;** TIME AND DATE SETTING PROGRAM **
	.LOC 	100H
	.PABS
	.PHEX
CONIN	=	6
CONOUT	=	9
DPIOB	=	0FAH
DPIOA	=	0F8H
SPIOA	=	0F9H
SPIOB	=	0FBH
J	=	4AH
K	=	4BH
U	=	55H
CR	=	0DH
LF	=	0AH
RVLF	=	0BH
ESC	=	1BH 
DSKFLG	=	0DA82H
TIMFLG	=	0DAADH
;
	JMP	START
;
DAYTBL:	.BYTE	32,29,32,31,32,31,32,32,31,32,31,32
;
BAKSEQ:	.BYTE	CR,RVLF+80H
SIGNON: .BYTE	ESC,5CH,ESC,"S","1"
	.ASCII	'    ATTACHE'
	.BYTE	ESC,"S","0",ESC,U,30H,"t","m",ESC,U,20H
	.ASCII	' DATE AND TIME UTILITY VERSION 1.8'	
	.BYTE	LF,CR
	.ASCII	'             COPYRIGHT 1982 OTRONA CORP., BOULDER, CO'
	.BYTE	CR,LF,LF,LF,ESC,U,24H
	.ASCII	'OPTIONS:'
	.BYTE	ESC,U,20H,CR,LF,LF
	.ASCII	' SET TIME    '
	.BYTE	ESC,U,24H,"T",ESC,U,20H,CR,LF
	.ASCII	' SET DATE    '
	.BYTE	ESC,U,24H,"D",ESC,U,20H,CR,LF
	.ASCII	' EXIT OPT    '
	.BYTE	ESC,U,24H,"E","S","C",ESC,U,20H,CR,LF
	.ASCII	' 0R PROG.'
OPTON:	.BYTE	ESC,"=",2BH,20H,ESC,"J"
	.ASCIS	' OPTION      '
;
HOURS:	.BYTE	ESC,"=",2DH,20H
	.ASCII	'ENTER TIME :'	
	.BYTE	CR,LF,LF	
	.ASCIS	'HRS (00-23): '	
;
MIN:	.BYTE	ESC,"=",30H,20H
	.ASCIS	'MIN (00-59): '
;
YRS:	.BYTE	ESC,"=",2DH,20H
	.ASCII	'ENTER DATE :'	
	.BYTE	CR,LF,LF
	.ASCIS	'YRS (00-99): '
;
MON:	.BYTE	ESC,"=",30H,20H
	.ASCIS	'MOS (01-12): '
;
DAY:	.BYTE	ESC,"=",31H,20H
	.ASCIS	'DAY (01-31): '
;
WEK:	.BYTE	ESC,"=",32H,20H
	.ASCII	'WEEK  (1-7): '
	.BYTE	ESC,"=",33H,20H	
	.ASCII	' DAY'	
	.BYTE	ESC,"=",32H,0ADH
;			
ESCAPE:	.BYTE	CR,LF,LF,LF
	.ASCII	'PRESS RETURN TO'
	.BYTE	CR,LF
	.ASCII	'ENTER, ESCAPE TO'
	.BYTE	CR,LF
	.ASCIS 	'CANCEL ENTRY   '
STATUS:	.BYTE	ESC,"=",24H,38H,ESC,U,26H
	.ASCII	'             CURRENT STATUS             '
	.BYTE	ESC,U,22H,ESC,"=",25H,38H
	.ASCII	'   HRS. MINS.   YRS MOS DAYS DAY OF WEEK'
	.BYTE	ESC,U,0A0H
NOTIME:	.BYTE	ESC,U,22H,ESC,"=",26H,38H	
	.ASCII	'  TIME NOT SET  '
	.BYTE	ESC,U,0A0H
NODATE:	.BYTE	ESC,U,22H,ESC,"=",26H,48H
	.ASCII	'      DATE NOT SET      '
	.BYTE	ESC,U,0A0H
