;================================================================
;CP/M 2.2 f}r vortex-Speichererweiterung: Uhrzeit anzeigen
;Datei OSC4TIME.MAC Version 18-Dez-88
;Include f}r OSC4BANK.MAC

;Z80DOS-Kompatible Uhrzeit auf Wunsch st{ndig am Bildschirm einblenden

	.COMMENT @
	public shtime,stclck,gotime
lock:	dw 0
nbuff:	db 0FFh,0FFh,0FFh	;Ergebnis des Uhrlesens ablegen
	@

;******	Int-Bildschirmausgabe w{hrend Routinenausf}hrung sperren
stclck:	ld a,255
	ld (lock),a		;Flag, da~ Scroll gerade ausgef}hrt
	pop hl			;auszuf}hrende Routine
	call ipchl
	ld a,(lock+1)		;Interrupt wartend?
	and a
	ld b,a			;Anzahl der ge{nderten Register
	call nz,uhrzeit		;dann im Hauptprogramm anzeigen
	ld hl,0
	ld (lock),hl
	ret

;******	Routine in HL ausf}hren
ipchl:	jp (hl)

;******	Uhr am Bildschirm neu anzeigen
shtime:	ld a,255
	ld (lock),a
	xor a
 	ld hl,0018h
	ld de,4718h
	call SCR_FILL_BOX
	ld hl,4A18h
	ld a,':'
	call uchar
	ld hl,4D18h
	ld a,':'
	call uchar
	di		;erzwingen, da~ alle Register gelesen
	ld hl,nbuff
	ld b,3
clrbf:	ld (hl),255
	inc hl
	djnz clrbf
	ei
	call KL_L_ROM_DISABL
	push af
	call gettime	;Uhrenregister einlesen B: Anzahl der Register
	pop af
	call KL_ROM_RESTORE
	call uhrzeit	;Zeit anzeigen
	ld hl,0
	ld (lock),hl
	ret

;******	Im Interrupt: Uhr aktualisieren
gotime:	call txt_get_window	;Darstellung notwendig?
	ld a,e
	cp 17h
	ret nz		;Statuszeile nicht aktiviert
	call gettime	;B := Anzahl der ge{nderten Register
	ld a,(lock)	;Kollision mit Bildschirmausgabe?
	and a
	jr z,uhrzeit	;Uhrzeit anzeigen B:= Registerzahl
	ld a,b			;Anzahl der Register (# 0)
	ld (lock+1),a		;Ausgabe zur}ckgestellt Signalisieren
	ret

;Uhrzeit auf Bildschirm aktualisieren B:= Anzahl der Register
uhrzeit:ld de,4F18h	;Zeit anzeigen, sofern Ziffer umgesprungen
	ld hl,nbuff+2
	call disp2	;Sekunden Einer/Zehner
	ret z
	dec d		;Freiraum ]berspringen
	call disp2	;Minuten Einer/Zehner
	ret z
	dec d		;Stunden
disp2:	ld a,(hl)
	and 0Fh
	call zdisp
	ld a,(hl)
	rrca
	rrca
	rrca
	rrca
	and 0Fh
	call zdisp
	dec hl
	dec b
	ret
zdisp:	add a,'0'
;Zeichen an Spalte D, Zeile E ausgeben. Danach DEC D
char:	push hl
	push de
	push bc
	ex de,hl	;Cursorpos.
	call uchar
	pop bc
	pop de
	pop hl
	dec d
	ret

;Uhrzeit von Z{hler-Speicher einlesen
gettime:di
	ld b,0
	ld hl,nbuff+2		;Register Immer nach NBUFF kopieren
	ld de,X_Time+4
gtnxt:	ld a,(de)
	cp (hl)
	jr z,gtend
	ld (hl),a
	dec hl
	dec de
	inc b
	ld a,b
	cp 3
	jr c,gtnxt
gtend:	ei
	ret

;******	Zeichen f}r Uhr auf Screen ausgeben
uchar:	ld c,a
	call KL_L_ROM_ENABLE
	push af
	ld a,(vidatt)		;Video-Attribute l|schen
	push af
	xor a
	ld (vidatt),a
	ld a,c
	call charus	;tbuffer wird hier nicht verwendet
	pop af
	ld (vidatt),a
	pop af
	jp KL_ROM_RESTORE
;================================================================
                                  