;-*- Mode: MIDAS -*- TITLE TIMES - Time Sites ; Hack courtesy of KLH 8/11/76, and CSTACY 1/8/83 and 5/30/83. ;;; This program queries TIME servers on the ARPAnet (by TCP) or on ;;; the CHAOSnet. Which network it checks depends on whether its job ;;; name is TIMES or CTIMES. X=0 A=1 B=2 C=3 D=4 E=5 T=10 ;Temporary TT=11 ;Temporary+1. OC==12 ;OUT register. U1==13 ;4 UUO Registers. U2==14 U3==15 U4==16 P=17 NETD==1 TYOC==2 TYIC==3 NETI==4 NETO==5 CHICH==6 CHOCH==7 ;;; Time routines. DATIME"$$SVNG==1 DATIME"$$OUT==1 DATIME"$$ABS==1 .INSRT SYSENG;DATIME ;;; Network hacking routines. NETWRK"$$HST3==1 ;HOSTS3 table. NETWRK"$$ALLNET==1 ;Lookup any host. NETWRK"$$OWNHST==1 ;Own host number. NETWRK"$$HOSTNM==1 ;Hostnames. NETWRK"$$HSTCMP==1 ;Host comparisons. NETWRK"$$SYMGET==1 ;Symbol lookup. NETWRK"$$HSTMAP==1 ;Table mapping. NETWRK"$$ARPA==1 ;Internet. NETWRK"$$CHAOS==1 ;Chaosnet. NETWRK"$$CHATO==5.*30. NETWRK"$$SIMPLE==1 ;Simple transactions. .INSRT SYSENG;NETWRK ;;; Macros and Output routines. $$OUT==1 $$OTIM==1 $$OHST==1 .INSRT KSC;MACROS .INSRT KSC;OUT CONSTANTS VARIABLES SUBTTL Handlers and Returns. POPJ1: AOS (P) ;Skip CPOPJ: RET ;Return SYSLOS: ;Error Handler. AUTPSY: 0 ;Fatal errors JSR here. DEATH: SKIPE DEBUG ;Here for normal termination. .VALUE [0] .LOGOUT 1, ;;; Routines for NETWRK. PUTCHR: .IOT TYOC,T ;Type the char in T JRST CPOPJ ;and return. GETCHR: .IOT TYIC,T ;Read a char into T ANDI T,%TXASC JRST POPJ1 ;and skip return. SPCHAN: JRST POPJ1 ;Nothing special TMPLOC 42,{-TSINTL,,TSINT} ;New style interrupts. INTACS==T_6+7 ;T,TT, and OUT registers preserved. TSINT: INTACS,,P 0 ? 1_TYIC ? 0 ? <1_TYOC>\<1_TYIC> ? CHRINT 0 ? 1_TYOC ? 0 ? 0 ? MORINT TSINTL==:.-TSINT ;;; Interrupt dismissal INTRET: SYSCAL DISMIS,[%CLBIT,,INTACS ? P] JSR SYSLOS ;;; We will handle only interrupts from the user's console (not from networks). CHRINT: MOVEI T,TYIC ;INTERRUPT CHAR. .ITYIC T, JRST INTRET CAIN T,^S JRST [ .RESET TYOC, SYSCAL TTYFLS,[ %CLBIT,,1 ? %CLIMM,,TYIC] .LOSE %LSSYS JRST WRAPUP ] CAIN T,^G JRST [.RESET TYOC, SYSCAL TTYFLS,[ %CLBIT,,1 ? %CLIMM,,TYIC] .LOSE %LSSYS JRST FLSIT1] JRST INTRET MORINT: OUT(TYOC,("--More--")) ;MORE BREAK. SYSCAL IOT,[%CLBIT,,%TIPEK ? %CLIMM,,TYIC ? %CLOUT,,T] .LOSE %LSFIL CAIE T,40 CAIN T,177 .IOT TYIC,T CAIE T,40 JRST FLSIT OUT(TYOC,("A")) JRST INTRET FLSIT: OUT(TYOC,("Flushed")) FLSIT1: JRST DEATH ;means we are done. SUBTTL LOOKUP a host address. ;;; A/ BP to host name ;;; B/ network number, or -1 for any we prefer, and -2 for any at all ;;; Skip returns with host address in A. LOOKUP: PUSHAE P,[B,C,D,E] CALL NETWRK"HSTLOOK ;Parse name, lookup host in HOSTS3. JRST LOOKU9 ; Unknown host name. MOVE B,A ;B gets host number. CALL NETWRK"HSTSRC ;D gets addr of its SITES table entry. JRST LOOKU9 ; Fail if site is unknown. HRRZ A,(D) ;Relative addr of ADDRESS list. JUMPE A,LOOKU9 ;(NULL ADDRESS) ==> Failure. MOVE B,-3(P) ;Recover target network number. LOOKU1: ADD A,NETWRK"HSTADR ;De-relativize list pointer. NETWRK"GETNET C,(A) ;Get network number of this entry. CAMN B,[-2] ;Are we not checking network numbers? JRST LOOKU3 ; Yeah - any old address will do. CAME B,[-1] ;Are we checking for assorted Internet addresses? JRST LOOKU2 ; No - we want an exact match. CAMN C,[NETWRK"NW%ARP] JRST LOOKU3 CAMN C,[NETWRK"NW%LCS] JRST LOOKU3 CAMN C,[NETWRK"NW%MIL] JRST LOOKU3 JRST LOOKU4 ;This address not on the Internet. LOOKU2: CAME C,B ;Is this the target network? JRST LOOKU4 ; No. LOOKU3: MOVE A,(A) ;Yes - get host address on this net. JRST LOOKU8 LOOKU4: HRRZ A,NETWRK"ADRCDR(A) ;Follow thread to next host-address addr. SKIPN A ;If NIL JRST LOOKU9 ; Fail. JRST LOOKU1 ;Else go look at host-address. LOOKU8: AOS -4(P) ;Success - make us skip. LOOKU9: POPAE P,[E,D,C,B] RET SUBTTL Main Program GO: MOVE P,[-PDLLEN,,PDL] ;Init the stack. SYSCAL OPEN,[%CLBIT,,<.UAO\%TJDIS> ? %CLIMM,,TYOC ? [SIXBIT /TTY/]] .LOSE %LSFIL SYSCAL OPEN,[%CLBIT,,.UAI ? %CLIMM,,TYIC ? [SIXBIT /TTY/]] .LOSE %LSFIL SYSCAL CNSGET,[%CLIMM,,TYOC ? %CLOUT,,X ? %CLOUT,,TCMXH] .LOSE %LSFIL SYSCAL TTYSET,[%CLIMM,,TYIC ? [222222,,222222] ? [230222,,220222]] .LOSE %LSFIL .SUSET [.ROPTION,,A] ;Read job option bits. TLO A,%OPINT\%OPOPC ;Turn on winning-PC and new interrupts. .SUSET [.SOPTION,,A] ;Set option bits. .SUSET [.SMSK2,,[<1_TYIC>\<1_TYOC>]] ;Enable TTY interrupts. OUT(TYOC,OPEN(UC$IOT)) OUT(,CH(TYOC)) ;Open typeout display as default device. .SUSET [.RXJNAM,,A] CAMN A,[SIXBIT /CTIMES/] ;If running under this job name SETOM CHAOSP ; use Chaosnet instead of Internet. .RDTIME A, ;Get starting system time. MOVEM A,TSTART MOVE A,[NETWRK"NW%ARP] ;Get HOSTS3 address CALL NETWRK"OWNHST ;of this machine. JRST [ MOVE A,[NETWRK"NW%CHS] ;Get HOSTS3 address CALL NETWRK"OWNHST ;of this machine. JSR SYSLOS JRST .+1 ] MOVEM A,OWNHST ;Save our address. SKIPE CHAOSP JRST GO1 MOVE A,[SQUOZE 0,/IMPUP/] ;Get IMP status from ITS. .EVAL A, JRST [ OUT(,("ANo ARPAnet connection available.")) JRST DEATH ] HRL A,A HRRI A,A .GETLOC A, GO1: SKIPN CHAOSP ;If using Chaos, no need for IMP. SKIPN A ;Else it had better be up. JRST MAPHST OUT(,("AThe ARPAnet IMP is not up."),CRLF) JRST DEATH MAPHST: MOVEI A,LSTPAG ;Page to map HOSTS3 in. MOVEI B,0 CALL NETWRK"HSTMAP ;Map in the host table. JSR AUTPSY SKIPE CHAOSP ;Tell luser which network we are using. JRST [ OUT(,("AChecking the time using CHAOS protocol: ")) MOVEI E,CHATAB ;(Seperate tables for TCP and CHAOS.) MOVSI C,-CHATBL ;C gets length of the table. MOVE B,[NETWRK"NW%CHS] ;B specifies the network. JRST SETUP ] OUT(,("AChecking the time using Internet/TCP: ")) MOVEI E,TCPTAB MOVSI C,-TCPTBL MOVE B,[-1] SETUP: OUT(,LPAR,("^S to stop"),RPAR,(":"),CRLF) HRR C,E ;Select the table. SETZ D, ;D counts addresses found. SETUP2: HRRZ A,(C) ;Get next host name from table. HRLI A,440700 ;Make BP to it. MOVE B,[-2] ;Use primary (first) address. SKIPE CHAOSP MOVE B,[NETWRK"NW%CHS] CALL LOOKUP ;Look up the host. JRST SETUP3 ; Ignore hosts unknown on this net. MOVEM A,HOSTS(D) ;Else store this host address. AOS D SETUP3: AOBJN C,SETUP2 ;Go get another. SKIPE CHAOSP JRST [ OUT(,("Subnet Site Greenwich Mean Time Local Time"),CRLF) JRST SETUP9 ] OUT(,("Network Site Greenwich Mean Time Local Time"),CRLF) SETUP9: MOVSI C,-NHOSTS ;Number of hosts to poll. LOOP: SKIPN A,HOSTS(C) ;Get host address in A. JRST LOOP8 ; Ignore if zero. CALL PRTHST ;Print the network and host. CAMN A,OWNHST ;Hacking local host? JRST [ .RLPDTM U1, ;Get time of our local host CAME U1,[-1] ;for both time-since-beg-of-year CAMN U2,[-1] ;and year. JRST [ OUT(,(" doesn't know the time!"),CRLF) JRST LOOP8 ] CALL DATIME"TIMGTN ;Found it, now get local net time. .LOSE JRST LOOP5 ] MOVEM A,HSTNUM ;Remember which host to ask. CALL NETIM ;Now ask it for the time. JRST [ OUT(,("'s time is unavailable."),CRLF) JRST LOOP8 ] LOOP5: MOVE B,A ;Remember network time. CALL DATIME"SECTIM ;Convert to time word. EXCH A,B ;GMT in B. SUBI A,DATIME"ESTDIF*60.*60. CALL DATIME"SECTIM PUSH P,C PUSH P,B MOVE C,[SIXBIT / EST./] MOVEI B,3600. CALL DATIME"ODAYL CALL [ MOVE C,[SIXBIT / EDT./] JRST DATIME"TIMADD ] POP P,B OUT(,("H'"),TIM(MDYT,B),(" -> ")) OUT(,TIM(MDYT,A),6F(C),CRLF) POP P,C LOOP8: AOBJN C,LOOP WRAPUP: .RDTIME A, ;Get sys time at end. SUB A,TSTART ;Find total 30'ths we ran in real time. IDIVI A,30. ;# secs in A, rem in B IMULI B,100. IDIVI B,30. ;Get 2 digits after decimal pt. OUT(,("ARealtime used: "),D(A),("."),D(B),(" secs."),CRLF) JRST DEATH ;;; NETIM - Hack to pluck 32-bit Network-time word from site ;;; specified by A. Returns value in A and skips, ;;; doesn't skip if couldn't get. NETIM: SKIPE CHAOSP ;Using CHAOSnet? CALRET CHTIM ; Yes. CALRET ARTIM ;No - use ARPAnet. SUBTTL Get time from ARPAnet. ;;; Asks the host in HSTNUM for the time, using TCP or NCP. ;;; If successful, skip returns with time in A. ARTIM: SETZM GOTTCP ;No - say we need TCP time. SKIPN TCPP ;If not trying TCP these days JRST NETIM4 ; just go try NCP instead. ;Try to get a TCP connection. SYSCAL TCPOPN,[ MOVEI NETI ? MOVEI NETO ? [-1] ? NTMSOC ? A] JRST NETIM4 ; Failed (should timeout!) MOVEI B,3*5. NETIM2: MOVEI A,10. .SLEEP A, SYSCAL WHYINT,[MOVEI NETI ? MOVEM A ? MOVEM A] .LOSE %LSSYS CAIE A,%NSOPN CAIN A,%NSRFN CAIA SOJG B,NETIM2 CAIG B, JRST NETIM4 ; Timed out, try NCP maybe. SETOM GOTTCP ; Or got TCP connected. PUSH P,B PUSH P,C SETZ A, MOVE B,[401000,,A] ; Read in 32 bit word here. MOVEI C,4. ; 8-bit bytes at a time. SYSCAL SIOT,[MOVEI NETI ? B ? C] .LOSE %LSFIL POP P,C POP P,B AOS (P) ; Make us win-skip. JRST NETIM9 ; All done. ;;; Here to try NCP instead. NETIM4: SKIPN NCPP ; If not trying NCP these days JRST NETIM9 ; dont even try. MOVE A,HSTNUM SYSCAL OPEN,[[40054,,NETD] ? NETDEV ? CIMM -1 ? NTMSOC ? A] JRST NETIM9 ;Failed. MOVEI A,30.*10. SYSCAL NETBLK,[CIMM NETD ? CIMM %NSRFS ? A ? CRET A] JRST NETIM9 CAIE A,%NSOPN JRST NETIM5 MOVEI A,30.*10. SYSCAL NETBLK,[CIMM NETD ? CIMM %NSOPN ? A ? CRET A] JRST NETIM9 NETIM5: CAIE A,%NSCLI CAIN A,%NSINP AOSA (P) ; Win, make us skip. JRST NETIM9 NETIM8: .IOT NETD,A ; Pull in the 32 bit time word. NETIM9: .CLOSE NETD, POPJ P, SUBTTL Get time from Chaosnet ;;; Asks the host in HSTNUM for the time. ;;; If successful, skip returns with time in A. CHTIM: PUSHAE P,[B,C,D] MOVE B,HSTNUM ;Host address. MOVEI A,CHICH ;Channel pair. MOVEI C,[ASCIZ /TIME/] ;Contact name. MOVE D,[-1,,A] ;AOBJN pointer to answer buffer. PUSHJ P,NETWRK"CHASMP JRST CHTIM1 JRST CHTIM1 LDB A,[041000,,NETWRK"PKTBUF+NETWRK"%CPKDT] LDB T,[141000,,NETWRK"PKTBUF+NETWRK"%CPKDT] LSH A,8 ADD A,T LDB T,[241000,,NETWRK"PKTBUF+NETWRK"%CPKDT] LSH A,8 ADD A,T LDB T,[341000,,NETWRK"PKTBUF+NETWRK"%CPKDT] LSH A,8 ADD A,T AOS -3(P) CHTIM1: POPAE P,[D,C,B] POPJ P, ;;; Identify the host whose addr is in A. PRTHST: PUSHAE P,[A,B,C,D,E] NETWRK"GETNET C,A ;C has network number. CAMN C,[NETWRK"NW%CHS] ;If Chaosnet JRST [ LDB B,[080800,,A] ; print subnet number. OUT(,O(B)) JRST PRTHS6 ] HRRZ D,NETWRK"STRADR(D) ;Find name of network in C. MOVE B,HSTTAB+NETWRK"ADDADR(D) MOVE T,HSTTAB+NETWRK"NETPTR ;Ptr to NETWORKS table. MOVE TT,HSTTAB(T) ;# of entries. MOVE E,HSTTAB+1(T) ;Size of entries. MOVEI T,2(T) ;Skip count and size. PRTHS3: CAMN C,HSTTAB(T) ;Is this the network? JRST PRTHS5 ;Yes - print its name. ADD T,E ;No, next entry. SOJG TT,PRTHS3 OUT(,("Unknown net")) JRST PRTHS6 PRTHS5: HLRZ T,HSTTAB+NETWRK"NTLNAM(T) ;Get the loc of the network name OUT(,TZ(HSTTAB(T))) ;Get core address of network name PRTHS6: OUT(,("H"),HST(A)) ;Type host name. POPAE P,[E,D,C,B,A] POPJ P, SUBTTL Known TIME servers. ;;; It is faster to consult our own list of TIME servers, instead ;;; of searching HOSTS3 for them. NHOSTS==100. ;Maximum number of hosts we can query. ;;; TCP TIME servers. TCPTAB: [ASCIZ /MIT-MC/] ; [ASCIZ /MIT-AI/] [ASCIZ /DCN1/] [ASCIZ /MIT-MULTICS/] [ASCIZ /SCRC-STONY-BROOK/] [ASCIZ /BBN-NOC/] [ASCIZ /BBN-INOC/] [ASCIZ /SU-AI/] [ASCIZ /SRI-PRMH/] [ASCIZ /MIT-REAGAN/] [ASCIZ /BBNG/] [ASCIZ /BBNA/] [ASCIZ /S1-A/] [ASCIZ /NIC/] [ASCIZ /SCORE/] [ASCIZ /HONEY/] [ASCIZ /BRL/] [ASCIZ /BRL-BMD/] [ASCIZ /BRL-VGR/] [ASCIZ /DCA-EUR/] [ASCIZ /DDN1/] TCPTBL==.-TCPTAB ;;; CHAOS TIME servers. CHATAB: [ASCIZ /MIT-MC/] [ASCIZ /MIT-AI/] ; [ASCIZ /MIT-ML/] [ASCIZ /MIT-OZ/] [ASCIZ /MIT-EE/] [ASCIZ /PREP/] [ASCIZ /MIT-REAGAN/] [ASCIZ /GOLDILOCKS/] [ASCIZ /AP6/] ; [ASCIZ /SCRC-RIVERSIDE/] ; [ASCIZ /SCRC-QUABBIN/] ; [ASCIZ /SCRC-STONY-BROOK/] [ASCIZ /BYPASS/] [ASCIZ /PLASMA/] [ASCIZ /NE439A/] [ASCIZ /NE438A/] [ASCIZ /MIT-VAX/] [ASCIZ /SPEECH/] [ASCIZ /PIG/] [ASCIZ /MIT-MORRISON/] [ASCIZ /MIT-MOON/] [ASCIZ /CADR-1/] [ASCIZ /CADR-2/] [ASCIZ /CADR-3/] [ASCIZ /CADR-4/] [ASCIZ /CADR-6/] [ASCIZ /CADR-9/] [ASCIZ /BING/] [ASCIZ /SINATRA/] [ASCIZ /ROBOT-3/] [ASCIZ /APIARY-3/] [ASCIZ /APIARY-4/] CHATBL==.-CHATAB SUBTTL Data. PDLLEN==100 PDL: BLOCK PDLLEN ;The Stack. 0 DEBUG: 0 ;-1 => Debugging. TCPP: -1 ;-1 => Try TCP time servers. NCPP: 0 ;-1 => Try NCP time servers. CHAOSP: 0 ;-1 => Try Chaosnet servers. UDPP: 0 ;-1 => Try ARPAnet UDP servers (not implemented yet). TCMXH: 0 TSTART: 0 ;Starting time. OWNHST: 0 ;My host address. HSTNUM: 0 ;HOSTS3 address to connect to. GOTTCP: 0 ;-1 => Got the info from TCP. NETDEV: SIXBIT /NET/ NTMSOC: 45 ; Socket to connect to HOSTS: BLOCK NHOSTS ;Table of host addresses. CONSTANTS VARIABLES LSTPAG==<.+1777>/2000 ;Page where HOSTS3 is mapped. HSTTAB=:LSTPAG*PG$SIZ ;Address of host table. END GO