;CBBS V3.5.0 	CBBSCLKS.ASM - SCITRONICS CLOCK FUNCTIONS
;07/13/81 20:16:29
; LINKED FROM CBBSDISK ONLY IF CLOCKS=TRUE
;
;	LINKS TO CBBSSUB1
;
;	O O O	O	O   O	O O O
;	O	O	O  O	O
; CBBS	O	O	OOO	O O O	.ASM
;	O	O	O  O	    O
;	O O O	O O O	O   O	O O O
;
;MOD LOG (THRU 3.2 WRITTEN TO "HISTORY")
;
;====> HISTORICAL COMMENTS SINCE 3.3 TO "HISTORY.033"
;
;	----------------
;SCITRONICS CLOCK BOARD EQUATES
;
SCIP0	EQU	24	;SCITRONICS CLOCK READ
SCIP1	EQU	SCIP0+1
SCIP2	EQU	SCIP0+2
SCIP3	EQU	SCIP0+3
;
;'T' COMMAND: PRINTS DATE, TIME, ELAPSED TIME
;
PRDTIME	CALL	PRETIME
	JMP	FUNCT
;
;DATE/TIME PRINT SUBROUTINE
;
PRTIME	LXI	H,ANSWER ;STORE IT HERE
	PUSH	H
	CALL	RDDATE
	MVI	M,' '
	INX	H
	JC	CLKINOP
	CALL	RDTIME	;GET TIME
	MVI	M,0
	POP	H
	MOV	A,M	;GET HI
	CPI	'3'	;VALID?
	JNC	CLKINO1
	CALL	TYPEM0	;TYPE DATE
	CALL	CRLF
	ORA	A	;SHOW CLOCK IS OK
	RET
;
CLKINOP	POP	H	;FIXUP STACK
CLKINO1	CALL	ILPRT
	DB	'++Clock inop++',CR,LF,0
	STC		;SHOW ERROR
	RET
;
;PRETIME: PRINTS CURRENT AND ELAPSED TIME
;
PRETIME	CALL	PRTIME
	RC		;RET IF NO CLOCK
	LXI	H,ANSWER
	PUSH	H
	CALL	RDTIME
	POP	H
	CALL	CONVTBI	;HL=BINARY CURR TIME
	PUSH	H
	LXI	H,LGINTIM ;GET LOGGED IN TIME
	CALL	CONVTBI	;HL=LOGGED IN TIME
	POP	D	;DE=CURR TIME
;SUBTRACT TO GET ELAPSED MINUTES
	MOV	A,E
	SUB	L
	MOV	L,A
	MOV	A,D
	SBB	H
	MOV	H,A
	RAL		;CARRY IF NEG
	JNC	PRETOK
;ELAPSED TIME IS NEGATIVE - ADD 24 HOURS
	LXI	D,24*60	;1 DAY OF MINUTES
	DAD	D
PRETOK	MOV	A,H
	ORA	A	;>255 MINUTES?
	JNZ	PREBAD
	MOV	A,L	;GET TIME
	CPI	120	;>2 HRS? PROB. BAD.
	JNC	PREBAD
;E.T. IS VALID, PRINT IT
	PUSH	PSW
	CALL	ILPRT
	DB	'Connect time ',0
	POP	PSW
	CALL	PRDEC
	CALL	ILPRT
	DB	' minutes',CR,LF,0
	RET
;
PREBAD	CALL	ILPRT
	DB	'Unable to calc connect time',cr,lf,0
	RET
;
;WRITE DATE, TIME, ELAPSED TIME
;
WRETIME	CALL	PRETIME	;PRINT & CALC ELAPSED
	RC		;INVALID CLOCK
	LXI	H,WRETMSG
	JMP	WRVARC	;WRITE ELAPSED, ","
;
;WRITE DATE AND TIME TO CURRENTLY OPEN
;FILE (USUALLY LOG, BUT SOMETIMES "NOTES")
;
WRTIME	LXI	H,ANSWER ;WORK AREA
	PUSH	H
	CALL	RDDATE
	MVI	M,0DH
	POP	H
	RC
	MOV	A,M
	CPI	'2'	;VALIDATE
	CMC		;	THE
	RC		;	TIME
	PUSH	H
	CALL	WRVARC	;WRITE DATE
	POP	H
	PUSH	H
	CALL	RDTIME
	MVI	M,0DH
	POP	H
	JMP	WRVARC	;WRITE DATE
;
;RDTIME - STORES THE TIME "HH:MM:SS " INTO
;	FIELD POINTED TO BY HL.  UPON RETURN,
;	HL POINTS PAST LAST BYTE.
;
RDTIME	CALL	CLKINIT
	RC
	LXI	D,256*5+':' ;GET DIGIT SEL, DELIM
	CALL	CLKDIG2
	CALL	CLKDIG2
	CALL	CLKDIG2
	CALL	CLKCONT
	DCX	H
	ORA	A	;SHOW READ OK
	RET
