Browse Source

Update md.asm

Optimization and cleanup
pull/163/head
b1ackmai1er 5 years ago
parent
commit
4327d0a0f1
  1. 193
      Source/HBIOS/md.asm

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

Loading…
Cancel
Save