; ; Routinen fuer die Echtzeituhr mit dem RTC5832 (im Booteprom) ; ; Einsprung bei E00: Lesen der Uhr, HL zeigt dann auf Buffer mit den ; aktuellen Daten im BCD-Code ; ; E03: Schreiben der Uhr, HL muss auf Buffer mit den ; Daten im BCD-Code zeigen ; ; E80: umrechnen des Datums fuer NovaDOS ; BC enthaelt Anzahl der Tage seit 1.1.78 ; Parameter: HL zeigt auf Buffer fuer Datum ; ; Aufbau des Buffers: JJMMTTHHMMSS ; Datum Zeit ; ; Nach Aufruf von E80: xxTTTTHHMMSS .z80 .phase 0E00h jp rdclock wrclock: LD C,2 ;2 Durchl. (Zeit, Datum) LD D,0cah wr3val: LD B,3 ;Zaehler drei Werte wr1val: LD A,(HL) ;Sekunden usw. laden AND 0f0h RRA RRA RRA RRA CALL wrrtc ;RTC-Register schreiben LD A,(HL) AND 0fh CALL wrrtc INC HL DJNZ wr1val LD D,5ah DEC C ;von Zeit auf Datum JR NZ,wr3val ;falls noch nicht geschr. XOR A OUT (5bh),A RET rdclock: PUSH IX ;retten LD IX,clktab-1 ;Ziffernmasken-Tabelle LD C,2 ;2 Durchl. wie oben, RD LD D,0cch ;ab RTC-Reg. 12 (Jahr) rd3val: LD B,3 ;Zaehler 3 Werte rd1val: CALL rdrtc ;RTC auslesen (Zehner) ADD A,A ;*2 ADD A,A ;*4 ADD A,A ;*8 ADD A,A ;*16 LD E,A ;sichern CALL rdrtc ;RTC auslesen (Einer) ADD A,E ;+ Zehnerstelle LD (HL),A ;in den Puffer INC HL ;1 Stelle tiefer DJNZ rd1val ;bis 3 Werte fertig LD D,5ch ;ab RTC-Reg. 5 (Stunden) DEC C ;von Datum auf Zeit JR NZ,rd3val ;falls noch nicht gelesen POP IX ;restaurieren XOR A ;A <- 00, RTC ruecksetzen OUT (5bh),A ;auf RTC-Adressport RET rdrtc: LD A,D ;RTC-Adressreg., RD/WR-Bit OUT (5bh),A ;Register adressieren LD D,10h ;1 tiefer im ober. Nibble SUB D LD D,A ;D <- neues Register INC IX ;naechste BCD-Ziffernmaske IN A,(5ah) ;RTC-Register auslesen AND (IX+0) ;relevante Bits maskieren RET wrrtc: LD E,A ;Zeit, Datum retten LD A,D ;RTC-Adressreg. RD/WR-Bit OUT (5bh),A ;RTC-Register adressieren LD D,10h ;1 hoeher im oberen Nibble SUB D LD D,A ;D <- neues Adressregister AND 0f0h ;nur oberes Nibble CP 50h ;Std.-Zehner adressiert ? LD A,E ;Zeit/Datum JR NZ,setrtc ;falls anderes Digit SET 3,A ;24h-Anzeige-Bit setzen setrtc: OUT (5ah),A ;Zeit stellen RET clktab: DB 0fh,0fh ;Jahr Zehner, Einer DB 01h,0fh ;Monat Zehner, Einer DB 03h,0fh ;Tag Zehner, Einer DB 03h,0fh ;Stunde Zehner, Einer DB 07h,0fh ;Minute Zehner, Einer DB 07h,0fh ;Sekunde Zehner, Einer ds 5 ;******************************************************************** datecon: push hl ;Zeiger retten ld a,(hl) ;Jahr call BCDHEX ;in Hexzahl ld de,1900 ;19xx ld h,0 ld l,a add hl,de ex (sp),hl ;Jahr auf den Stack inc hl ld a,(hl) ;Monat call BCDHEX ld d,0 ld e,a inc hl ld a,(hl) ;Tag call BCDHEX ld b,0 ld c,a pop hl ;Jahr holen call DAYS ret ; ; CONVERT BCD TO HEX ; BCDHEX: OR A RET Z PUSH BC LD B,0 BCDHX0: INC B SUB 1 DAA JR NZ,BCDHX0 LD A,B POP BC RET ; ; CALCULATE DAYS AND YEAR,MONTH,DAYS ; ; CALCULATE DAYS ; ENTRY : HL=YEAR (1978..2157) ; E =MONTH (1..12) ; C =DAYS (1..31) ; EXIT : BC=DAYS ; FIRST DAY (00001) : SU 01-01-1978 ; LAST DAY (65535) : SU 05-06-2157 ; DAYS: LD B,0 PUSH DE LD DE,1978 DAYS0: OR A SBC HL,DE ADD HL,DE JR Z,DAYS1 PUSH HL LD HL,365 ADD HL,BC LD B,H LD C,L POP HL EX DE,HL CALL LEAPYR EX DE,HL INC DE JR NZ,DAYS0 INC BC JR DAYS0 DAYS1: POP DE PUSH HL LD HL,DM LD D,1 DAYS2: LD A,E CP D JR Z,DAYS4 LD A,C ADD A,(HL) LD C,A JR NC,DAYS3 INC B DAYS3: INC HL LD A,D INC D CP 2 JR NZ,DAYS2 EX (SP),HL CALL LEAPYR EX (SP),HL JR NZ,DAYS2 INC BC JR DAYS2 DAYS4: POP HL RET ; ; CALCULATE LEAP YEAR CORRECTION ; ENTRY : HL = YEAR ; EXIT : Z = 1 CORRECTION NECCESARRY ; Z = 0 NO CORRECTION NEEDED ; LEAPYR: LD A,L AND 3 RET NZ PUSH HL PUSH DE LD A,-1 LD DE,100 OR A LEAPY0: INC A SBC HL,DE JR NC,LEAPY0 ADD HL,DE LD H,A LD A,L OR A JR NZ,LEAPY1 LD A,H AND 3 JR LEAPY2 LEAPY1: XOR A LEAPY2: POP DE POP HL RET ; ; DAYS/MONTH ; DM: DEFB 31,28,31,30,31,30,31,31,30,31,30,31 ; ; ds 1 .dephase END ;************************************************************************** ; Rahmenprogramm im BIOS: ; ;readrtc: ;hier Booteprom einblenden ; ; ld hl,buff ;auf Buffer zeigen ; push hl ;Zeiger retten ; call 0e00h ;Zeit einlesen ; pop hl ;wieder auf Buffer zeigen ; call 0e80h ;Datum umrechnen und ; ld (buff+1),bc ;abspeichern ; ld hl,buff+1 ;Zeiger setzen ; ; ;hier Booteprom ausblenden ; ; ret ; ;buff: db 0,0,0,0,0,0 ; ; ;********************************************************************** ; ; Einbindung in der BIOS-Sprungleiste: ; ; (Offset des Sprungs muss im Sourcecode des NovaDOS eingetragen ; werden, hier z.B. 54 oder 26h) ; ; JP boot ;BIOS ; JP wboot ;BIOS + 3 BIOS-Fkt. 0 ; JP const ;BIOS + 6 1 ; JP conin ;BIOS + 9 2 ; JP conout ;BIOS + 12 3 ; JP list ;BIOS + 15 4 ; JP punch ;BIOS + 18 5 ; JP reader ;BIOS + 21 6 ; JP home ;BIOS + 24 7 ; JP seldsk ;BIOS + 27 8 ; JP settrk ;BIOS + 30 9 ; JP setsec ;BIOS + 33 10 ; JP setdma ;BIOS + 36 11 ; JP read ;BIOS + 39 12 ; JP write ;BIOS + 42 13 ; JP listst ;BIOS + 45 14 ; JP sectrn ;BIOS + 48 15 ; ;; Erweiterung der BIOS-Sprungleiste fuer NovaDOS u.a. ; ; JP 0000 ;BIOS + 51 HRG-Treiber (jetzt RSM) ; JP time ;BIOS + 54 Routinen fuer RTC ; ;