diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 5675df72..8c17032f 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 @@ -316,7 +317,7 @@ MD_RDSECF: ; CALLED FROM MD_RW ; LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL - CALL FF_FNCALL ; EXECUTE: READ 4K SECTOR + CALL MD_FNCALL ; EXECUTE: READ 4K SECTOR ; MD_SECM: LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK @@ -377,11 +378,11 @@ MD_WRSECF: ; CALLED FROM MD_RW ; LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL - CALL FF_FNCALL ; EXECUTE: READ 4K SECTOR + CALL MD_FNCALL ; EXECUTE: READ 4K SECTOR ; MD_SECM1: ; DESIRED SECTOR IS IN BUFFER LD BC,MD_FERAS_R ; PUT ROUTINE TO CALL - CALL FF_FNCALL ; EXECUTE: ERASE 4K SECTOR + CALL MD_FNCALL ; EXECUTE: ERASE 4K SECTOR OR A RET NZ ; RETURN IF ERROR ; @@ -409,9 +410,28 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER ; LD IX,MD_F4KBUF ; SET SOURCE ADDRESS LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL - CALL FF_FNCALL ; EXECUTE: WRITE 4K SECTOR + CALL MD_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 MD_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 MD_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 MD_FNCALL ; EXECUTE: VERIFY 4K SECTOR +; + OR A ; SET FINAL STATUS AFTER RETRY +#ENDIF ; RET ; @@ -610,8 +630,7 @@ MDSTR_LEN .TEXT "LEN=$" ; AND THE FLASH CHIP IS SWITCHED INTO THE LOWER BANK. ; ; EACH FLASH ROUTINE MUST FIT INTO TO THE HBX_BUF, INCLUDING IT'S LOCAL STACK WHICH -; IS REQUIRED FOR CALLING THE BANK SWITCH ROUTINES. IN SOME CASES THIS MEANS -; OVERLAYING THE STACK ON THE INITIALIZATION CODE. +; IS REQUIRED FOR CALLING THE BANK SWITCH ROUTINES. ; ; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ ; @@ -636,7 +655,7 @@ MD_FINIT: #ENDIF LD B,A ; NUMBER OF DEVICES TO PROBE LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL -FF_PROBE: +MD_PROBE: LD D,$00 ; SET ADDRESS IN DE:HL LD E,C ; LD H,D ; WE INCREASE E BY $08 @@ -652,7 +671,7 @@ FF_PROBE: CALL COUT #ENDIF LD BC,MD_FIDENT_R ; PUT ROUTINE TO CALL - CALL FF_FNCALL ; EXECUTE: IDENTIFY FLASH CHIP + CALL MD_FNCALL ; EXECUTE: IDENTIFY FLASH CHIP PUSH HL LD HL,MD_TGTDEV ; IF WE MATCH WITH @@ -672,7 +691,7 @@ FF_PROBE: ADD A,$08 ; TO NEXT DEVICE LD C,A ; - DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE + DJNZ MD_PROBE ; ALWAYS AT LEAST ONE DEVICE #IF (MD_FVBS==1) CALL PRTSTRD @@ -705,21 +724,21 @@ MD_LAND: ; LD HL,MD_TABLE ; SEARCH THROUGH THE FLASH LD DE,MD_T_CNT ; TABLE TO FIND A MATCH -FF_NXT1:LD A,(HL) +MD_NXT1:LD A,(HL) CP B - JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH + JR NZ,MD_NXT0 ; FIRST BYTE DOES NOT MATCH ; INC HL LD A,(HL) CP C DEC HL - JR NZ,FF_NXT0 ; SECOND BYTE DOES NOT MATCH + JR NZ,MD_NXT0 ; SECOND BYTE DOES NOT MATCH ; INC HL INC HL JR FF_NXT2 ; MATCH SO EXIT ; -FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT +MD_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT LD BC,MD_T_SZ ; TO THE NEXT TABLE ENTRY ADD HL,BC POP BC @@ -727,7 +746,7 @@ FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT LD A,D ; CHECK IF WE REACHED THE OR E ; END OF THE TABLE DEC DE - JR NZ,FF_NXT1 ; NOT AT END YET + JR NZ,MD_NXT1 ; NOT AT END YET ; LD HL,MD_FFMSGUNK ; WE REACHED THE END WITHOUT A MATCH ; @@ -754,7 +773,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 @@ -767,17 +791,17 @@ FF_NXT2: ; RETURN WITH ID CODE. ;====================================================================== ; -FF_FNCALL: +MD_FNCALL: PUSH HL ; USING HBX_BUF FOR CODE AREA PUSH DE PUSH BC - CALL FF_CALCA ; GET BANK AND SECTOR DATA IN BC + CALL MD_CALCA ; GET BANK AND SECTOR DATA IN BC ; POP HL ; GET ROUTINE TO CALL PUSH BC ; LD DE,HBX_BUF ; EXECUTE / START ADDRESS - LD BC,HBX_BUFSIZ ; MAX. CODE SIZE POSSIBLE + LD BC,MD_CSIZE ; CODE SIZE. MAXIMUM 64 BYTES LDIR ; COPY OUR RELOCATABLE CODE TO THE BUFFER ; LD D,B ; PRESET DE TO ZERO TO REDUCE @@ -789,8 +813,14 @@ FF_FNCALL: CALL PRTHEXWORD #ENDIF ; + LD HL,MD_FNRET ; ADDRESS RELOCATABLE CODE TO RETURN TO HB_DI - CALL HBX_BUF ; EXECUTE RELOCATED CODE + LD (FF_SAVSTK),SP ; SAVE CURRENT STACK + LD SP,(HBX_BUF_END-2 ; SETUP A NEW HIMEM STACK AT END OF HX_BUF + EX (SP),HL ; BEHIND CODE WITH RETURN ADDRESS PREPOPULATED + JP HBX_BUF ; EXECUTE RELOCATED CODE +MD_FNRET: + LD SP,(FF_SAVSTK) ; RESTORE STACK HB_EI ; #IF (MD_FDBG==1) @@ -808,6 +838,8 @@ FF_FNCALL: POP HL RET ; RETURN TO MD_READF, MD_WRITEF ; +FF_SAVSTK .DW 0 +; ;====================================================================== ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS ; @@ -823,7 +855,7 @@ FF_FNCALL: ; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK ;====================================================================== ; -FF_CALCA: +MD_CALCA: ; #IF (MD_FDBG==1) CALL PC_SPACE ; DISPLAY SECTOR @@ -849,7 +881,7 @@ FF_CALCA: ; LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK ; - RET + RET ; RETURN TO MD_FNRET ; ;====================================================================== ; FLASH IDENTIFY @@ -866,9 +898,6 @@ FF_CALCA: ;====================================================================== ; MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD (HBX_BUF+MD_FIST-MD_FIDENT_R),SP ; SAVE STACK - LD SP,HBX_BUF + (MD_FIST-MD_FIDENT_R) ; SETUP TEMP STACK ; PUSH AF ; SAVE CURRENT BANK ; @@ -889,12 +918,8 @@ MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; - LD SP,(HBX_BUF + (MD_FIST-MD_FIDENT_R)) ; RESTORE STACK + RET ; RETURN TO MD_FNRET ; - RET -; - .FILL 8,0 ; STACK SPACE -MD_FIST .DW 0 ; SAVE STACK MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== @@ -912,29 +937,19 @@ MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; -MD_FEST .EQU $+2 ; SAVE STACK -; - LD HL,$5555 ; COMMAND ; LOCAL STACK - LD DE,$2AAA ; PRELOAD ; LOCAL STACK - LD (HBX_BUF+MD_FEST-MD_FERAS_R),SP ; SAVE STACK ; LOCAL STACK - LD SP,HBX_BUF + (MD_FERAS_S-MD_FERAS_R) ; SETUP TEMP STACK ; LOCAL STACK -; -MD_FERAS_S PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM ; - - LD A,L ; LD ($5555),A ; COMMAND - LD (HL),E ; LD A,$55 ; SETUP - LD (DE),A ; LD ($2AAA),A - LD (HL),$80 ; LD A,$80 - LD (HL),E ; LD ($5555),A - LD (DE),A ; LD A,$AA - ; LD ($5555),A - ; LD A,$55 - ; LD ($2AAA),A - + LD HL,$5555 ; LD ($5555),A + LD DE,$2AAA ; LD A,$55 + LD A,L ; LD ($2AAA),A + LD (HL),E ; LD A,$80 + LD (DE),A ; LD ($5555),A + LD (HL),$80 ; LD A,$AA + LD (HL),E ; LD ($5555),A + LD (DE),A ; LD A,$55 +; ; LD ($2AAA),A LD H,C ; SECTOR LD L,$00 ; ADDRESS ; @@ -966,9 +981,7 @@ MD_WT5: LD C,L ; SET SUCCESS STATUS MD_WT6: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; - LD SP,(HBX_BUF + (MD_FEST-MD_FERAS_R)) ; RESTORE STACK -; - RET + RET ; RETURN TO MD_FNRET ; MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; @@ -990,11 +1003,8 @@ MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; - LD H,C ; SECTOR ; LOCAL STACK - LD L,D ; ADDRESS ; LOCAL STACK - LD (HBX_BUF+MD_FRST-MD_FREAD_R),SP ; SAVE STACK ; LOCAL STACK - LD SP,HBX_BUF + (MD_FRD_S-MD_FREAD_R) ; SETUP TEMP STACK ; LOCAL STACK -MD_FRD_S: + LD H,C ; SECTOR + LD L,D ; ADDRESS ; PUSH AF ; SAVE CURRENT BANK ; @@ -1018,14 +1028,65 @@ MD_FRD1: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; - LD SP,(HBX_BUF+MD_FRST-MD_FREAD_R) ; RESTORE STACK -; - RET + RET ; RETURN TO MD_FNRET ; -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 + LD L,D ; ADDRESS +; + 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 +; + RET ; RETURN TO MD_FNRET +; +MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +; +;====================================================================== ; FLASH WRITE SECTOR. ; ; SELECT THE APPROPRIATE BANK / ADDRESS @@ -1043,13 +1104,8 @@ MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; -MD_FWST .EQU $+2 ; SAVE STACK -; - LD H,C ; SECTOR ; LOCAL STACK - LD L,D ; ADDRESS ; LOCAL STACK - LD (HBX_BUF+MD_FWST-MD_FWRIT_R),SP ; SAVE STACK ; LOCAL STACK - LD SP, HBX_BUF+(MD_FWRIT_S-MD_FWRIT_R) ; SETUP TEMP STACK ; LOCAL STACK -MD_FWRIT_S: + LD H,C ; SECTOR + LD L,D ; ADDRESS ; PUSH AF ; SAVE CURRENT BANK ; @@ -1089,8 +1145,6 @@ MD_FW7: LD A,(HL) ; FROM THE SAME FLASH ADDRESS. ; POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; - LD SP,(HBX_BUF+MD_FWST-MD_FWRIT_R) ; RESTORE STACK ; RET ; @@ -1156,6 +1210,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 +1238,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 "