.Z80
;
;********************************************
;* Interrupt - Uhr                          *
;* (c)    Michael Lutz        19.09.1988    *
;* Programm an Adresse B380 im Sound Buffer *
;********************************************
;
ADDR	EQU	0B380H	     ; Adresse im Sound Buffer
ADDR1	EQU	0B200H	     ; Adresse der Installation
;
BDOS	EQU	5	     ; BDOS Call
FIRM	EQU	0FC5AH	     ; Firmware Aufruf
ADDT	EQU	0BCE9H	     ; Ticker einhaengen
WRCHAR	EQU	0BB5DH	     ; Zeichen auf Bildschirm
CURPOS	EQU	0BB78H       ; Cursorposition holen
COLUMN	EQU	0BB6FH	     ; Cursorposition Spalte setzen
ROW	EQU	0BB72H	     ; Cursorposition Zeile setzen
SETCUR	EQU	0BB75H	     ; Cursor positionieren
STUMIN	EQU	0FBF6H	     ; Speicherzellen mit Uhrzeit
;
INIT:
	LD	BC,0001	     ; Bank 1 auf Bank 0
	CALL	0FC57H	     ; Kopieren vorbereiten
	LD	DE,START     ; Quelle auf DE
	LD	BC,ENDE1-START;Laenge auf BC
	LD	HL,ADDR	     ; Ziel   auf HL
	CALL	0FC4BH	     ; Code kopieren
	LD	BC,0001	     ; Bank 1 auf Bank 0
	CALL	0FC57H	     ; Kopieren vorbereiten
	LD	DE,BEGIN     ; Quelle auf DE
	LD	BC,END-BEGIN ; Laenge auf BC
	LD	HL,ADDR1     ; Ziel auf HL
	CALL	0FC4BH	     ; Code kopieren
	CALL	FIRM	     ; Installationsroutine in Bank 0
	DEFW	ADDR1	     ; auf Adresse 0B200H aufrufen
	RET		     ; Zurueck ins CP/M
	DEFB	'COPYRIGHT MICHAEL LUTZ'
	DEFB	'19.09.1988 (c)'
;
BEGIN:	DI		     ; Interrupts ausschalten
	LD	HL,ADDR	     ; Adresse der einzuhaengenden Routine auf HL
	ld	de,50	     ; Anzahl der Wiederholungen auf DE
	ld	bc,50	     ; und BC
	CALL	ADDT	     ; in Ticker einhaengen
	EI		     ; Interrupts wieder zulassen
	RET		     ; zurueck zu Initialisierung in Bank 1
END:

START:
	.PHASE  ADDR
TICKB:	DEFW	00000H	     ; Kettungspointer     
	defw	00000h	     ; Tickerzaehler
	defw	00000h	     ; Tickerzaehler Reload
EVBLOCK:DEFW	00000H	     ; Kettung Pending Queue 
	DEFB	000H	     ; Counter
	DEFB	081H	     ; Klasse                
	DEFW	CENTRAL      ; Adresse der Routine
;
CENTRAL:push	af	     ; Register retten
	push	bc
	push	de
	push	hl
	di		     ; Interrupt abschalten
	call	curpos       ; Position des Cursors feststellen      
	ld	(oldpos),hl  ; und merken
	ld	a,70         ; Cursor auf 
	call	column       ; Position fuer
	ld	a,25         ; Ausgabe der
	call	row          ; Uhrzeit
	ld	hl,stumin    ; Stunden und Minuten
	push	hl           ; in HL
	call	ausgabe      ; Stunden ausgeben
	call	doppelp      ; Doppelpunkt ausgeben
	pop	hl           ;
	ld	bc,1         ; Minuten ermitteln
	add	hl,bc        ;
	push	hl           ;
	call	ausgabe      ; und ausgeben
	call	doppelp      ; Doppelpunkt ausgeben
	pop	hl           ; 
	ld	bc,1         ; Sekunden ermitteln
	add	hl,bc        ;
	call	ausgabe      ; und ausgeben
	ld	hl,(oldpos)  ; alte Cursorposition 
	call	setcur       ; wiederherstellen
	ei                   ; Interrupts wieder zulassen
	pop	hl           ; Register wieder
	pop	de           ; herstellen
	pop	bc           ;
	pop	af           ;
	ret                  ; zurueck

doppelp:ld	a,':'        ; Doppelpunkt auf
	call	wrchar       ; Bildschirm
	ret                  ;

ausgabe:push	hl           ; HL retten
	ld 	a,(hl)       ; Erste Stelle 
	and	11110000b    ; ausmaskieren
	rrc	a            ;
	rrc	a            ;
	rrc	a            ;
	rrc	a            ;
	add	a,30h        ; in Ziffer umwandeln
	call	wrchar       ; und ausgeben
	pop	hl           ; HL zurueck
	ld 	a,(hl)       ; zweite Stelle
	and	00001111b    ; ausmaskieren
	add	a,30h        ; in Ziffer umwandeln
	call	wrchar       ; und ausgeben
	ret                  ;
ENDE:
oldpos:	defw	0000h        ; alte Cursorposition
.DEPHASE
ENDE1:
	END	INIT	
; und ausgeben
	ret                  ;
ENDE:
oldpos:	defw	0000h        ; alte Cursorposition
.DEPHAS