diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index f5a161e7..9c26c860 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -601,15 +601,19 @@ MDSTR_LEN .TEXT "LEN=$" ; THE STACK IS IN UPPER MEMORY DURING BIOS INITIALIZATION BUT IS IN LOWER ; MEMORY DURING HBIOS CALLS. ; -; TO ACCESS THE FLASH CHIP FEATURES, CODE IS COPIED TO THE UPPER RAM BANK +; TO ACCESS THE FLASH CHIP FEATURES, CODE IS COPIED TO THE UPPER RAM BANK (HBX_BUF) ; 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. +; ; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ ; ;================================================================================================== ; #IF (MDFFENABLE) -FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM +FF_TGT .EQU 0B7BFH ; TARGET CHIP FOR R/W FILESYSTEM ; ;====================================================================== ; BIOS FLASH INITIALIZATION @@ -646,9 +650,9 @@ FF_PROBE: PUSH HL ; PUSH DE - LD H,FF_TGT&$FF ; IF WE MATCH WITH - LD L,FF_TGT/$FF - CCF ; A NON 39SF040 + LD HL,FF_TGT ; IF WE MATCH WITH +; LD L,FF_TGT&$FF + XOR A ; A NON 39SF040 SBC HL,BC ; CHIP SET THE LD A,(MD_FFSEN) ; R/W FLAG TO R/O OR H @@ -772,6 +776,52 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA RET ; RETURN TO MD_READF, MD_WRITEF ; ;====================================================================== +; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS +; +; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. +; ON EXIT I,B CONTAINS BANK SELECT BYTE +; Y,C CONTAINS HIGH BYTE OF SECTOR ADDRESS +; A CONTAINS CURRENT BANK HB_CURBNK +; +; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL +; 3322222222221111 1111110000000000 +; 1098765432109876 5432109876543210 +; XXXXXXXXXXXXSSSS SSSSXXXXXXXXXXXX < S = SECTOR +; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK +;====================================================================== +; +FF_CALCA: +; +#IF (MD_FDBG==1) + CALL PC_SPACE ; DISPLAY SECTOR + CALL PRTHEX32 ; SECTOR ADDRESS + CALL PC_SPACE ; IN DE:HL +#ENDIF +; + LD A,E ; BOTTOM PORTION OF SECTOR + AND $0F ; ADDRESS THAT GETS WRITTEN + RLC H ; WITH ERASE COMMAND BYTE + RLA ; A15 GETS DROPPED OFF AND + LD B,A ; ADDED TO BANK SELECT +; + LD A,H ; TOP SECTION OF SECTOR + RRA ; ADDRESS THAT GETS WRITTEN + AND $70 ; TO BANK SELECT PORT + LD C,A +; + PUSH BC + POP IY +; +#IF (MD_FDBG==1) + CALL PRTHEXWORD ; DISPLAY BANK AND + CALL PC_SPACE ; SECTOR RESULT +#ENDIF +; + LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK +; + RET +; +;====================================================================== ; IDENTIFY FLASH CHIP. ; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS ; CREATE A CODE BUFFER IN HIGH MEMORY AREA @@ -842,53 +892,7 @@ MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY .FILL 8,0 ; STACK SPACE MD_FIST .DW 0 ; SAVE STACK MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED -; -;====================================================================== -; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS -; -; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. -; ON EXIT I,B CONTAINS BANK SELECT BYTE -; Y,C CONTAINS HIGH BYTE OF SECTOR ADDRESS -; A CONTAINS CURRENT BANK HB_CURBNK -; -; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL -; 3322222222221111 1111110000000000 -; 1098765432109876 5432109876543210 -; XXXXXXXXXXXXSSSS SSSSXXXXXXXXXXXX < S = SECTOR -; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK -;====================================================================== -; -FF_CALCA: -; -#IF (MD_FDBG==1) - CALL PC_SPACE ; DISPLAY SECTOR - CALL PRTHEX32 ; SECTOR ADDRESS - CALL PC_SPACE ; IN DE:HL -#ENDIF -; - LD A,E ; BOTTOM PORTION OF SECTOR - AND $0F ; ADDRESS THAT GETS WRITTEN - RLC H ; WITH ERASE COMMAND BYTE - RLA ; A15 GETS DROPPED OFF AND - LD B,A ; ADDED TO BANK SELECT -; - LD A,H ; TOP SECTION OF SECTOR - RRA ; ADDRESS THAT GETS WRITTEN - AND $70 ; TO BANK SELECT PORT - LD C,A -; - PUSH BC - POP IY -; -#IF (MD_FDBG==1) - CALL PRTHEXWORD ; DISPLAY BANK AND - CALL PC_SPACE ; SECTOR RESULT -#ENDIF -; - LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK -; - RET -; + ;====================================================================== ; ERASE FLASH SECTOR ; @@ -924,58 +928,34 @@ MD_FERAS: ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FAIL=NZ ;====================================================================== ; MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; - LD (HBX_BUF+MD_FEST-MD_FERAS_R),SP ; SAVE STACK - LD SP,HBX_BUF + (MD_FERAS_S-MD_FERAS_R) ; SETUP TEMP STACK +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 ; - LD HL,$5555 ; LD A,$AA ; COMMAND - LD DE,$2AAA ;+3 MD_FERAS_S PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM - ; -; LD HL,$5555 ; LD A,$AA ; COMMAND -; LD A,L ; LD ($5555),A ; SETUP -; LD (HL),$AA ; LD A,$55 -; LD ($2AAA),A ; LD ($2AAA),A -; LD (HL),$80 ; LD A,$80 -; LD (HL),$AA ; LD ($5555),A -; LD ($2AAA),A ; LD A,$AA - ; LD ($5555),A - ; LD A,$55 - ; LD ($2AAA),A ; -; LD HL,$5555 ; LD A,$AA ; COMMAND -; LD DE,$2AAA ;+3 -; LD A,L ; LD ($5555),A ; SETUP -; LD (HL),$AA ; LD A,$55 -; LD (DE),A ;-2 ; LD ($2AAA),A -; LD (HL),$80 ; LD A,$80 -; LD (HL),$AA ; LD ($5555),A -; LD (DE),A ;-2 ; LD A,$AA - ; LD ($5555),A - ; LD A,$55 - ; LD ($2AAA),A -; -; LD HL,$5555 ; LD A,$AA ; COMMAND -; LD DE,$2AAA ;+3 - LD A,L ; LD ($5555),A ; SETUP - LD (HL),E ;-1 ; LD A,$55 - LD (DE),A ;-2 ; LD ($2AAA),A + + 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 ;-1 ; LD ($5555),A - LD (DE),A ;-2 ; LD A,$AA + LD (HL),E ; LD ($5555),A + LD (DE),A ; LD A,$AA ; LD ($5555),A ; LD A,$55 ; LD ($2AAA),A - - LD H,C ; SECTOR LD L,$00 ; ADDRESS ; @@ -999,11 +979,11 @@ FF_WT4: LD C,(HL) ; FROM THE SAME FLASH ADDRESS. BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED JR Z,FF_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. ; -; LD (HL),$F0 ; WRITE DEVICE RESET -; LD C,$FF ; SET FAIL STATUS + LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE + LD (HL),C ; WRITE DEVICE RESET JR FF_WT6 -; FF_WT5: LD C,L ; SET SUCCESS STATUS +; FF_WT6: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; @@ -1011,7 +991,6 @@ FF_WT6: POP AF ; RETURN TO ORIGINAL BANK ; RET ; -MD_FEST .DW 0 MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== @@ -1054,7 +1033,7 @@ MD_FREAD: ; DESTINATION BANK IS ALWAYS CURRENT BANK ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; DE = 0000 +; DE = 0000 BYTE COUNT ; IX POINTS TO DATA TO BE WRITTEN ; A CONTAINS CURRENT BANK ; ON EXIT NO STATUS RETURNED @@ -1062,14 +1041,11 @@ MD_FREAD: ; MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; - LD H,C ; SECTOR - LD L,$00 ; ADDRESS -; LD D,L ; INITIALIZE -; LD E,L ; BYTE COUNT -; - LD (HBX_BUF+MD_FRST-MD_FREAD_R),SP ; SAVE STACK + 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 SP,HBX_BUF + (MD_FRD_S-MD_FREAD_R) ; SETUP TEMP STACK ; PUSH AF ; SAVE CURRENT BANK ; @@ -1092,7 +1068,6 @@ MD_FRD1: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; LD C,D ; RETURN STATUS ; LD SP,(HBX_BUF+MD_FRST-MD_FREAD_R) ; RESTORE STACK ; @@ -1141,6 +1116,7 @@ MD_FWRIT: ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; IX POINTS TO DATA TO BE WRITTEN +; DE = 0000 BYTE COUNT ; A CONTAINS CURRENT BANK ; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== @@ -1149,13 +1125,10 @@ MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; MD_FWST .EQU $+2 ; SAVE STACK ; - LD H,C ; SECTOR - LD L,$00 ; ADDRESS -; LD D,L ; INITIALIZE -; LD E,L ; BYTE COUNT - - LD (HBX_BUF+MD_FWST-MD_FWRIT_R),SP ; SAVE STACK - LD SP, HBX_BUF+(MD_FWRIT_S-MD_FWRIT_R) ; SETUP TEMP 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: ; PUSH AF ; SAVE CURRENT BANK @@ -1253,7 +1226,7 @@ MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE ; ;====================================================================== ; -#IF (MD_FDBG==1) +#IF (MD_FDBG==0) .ECHO "MD_FIDENT_R " .ECHO MD_I_SZ .ECHO "\n"