CURTM1:	.BYTE	ESC,U,22H,ESC,"=",26H,38H
CURTIM:	.ASCII	'                '
	.BYTE	ESC,U,0A0H
CURDT1:	.BYTE	ESC,U,22H,ESC,"=",26H,48H
CURDAT:	.ASCII	'                        '
	.BYTE	ESC,U,0A0H
BADKEY:	.BYTE	ESC,"["	
	.ASCII	'  INVALID ENTRY'
	.BYTE	ESC,"]"+80H
TIMBAK:	.BYTE	ESC,"=",30H,2EH,ESC,"J"+80H
DATBAK:	.BYTE	ESC,"=",33H,24H,ESC,"J",ESC,"=",32H,2DH,ESC,"K"+80H
;******************************************
;*                                        *
;*               TIMESET                  *
;*					  *
;******************************************
;
;
START:	DI
	LXI	SP,2000H
	LHLD 	1
	LXI	D,7FH
	DAD	D
	SHLD	INV1+1
	SHLD	INV2+1
	XRA	A
	STA	OKIFLG
	MVI	B,0
	MVI	A,7
	CALL	W58174
	MVI	B,0FH
	XRA	A
	CALL	W58174
	MVI	B,4	
..L1:	PUSH	B
	MVI	B,0FH	
	CALL	R58174
	CPI	0FH
	POP	B
	JRNZ	..NSCK
	DJNZ	..L1
	CALL	OKISET	
..NSCK:	EI
	LXI	H,SIGNON	
	CALL	MESSG	;CLEAR SCREEN AND
	LXI	H,STATUS
	CALL	MESSG
START2:	CALL	DSPTIM
	LXI	H,OPTON
	CALL	MESSG
;
ESS:	CALL	COIN	
	CPI	1BH	;CTRL C TO EXIT	PROGRAM
	JZ	DONE
	ANI	0DFH
	CPI	"T"	;T TO SET TIME
	JRZ	TIM
	CPI	"D"	;D TO SET DATE
	JZ	DAT
	JMPR	  ESS
;
DONE:	LDA	TIMFLG
	ORA	A
	JRZ	START2
	JMP	0
;
TIM:	MOV	C,A
	CALL	COUT	
	LXI	H,HOURS
	CALL	MESSG
	MVI	B,4
	MOV	A,B
	STA 	LIMIT
	LXI	H,HRS10
;
TIM1:	CALL	COIN	
	CALL	CLTOND
	CPI	1BH	;ESC TO ABORT ENTRY
	JRZ	START2
	CPI	8	;BACKSPACE	
	JRNZ	TIM4	
TIM2:	CALL	BAKSPC
	JRNZ	TIM1
	JMPR	START2
;
TIM3:	CALL	INVALD
	JMPR	TIM1
;
TIM4:	CPI	30H	;KEY < 0 ?
	JM	TIM3
 	CPI	3AH	;> 9 ?
	JRNC	TIM3	
;
	MOV	M,A
	INX	H
	MOV	C,A
	CALL	COUT
	MOV	A,B
	CPI	3
	JRNZ	TIM6
;
	CALL	CHKHRS
	JRC	TIM5	
	CALL	BACKUP
	CALL	INVALD
	DCR	B
	JMPR	TIM1
;
TIM5:	PUSH	H
	LXI	H,MIN
	CALL	MESSG
	POP	H
	JMPR	TIM7
;
TIM6:	CPI	1
	JRNZ	TIM7
	CALL 	CHKMIN	;CHECK FOR VALID MINUTES
	JRC	TIM7	
	CALL	BACKUP
	CALL	INVALD
	DCR	B
	JMPR	TIM1
;
TIM7:	DJNZ    TIM1
	PUSH	H
	LXI	H,ESCAPE
	CALL	MESSG
	POP	H
	CALL	COIN
	CALL	CLTOND
	CPI	1BH
	JZ	START2
	CPI	8
	JRNZ	TIM8	
	PUSH	H
	LXI	H,TIMBAK
	CALL	MESSG
	POP	H
	DCX	H
	INR	B
	JMP	TIM1
