Browse Source

Update md.asm

Restructure local stack setup for relocatable flash routines.
pull/167/head
b1ackmai1er 5 years ago
parent
commit
7c67fc18c8
  1. 130
      Source/HBIOS/md.asm

130
Source/HBIOS/md.asm

@ -317,7 +317,7 @@ MD_RDSECF: ; CALLED FROM MD_RW
; ;
LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS
LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL 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: MD_SECM:
LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK
@ -378,11 +378,11 @@ MD_WRSECF: ; CALLED FROM MD_RW
; ;
LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS
LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL 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 MD_SECM1: ; DESIRED SECTOR IS IN BUFFER
LD BC,MD_FERAS_R ; PUT ROUTINE TO CALL 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 OR A
RET NZ ; RETURN IF ERROR RET NZ ; RETURN IF ERROR
; ;
@ -410,25 +410,25 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER
; ;
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS LD IX,MD_F4KBUF ; SET SOURCE ADDRESS
LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL 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 ; PRESUME SUCCESS STATUS XOR A ; PRESUME SUCCESS STATUS
; ;
#IF (MD_FVAR==1) #IF (MD_FVAR==1)
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS LD IX,MD_F4KBUF ; SET SOURCE ADDRESS
LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL
CALL FF_FNCALL ; EXECUTE: VERIFY 4K SECTOR
CALL MD_FNCALL ; EXECUTE: VERIFY 4K SECTOR
; ;
OR A OR A
RET Z ; RETURN IF SUCCESSFUL RET Z ; RETURN IF SUCCESSFUL
; ;
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; RETRY LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; RETRY
LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL ; WRITE LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL ; WRITE
CALL FF_FNCALL ; EXECUTE: WRITE 4K SECTOR ; ONCE
CALL MD_FNCALL ; EXECUTE: WRITE 4K SECTOR ; ONCE
; ;
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; VERIFY LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; VERIFY
LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL ; AGAIN LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL ; AGAIN
CALL FF_FNCALL ; EXECUTE: VERIFY 4K SECTOR
CALL MD_FNCALL ; EXECUTE: VERIFY 4K SECTOR
; ;
OR A ; SET FINAL STATUS AFTER RETRY OR A ; SET FINAL STATUS AFTER RETRY
#ENDIF #ENDIF
@ -630,8 +630,7 @@ MDSTR_LEN .TEXT "LEN=$"
; AND THE FLASH CHIP IS SWITCHED INTO THE LOWER BANK. ; 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 ; 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/ ; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/
; ;
@ -656,7 +655,7 @@ MD_FINIT:
#ENDIF #ENDIF
LD B,A ; NUMBER OF DEVICES TO PROBE LD B,A ; NUMBER OF DEVICES TO PROBE
LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL
FF_PROBE:
MD_PROBE:
LD D,$00 ; SET ADDRESS IN DE:HL LD D,$00 ; SET ADDRESS IN DE:HL
LD E,C ; LD E,C ;
LD H,D ; WE INCREASE E BY $08 LD H,D ; WE INCREASE E BY $08
@ -672,7 +671,7 @@ FF_PROBE:
CALL COUT CALL COUT
#ENDIF #ENDIF
LD BC,MD_FIDENT_R ; PUT ROUTINE TO CALL 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 PUSH HL
LD HL,MD_TGTDEV ; IF WE MATCH WITH LD HL,MD_TGTDEV ; IF WE MATCH WITH
@ -692,7 +691,7 @@ FF_PROBE:
ADD A,$08 ; TO NEXT DEVICE ADD A,$08 ; TO NEXT DEVICE
LD C,A LD C,A
; ;
DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE
DJNZ MD_PROBE ; ALWAYS AT LEAST ONE DEVICE
#IF (MD_FVBS==1) #IF (MD_FVBS==1)
CALL PRTSTRD CALL PRTSTRD
@ -725,21 +724,21 @@ MD_LAND:
; ;
LD HL,MD_TABLE ; SEARCH THROUGH THE FLASH LD HL,MD_TABLE ; SEARCH THROUGH THE FLASH
LD DE,MD_T_CNT ; TABLE TO FIND A MATCH LD DE,MD_T_CNT ; TABLE TO FIND A MATCH
FF_NXT1:LD A,(HL)
MD_NXT1:LD A,(HL)
CP B CP B
JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH
JR NZ,MD_NXT0 ; FIRST BYTE DOES NOT MATCH
; ;
INC HL INC HL
LD A,(HL) LD A,(HL)
CP C CP C
DEC HL DEC HL
JR NZ,FF_NXT0 ; SECOND BYTE DOES NOT MATCH
JR NZ,MD_NXT0 ; SECOND BYTE DOES NOT MATCH
; ;
INC HL INC HL
INC HL INC HL
JR FF_NXT2 ; MATCH SO EXIT 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 LD BC,MD_T_SZ ; TO THE NEXT TABLE ENTRY
ADD HL,BC ADD HL,BC
POP BC POP BC
@ -747,7 +746,7 @@ FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT
LD A,D ; CHECK IF WE REACHED THE LD A,D ; CHECK IF WE REACHED THE
OR E ; END OF THE TABLE OR E ; END OF THE TABLE
DEC DE 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 LD HL,MD_FFMSGUNK ; WE REACHED THE END WITHOUT A MATCH
; ;
@ -792,17 +791,17 @@ FF_NXT2:
; RETURN WITH ID CODE. ; RETURN WITH ID CODE.
;====================================================================== ;======================================================================
; ;
FF_FNCALL:
MD_FNCALL:
PUSH HL ; USING HBX_BUF FOR CODE AREA PUSH HL ; USING HBX_BUF FOR CODE AREA
PUSH DE PUSH DE
PUSH BC 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 POP HL ; GET ROUTINE TO CALL
PUSH BC PUSH BC
; ;
LD DE,HBX_BUF ; EXECUTE / START ADDRESS 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 LDIR ; COPY OUR RELOCATABLE CODE TO THE BUFFER
; ;
LD D,B ; PRESET DE TO ZERO TO REDUCE LD D,B ; PRESET DE TO ZERO TO REDUCE
@ -814,8 +813,14 @@ FF_FNCALL:
CALL PRTHEXWORD CALL PRTHEXWORD
#ENDIF #ENDIF
; ;
LD HL,FF_FNRET ; ADDRESS RELOCATABLE CODE TO RETURN TO
HB_DI 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
FF_FNRET:
LD SP,(FF_SAVSTK) ; RESTORE STACK
HB_EI HB_EI
; ;
#IF (MD_FDBG==1) #IF (MD_FDBG==1)
@ -833,6 +838,8 @@ FF_FNCALL:
POP HL POP HL
RET ; RETURN TO MD_READF, MD_WRITEF RET ; RETURN TO MD_READF, MD_WRITEF
; ;
FF_SAVSTK .DW 0
;
;====================================================================== ;======================================================================
; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS
; ;
@ -848,7 +855,7 @@ FF_FNCALL:
; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK ; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK
;====================================================================== ;======================================================================
; ;
FF_CALCA:
MD_CALCA:
; ;
#IF (MD_FDBG==1) #IF (MD_FDBG==1)
CALL PC_SPACE ; DISPLAY SECTOR CALL PC_SPACE ; DISPLAY SECTOR
@ -874,7 +881,7 @@ FF_CALCA:
; ;
LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK
; ;
RET
RET ; RETURN TO FF_FNRET
; ;
;====================================================================== ;======================================================================
; FLASH IDENTIFY ; FLASH IDENTIFY
@ -891,9 +898,6 @@ FF_CALCA:
;====================================================================== ;======================================================================
; ;
MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY 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 PUSH AF ; SAVE CURRENT BANK
; ;
@ -914,12 +918,8 @@ MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
POP AF ; RETURN TO ORIGINAL BANK POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
; ;
LD SP,(HBX_BUF + (MD_FIST-MD_FIDENT_R)) ; RESTORE STACK
;
RET
RET ; RETURN TO FF_FNRET
; ;
.FILL 8,0 ; STACK SPACE
MD_FIST .DW 0 ; SAVE STACK
MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
; ;
;====================================================================== ;======================================================================
@ -937,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_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 PUSH AF ; SAVE CURRENT BANK
LD A,B ; SELECT BANK LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM 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 H,C ; SECTOR
LD L,$00 ; ADDRESS LD L,$00 ; ADDRESS
; ;
@ -991,9 +981,7 @@ MD_WT5: LD C,L ; SET SUCCESS STATUS
MD_WT6: POP AF ; RETURN TO ORIGINAL BANK MD_WT6: POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
; ;
LD SP,(HBX_BUF + (MD_FEST-MD_FERAS_R)) ; RESTORE STACK
;
RET
RET ; RETURN TO FF_FNRET
; ;
MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
; ;
@ -1015,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 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 PUSH AF ; SAVE CURRENT BANK
; ;
@ -1043,12 +1028,10 @@ MD_FRD1:
POP AF ; RETURN TO ORIGINAL BANK POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
; ;
LD SP,(HBX_BUF+MD_FRST-MD_FREAD_R) ; RESTORE STACK
RET ; RETURN TO FF_FNRET
; ;
RET
;
MD_FRST .DW 0 ; SAVE STACK
MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
;
;====================================================================== ;======================================================================
; FLASH VERIFY SECTOR. ; FLASH VERIFY SECTOR.
; ;
@ -1067,11 +1050,8 @@ MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
; ;
MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY 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:
LD H,C ; SECTOR
LD L,D ; ADDRESS
; ;
PUSH AF ; SAVE CURRENT BANK PUSH AF ; SAVE CURRENT BANK
; ;
@ -1102,11 +1082,8 @@ MD_FVE2:
POP AF ; RETURN TO ORIGINAL BANK POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
; ;
LD SP,(HBX_BUF+MD_FVST-MD_FVERI_R) ; RESTORE STACK
RET ; RETURN TO FF_FNRET
; ;
RET
;
MD_FVST .DW 0 ; SAVE STACK
MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
; ;
;====================================================================== ;======================================================================
@ -1127,13 +1104,8 @@ MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
; ;
MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY 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 PUSH AF ; SAVE CURRENT BANK
; ;
@ -1173,8 +1145,6 @@ MD_FW7: LD A,(HL) ; FROM THE SAME FLASH ADDRESS.
; ;
POP AF ; RETURN TO ORIGINAL BANK POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
LD SP,(HBX_BUF+MD_FWST-MD_FWRIT_R) ; RESTORE STACK
; ;
RET RET
; ;

Loading…
Cancel
Save