mirror of
https://github.com/PDP-10/its.git
synced 2026-01-22 18:42:15 +00:00
107 lines
2.6 KiB
Plaintext
Executable File
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
|