1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-29 13:21:11 +00:00

Added CTIMES/TIMES: Chaosnet/TCP time server.

Resolves #298.
This commit is contained in:
Eric Swenson
2016-12-20 16:43:55 -08:00
committed by Lars Brinkhoff
parent 478eec5dc5
commit ae86cc010b
3 changed files with 546 additions and 0 deletions

538
src/sysnet/times.73 Normal file
View File

@@ -0,0 +1,538 @@
;-*- 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 /FAMILJEN/]
[ASCIZ /CP/]
[ASCIZ /PI/]
[ASCIZ /DX/]
[ASCIZ /DU/]
[ASCIZ /KN/]
[ASCIZ /MD/]
[ASCIZ /NX/]
[ASCIZ /AXPKLH/]
[ASCIZ /PCKLH/]
; [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 /PI/]
[ASCIZ /DX/]
[ASCIZ /DU/]
[ASCIZ /KN/]
[ASCIZ /MD/]
[ASCIZ /NX/]
; [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