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