1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-22 18:42:15 +00:00
PDP-10.its/src/sysnet/timsrv.10
Eric Swenson e29d6907c1 Added TIMSRV.
Resolves #245.
2016-12-18 22:29:01 -08:00

107 lines
2.6 KiB
Plaintext
Executable File

;-*- Mode: MIDAS -*-
TITLE TIMSRV ; Net time server
GMTDIF==5 ; # hours difference between local zone and GMT.
F=0 ;TCP flag.
A=1
B=2
C=3
P=17
NETO==1
NETI==2
.INSRT KSC;MACROS >
LOC 42
JSR TSINT
LOC 100
PAT: BLOCK 20
PDL: BLOCK 20
DEBUG: 0
ICPSOC==45 ; Official ICP socket for Time Server.
;Interrupt handler - mostly for fatal conditions
TSINT: 0
0
JSR LOGOUT ; Any interrupt is cause for death.
; Start of program
GO: MOVEI P,PDL ;init pdl pointer
.SUSET [.RJNAME,,A]
CAME A,[SIXBIT /TCP/]
JRST NCPICP
TCPICP: SYSCAL TCPOPN,[ MOVEI NETI ? MOVEI NETO
MOVEI ICPSOC ? [-1] ? [-1]]
JSR LOGOUT ; Failed (should timeout!)
MOVEI B,3*30. ; Try for 30 sec
TCPIP1: MOVEI A,10.
.SLEEP A,
SYSCAL WHYINT,[MOVEI NETO ? MOVEM A ? MOVEM A]
.LOSE %LSSYS
CAIE A,%NSOPN
CAIN A,%NSRFN
CAIA
SOJG B,TCPIP1
CAIG B,
JSR LOGOUT ; Timed out...
SETO F,
JRST SERVE ; Or got connected...
;set timer to log out if icp not finished within 60 sec.
NCPICP: MOVE A,[600000,,[60.*60.]] ;flush old ticks, start
.REALT A, ;new rate, 60 sec frame(ints).
JFCL
.SUSET [.SMASK,,[%PIRLT+%PIIOC]] ;enable ioc and realt
.SUSET [.SPICLR,,[-1]] ;enable ints
;start icp
.OPEN NETO,[40060+.UIO,,'NET ? ICPSOC] ;open 32-bit listen on ICP socket.
JSR LOGOUT
MOVEI A,NETO
NETHANG 900.,A,%NSLSN,[%NSRFC] ;hang until rfc received
JSR LOGOUT
.NETAC NETO, ;accept it
JSR LOGOUT
MOVEI A,NETO
NETHANG 900.,A,%NSRFC,[%NSOPN] ;wait until open
JSR LOGOUT
SETZ F,
SERVE: .RLPDTM A, ; Get in A, # secs since beg of year.
CAME A,[-1]
CAMN B,[-1]
JSR LOGOUT ; If either is -1, time not known.
CAIGE B, ; If 4.9 on,
SUBI A,24.*3600. ; subtract 1 day - .RLPDTM misfeature!
TLNE B,100000 ; Bit 4.7 = Daylight Savings time?
SUBI A,3600. ; If on, subtract one hour to get Standard.
MOVEI B,-1900.(B) ; Get year, relative to 1900.
MOVEI C,-1(B) ; Adjust and
LSH C,-2 ; Get # leap years since 1900
; not including this year.
IMULI B,365. ; Find # days in years thus far
ADDI B,(C) ; Plus # LY's, to get total days in years past.
IMULI B,86400. ; Now get # seconds in all them days.
ADD A,B ; and produce total seconds since 1/1/00 !
ADD A,[GMTDIF*3600.] ; Adjust to GMT.
SKIPN F ; If connected via NCP
JRST [ .IOT NETO,A ; Send out a word of the 32-bit time.
JRST SRVDUN ]
MOVE B,[401000,,A] ; If connected via TCP
MOVEI C,4. ; Send four 8-bit bytes of the 32-bit time.
SYSCAL SIOT,[MOVEI NETO ? B ? C]
JSR LOGOUT
SRVDUN: .NETS NETO, ; Force the output.
.CLOSE NETO, ; Disconnect.
CAIA
LOGOUT: 0
SKIPE DEBUG
.VALUE
.LOGOUT ; All done
END GO