CLOCKASM;***************************************
;*					*
;*   Programm " CLOCK" fuer KC85/3/4	*
;*					*
;*  Uhrenprogramm mit CTC-Kanal 3 des	*
;*					*
;*    V 24 Moduls M003 (ADRESSE 0EH)	*
;*					*
;*    einschliesslich Datumsausgabe	*
;*					*
;* (Beruecksichtigung der Schaltjahre) *
;*					*
;* (c)  by   U. Karmrodt    07.05.1990	*
;*					*
;***************************************
;
;---------------------------------------
;	>>> Merkzellen <<<
;---------------------------------------
;
ZAE:	DEFB 57		;ZAEHLER 2
H0:	DEFB 0		;STUNDE
M0:	DEFB 0		;MINUTE
S0:	DEFB 0		;SEKUNDE
TA:	DEFB 1		;TAG
MO:	DEFB 1		;MONAT
JA:	DEFB 90H	;JAHR
FEN1:	DEFB 31		;FENSTER FUER
	DEFB 0		;DATUM
	DEFB 9
	DEFB 1
	DEFB 0
	DEFB 0
	DEFB 2		;STBT
FEN2:	DEFB 0		;ZU RETTENDES
	DEFB 0		;FENSTER
	DEFB 0
	DEFB 0
	DEFB 0
	DEFW 0
FEN3:	DEFB 1		;FENSTER FUER
	DEFB 0		;ZEIT
	DEFB 9
	DEFB 1
	DEFB 0
	DEFB 0
	DEFB 2
UP0:	DEFW 0		;ADRESSE UP 0
UP1C:	DEFW 0		;ADRESSE UP 1CH
VGL:	DEFB 0
;
;---------------------------------------
UPV:	JP (HL)		;UP VERTEILER
;---------------------------------------
;
;---------------------------------------
;
;	       >>> ISR <<<
;
;---------------------------------------
;ISR:	Teil Retten und Einstellen
;---------------------------------------
ISR:	CALL EIRETI	;SCHNELLER
			;ABSCHLUSS DER
			;ISR
	PUSH IX		;RETTEN
	PUSH HL
	PUSH DE
	PUSH BC
	PUSH AF
	LD C,88H
	IN A,(C)
	PUSH AF
	SET 1,A
	OUT (C),A
	LD HL,0B79CH
	LD DE,FEN2	;KOPIEREN
	LD BC,7		;AKTUELLES
	LDIR		;FENSTER
	LD HL,FEN1
	LD DE,0B79CH	;EINTRAGEN
	LD BC,7		;DATUM-
	LDIR		;FENSTER
	LD A,(H0)
	LD (VGL),A
	LD A,(ZAE)
	DEC A		;ZAEHLER DEC
	LD (ZAE),A
	JR NZ,ZWI	;NULL-KONTR.
	LD A,57
	LD (ZAE),A	;ZAEHL. LADEN
	LD A,(S0)
	ADD A,1		;SEK. HOCHZAEHL.
	DAA
	LD (S0),A
	CP 60H
	CALL Z,MIN	;KONTR. MINUT.
	JR WEI
;
;---------------------------------------
;    >>> Bildschirmausgabe Datum <<<
;---------------------------------------
;
DAT:	LD A,25
	LD HL,(UP0)
	CALL UPV
	LD A,(TA)
	LD HL,(UP1C)
	CALL UPV
	LD A,2EH
	LD HL,(UP0)
	CALL UPV
	LD A,(MO)
	LD HL,(UP1C)
	CALL UPV
	LD A,2EH
	LD HL,(UP0)
	CALL UPV
	LD A,(JA)
	LD HL,(UP1C)
	CALL UPV
	RET
;---------------------------------------
ZWI:	JR END		;STUETZSTELLE
;---------------------------------------
;    >>> Bildschirmausgabe Zeit <<<
;---------------------------------------
WEI:	LD A,(H0)
	LD HL,VGL
	CP (HL)
	CALL NZ,DAT
      	LD HL,FEN3
	LD DE,0B79CH
	LD BC,7
	LDIR
	LD A,25
	LD HL,(UP0)
	CALL UPV
	LD A,(H0)
	LD HL,(UP1C)
	CALL UPV
	LD A,2EH
	LD HL,(UP0)
	CALL UPV
	LD A,(M0)
	LD HL,(UP1C)
	CALL UPV
	LD A,3AH
	LD HL,(UP0)
	CALL UPV
	LD A,(S0)
	LD HL,(UP1C)
	CALL UPV
;
;---------------------------------------
;ISR:	Teil Rueckspeichern
;---------------------------------------
;
END:	LD HL,FEN2
	LD DE,0B79CH
	LD BC,7
	LDIR
	POP AF
	LD C,88H
	OUT (C),A
	POP AF
	POP BC
	POP DE
	POP HL
	POP IX
	RET
;---------------------------------------
EIRETI:	EI
	RETI
