1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-18 17:16:59 +00:00
PDP-10.its/src/sysnet/times.73
2016-12-21 08:19:09 +01:00

539 lines
13 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-*- 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