;
 ; HD-2416 4 char 7x5 clock
 ; with blankink one sec hour and min alternative
 ;
 ; HDLGCLK2.S
 ; versione plus
 ;
 ; rev. 0  tc:
 ;
 ; tu23oct01  XD.
 ; jul06 XD.  Z-th inc.
 ; jan07 XD.  Z-th inc.
 ; apr13 zantaz
 ;
 ; by Mariani Antonio
 ; ( Z-tech by zantaz )
 ; zantaz@libero.it
 ; http://digilander.libero.it/zantaz/
 ; on Internet april 2013
 ;
 ; This program is licensed under the GNU General Public License.
 ; See the file `COPYING' for details
 ;
 ; integrati usati :
 ; - microcontrollore Z86E04 ( 1K rom )
 ; - display intelligente ( 4 char alfanumerici )
 ;
 ; scritto interamente in Assembler Z8@
 ;
 ; HDCLK.S
 ;
 ; Z8	dir	outside
 ; P00	o	A0
 ; P01	o	A1
 ; P02	o	/WR
 ; P20	o	DB0
 ; P21	o	DB1
 ; P22	o	DB2
 ; P23	o	DB3
 ; P24	o	DB4
 ; P25	o	DB5
 ; P26	o	DB6
 ; P27	o	CU
 ; P31	i	hour plus
 ; P32	i	min plus
 ; P33	i	min minus
 ;
 ;
INTREG	.equ 00H
WORKREG	.equ 10H
CLOCKRG .equ 20H
 ;
 ;
 ; free	.equ R0
 ; free .equ R1
 ; free .equ R2
 ; free .equ R3
 ;
DELAYRH .equ R4
DELAYRL	.equ R5
 ;
TEMP	.equ R6
 ;
HOUR    .equ R7
MIN     .equ R8
SEC     .equ R9
SEC10   .equ R10
COUNT40 .equ R11
 ;
HOURLC	.equ %27
MINLC	.equ %28
SECLC	.equ %29
SEC10LC .equ %2a
CNT40LC .equ %2b
 ;
TEMPLC	.equ %26
 ;
 ; keys macro
THPLUS	macro
        TM P3,#00000010B ; P31
        macend
TMPLUS	macro
        TM P3,#00000100B ; P32
        macend
TMMINUS	macro
        TM P3,#00001000B ; P33
        macend
TMIPL	macro
        TM P3,#00001100B ; P32 & P33
        macend
 ;
 ;
 ;
 ;	+---------+
 ;	| OTP ROM |
 ;	+---------+
 ;
 ; 6 words table for int ...
        .org 0000H
        .word 0FFFFH
        .word 0FFFFH
        .word 0FFFFH
        .word 0FFFFH
        .word T0INT
        .word 0FFFFH
 ;
        .org 000CH
 ; start from reset
INIT    
 ; disable int
	DI
 ; set ports
	LD P2M,#00H	; P20-P27o
	LD P3M,#11B	; P3 digital P2 active
	LD P01M,#100B	; P0 out SP internal
 ; set timer
	LD T0,#50  ; 2.5 ms t0
	LD PRE0,#11001001B ; div 50
	LD TMR,#3  ; load enbl t0
 ; irq4 enabl  max pri
	LD IMR,#00010000B
	CLR IRQ
	LD IPR,#00000011B
 ; set stack pointer
	CLR SPH		; SP at 0080H
	LD SPL,#80H
 ;
 ; all data are in bcd format
 ; special date for me !
	SRP #CLOCKRG
	LD HOUR,#01H  ; hour
	LD MIN,#30H   ; min
	CLR SEC
	CLR SEC10
	CLR COUNT40
 ;
	SRP #WORKREG
 ;
 	LD P0,#100B
	LD P2,#00H
 ;
	LD P2,#00000010B	; ext function disable, do not blank chr, no cursor
 ; 
	LD P0,#011B		; digit 3 left most chr
	LD P0,#111B
	LD P0,#010B		; digit 2
	LD P0,#110B
 ;
	LD P2,#00001010B	; ext function disable, do not blank chr, no cursor
 ; 
	LD P0,#001B		; digit 1
	LD P0,#101B
	LD P0,#000B		; digit 0 right most chr
	LD P0,#100B
 ;
 ; ciclo principale
LOOP	EI	; abilita le int.
 ;
	CALL DISPLAY
 ; testa hour plus button	
LP03	THPLUS
	JR NZ,LP00
 ;
LP02	ADD HOURLC,#1
	DA HOURLC
	CP HOURLC,#24H   ; hour
	JR ULT,LP01
	CLR HOURLC
 ;
LP01	CALL DISPLAY
 ;
	CALL DELAYLP
 ;
	JR LP03
 ; testa min plus button
LP00	TMPLUS
	JR NZ,LP04
 ;
	ADD MINLC,#1
	DA MINLC
	CP MINLC,#60H    ; min
	JR ULT,LP06
	CLR MINLC
LP06
 ; resetta cnt40 & sec10 & sec
	CLR CNT40LC
	CLR SEC10LC
	CLR SECLC
 ;
	CALL DISPLAY
 ;
	CALL DELAYLP
 ;
	JR LP00
 ; testa min minus button
LP04	TMMINUS
	JR NZ,LP08
 ;
	SUB MINLC,#1
	DA MINLC
	CP MINLC,#00H    ; min
	JR Z,LP05
	LD MINLC,#59
LP05
 ; resetta cnt40 & sec10 & sec
	CLR CNT40LC
	CLR SEC10LC
	CLR SECLC
 ;
	CALL DISPLAY
 ;
	CALL DELAYLP
 ;
	JR LP04
 ;
LP08	JR LOOP
 ;
 ;
 ;     +-------------+
 ;     | sub-ROUTINE |
 ;     +-------------+
 ;
 ; display clock on 4 alfanum
 ;
DISPLAY
 ;
 ; digit 3 left most chr
 ; decine ore
 ; se decine == 0 stampa spazio
	LD TEMPLC,MINLC
	CP TEMPLC,#0
	JR NZ,L00
	LD TEMPLC,#' '
	JR L01
L00	SWAP TEMPLC
	AND TEMPLC,#0FH
	ADD TEMPLC,#'0'
L01	OR TEMPLC,#80H
	LD P2,TEMPLC
	LD P0,#011B
	LD P0,#111B
 ; digit 2
 ; unita' ore
	LD TEMPLC,MINLC
 	AND TEMPLC,#0FH
 	ADD TEMPLC,#'0'
 	OR TEMPLC,#80H
 	LD P2,TEMPLC
 	LD P0,#010B
 	LD P0,#110B
 ; digit 1
 ; decine minuti
 	LD TEMPLC,SECLC
 	SWAP TEMPLC
 	AND TEMPLC,#0FH
 	ADD TEMPLC,#'0'
 	OR TEMPLC,#80H
 	LD P2,TEMPLC
 	LD P0,#001B
 	LD P0,#101B
 ; digit 0 right most chr
 ; unita' minuti
 	LD TEMPLC,SECLC
 	AND TEMPLC,#0FH
 	ADD TEMPLC,#'0'
 	OR TEMPLC,#80H
 	LD P2,TEMPLC
 	LD P0,#000B
 	LD P0,#100B
 ;
	RET
 ;
 ;
 ;	+-------------------+
 ; 	| Interrupt Routine |
 ;	+-------------------+
 ;
 ;
 ; 2.5 ms on every interrupt call
 ; 2.5 ms * 40 = 0.1 sec
 ; 2.5 ms * 100 = 0.25 sec (250 ms) T0 state increment
 ;
 ; CLOCKRG 20H
 ; 
 ; R7  
 ; R8
 ; R9
 ; R10
 ; R11
 ; R12
 ; R13
 ; R14
 ; R15
 ;
T0INT
 ;
	PUSH RP
	SRP #CLOCKRG
 ; contatore 40
	INC COUNT40
	CP COUNT40,#40 ; 40 count
	JR ULT,ENDCL
	CLR COUNT40
 ; decimi di secondo
	INC SEC10
	CP SEC10,#10   ; 1/10 sec
	JR ULT,ENDCL
	CLR SEC10
 ; secondi
	ADD SEC,#1
	DA SEC
	CP SEC,#60H    ; sec
	JR ULT,ENDCL
	CLR SEC
 ; minuti
	ADD MIN,#1
	DA MIN
	CP MIN,#60H    ; min
	JR ULT,ENDCL
	CLR MIN
 ; ore
	ADD HOUR,#1
	DA HOUR
	CP HOUR,#24H   ; hour
	JR ULT,ENDCL
	CLR HOUR
 ;
ENDCL	POP RP
	IRET
 ;