;
TIM8:	CALL	SETIME
	JMP	START2
; ***************************
DAT:	MOV	C,A
	CALL	COUT
	LXI	H,YRS	;YYMMDDW
	CALL	MESSG
	MVI	B,8
	MOV	A,B
	STA	LIMIT
	LXI	H,HRS10
;
DAT1:	CALL	COIN	
	CALL	CLTOND
	CPI	1BH	;ESC TO ABORT ENTRY
	JZ	START2
	CPI	08	;BACKSPACE
	JRNZ	DAT4	
;
DAT2:	CALL	BAKSPC
	JRNZ	DAT1
	JMP	START2
;
DAT3:	CALL	INVALD
	JMPR	DAT1
;
DAT4:	CPI	30H	;KEY < 0 ?
	JM	DAT3	
	CPI	3AH	;> 9 ?
	JRNC	DAT3	
;
	MOV	M,A
	INX	H
	MOV	C,A
	CALL    COUT
	MOV  	A,B
 	CPI     7
	JRNZ	DAT5
;
	CALL	LEAP
	PUSH	H
	LXI	H,MON
	CALL	MESSG
	POP	H
;
DAT5:	CPI	5
	JRNZ	DAT7	
	CALL	CHKMOS
	JRC	DAT6	
	CALL	BACKUP
	CALL	INVALD
	DCR	B
	JMPR	DAT1
;
DAT6:	PUSH	H
	LXI	H,DAY
	CALL	MESSG
	POP	H
	JMPR	DAT10
;
DAT7:	CPI	3
	JRNZ	DAT9
	CALL	CHKDAY
	JRC	DAT8
	CALL	BACKUP
	CALL	INVALD
	DCR	B
	JMPR	DAT1
;
DAT8:	PUSH	H
	LXI	H,WEK
	CALL	MESSG
	POP	H
	JMPR	DAT10
;
DAT9: 	CPI	2
     	JRNZ    DAT10	;CHECK FOR VALID DAY OF WEEK
	DCX	H
	PUSH	D
	MOV	D,M
	LDA 	OKIFLG
	ORA	A
	JRZ	..DT9S
	DCR	M
..DT9S:	INX	H
	MOV	A,D
	POP	D
	CPI	31H
	JM	DAT11
	CPI	38H
	JRNC	DAT11
;
DAT10:	DCR	B
	MOV	A,B
	CPI	1
	JNZ	DAT1
	PUSH	H
	LXI	H,ESCAPE
	CALL	MESSG
	POP	H
	CALL	COIN
	CALL	CLTOND
	CPI	1BH
	JZ 	START2
	CPI	08H
	JRNZ	DAT12	
	PUSH	H
	LXI	H,DATBAK
	CALL	MESSG
	POP	H
	DCX	H
	INR	B
	JMP	DAT1
;
DAT12:	CALL	SETDAT
	JMP	START2
;
DAT11:	MVI	C,8
	CALL	COUT
	MVI	C,20H
	CALL	COUT
	MVI	C,8
	CALL	COUT
	INR	B
	DCX	H
	CALL	INVALD
	JMPR	DAT10
;
;***************************
;
CHKMOS:	MVI	A,13
	MVI	D,9
	JMPR	CHKGEN
;
CHKHRS:	MVI	A,24
	JMPR	CHKGN1	
;
CHKMIN:	MVI	A,60
;
CHKGN1:	MVI	D,0
CHKGEN:	STA 	CHKCHG+1
	MOV	A,D	
	STA	CHKCG1+2
	PUSH	B
	DCX	H	;CHECK HOURS,MINUTES,OR MONTHS
	MOV	A,M	;FOR VALID INPUT
	DCX	H
	MOV 	B,M
	INX	H
	INX	H
	CALL	ASCBIN
	POP	B
CHKCG1:	ORA	A
	JRZ	NOGOOD	;MODIFIABLE
	JM	NOGOOD
