|
|
|
@ -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" |
|
|
|
|