From 44d890be599eca9e4730c88e37d253effa4a20d3 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 7 Jul 2024 09:58:42 +1000 Subject: [PATCH] ez80: Added new driver ez80rtc --- Source/Doc/SystemGuide.md | 17 +-- Source/HBIOS/Config/RCEZ80_std.asm | 7 +- Source/HBIOS/cfg_rcez80.asm | 2 + Source/HBIOS/ez80rtc.asm | 172 +++++++++++++++++++++++++++++ Source/HBIOS/hbios.asm | 11 ++ Source/HBIOS/hbios.inc | 1 + Source/HBIOS/rp5rtc.asm | 2 +- Source/RomDsk/Makefile | 2 +- Source/RomDsk/ROM_384KB/WDATE.COM | Bin 0 -> 2816 bytes 9 files changed, 200 insertions(+), 14 deletions(-) create mode 100644 Source/HBIOS/ez80rtc.asm create mode 100644 Source/RomDsk/ROM_384KB/WDATE.COM 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 0000000000000000000000000000000000000000..c7ab78e304f4e190a716a56aebc7e2cfb0da4fa9 GIT binary patch literal 2816 zcmd^ATWl0n7(P2YGka?b+d?~~P|mnShg-W8gu3c9U_%MeR$&nXsb$*^-2&Zd_R{XQ zuwr5~KA4dBV4{gWXd;S<0^(v~V%BESNplEmToX++PRQ^8LMXc6gPHoDnU;$r>Vt_7 z?q<&So$tS#vuFPEFGBzO&twH_h?iMX=ETqFsB4B84`)H^K81N1A;m z`a))OO?;Ijjf|y@&S?cY<@xkjfJ>VQ-_r9CDI<-vGuo^zOJtr@@wUSa%Rw`}L04H0 zl1tolNz~a|)JtyiuxwE?$cG+lH-?F%3bQikCRc2sEVogA*vDM~atJiYF22r9HZo^} zPI8W^__UP*q&mQaKIR5Pr#aOKo#NC7k^h3LKHQ^|uifNr2ExEhUbe_-j(jjnLT9LG zWe$CEhvw#7Z)fuBELqOO57xCpiLT~9!NG9^0)a(5s;VPDF=K%mN*|?^1R1@U*Z$t| z&oTETr|J6VGCQg&?$D)k^!}yq${47b-3J+V@rayvNl)dZI&%x=3C~Qv!J1D4TS(dD zJ1mn`>kq$!@FH36Gllq!PTN?meh|Gb>aPV%SkSDl7o8S z$Tdb-W->tbIE4n&3FHN*P;K%+a!$cxm!e&Els7VBVz&Nnn}mxPW7HhQiKse;qspNX zoK(`uN^kS1EsZMi#E=@R^rAH_Yu7!zenTtTm52-~Av`t^Nh)}6b9A%^@14jfk@yij zF|5XtQNV#n=132oh^i?|9g3xr$`QObq4cYf@u5AiJ)TYP)j-`hClz0eR6LlmB+iOB$RmH=RSO!Pp zgQ;O9mP|CEE*0+xKY_YaNv!V2@kne?xxYtkhQOeRD74tH)`s;WszQWAWw{dWf$XIh zL^BHIQWet+a&bDZYh|d->`f&3Kr=wp1HyGE#A&T8W6Qs6dRtxRHdy?ebtj=n%i$hz z7jNH6cstBi!3 z1*6oPJ}GetUqFDJ2k}c<$@dL zp)PkvZ!N0Nni#ueG`5n%ztRn_*iKEkuc*Ed*yD3CV4x|4A7RkWlXqQ~Tj+v2CoKWn zY#vB1T$~NFmdw$NS+iN<&DHR$>tzSH1PYsJuDSG%TpA96W~f|`s6m$!4RLoPC)rL{%r=>-Pe}GmIVhcakmYA}^ZqMgb}QlVWE zb@wM#ie2icEwn5BHrbhqL6=6I(2xPbDJ4O1w=xj3SvZ=CThiwE5Vh=#BvWxp+S=NX zvBI3mn!B+#kTs8EHjvdd>-Aip(F)y{u1~dfOtnq59qq_mns+p>6?kveOvSO_?;yMc zpO5mIJVUN|bJAl_Wd1Y0ELrTU4%GYu5YPB{k#Ig*KJv_5nstzd$F^*gv&7>Y3;gvs MZH3#{>R(y^4-_PiqyPW_ literal 0 HcmV?d00001