CHKCHG:	CPI	00	;MODIFIABLE 
	STA	MONTH
	RC
;
NOGOOD:	XRA	A	
	RAL
	RET
;
CHKDAY:	PUSH	B
	DCX	H
	MOV	A,M
	DCX	H
	MOV	B,M
	INX	H
	INX	H	;CHECK INPUTTED DAY
	PUSH	H
	CALL	ASCBIN	;FOR MAX
	ORA	A
	JRZ	..J1
	PUSH	PSW
	LXI	H,DAYTBL-1
	LDA	MONTH
	MOV	E,A
	MVI	D,0
	DAD	D
	MOV	B,M
	POP	PSW
	CMP	B
..J1:	POP	H
	POP	B
	RC
	JMPR	NOGOOD
;
;
LEAP:	PUSH	B
	DCX	H
	MOV	A,M
	DCX	H	;CHECK FOR LEAP YEAR
	MOV	B,M					
	INX	H
	INX	H	;ADJUST DAYTBL FOR 
	CALL	ASCBIN	;29 DAYS IN FEB.
..L1:	SUI	4
	JP	..L1	;IF NECESSARY
	ADI	4
	MOV	B,A
	MVI	A,29
	JRNZ	..J1
	INR	A
..J1:	STA	DAYTBL+1
	MOV	A,B
	STA	LEPFLG
	POP	B
	RET
;
;******************************
;
OKISET:	LXI	H,05FFH	
	SHLD	CHG2+1
	MVI	A,0C9H	;ADJUST FOR OKI CHIP
	STA	CHG1
	MVI	A,0ACH
	STA	W58174+14
	MVI	A,0A8H
	STA	R58174+15
	STA	OKIFLG
	LXI	H,0C05H	
	SHLD	CHG3+1
 	RET
;
;**********************************
;
RD5101:	CALL	SU5101
	MVI	A,0FH
	CALL	RWPORT
	MOV	A,D
	OUT	DPIOA
	MVI	C,DPIOB
	MOV	A,E
	ORI	0B4H
	JMPR	RCOMON
;
WR5101:	CALL	SU5101
	XRA	A
	CALL	RWPORT
	MOV	A,D
	OUT	DPIOA
	MVI	C,DPIOB
	MOV	A,E
	ORI	0B0H
	JMPR	WCOMON
;
SU5101:	CALL	PACK
	MOV	D,A
	MOV	A,C
	ANI	30H
	RRC
	RRC
	RRC
	RRC
	MOV	E,A
	RET
;
R58174:	CALL	PACK
	MOV	D,A
	MVI	A,0FH
	CALL	RWPORT
	MOV	A,D
	OUT	DPIOB
	MVI	C,DPIOB
	MVI	A,0ACH
;
RCOMON:	OUTP	A
	ANI	0DFH
	OUTP	A
	IN	DPIOA	
	MOV	B,A
	JMPR	DSLC
;
W58174:	CALL	PACK
	MOV	D,A
	XRA	A
	CALL	RWPORT
	MOV	A,D
	OUT	DPIOA
	MVI	C,DPIOB
	MVI	A,0A8H
	JMPR	WCOMON
;
RWPORT:	MVI	C,SPIOA	
	MVI	B,0CFH
	DI
	OUTP	B
	OUTP	A
	RET
;
WCOMON:	OUTP	A
	ANI	0DFH
	OUTP	A
DSLC:	MVI	A,0A0H
	OUTP	A
	MOV	A,B
	ANI	0FH
	RET
;
PACK:	MOV	C,B
	ANI	0FH	;PACK LOW NIBBLE OF B AND A
	MOV	D,A	;INTO ONE BYTE
	MOV	A,B
	SLAR	A
	SLAR	A
	SLAR	A
	SLAR	A
	ORA	D
	RET
