From 214182b514c282fbe723b3d6a27b378810494d2c Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 21 Nov 2023 11:59:31 -0800 Subject: [PATCH] Fix RTC Initialization When using the Z2 memory manager, if the HBIOS exceeds 16K, RTCDEFVAL will not be accessible prior to programming the Z2 memory bank registers. In this corner case the RTC latch could be mis-programmed. This commit introduces a workaround. --- Source/HBIOS/hbios.asm | 27 +++++++++++++++++++-------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index ddfdfa1d..e6c0a34e 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1117,12 +1117,17 @@ BOOTWAIT: JR NZ,BOOTWAIT #ENDIF ; -;#IF ((PLATFORM == PLT_MBC) | (PLATFORM == PLT_SBC)) - ; INITIALIZE RTC LATCH BYTE + ; EARLY RTC LATCH BYTE INITIALIZATION ; FOR SOME PLATFORMS THIS CONTROLS HI/LO SPEED CIRCUIT - LD A,(RTCDEFVAL) ; GET DEFAULT VALUE + ; NOTE: WE WANT TO USE (RTCDEFVAL) HERE, BUT THE Z2 MEMORY + ; MANAGER STARTS UP WITH THE FIRST 16K OF ROM MAPPED TO ALL + ; 4 16K BANKS OF CPU SPACE. SO, IF RTCDEVFAL IS LOCATED AFTER + ; PAST 16K, WE DON'T HAVE ACCESS TO IT. FOR NOW, WE JUST USE + ; RTCDEF WHICH IS SUBOPTIMAL, BUT PROBABLY DOES NOT CAUSE ANY + ; PROBLEMS. + ;LD A,(RTCDEFVAL) ; GET DEFAULT VALUE + LD A,RTCDEF ; DEFAULT VALUE OUT (RTCIO),A ; SET IT -;#ENDIF ; #IF (PLATFORM == PLT_N8) LD A,N8_DEFACR ; ENSURE N8 ACR @@ -1144,7 +1149,9 @@ BOOTWAIT: XOR A ; LED IS INVERTED, TURN IT ON #ENDIF #IF (LEDMODE == LEDMODE_RTC) - LD A,(RTCDEFVAL) ; DEFAULT LATCH VALUE + ; CAN'T USE (RTCDEFVAL) YET, SEE COMMENTS ABOVE + ;LD A,(RTCDEFVAL) ; DEFAULT LATCH VALUE + LD A,RTCDEF ; DEFAULT LATCH VALUE OR %00000001 ; LED 0 ON #ENDIF OUT (LEDPORT),A @@ -1435,11 +1442,15 @@ S100MON_SKIP: LD A,(HB_CURBNK) ; GET HB_CURBNK LD (HBX_LOC - 2),A ; ... AND SAVE TEMP FOR APPBNK ; -; THE RTCVAL FIELD OF THE PROXY DATA NEEDS TO BE INITIALIZED HERE -; BECAUSE IT CANNOT BE PRE-INITIALIZED (SEE COMMENTS ABOVE WHERE -; RTCVAL EQUATE IS DEFINED). +; WE CAN NOW DO THE REAL INITIALIZATION OF THE RTC LATCH BASED ON +; (RTCDEFVAL). AT THIS POINT WE SHOULD HAVE ACCESS TO THE ROM LOCATION +; WHERE RTCDEFVAL IS STORED AND THE PROXY IS INSTALLED IN UPPER RAM +; WHERE WE WILL STORE THE WORKING SHADOW COPY (HB_RTCVAL). +; SEE COMMENTS ABOVE REGARDING THE FUNKY WAY THAT THE RTCDEFVAL IS +; CREATED. ; LD A,(RTCDEFVAL) + OUT (RTCIO),A ; SET IT LD (HB_RTCVAL),A ; #IFDEF TESTING diff --git a/Source/ver.inc b/Source/ver.inc index 6c118fde..e2f398e9 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 4 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.4.0-dev.22" +#DEFINE BIOSVER "3.4.0-dev.23" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 70f91ac4..6c9b9eff 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 4 rup equ 0 rtp equ 0 biosver macro - db "3.4.0-dev.22" + db "3.4.0-dev.23" endm