;
;RDDATE - STORES THE DATE "MM/DD/YY " INTO
;	FIELD POINTED TO BY HL.  UPON RETURN,
;	HL POINTS PAST LAST BYTE.
;
RDDATE	CALL	CLKINIT
	RC
	LXI	D,256*10+'/'
	CALL	CLKDIG2
	CALL	CLKDIG2
	MVI	D,12
	CALL	CLKDIG2
	CALL	CLKCONT	;RESTART CLOCK
	DCX	H
	ORA	A
	RET
;
;STORE 2 CONSECUTIVE DATE/TIME DIGITS
;
CLKDIG2	CALL	CLKDIG
	CALL	CLKDIG
	MOV	M,E
	INX	H
	RET
;
;====>	CLKDIG:	GETS A SINGLE DIGIT FROM THE CLOCK TO MEMORY
;
CLKDIG	MOV	A,D	;GET DIGIT SELECT
	DCR	D	;SETUP FOR NEXT DIGIT
	OUT	SCIP0	;ASK FOR IT
	CPI	5	;HOURS (HAVE TO MASK)?
	IN	SCIP0	;READ IT (PRESERVES CPI 5 TEST)
	JNZ	CLKN5	;	NOT DIGIT 5, SKIP MASKING
	ANI	70H	;	KILL HI DIGIT
CLKN5	RAR!RAR!RAR!RAR	;DIVIDE BY 16
	ANI	0FH	;ISOLATE NUMERIC VALUE
	ADI	'0'	;MAKE PRINTABLE
	MOV	M,A	;STORE I
	INX	H	;BUMP TO NEXT
	RET		;	AND RETURN
;
;====>	CLKINIT	INITIALIZES THE CLOCK FOR READ
;	RETURNS CARRY IF THERE IS NO CLOCK
;
CLKINIT	IN	SCIP0	;CLOCK EXIST?
	INR	A
	STC		;RETURN CARRY
	RZ		;	IF NO CLOCK
;
;INIT PIA
;
	MVI	A,0F0H	;1
	OUT	SCIP1	;2
	MVI	A,0FH	;3
	OUT	SCIP0
	MVI	A,0FCH
	OUT	SCIP3
	MVI	A,0F4H
	OUT	SCIP1
	ORA	A	;CLOCK OK
	RET
;
;====>	CLKCONT	CONTINUE CLOCK
;
CLKCONT	MVI	A,0F8H
	OUT	SCIP1
	MVI	A,0FH
	OUT	SCIP0
	MVI	A,0F8H
	OUT	SCIP3
	MVI	A,0FCH
	OUT	SCIP1
	MVI	A,0FH
	OUT	SCIP0
	RET		;END OF CLOCK ROUTINES
;
;SUBROUTINE TO CONVERT ASCII TIME TO BINARY
;
;USED TO PRINT CALLER'S ELAPSED TIME
;
;	HL POINTS TO "HH:MM"
;
;	BINARY MINUTES RETURNED IN HL
;
CONVTBI	EQU	$
	MOV	BAG
TYPEFR	CALL	SETRD
	RC		;NO FILE
	JMP	TFHLC	;TYPE FIRST LINE
;
TFHLN	CALL	CTLCKS	;ALLOW ^K ABORT
	CALL	RDBYTE
	RC
	CPIALL	CT6	;X 6 + NEXT DIGIT
;
;FALL INTO CB10, TO MULTIPLY BY 10
;AND GET LAST DIGIT
;
;MULTIPLY HL BY 10 AND ADD IN BINARY
;VALUE OF NEXT ASCII DIGIT POINTED TO BY BC.
;
CT10	MOV	D,H	;SET UP
	MOV	E,L	;	FOR MULT
	DAD	H	;X2
	DAD	H	;X4
	DAD	D	;X5
	DAD	H	;X10
;
;ENTER HERE TO GET FIRST DIGIT
;
CT10F	LDAX	B	;GET DIGIT
	INX	B	;TO NEXT DIGIT
	SUI	'0'	;MAKE BINARY
	ADD	L	;ADD TO LOW
	MOV	L,A	;SAVE BACK
	RNC
	INR	H	;ADD IN CARRY
	RET
;
;ROUTINE TO MULTIPLY HL BY 60, AND ADD
;IN NEXT DIGIT
;
CT6	MOV	D,H	;SET UP
	MOV	E,L	;	FOR MULT
	DAD	H	;X2
	DAD	D	;X3
	DAD	H	;X6
	JMP	CT10F	;GET DIGIT
;
	ENDIF		;CLOCK
;
 	LINK	CBBSSUB1 ;TO NEXT .ASM FILE