;
;*********************************
;
;
ASCBIN:	ANI	0FH
	MOV	C,A
	XRA	A
	RAL
	MOV	A,B	;CONVERT ASCII IN
	ANI	0FH	;B AND A TO BINARY
	MOV	B,A
	RAL
	RAL
	RAL
	ADD	B
	ADD	B
	MOV	B,A
	MOV	A,C
	ADD	B
	RET
;
SETIME:	MVI	A,0EH
	MVI	B,3	;SET FLAG IN CMOS RAM
	CALL	WR5101
	EI
	LDA	OKIFLG
	ORA	A	;SKIP THIS PART FOR
	JRNZ	..J1	;OKI CHIP
	XRA	A
	MVI	B,0EH
	CALL	W58174
	EI
	JMPR	CHG2
..J1:	MVI	C,4
	LDA	HRS10
	CPI	1	;SET UP FOR AM/PM
	JM	..J2	;12/24 HOUR FORMAT
	CPI	2
	JRZ	..J4
	LDA	HRS
	CPI	3
	JM	..J2
..J4:	MVI	C,0CH
..J2:	LDA	HRS10
	ORA	C
	STA	HRS10
	LXI	H,0	;SET SECONDS TO 0
	SHLD	SEC10
CHG2:	LXI	B,0701H
LOOP2:	LXI	H,HRS10
..L1:	PUSH	B
	PUSH	H
	MOV	A,M
	CALL	W58174	;WRITE TIME TO CHIP
	EI
	POP	H
	POP	B
	DCR	B
	INX	H
	MOV	A,B				
	CMP	C
	JRNZ	..L1
	CALL 	DSPTIM
CHG1:	MVI	A,1	;RETURN HERE IF OKI
	MVI	B,0EH
	CALL	W58174
	EI	
	CALL	DSPTIM
	RET
;
SETDAT:	MVI 	A,05H
	MVI	B,4	;SET FLAG IN CMOS RAM
	CALL	WR5101
	LXI	H,HRS10	
	MOV	A,M	;WRITE YEAR TO CMOS RAM
	MVI	B,0DH
	CALL	WR5101
	EI
	LXI	H,HRS
	MVI	B,0CH	
	MOV	A,M
	CALL	WR5101
	EI
	LDA	OKIFLG
	ORA	A	;SKIP THIS PART
	JRZ 	..J1	;FOR NATIONAL CHIP
	LDA	LEPFLG
	ORA	A
	JRNZ	CHG3	
	LDA	SEC10
	ORI	4	;SET LEAP BIT IF LEAP YEAR
	STA	SEC10
	JMPR	CHG3	
;
..J1:	LDA	LEPFLG
	ANI	7
	INR	A	
	MOV	B,A
	MVI	A,10H
..L1:	RAR
	DJNZ	..L1
	STA	HRS10	;REARRANGE FORMAT FOR NATIONAL CHIP
	LHLD	MINS10
	SHLD	HRS
	LDA	OKIBYT
	STA	MINS
;
	XRA	A	;WRITE DATE TO CHIP
	MVI	B,0E0H
	CALL	W58174
	EI
CHG3:	LXI	B,0D07H
	JMP	LOOP2
;
MESSG:	MOV	C,M
	BIT	7,C
	RES	7,C	;OUTPUT ASCII UNTIL
	INX	H	;BIT 7=1
	JNZ	COUT
	CALL	COUT
	JMPR	MESSG
;
BAKSPC:	LDA	LIMIT
	CMP	B
	RZ
	INR	B
	DCX	H
	PUSH	H
	PUSH	B
	BIT	0,B
	JRZ	S1
	LXI	H,BAKSEQ
	CALL	MESSG
	MVI	B,15	
..L1:	MVI	C,0CH
	CALL	COUT
	DJNZ	..L1
S1:	MVI	C,8
	CALL	COUT
	MVI	C,1BH	
	CALL	COUT
	MVI	C,4AH
	CALL	COUT
	XRA	A
	INR	A		
	POP	B
	POP	H
	RET
;
BACKUP:	PUSH	H
	LXI	H,BAKTWO
	CALL	MESSG
	POP	H
	DCX	H
	DCX	H
	INR	B
	INR	B
	RET
