	TITLE 'Testprogramm zur Uhr'

; MC80 Version 1.0
; 09.07.88

    ; Z80 macro library instruction definitions

	maclib z80

    ; common control characters

cr	equ 13
lf	equ 10
bell	equ 7

;**************************************************************
; Vereinbarungen
;**************************************************************

bdos	equ	5

uhrbas	equ	60h

zmon	equ	uhrbas+0
mon	equ	uhrbas+2
ztag	equ	uhrbas+4
tag	equ	uhrbas+6
zjahr	equ	uhrbas+8
jahr	equ	uhrbas+10

zhod	equ	uhrbas+0
hod	equ	uhrbas+2
zmin	equ	uhrbas+4
min	equ	uhrbas+6
zsec	equ	uhrbas+8
sec	equ	uhrbas+10

uhrctr	equ	uhrbas+14

ht	equ	2
vt	equ	1

;**************************************************************
; Programm
;**************************************************************

anf:
	lxi h,amonat ! mvi c,zmon
	push h ! push b
wreadydat:
	mvi a,2 ! out uhrctr	; Einstellen Datumsabfrage
readdat1:
	call	eing1
	bit 3,a
	jrnz wreadydat
	ani	3		; Auswertung fuer fuehrende Stellen
	mvi	b,3
	mvi	e,'0'
	lxi	h,codtab1
readdat2:
	cmp	m
	jrz	readdat3
	inr	e
	inx	h
	djnz	readdat2
	mvi	e,'X'
readdat3:
	pop b ! pop h
	mov m,e
	mvi b,1			; 1. nur 1 Wert
	mvi e,3			; 1 * 1 + 2 * 2 Werte
	push d
	jr loop
loopsc:
	push d ! mvi b,2
loop:
	inr c ! inr c ! inx h
	call readin ! mov m,d
	djnz loop
	inx h ! pop d ! dcr e
	jrnz loopsc

; Datum ausschalten
	mvi a,0 ! out uhrctr	; Einstellen Uhrabfrage
start:
	lxi h,ahod ! mvi c,zhod
	push h ! push b
wreadytim:
	mvi a,2 ! out uhrctr	; Tag auf Sekunden noch aus
	mvi a,0 ! out uhrctr
readtim1:
	call	eing1
	bit 3,a
	jrz wreadytim
startw:
	ani	3		; Auswertung fuer fuehrende Stellen
	mvi	e,'0'
	mvi	b,3
	lxi	h,codtab1
readtim2:
	cmp	m
	jrz	readtim3
	inr	e
	inx	h
	djnz	readtim2
	mvi	e,'X'
readtim3:
	pop b ! pop h
	mov m,e
	mvi b,1			; 1. nur 1 Wert
	mvi e,3			; 1 * 1 + 2 * 2 Werte
	push d
	jr uloop
uloopsc:
	push d ! mvi b,2
uloop:
	inr c ! inr c ! inx h
	call readin ! mov m,d
	djnz uloop
	inx h ! pop d ! dcr e
	jrnz uloopsc

	lxi h,bmonat
	lxi d,amonat
	mvi b,aend-amonat
vergleich:
	ldax d
	cmp m
	jrnz	nichtgleich
	inx	h
	inx	d
	djnz vergleich
	jr gleich
nichtgleich:
	lxi	h,amonat
	lxi	d,bmonat
	lxi	b,aend-amonat
	ldir
	lxi	d,anzeige
	mvi	c,9
	call	bdos
gleich:
	mvi	e,0ffh
	mvi	c,6
	call	bdos
	sui	30h
	jz	0
	in	06h
	sui	30h
	cpi	4
	jc	ausgabe
	xra	a
ausgabe:
	out uhrctr
	lxi h,ahod ! mvi c,zhod
	push h ! push b
	call	eing1
	jmp	startw

; Unterprogramme

readin:
	push h ! push b
readin1:
	call	eing
	push	psw
	ani	1fh		; Auswertung fuer normale Stellen
	lxi	d,3030h
	mvi	b,10
	lxi	h,codtab
readloop1:
	cmp	m
	jrz	readwert1
	inr	d
	inx	h
	djnz	readloop1
	mvi	d,'X'
readwert1:
	ani	7		; Auswertung fuer fuehrende Stellen
	mvi	b,3
	lxi	h,codtab1
readloop2:
	cmp	m
	jrz	readwert2
	inr	e
	inx	h
	djnz	readloop2
	mvi	e,'X'
readwert2:
	pop psw ! pop b ! pop h
	ret

eing0:	pop	psw
eing:	inp	a
	bit	5,a
	jrz	eing
	inp	a
	bit	5,a
	jrz	eing
	push	psw
	inp	a
	bit	5,a
	jrz	eing0
	pop	psw
	ret

eing10:	pop	psw
eing1:	inp	a
	bit	2,a
	jrz	eing1
	inp	a
	bit	2,a
	jrz	eing1
	push	psw
	inp	a
	bit	2,a
	jrz	eing10
	pop	psw
	ret

anzeige:
	db	cr,9
amonat:	db	'  /'
atag:	db	'  /'
ajahr:	db	'    '
ahod:	db	'00:'
amin:	db	'00:'
asec:	db	'00$'
aend:

bmonat:	db	'  /'
	db	'  /'
	db	'    '
	db	'00:'
	db	'00:'
	db	'00$'
bend:

codtab1:
	db	00011b		; 0
	db	00001b		; 1
	db	00000b		; 2

codtab:	db	10000b		; 0
	db	11101b		; 1
	db	01000b		; 2
	db	01100b		; 3
	db	00101b		; 4
	db	00110b		; 5
	db	00010b		; 6
	db	11100b		; 7
	db	00000b		; 8
	db	00100b		; 9


	ds	64
stack:
	end
