perm filename TIMES.MID[S,NET] blob
sn#595935 filedate 1981-06-22 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 GMTDIF A B C D E N N1 P PDLLEN PDL
C00003 00003 GO LUP LUPNXT NTMTAB NTHSTS
C00006 00004 NETIM TIME CONBLK CONSTS CONLSK CONHST
C00008 00005 TIMCAS TIMCA2 TIMCA3 TM%SEC TM%DAY TM%MON TM%YR TM$SEC TM$DAY TM$MON TM$YR TMONTB
C00012 00006 TIMOUT DEC2OU DECOUT
C00014 ENDMK
C⊗;
;GMTDIF A B C D E N N1 P PDLLEN PDL
TITLE TIMES
; Time Sites
; Hack courtesy of KLH
; Hacked for SAIL by MRC
GMTDIF==8.
A=1
B=2
C=3
D=4
E=5
N=10
N1=11
P=17
PDLLEN==20
PDL: BLOCK PDLLEN
0
;GO LUP LUPNXT NTMTAB NTHSTS
GO: CAI
RESET
MSTIME
MOVEM TSTART'
MOVEI 261
PEEK
PEEK
MOVEM DAYLIT'
MOVE P,[-PDLLEN,,PDL]
OUTSTR [ASCIZ/ Site Greenwich Mean Time Local Time
/]
; Now loop thru sites in table...
MOVSI C,-NTHSTS
LUP: HRRZ A,NTMTAB(C)
OUTSTR (A) ; Type site name.
HLRZ A,NTMTAB(C) ; Get site # to hack, and
PUSHJ P,NETIM ; Get net time for foreign site.
JRST [ OUTSTR [ASCIZ/'s time is unavailable.
/]
JRST LUPNXT]
; Here, have net time in A. Print out...
MOVE B,A ; save
PUSHJ P,TIMCAS ; Convert one as GMT,
EXCH A,B ; get saved value,
SUBI A,GMTDIF*3600. ; and use to get local-time value,
SKIPE DAYLIT
ADDI A,3600. ; daylight losing time
PUSHJ P,TIMCAS ; converted thereto.
OUTSTR [ASCIZ/ /]
MOVE D,B
PUSHJ P,TIMOUT
OUTSTR [ASCIZ/ -> /]
MOVE D,A
PUSHJ P,TIMOUT
SKIPE DAYLIT
JRST [ OUTSTR [ASCIZ/ PDT.
/]
JRST LUPNXT]
OUTSTR [ASCIZ/ PST.
/]
LUPNXT: AOBJN C,LUP
MSTIME A, ; Get sys time at end.
SUB A,TSTART ; Find total 1000'ths we ran in real time.
IDIVI A,1000. ; # secs in A, rem in B
IDIVI B,10. ; Get 2 digits after decimal pt.
OUTSTR [ASCIZ/Realtime used: /]
MOVEI N,(A)
PUSHJ P,DECOUT
OUTCHR [".]
MOVEI N,(B)
PUSHJ P,DECOUT
OUTSTR [ASCIZ/ secs
/]
EXIT
NTMTAB: 20000,,[ASCIZ /AMES-67/]
6002,,[ASCIZ /MIT-AI/]
6003,,[ASCIZ /MIT-ML/]
6001,,[ASCIZ /MIT-DM/]
54003,,[ASCIZ /MIT-MC/]
13000,,[ASCIZ /SU-AI/]
111001,,[ASCIZ /SRIWARF/]
NTHSTS==.-NTMTAB
;NETIM TIME CONBLK CONSTS CONLSK CONHST
; 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: MOVEM A,CONHST
INIT 17 ; open in dump mode
'IMP,, ; device IMP:
0 ; no buffers
JRST 4,.
MTAPE [17 ? .BYTE 6 ?1?0?0?5?5?0]; set timeouts
SETOM CONLSK ; gensym socket to use
MTAPE CONBLK ; connect → foreign logger
MOVE CONSTS ; check for MTAPE error
TRNE 77
POPJ P,
STATZ 763600
POPJ P,
TLC 300000 ; for next instruction to win
TLCE 300000 ; legal socket state?
POPJ P,
HRROI A,TIME-1 ; get ready to get a socket
SETZ B, ; stop code for dump mode
IN A ; get socket from logger
AOS (P) ; won
LDB A,[044000,,TIME]
RELEASE
POPJ P,
TIME: BLOCK 1 ; time
CONBLK: 0 ; CONNECT
CONSTS: BLOCK 1 ; returned status bits
CONLSK: BLOCK 1 ; local socket
-1 ; ≠ 0 → wait for connection until timeout
BLOCK 1 ; byte size
45 ; foreign socket
CONHST: BLOCK 1 ; foreign host
;TIMCAS TIMCA2 TIMCA3 TM%SEC TM%DAY TM%MON TM%YR TM$SEC TM$DAY TM$MON TM$YR TMONTB
; TIMCAS - Converts Absolute Seconds to time word.
; Argument in A (# secs since 1/1/00), returns time wd in A.
TIMCAS: PUSH P,B
PUSH P,C
IDIVI A,24.*60.*60. ; Get remainder of # secs in day
PUSH P,B
IDIVI A,365. ;find # "normal" years.
JUMPE A,TIMCA2 ; Avoid 1900 lossage.
MOVEI C,-1(A) ;now see how many leap years covered (not incl current)
LSH C,-2 ;divide by 4 to get # leap yrs
SUBI B,(C) ;adjust cnt of remaining days
JUMPGE B,TIMCA2
SUBI A,1 ;backed past year boundary? bump down # yrs
ADDI B,365. ;if negative, must adjust again
TRNN A,3 ;if in leap year,
ADDI B,1 ;add one more since 366. days in LY
TIMCA2: MOVEI C,12.
CAMGE B,TMONTB(C) ;compare # days in year with # days after each month
SOJG C,.-1 ;loop (#1 index has 0 value, so it will stop)
TRNN A,3 ;leap year?
CAIGE C,3 ;ugh, yes. but if in jan or feb,
JRST TIMCA3 ;saved. else it's after feb and must hack it.
SUBI B,1 ;lower value
CAMGE B,TMONTB(C) ;still wins?
SUBI C,1 ;if not, bump month down.
CAIN C,2 ;if now in Feb,
AOJA B,.+1 ;restore value so subtracting TMONTB gives 29, not 28.
TIMCA3: SUB B,TMONTB(C) ;get # of day within month
DPB A,[TM$YR,,A] ;deposit year
DPB C,[TM$MON,,A] ;and month
MOVEI B,1(B) ; First day of month is day 1, not day 0.
DPB B,[TM$DAY,,A] ;and day.
ANDCMI A,-1 ;Zap RH to start of day.
POP P,B
LSH B,1
ADDI A,(B) ; Add in # half secs.
POP P,C
POP P,B
POPJ P,
; Mask Field Bits Range Var. Variable range
TM%SEC== 777776 ; 2.9-1.2 0-131K seconds 0-86399.
TM%DAY== 37,,0 ; 3.5-3.1 0-31 days 1-31
TM%MON== 740,,0 ; 3.9-3.6 0-15 months 1-12
TM%YR== 177000,,0 ; 4.7-4.1 0-127 years 0-127 relative to 1900 (1900-2027)
TM$SEC==(.BP TM%SEC,) ; Define BP LH's into each field.
TM$DAY==(.BP TM%DAY,)
TM$MON==(.BP TM%MON,)
TM$YR== (.BP TM%YR,)
; Special table to allow figuring how many days so far
; in this year. Indexed by month # (1-12) gives # days
; taken up by months preceding it. Assumes non-leap year.
TMONTB: 0
0
31. ;+jan
59. ;+jan+feb
90. ;+jan+feb+mar...
120. ;...+apr
151. ;...+may
181. ;...+jun
212. ;...+jul
243. ;...+aug
273. ;...+sep
304. ;...+oct
334. ;...+nov
;TIMOUT DEC2OU DECOUT
; TIMOUT - Output date/time in D
TIMOUT: LDB N,[TM$MON,,D]
PUSHJ P,DEC2OU
OUTCHR ["/]
LDB N,[TM$DAY,,D]
PUSHJ P,DEC2OU
OUTCHR ["/]
LDB N,[TM$YR,,D]
PUSHJ P,DEC2OU
OUTCHR [" ]
LDB N,[TM$SEC,,D]
IDIVI N,60.*60.
PUSH P,N1
PUSHJ P,DEC2OU
OUTCHR [":]
POP P,N
IDIVI N,60.
PUSH P,N1
PUSHJ P,DEC2OU
OUTCHR [":]
POP P,N
; JRST DEC2OU
; DEC2OU - Output two-digit decimal number in N
DEC2OU: IDIVI N,10.
ADDI N,"0
OUTCHR N
ADDI N1,"0
OUTCHR N1
POPJ P,
; DECOUT - Output decimal number in N
DECOUT: IDIVI N,10.
PUSH P,N1
SKIPE N
PUSHJ P,DECOUT
POP P,N
ADDI N,"0
OUTCHR N
POPJ P,
END GO