From 2e6122025dcafb77444aa39d901615782ba2aece Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 27 Oct 2021 15:06:24 -0700 Subject: [PATCH] RAM Disk Auto-Format Improvements - Detect the situation where the RAM disk area is all zeroes and handle it properly as uninitialized. --- Source/CBIOS/cbios.asm | 22 ++++++++++++++++++++++ Source/CPM3/boot.z80 | 11 +++++++++++ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 695c823d..4bb0b22e 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -2471,6 +2471,17 @@ MD_INIT4: CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE) ; #IF (CLRRAMDISK == CLR_AUTO) + ; CHECK THE FIRST SECTOR (512 BYTES) FOR ALL ZEROES. IF SO, + ; IT IMPLIES THE RAM IS UNINITIALIZED. + LD HL,0 ; START AT BEGINING OF RAM DISK + LD BC,512 ; COMPARE 512 BYTES + XOR A ; COMPARE TO ZERO +CLRRAM000: + CPI ; A - (HL), HL++, BC-- + JR NZ,CLRRAM00 ; IF NOT ZERO, GO TO NEXT TEST + JP PE,CLRRAM000 ; LOOP THRU ALL BYTES + JR CLRRAM2 ; ALL ZEROES, JUMP TO INIT +CLRRAM00: ; CHECK FIRST 32 DIRECTORY ENTRIES. IF ANY START WITH AN INVALID ; VALUE, INIT THE RAM DISK. VALID ENTRIES ARE E5 (EMPTY ENTRY) OR ; 0-15 (USER NUMBER). @@ -2528,6 +2539,17 @@ CLRRAM3: CALL HB_BNKSEL ; SELECT BANK #IF (CLRRAMDISK == CLR_AUTO) + ; CHECK THE FIRST SECTOR (512 BYTES) FOR ALL ZEROES. IF SO, + ; IT IMPLIES THE RAM IS UNINITIALIZED. + LD HL,0 ; START AT BEGINING OF RAM DISK + LD BC,512 ; COMPARE 512 BYTES + XOR A ; COMPARE TO ZERO +CLRRAM000: + CPI ; A - (HL), HL++, BC-- + JR NZ,CLRRAM00 ; IF NOT ZERO, GO TO NEXT TEST + JP PE,CLRRAM000 ; LOOP THRU ALL BYTES + JR CLRRAM2 ; ALL ZEROES, JUMP TO INIT +CLRRAM00: ; CHECK FIRST 32 DIRECTORY ENTRIES. IF ANY START WITH AN INVALID ; VALUE, INIT THE RAM DISK. VALID ENTRIES ARE E5 (EMPTY ENTRY) OR ; 0-15 (USER NUMBER). diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 9789cb8b..ce3fef1b 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -328,6 +328,17 @@ clrram: ;call hb_bnksel ; select bank call 0FFF3h ; select bank + ; Check the first sector (512 bytes) for all zeroes. If so, + ; it implies the RAM is uninitialized. + ld hl,0 ; start at begining of ram disk + ld bc,512 ; compare 512 bytes + xor a ; compare to zero +clrram000: + cpi ; a - (hl), hl++, bc-- + jr nz,clrram00 ; if not zero, go to next test + jp pe,clrram000 ; loop thru all bytes + jr clrram2 ; all zeroes, jump to init +clrram00: ; Check first 32 directory entries. If any start with an invalid ; value, init the ram disk. Valid entries are e5 (empty entry) or ; 0-15 (user number). diff --git a/Source/ver.inc b/Source/ver.inc index 61eac6ca..2c77bb1e 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.131" +#DEFINE BIOSVER "3.1.1-pre.132" diff --git a/Source/ver.lib b/Source/ver.lib index 7c8580d2..d12c7674 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.131" + db "3.1.1-pre.132" endm