From 4c65e244f5a8710c83ca3ffa750b3f4ca1357186 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 18 Jan 2021 02:07:19 +0800 Subject: [PATCH] Update flashlib.inc Add chip erase support. Consolidate code space check here. Only display on error. --- Source/HBIOS/flashlib.inc | 130 +++++++++++++++++++++++++++++++++----- 1 file changed, 115 insertions(+), 15 deletions(-) diff --git a/Source/HBIOS/flashlib.inc b/Source/HBIOS/flashlib.inc index 37e89be5..f9cc6fa3 100644 --- a/Source/HBIOS/flashlib.inc +++ b/Source/HBIOS/flashlib.inc @@ -37,9 +37,6 @@ MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; MD_I_SZ .EQU $-MD_FIDEN_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FIDEN_R occupies " - .ECHO MD_I_SZ - .ECHO " bytes.\n" ; ;====================================================================== ; ERASE FLASH SECTOR. @@ -102,9 +99,6 @@ MD_WT6: POP AF ; RETURN TO ORIGINAL BANK JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FERAS_R occupies " - .ECHO MD_S_SZ - .ECHO " bytes.\n" ; ;====================================================================== ; FLASH READ SECTOR. @@ -151,9 +145,6 @@ MD_FRD1:LD A,B ; CHANGE TO SOURCE BANK RET ; MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FREAD_R occupies " - .ECHO MD_R_SZ - .ECHO " bytes.\n" ; ;====================================================================== ; FLASH VERIFY SECTOR. @@ -203,9 +194,6 @@ MD_FVE2:POP AF RET ; MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FVERI_R occupies " - .ECHO MD_V_SZ - .ECHO " bytes.\n" ; ;====================================================================== ; FLASH WRITE SECTOR. @@ -268,6 +256,118 @@ MD_FWR2:LD A,(HL) ; FROM THE SAME FLASH ADDRESS. JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY ; MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FWRIT_R occupies " - .ECHO MD_W_SZ - .ECHO " bytes.\n" +; +;====================================================================== +; ERASE FLASH CHIP. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; ISSUE ERASE COMMAND +; POLL TOGGLE BIT FOR COMPLETION STATUS. +; SELECT ORIGINAL BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; A CONTAINS CURRENT BANK +; ON EXIT A RETURNS STATUS 0=SUCCESS FF=FAIL +;====================================================================== +; + .DB MD_E_SZ ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +MD_FERAC_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + PUSH AF ; SAVE CURRENT BANK + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO PROGRAM +; + LD HL,$5555 ; LD A,$AA ; COMMAND + LD (HL),$AA ; LD ($5555),A ; SETUP + LD A,L ; LD A,$55 + LD ($2AAA),A ; LD ($2AAA),A + LD (HL),$80 ; LD A,$80 + LD (HL),$AA ; LD ($5555),A + LD A,L ; LD A,$AA + LD ($2AAA),A ; LD ($5555),A + LD (HL),$10 ; LD A,$55 + ; LD ($2AAA),A + ; LD A,$10 + ; LD ($5555),A +; +FF_WT2: LD A,(HL) ; DO TWO SUCCESSIVE READS FROM THE SAME FLASH ADDRESS. + LD C,(HL) ; IF TOGGLE BIT (BIT 6) + XOR C ; IS THE SAME ON BOTH READS + BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. + JR Z,FF_WT1 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. +; + LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). + BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS + JR Z,FF_WT2 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 +; + LD A,(HL) ; WE GOT A TIMEOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE + XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? + BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED + JR Z,FF_WT1 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. +; + LD (HL),$F0 ; WRITE DEVICE RESET + LD C,$FF ; SET FAIL STATUS + JR FF_WT3 +; +FF_WT1: LD C,0 ; SET SUCCESS STATUS +FF_WT3: POP AF +; LD A,B ; RETURN TO ORIGINAL BANK + JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; +MD_E_SZ .EQU $-MD_FERAC_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED + +;====================================================================== +; +; RELOCATABLE CODE SPACE REQUIREMENTS CHECK +; +;====================================================================== +; +MD_CSIZE .EQU 0 +; +#IF (MD_W_SZ>MD_CSIZE) +MD_CSIZE .SET MD_W_SZ +#ENDIF +#IF (MD_S_SZ>MD_CSIZE) +MD_CSIZE .SET MD_S_SZ +#ENDIF +#IF (MD_I_SZ>MD_CSIZE) +MD_CSIZE .SET MD_I_SZ +#ENDIF +#IF (MD_R_SZ>MD_CSIZE) +MD_CSIZE .SET MD_R_SZ +#ENDIF +#IF (MD_V_SZ>MD_CSIZE) +MD_CSIZE .SET MD_V_SZ +#ENDIF +#IF (MD_E_SZ>MD_CSIZE) +MD_CSIZE .SET MD_E_SZ +#ENDIF +; +#IF (MD_CSIZE>64) + .ECHO "Warning: Flash code exceeds available space by " + .ECHO MD_CSIZE-64 + .ECHO " bytes.\n" + .ECHO "MD_FIDEN_R " + .ECHO MD_I_SZ + .ECHO "\n" +; + .ECHO "MD_FREAD_R " + .ECHO MD_R_SZ + .ECHO "\n" +; + .ECHO "MD_FVERI_R " + .ECHO MD_V_SZ + .ECHO "\n" +; + .ECHO "MD_FERAS_R " + .ECHO MD_S_SZ + .ECHO "\n" +; + .ECHO "MD_FWRIT_R " + .ECHO MD_W_SZ + .ECHO "\n" +; + .ECHO "MD_FERAC_R " + .ECHO MD_E_SZ + .ECHO "\n" +#ENDIF \ No newline at end of file