BAKTWO:	.BYTE	08H,20H,08H,08H,20H,88H
;	
CLTOND:	PUSH	PSW
	PUSH	B
	MVI	C,ESC	;CLEAR TO END
	CALL	COUT	;OF SCREEN
	MVI	C,"K"
	CALL	COUT
	POP	B
	POP	PSW
	RET
;
INVALD:	PUSH	H
	PUSH	B
	MVI	A,0FFH
INV1:	STA	DSKFLG
	LXI	H,BADKEY
	CALL	MESSG
	XRA	A
	RLC
INV2:	STA	DSKFLG
	POP	B
	POP	H
	RET	
;
DSPTIM:	XRA	A
	STA	BOTH
	MVI	B,3	
	CALL	RD5101
	CPI	0EH	
 	EI		;CHECK FLAGS IN CMOS RAM
	JRZ	..D1
..D2:	LXI	H,NOTIME
	CALL	MESSG
	JMP	..J1
..D1:	MVI	C,ESC
	CALL	COUT
	MVI	C,'>'
	CALL	COUT
	LXI 	H,HRS10
	MVI 	B,6
..L1:	CALL	COIN	
	CPI	"?"	
	JRZ	..D2
	MOV	M,A
	INX	H	;DISPLAY TIME
	DJNZ	..L1
	LXI	H,SECS		
	MOV	A,M
	CPI	30H
	JRNZ	..L2
	MVI	A,20H
..L2:	STA 	CURTIM+4
	DCX	H
	MOV	A,M
	STA	CURTIM+5
	DCX	H
	MOV	A,M
	STA	CURTIM+9
	DCX	H	
	MOV	A,M
	STA	BOTH
	STA	CURTIM+10
	LXI	H,CURTM1
	CALL	MESSG
..J1:	MVI	B,4
	CALL	RD5101
	EI
	CPI	5
	JRNZ	NODAT
	MVI	C,ESC
	CALL	COUT
	MVI	C,':'
	CALL	COUT
	LXI	H,HRS10
	MVI	B,7	;AND DISPLAY
..L4:	CALL	COIN
	CPI	"?"	
	JRZ	NODAT
	MOV	M,A	
	INX	H
	DJNZ	..L4
	LXI	H,OKIBYT
	MOV	A,M
	CPI	30H
	JRNZ	..L5
	ANI	20H
..L5:	STA	CURDAT+1
	DCX	H
	MOV	A,M
	STA	CURDAT+2
	DCX	H
	MOV	A,M
	STA	CURDAT+5
	DCX	H
	MOV	A,M
	STA	CURDAT+6
	DCX	H
	MOV	A,M	
	STA	CURDAT+9
	DCX	H
	MOV	A,M
	STA	CURDAT+10
	DCX	H
	MOV	A,M
	STA	CURDAT+18
	LXI	H,CURDT1
	CALL	MESSG
	LDA	BOTH
	ORA	A
	RZ
	MVI	A,0FFH
	STA	TIMFLG
	RET
NODAT:	LXI	H,NODATE
	JMP	MESSG
;
COUT:	PUSH	H
	LHLD	1
	LXI	D,CONOUT
	DAD	D
	LXI	D,.+5
	PUSH	D
	PCHL
	POP	H
	RET
;
COIN:	PUSH	H
	LHLD	1
	LXI	D,CONIN
	DAD	D
	LXI	D,.+5
	PUSH	D
	PCHL
	POP	H
	RET
;
OKIFLG:	.BLKB	1
LEPFLG:	.BLKB	1
MONTH:	.BLKB	1
HRS10:	.BLKB	1
HRS:	.BLKB	1
MINS10:	.BLKB	1
MINS:	.BLKB	1
SEC10:	.BLKB	1
SECS:	.BLKB	1
OKIBYT:	.BLKB	1
LIMIT:	.BLKB	1
BOTH:	.BLKB	1
	.XSYM
	.END