;---------------------------------------
;ISR:	Teil Std.,Min.,Sek.,Tag,Mon.
;	und Jahr hochzaehlen
;---------------------------------------
;
MIN:	LD A,0
	LD (S0),A
	LD A,(M0)
	ADD A,1		;MIN. HOCHZ.
	DAA
	LD (M0),A
	CP 60H		;TEST STUNDE
	CALL Z,STU
	RET
STU:	LD A,0
	LD (M0),A
	LD A,(H0)
	ADD A,1		;STUNDE HOCHZ.
	DAA
	LD (H0),A
	CP 24H		;TEST TAG
	CALL Z,TAG
	RET
TAG:	LD A,0
	LD (H0),A
	LD A,(TA)
        CP 28H		;TEST TAG<28
	JR C,PLUS
	LD A,(MO)
	CP 2		;TEST FEBRUAR
	JR Z,FEB
	LD A,(TA)
	CP 30H		;TEST TAG<30
	JR C,PLUS
        LD A,(MO)
	BIT 0,A		;TEST
	JR Z,MAR	;GERADER MONAT
	LD A,(TA)
	CP 31H		;TEST TAG<31
	JR C,PLUS
MAR:	LD A,1		;TAG AUF 1
	LD (TA),A
	CALL MON	;SPR. AUF MONAT
	RET
PLUS:	LD A,(TA)
	ADD 1		;TAG=TAG+1
	DAA
	LD (TA),A
	RET
FEB:	LD A,(JA)
	BIT 4,A		;Halbbyte ger.?
	JR NZ,TEST1
	BIT 1,A		;TEST BIT1=0
	JR Z,TEST2
	JR MAR
TEST2:	LD A,(TA)	;Test TAG=29
	CP 29H
	JR Z,MAR
	LD A,(JA)
      	BIT 0,A		;TEST BIT0=0
	JR NZ,MAR
	JR PLUS		;BIT0 u. BIT 1
			;SIND NULL ==>
			;DURCH 4 TEILBAR
			;==> SCHALTJAHR
TEST1:	BIT 1,A
	JR NZ,TEST2
	JR MAR
MON:	LD A,(MO)
	ADD 1		;MO=MO+1
	DAA
	LD (MO),A
	CP 13H		;TEST AUF JAHR
	CALL Z,JAHR
	RET
JAHR:	LD A,1		;MO=1
	LD (MO),A
	LD A,(JA)
	ADD 1		;JA=JA+1
	DAA
	LD (JA),A
	CP 100H		;TEST
			;JAHRHUNDERT-
			;WENDE
	CALL Z,NUSET
	RET
NUSET:	LD A,0		;JA=0
	LD (JA),A
	RET
;
;=======================================
;
	DEFW 7F7FH
	DEFM 'CLOCK'
	DEFB 1
	LD A,(0B781H)
	CP 0
	JR Z,STAR
	CP 6		;TEST ANZ. PAR.
	JR NZ,ZWI1	;PAR.<>6 SPRUNG
MM1:	LD B,A
	JR START
GROESS:	LD B,6
START:	LD HL,0B782H
	LD DE,H0
SCHL1:	LD A,(HL)
	LD (DE),A
	INC HL
	INC HL
	INC DE
	DJNZ SCHL1	;PAR. LADEN
STAR:	LD B,8
MM2:	LD C,80H
	IN A,(C)
	CP 0EEH		;V24 IM SYST.?
	JR Z,INIT
	INC B
	INC B
	INC B
	INC B		;SCHACHT HOCHZ.
	PUSH AF
	LD A,B
	CP 0F8H		;ENDE-TEST
	JR Z,SCHLUS
	POP AF
	JR MM2
SCHLUS:	POP AF
	CALL 0F003H
	DEFB 23H
	DEFM 'Keine V24 im System !'
	DEFW 0D0AH
	DEFB 0
	RET
INIT:	LD A,1
	OUT (C),A	;V24 EINSCHALTEN
	LD HL,0
	CALL UPIN	;UP-NR.
	LD (UP0),HL	;HOLEN
	LD HL,001CH	;UND
	CALL UPIN	;ABSPEICHERN
	LD (UP1C),HL
 	CALL DATUM
;
;---------------------------------------
;	CTC initialisieren
;---------------------------------------
;
	LD HL,ISR
	LD (1DCH),HL
	DI
	LD A,0D8H
	OUT (0CH),A
	LD A,0A7H
	OUT (0EH),A
	LD A,121
	OUT (0EH),A
	IM 2
	EI
        RET
;---------------------------------------
ZWI1:	JR NC,GROESS	;PAR.>6 SPRUNG
	JR MM1
;---------------------------------------
UPIN:	LD DE,(0B7B0H)	;UP-ADR.
	SLA L		;BERECHNEN
	SCF
	CCF
	ADD HL,DE
	LD E,(HL)
	INC HL
	LD D,(HL)
	EX DE,HL
	RET
;---------------------------------------
DATUM:	LD HL,0B79CH
	LD DE,FEN2
	LD BC,7
	LDIR
	LD HL,FEN1
	LD DE,0B79CH
	LD BC,7
	LDIR
	CALL DAT
	LD HL,FEN2
	LD DE,0B79CH
	LD BC,7
	LDIR
	RET
