TITLE TIMSRV ; Net time server GMTDIF==5 ; # hours difference between local zone and GMT. F=0 A=1 B=2 C=3 P=17 NETO==1 .INSRT KSC;MACROS > LOC 42 JSR TSINT LOC 100 PAT: BLOCK 20 PDL: BLOCK 20 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 ;set timer to log out if icp not finished within 60 sec. 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 .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. .IOT NETO,A ; Send out 32 bit time. .NETS NETO, ; Immediately. .CLOSE NETO, CAIA LOGOUT: 0 .LOGOUT .VALUE END GO