	TITLE	QT CLOCK-CALENDAR DRIVER
	LIST	NOCOND

;***************************************************************************
;
;	CLOCK DRIVER ROUTINES FOR PROM
;
;***************************************************************************
;
;	REVISIONS:
;
; 1.0 -	23 SEP 83   GRH
;	Initial version transferred from CBIOS routines.
;
VERS	EQU	'10'
;
;***************************************************************************

	SUBTTL	DECLARATIONS
*INCLUDE	CLOCK.DEF

	SUBTTL	CODE START
	ORG	0F800H		;PROM START

;--------------------------------------
;
;	ENTRY VECTORS
;
;--------------------------------------
	JP	CLKRDC		;READ CLOCK DATA INTO BUFFER
	JP	CLKSET		;SET CLOCK FROM BUFFER IMAGE
	JP	CLKCAL		;RETURN CALENDAR FUNCTION
	JP	CLKTIM		;RETURN TIME FUNCTION


;**********************************************************
;
;	RETURN CALENDAR FUNCTION
;	ENTRY-	BC= BUFFER PTR TO USE AS TEMPORARY STORAGE
;	EXIT -	A= DAY
;		B= MONTH
;		C= YEAR
;		L= DAY OF WEEK
;		DE= ?
;
;**********************************************************
CLKCAL:
	PUSH	BC		;SAVE PTR
	CALL	CLKRDC

	LD	DE,CLKWEEK	;ADD OFFSET TO WEEK BYTE
	POP	HL
	ADD	HL,DE
	EX	DE,HL

	LD	A,(DE)		;GET WEEK & SAVE FOR LATER
	AND	7
	LD	C,A		;SAVE WEEK IN C FOR NOW

	INC	DE		;NOW DO DAY
	LD	H,3		;MASK
	CALL	GETN
	PUSH	AF

	LD	H,1		;GET MONTH
	CALL	GETN
	LD	B,A

	LD	H,0FH		;GET YEAR
	CALL	GETN
	LD	L,C		;PUT WEEK IN L
	LD	C,A

	POP	AF		;DAY
	RET


;************************************************
;
;	RETURN TIME FUNCTION
;	ENTRY-	BC= TEMPORARY BUFFER PTR
;	EXIT -	A= SECONDS
;		B= MINITS
;		C= HOURS
;		DE= ?
;
;************************************************
CLKTIM:
	PUSH	BC		;SAVE PTR
	CALL	CLKRDC

	POP	DE		;START WITH SECONDS
	LD	H,7		;MASK
	CALL	GETN
	PUSH	AF		;SAVE

	CALL	GETN		;GET MINITS
	LD	B,A

	LD	H,3		;GET HOURS
	CALL	GETN
	LD	C,A

	POP	AF
	RET


;************************************************************
;
;	READ CLOCK TIME FUNCTION
;	ENTRY-	BC= PTR TO 13 BYTE BUFFER FOR CLOCK DATA
;	EXIT -	DE= ?
;
;************************************************************
CLKRDC:
	LD	E,C		;DE := PTR
	LD	D,B

	LD	C,CLKSECL	;WAIT FOR SECONDS TO CHANGE
	CALL	GETD
	AND	CLKDMSK		;MASK OFF UNWANTED BITS
	LD	B,A
CLKRWT:	CALL	GETD
	AND	CLKDMSK
	CP	B
	JR	Z,CLKRWT

	LD	B,12		;REGISTER CNT -1
	LD	(DE),A		;SAVE SECONDS
GETLP:	INC	DE		;PTR +1
	INC	C		;REGISTER + 1
	CALL	GETD
	LD	(DE),A		;PUT INTO BUFFER
	DJNZ	GETLP
	RET


;**********************************************************
;
;	CLOCK SET FUNCTION
;	ENTRY-	BC= CLOCK IMAGE BUFR PTR (13 BYTES LONG)
;	EXIT -	BC, DE= ?
;
;**********************************************************
CLKSET:
	LD	E,C		;DE := PTR
	LD	D,B

	LD	A,[1 SHL CLKHOLD]	;STOP CLOCK
	OUT	(CLKDAT),A
	LD	B,20		;DELAY >= 150us FROM HOLD
CLKSDL:	EX	(SP),HL
	EX	(SP),HL
	DJNZ	CLKSDL

	LD	B,13		;REGISTER COUNT
	LD	C,CLKSECL	;SET REGISTER #

CLKSLP:	LD	A,(DE)		;GET DATA
	SET	CLKHOLD,A	;INSURE HOLD BIT
	OUT	(CLKDAT),A	;OUTPUT DATA

	LD	A,C		;GET REG #
	OUT	(CLKCMD),A

	SET	CLKWRT,A	;OUTPUT WRITE STROBE
	OUT	(CLKCMD),A
	LD	A,C
	OUT	(CLKCMD),A

	INC	DE		;PTR +1
	INC	C		;REGISTER +1
	DJNZ	CLKSLP

	XOR	A		;CLEAR HOLD
	OUT	(CLKDAT),A
	OUT	(CLKCMD),A	;CLEAR COMMAND
	RET

	SUBTTL	SUPPORT SUBROUTINES
;***************************************
;
;	RETURN CLOCK DATA SUBR
;	ENTRY-	C= CLOCK REGISTER #
;	EXIT -	A= REGISTER DATA
;
;***************************************
GETD:	LD	A,C		;SET UP READ
	SET	CLKRD,A		;SET READ BIT
	OUT	(CLKCMD),A
	EX	(SP),HL		;DELAY >= 5us
	EX	(SP),HL
	IN	A,(CLKDAT)	;RETURN DATA
	RET


;****************************************
;
;	GET NUMBER SUBR
;	ENTRY-	DE= NUMBER PTR
;		H= MASK FOR HI BYTE
;	EXIT -	A= NUMBER
;		DE= PTR + 2
;
;****************************************
GETN:	PUSH	BC		;SAVE

	LD	A,(DE)		;GET LOW BYTE & SAVE IT
	AND	CLKDMSK
	LD	C,A

	INC	DE		;GET HI BYTE
	LD	A,(DE)
	AND	H		;MASK BITS
	LD	B,A		;SET CNT
	LD	A,C		;GET UNITS DIGIT
	JR	Z,NOTENS	;IF (TENS & MASK) == 0 THEN RETURN UNITS

	LD	C,10		;ELSE ADD TENS DIGIT
TENSLP:	ADD	A,C
	DJNZ	TENSLP

NOTENS:	INC	DE		;RETURN PTR TO NEXT FIELD
	POP	BC
	RET

	END