diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 5675df72..23cbb20d 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -27,6 +27,7 @@ MD_AFSH .EQU %00111000 ; FLASH ATTRIBUTE ; MD_FDBG .EQU 0 ; FLASH DEBUG CODE MD_FVBS .EQU 1 ; FLASH VERBOSE OUTPUT +MD_FVAR .EQU 1 ; FLASH VERIFY AFTER WRITE ; ; DEVICE CONFIG TABLE (RAM DEVICE FIRST TO MAKE IT ALWAYS FIRST DRIVE) ; @@ -54,7 +55,7 @@ MD_CFGTBL: ; MD_INIT: #IF (MDFFENABLE) - CALL MD_FINIT ; PROBE FLASH CAPABILITY + CALL MD_FINIT ; PROBE FLASH CAPABILITY #ENDIF CALL NEWLINE ; FORMATTING @@ -411,7 +412,26 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL CALL FF_FNCALL ; EXECUTE: WRITE 4K SECTOR ; - XOR A + XOR A ; PRESUME SUCCESS STATUS +; +#IF (MD_FVAR==1) + LD IX,MD_F4KBUF ; SET SOURCE ADDRESS + LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL + CALL FF_FNCALL ; EXECUTE: VERIFY 4K SECTOR +; + OR A + RET Z ; RETURN IF SUCCESSFUL +; + LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; RETRY + LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL ; WRITE + CALL FF_FNCALL ; EXECUTE: WRITE 4K SECTOR ; ONCE +; + LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; VERIFY + LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL ; AGAIN + CALL FF_FNCALL ; EXECUTE: VERIFY 4K SECTOR +; + OR A ; SET FINAL STATUS AFTER RETRY +#ENDIF ; RET ; @@ -754,7 +774,12 @@ FF_NXT2: ; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. ; IX POINTS TO WHERE TO SAVE DATA ; ON EXIT A NO STATUS IS RETURNED - +; +; MD_VERI_R - VERIFY FLASH SECTOR +; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. +; IX POINTS TO DATA TO COMPARE. +; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL +; ; MD_FWRIT_R - WRITE FLASH SECTOR ; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. ; IX POINTS TO DATA TO BE WRITTEN @@ -1024,6 +1049,65 @@ MD_FRD1: ; MD_FRST .DW 0 ; SAVE STACK MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +;====================================================================== +; FLASH VERIFY SECTOR. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME +; SELECT SOURCE BANK, READ DATA, +; SELECT DESTINATION BANK, COMPARE DATA +; DESTINATION BANK IS ALWAYS CURRENT BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; DE = 0000 BYTE COUNT +; IX POINTS TO DATA TO BE VERIFIED +; A CONTAINS CURRENT BANK +; ON EXIT NO STATUS RETURNED +;====================================================================== +; +MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + LD H,C ; SECTOR ; LOCAL STACK + LD L,D ; ADDRESS ; LOCAL STACK + LD (HBX_BUF+MD_FVST-MD_FVERI_R),SP ; SAVE STACK ; LOCAL STACK + LD SP,HBX_BUF + (MD_FVE_S-MD_FVERI_R) ; SETUP TEMP STACK ; LOCAL STACK +MD_FVE_S: +; + PUSH AF ; SAVE CURRENT BANK +; +MD_FVE1: + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO READ + LD C,(HL) ; READ BYTE +; + POP AF + PUSH AF ; SELECT BANK + CALL HBX_BNKSEL ; TO WRITE +; + LD A,C + SUB (IX+0) ; COMPARE BYTE + LD C,A ; SET NON ZERO STATUS + JR NZ,MD_FVE2 ; EXIT IF MISMATCH +; + INC HL ; NEXT SOURCE LOCATION + INC IX ; NEXT DESTINATION LOCATION +; + INC DE ; CONTINUE READING UNTIL + BIT 4,D ; WE HAVE DONE ONE SECTOR + JR Z,MD_FVE1 +; + LD C,E ; SET SUCCESS STATUS = 0 +; +MD_FVE2: + POP AF ; RETURN TO ORIGINAL BANK + CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + LD SP,(HBX_BUF+MD_FVST-MD_FVERI_R) ; RESTORE STACK +; + RET +; +MD_FVST .DW 0 ; SAVE STACK +MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; FLASH WRITE SECTOR. @@ -1156,6 +1240,10 @@ MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE .ECHO "MD_FREAD_R " .ECHO MD_R_SZ .ECHO "\n" +; + .ECHO "MD_VERI_R " + .ECHO MD_V_SZ + .ECHO "\n" ; .ECHO "MD_FERAS_R " .ECHO MD_S_SZ @@ -1180,6 +1268,9 @@ MD_CSIZE .SET MD_I_SZ #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_CSIZE>HBX_BUFSIZ) .ECHO "Warning: Flash code exceeds available space by "