diff --git a/Source/Doc/SystemGuide.md b/Source/Doc/SystemGuide.md index a2b6089e..07e32b77 100644 --- a/Source/Doc/SystemGuide.md +++ b/Source/Doc/SystemGuide.md @@ -889,14 +889,15 @@ more than one at a time. The RTC unit is assigned a Device Type ID which indicates the specific hardware device driver that handles the unit. The table below enumerates these values. -| **Device Type** | **ID** | **Description** | **Driver** | -|-----------------|-------:|------------------------------------------|------------| -| RTCDEV_DS | 0x00 | Maxim DS1302 Real-Time Clock w/ NVRAM | dsrtc.asm | -| RTCDEV_BQ | 0x01 | BQ4845P Real Time Clock | bqrtc.asm | -| RTCDEV_SIMH | 0x02 | SIMH Simulator Real-Time Clock | simrtc.asm | -| RTCDEV_INT | 0x03 | Interrupt-based Real Time Clock | intrtc.asm | -| RTCDEV_DS7 | 0x04 | Maxim DS1307 PCF I2C RTC w/ NVRAM | ds7rtc.asm | -| RTCDEV_RP5 | 0x05 | Ricoh RPC01A Real-Time Clock w/ NVRAM | rp5rtc.asm | +| **Device Type** | **ID** | **Description** | **Driver** | +|-----------------|-------:|------------------------------------------|-------------| +| RTCDEV_DS | 0x00 | Maxim DS1302 Real-Time Clock w/ NVRAM | dsrtc.asm | +| RTCDEV_BQ | 0x01 | BQ4845P Real Time Clock | bqrtc.asm | +| RTCDEV_SIMH | 0x02 | SIMH Simulator Real-Time Clock | simrtc.asm | +| RTCDEV_INT | 0x03 | Interrupt-based Real Time Clock | intrtc.asm | +| RTCDEV_DS7 | 0x04 | Maxim DS1307 PCF I2C RTC w/ NVRAM | ds7rtc.asm | +| RTCDEV_RP5 | 0x05 | Ricoh RPC01A Real-Time Clock w/ NVRAM | rp5rtc.asm | +| RTCDEV_EZ80 | 0x06 | eZ80 on-chip RTC | ez80rtc.asm | The time functions to get and set the time (RTCGTM and RTCSTM) require a 6 byte date/time buffer in the following format. Each byte is BCD diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index f5a95c4c..b72ac5ec 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -33,8 +33,7 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS FPSW_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL SWITCHES ; -DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) -RP5RTCENABLE .SET TRUE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +EZ80RTCENABLE .SET TRUE ; EZ80 ON CHIP RTC ; UARTENABLE .SET FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) @@ -44,8 +43,8 @@ EZ80UARTENABLE .SET TRUE ; EZ80UART: ENABLE EZ80 UART DRIVER (EZ80UART.ASM) ; LPTENABLE .SET FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; -TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSTIMENABLE .SET TRUE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX9958 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_rcez80.asm b/Source/HBIOS/cfg_rcez80.asm index 817eb23d..a04ac19f 100644 --- a/Source/HBIOS/cfg_rcez80.asm +++ b/Source/HBIOS/cfg_rcez80.asm @@ -117,6 +117,8 @@ DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; +EZ80RTCENABLE .EQU TRUE ; EZ80 ON CHIP RTC +; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) diff --git a/Source/HBIOS/ez80rtc.asm b/Source/HBIOS/ez80rtc.asm new file mode 100644 index 00000000..ff6e105c --- /dev/null +++ b/Source/HBIOS/ez80rtc.asm @@ -0,0 +1,172 @@ +; +;================================================================================================== +; EZ80 ON-CHIP CLOCK DRIVER +;================================================================================================== +; +EZ80RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) +; +; RTC DEVICE INITIALIZATION ENTRY + + DEVECHO "EZ80 RTC:\n" + +EZ80RTC_INIT: + ; display driver install message + ; delegate init function to firmware + ; install dispatcher + ; dispatch local routine that delgates to firmware routines + + LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? + OR A ; SET FLAGS + RET NZ ; IF ALREADY ACTIVE, ABORT + + CALL NEWLINE ; FORMATTING + PRTS("EZ80 RTC: ON-CHIP$") + + LD A, 1 ; RTC FIRMWARE FUNCTION GROUP + LD B, 0 ; RTC INIT FUNCTION + EZ80_FN + ; TODO VERIFY SUCCESS -> A IS ZERO + + ; DISPLAY CURRENT TIME + LD HL, EZ80RTC_BCDBUF_EXT ; POINT TO BCD BUF EXTENDED + LD A, 1 ; RTC FIRMWARE FUNCTION GROUP + LD B, 1 ; READ DATE-TIME INTO (HL) + EZ80_FN + + LD HL, EZ80RTC_BCDBUF ; POINT TO BCD BUF + CALL PRTDT ; DISPLAY THIS TIME +; + LD BC, EZ80RTC_DISPATCH + CALL RTC_SETDISP +; + XOR A ; SIGNAL SUCCESS + RET + +; +; RTC DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +EZ80RTC_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,EZ80RTC_GETTIM ; GET TIME + DEC A + JP Z,EZ80RTC_SETTIM ; SET TIME + DEC A + JP Z,EZ80RTC_GETBYT ; GET NVRAM BYTE VALUE + DEC A + JP Z,EZ80RTC_SETBYT ; SET NVRAM BYTE VALUE + DEC A + JP Z,EZ80RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES + DEC A + JP Z,EZ80RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + DEC A + JP Z,EZ80RTC_GETALM ; GET ALARM + DEC A + JP Z,EZ80RTC_SETALM ; SET ALARM + DEC A + JP Z,EZ80RTC_DEVICE ; REPORT RTC DEVICE INFO + SYSCHKERR(ERR_NOFUNC) + RET +; +; RTC GET TIME +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; HL: DATE/TIME BUFFER (OUT) +; BUFFER FORMAT IS BCD: YYMMDDHHMMSS +; 24 HOUR TIME FORMAT IS ASSUMED +; +EZ80RTC_GETTIM: + PUSH HL + LD HL, EZ80RTC_BCDBUF_EXT ; POINT TO BCD BUF EXTENDED + LD A, 1 ; RTC FIRMWARE FUNCTION GROUP + LD B, 1 ; READ DATE-TIME INTO (HL) + EZ80_FN + + LD A, BID_BIOS ; COPY FROM BIOS BANK + LD (HB_SRCBNK), A ; SET IT + LD A, (HB_INVBNK) ; COPY TO CURRENT USER BANK + LD (HB_DSTBNK), A ; SET IT + LD HL, EZ80RTC_BCDBUF ; SOURCE ADR + POP DE ; DEST ADR + LD BC, EZ80RTC_BUFSIZ ; LENGTH + CALL HB_BNKCPY ; COPY THE CLOCK DATA + + XOR A ; SIGNAL SUCCESS + RET +; +; +; RTC SET TIME +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; HL: DATE/TIME BUFFER (IN) +; BUFFER FORMAT IS BCD: YYMMDDHHMMSSWW +; 24 HOUR TIME FORMAT IS ASSUMED +; +EZ80RTC_SETTIM: + ; COPY TO BCD BUF + LD A,(HB_INVBNK) ; COPY FROM CURRENT USER BANK + LD (HB_SRCBNK),A ; SET IT + LD A,BID_BIOS ; COPY TO BIOS BANK + LD (HB_DSTBNK),A ; SET IT + LD DE,EZ80RTC_BCDBUF ; DEST ADR + LD BC,EZ80RTC_BUFSIZ ; LENGTH + CALL HB_BNKCPY ; COPY THE RPC DATA + + LD HL, EZ80RTC_BCDBUF_EXT ; POINT TO BCD BUF EXTENDED + LD (HL), $20 ; CENTURY NOT SUPPORT BY HBIOS + LD A, 1 ; RTC FIRMWARE FUNCTION GROUP + LD B, 2 ; WRITE DATE-TIME FROM (HL) + EZ80_FN + + XOR A ; SIGNAL SUCCESS + RET +; +; RTC GET NVRAM BYTE +; C: INDEX +; E: VALUE (OUTPUT) +; A:0 IF OK, ERR_RANGE IF OUT OF RANGE +; +EZ80RTC_GETBYT: + SYSCHKERR(ERR_NOTIMPL) + ; XOR A ; SIGNAL SUCCESS + RET ; AND RETURN + + +; RTC SET NVRAM BYTE +; C: INDEX +; E: VALUE +; A:0 IF OK, ERR_RANGE IF OUT OF RANGE +; +EZ80RTC_SETBYT: + SYSCHKERR(ERR_NOTIMPL) + ; XOR A ; SIGNAL SUCCESS + RET + +EZ80RTC_GETBLK: +EZ80RTC_SETBLK: +EZ80RTC_GETALM: +EZ80RTC_SETALM: + SYSCHKERR(ERR_NOTIMPL) + RET +; +; REPORT RTC DEVICE INFO +; +EZ80RTC_DEVICE: + LD D, RTCDEV_EZ80 ; D := DEVICE TYPE + LD E, 0 ; E := PHYSICAL DEVICE NUMBER + LD HL, 00 ; H := 0, DRIVER HAS NO MODES, L := 0, NO I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET + + +; REGISTER EXTRACTED VALUES +; +EZ80RTC_BCDBUF_EXT: +EZ80RTC_CN .DB 20 ; CENTURY +EZ80RTC_BCDBUF: +EZ80RTC_YR .DB 24 +EZ80RTC_MO .DB 01 +EZ80RTC_DT .DB 01 +EZ80RTC_HH .DB 00 +EZ80RTC_MM .DB 00 +EZ80RTC_SS .DB 00 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 0cbbf3c4..6d476148 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3779,6 +3779,9 @@ HB_INITTBL: #IF (RP5RTCENABLE) .DW RP5RTC_INIT #ENDIF +#IF (EZ80RTCENABLE) + .DW EZ80RTC_INIT +#ENDIF #IF (VDUENABLE) .DW VDU_INIT #ENDIF @@ -8051,6 +8054,14 @@ SIZ_RP5RTC .EQU $ - ORG_RP5RTC MEMECHO SIZ_RP5RTC MEMECHO " bytes.\n" #ENDIF +#IF (EZ80RTCENABLE) +ORG_EZ80RTC .EQU $ + #INCLUDE "ez80rtc.asm" +SIZ_EZ80RTC .EQU $ - ORG_EZ80RTC + MEMECHO "EZ80RTC occupies " + MEMECHO SIZ_EZ80RTC + MEMECHO " bytes.\n" +#ENDIF #IF (ASCIENABLE) ORG_ASCI .EQU $ #INCLUDE "asci.asm" diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 2cabc656..8949f3fc 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -359,6 +359,7 @@ RTCDEV_SIMH .EQU $02 ; SIMH RTCDEV_INT .EQU $03 ; PERIODIC INT TIMER RTCDEV_DS7 .EQU $04 ; DS1307 (I2C) RTCDEV_RP5 .EQU $05 ; RP5C01 +RTCDEV_EZ80 .EQU $06 ; EZ80 ON-CHIP RTC ; ; DSKY DEVICE IDS ; diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index aa03aaf3..2a7b99a6 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -297,7 +297,7 @@ RP5RTC_SETTIM: LD (HB_DSTBNK),A ; SET IT LD DE,RP5RTC_BCDBUF ; DEST ADR LD BC,RP5RTC_BUFSIZ ; LENGTH - CALL HB_BNKCPY ; COPY THE CLOCK DATA + CALL HB_BNKCPY ; COPY THE RPC DATA ; LD B, MODE_TIMEST CALL RP5RTC_SETMD diff --git a/Source/RomDsk/Makefile b/Source/RomDsk/Makefile index 1f067db1..c4ab2ec3 100644 --- a/Source/RomDsk/Makefile +++ b/Source/RomDsk/Makefile @@ -6,7 +6,7 @@ include $(TOOLS)/Makefile.inc .SHELLFLAGS = -ce -ROMAPPS1 := assign mode rtc syscopy xm +ROMAPPS1 := assign mode rtc syscopy xm ../../Source/Images/Common/All/WDATE ROMAPPS2 := fdu format survey sysgen talk timer cpuspd rom128_%.dat: DISKDEF=wbw_rom128 diff --git a/Source/RomDsk/ROM_384KB/WDATE.COM b/Source/RomDsk/ROM_384KB/WDATE.COM new file mode 100644 index 00000000..c7ab78e3 Binary files /dev/null and b/Source/RomDsk/ROM_384KB/WDATE.COM differ