Browse Source

Merge pull request #164 from b1ackmai1er/dev

Flash file system optimizations
pull/173/head
Wayne Warthen 5 years ago
committed by GitHub
parent
commit
fa6709f8bb
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 203
      Source/HBIOS/md.asm

203
Source/HBIOS/md.asm

@ -261,7 +261,13 @@ MD_RW:
MD_RW1: MD_RW1:
PUSH BC ; SAVE COUNTERS PUSH BC ; SAVE COUNTERS
LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS
#IF (MDFFENABLE)
PUSH IX
CALL JPHL ; ... AND CALL IT CALL JPHL ; ... AND CALL IT
POP IX
#ELSE
CALL JPHL ; ... AND CALL IT
#ENDIF
JR NZ,MD_RW2 ; IF ERROR, SKIP INCREMENT JR NZ,MD_RW2 ; IF ERROR, SKIP INCREMENT
; INCREMENT LBA ; INCREMENT LBA
LD A,MD_LBA ; LBA OFFSET IN CFG ENTRY LD A,MD_LBA ; LBA OFFSET IN CFG ENTRY
@ -297,7 +303,7 @@ MD_RDSECF: ; CALLED FROM MD_RW
POP HL ; BLOCK WE HAVE POP HL ; BLOCK WE HAVE
JR Z,MD_SECM ; IN THE BUFFER JR Z,MD_SECM ; IN THE BUFFER
; ;
MD_SECR:
;MD_SECR:
; DESIRED SECTOR ; DESIRED SECTOR
; IS NOT IN BUFFER ; IS NOT IN BUFFER
LD (MD_LBA4K),BC ; WE WILL READ IN LD (MD_LBA4K),BC ; WE WILL READ IN
@ -307,10 +313,10 @@ MD_SECR:
; ;
; DE:HL CONTAIN SOURCE ADDRESS ; DE:HL CONTAIN SOURCE ADDRESS
; WHICH WAS SETUP BY MD_IOSETUPF ; WHICH WAS SETUP BY MD_IOSETUPF
PUSH IX
;
LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS
CALL MD_FREAD ; READ 4K SECTOR
POP IX
LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL
CALL FF_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
@ -332,7 +338,7 @@ MD_SECM:
; ;
; ON EXIT ; ON EXIT
; BC = LBA 4K BLOCK WE ARE ACCESSING ; BC = LBA 4K BLOCK WE ARE ACCESSING
; DE:HL = MEMORY ADDRESS TO READ FROM IN FLASH
; DE:HL = MEMORY ADDRESS TO ACCESS IN FLASH
; ;
MD_IOSETUPF: MD_IOSETUPF:
LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA
@ -369,15 +375,13 @@ MD_WRSECF: ; CALLED FROM MD_RW
; ;
LD (MD_LBA4K),BC ; SAVE 4K LBA LD (MD_LBA4K),BC ; SAVE 4K LBA
; ;
PUSH IX
LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS
CALL MD_FREAD ; READ 4K SECTOR
POP IX
LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL
CALL FF_FNCALL ; EXECUTE: READ 4K SECTOR
; ;
MD_SECM1: ; DESIRED SECTOR IS IN BUFFER MD_SECM1: ; DESIRED SECTOR IS IN BUFFER
PUSH IX
CALL MD_FERAS ; ERASE 4K SECTOR
POP IX
LD BC,MD_FERAS_R ; PUT ROUTINE TO CALL
CALL FF_FNCALL ; EXECUTE: ERASE 4K SECTOR
OR A OR A
RET NZ ; RETURN IF ERROR RET NZ ; RETURN IF ERROR
; ;
@ -403,10 +407,9 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER
POP DE POP DE
POP HL POP HL
; ;
PUSH IX
LD IX,MD_F4KBUF ; WRITE THE SECTOR
CALL MD_FWRIT
POP IX
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS
LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL
CALL FF_FNCALL ; EXECUTE: WRITE 4K SECTOR
; ;
XOR A XOR A
; ;
@ -648,18 +651,17 @@ FF_PROBE:
LD A,'=' ; NUMBER LD A,'=' ; NUMBER
CALL COUT CALL COUT
#ENDIF #ENDIF
CALL MD_FIDENT ; GET ID AT THIS ADDRESS
LD BC,MD_FIDENT_R ; PUT ROUTINE TO CALL
CALL FF_FNCALL ; EXECUTE: IDENTIFY FLASH CHIP
PUSH HL PUSH HL
; PUSH DE
LD HL,MD_TGTDEV ; IF WE MATCH WITH LD HL,MD_TGTDEV ; IF WE MATCH WITH
XOR A ; A NON 39SF040 XOR A ; A NON 39SF040
SBC HL,BC ; CHIP SET THE SBC HL,BC ; CHIP SET THE
LD A,(MD_FFSEN) ; R/W FLAG TO R/O LD A,(MD_FFSEN) ; R/W FLAG TO R/O
OR H OR H
OR L
LD (MD_FFSEN),A ; A NON ZERO VALUE
; POP DE ; MEANS WE CAN'T
OR L ; A NON ZERO VALUE
LD (MD_FFSEN),A ; MEANS WE CAN'T
POP HL ; ENABLE FLASH WRITING POP HL ; ENABLE FLASH WRITING
#IF (MD_FVBS==1) #IF (MD_FVBS==1)
CALL MD_LAND ; LOOKUP AND DISPLAY CALL MD_LAND ; LOOKUP AND DISPLAY
@ -693,8 +695,6 @@ MD_LAND:
; ;
#IF (MD_FDBG==1) #IF (MD_FDBG==1)
PRTS(" ID:$") PRTS(" ID:$")
; LD H,C
; LD L,B
CALL PRTHEXWORD ; DISPLAY FLASH ID CALL PRTHEXWORD ; DISPLAY FLASH ID
CALL PC_SPACE CALL PC_SPACE
#ENDIF #ENDIF
@ -732,15 +732,45 @@ FF_NXT2:
CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT
#ENDIF #ENDIF
RET RET
;
;====================================================================== ;======================================================================
;COMMON FUNCTION CALL
; COMMON FUNCTION CALL FOR:
;
; MD_FIDENT_R - IDENTIFY FLASH CHIP
; ON ENTRY DE:HL POINTS TO AN ADDRESS WITH THE ADDRESS RANGE OF THE
; CHIP TO BE IDENTIFIED.
; ON EXIT BC CONTAINS THE CHIP ID BYTES.
; A NO STATUS IS RETURNED
;
; MD_FERAS_R - ERASE FLASH SECTOR
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS.
; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL
;
; MD_FREAD_R - READ FLASH SECTOR
; 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_FWRIT_R - WRITE FLASH SECTOR
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS.
; IX POINTS TO DATA TO BE WRITTEN
; ON EXIT A NO STATUS IS RETURNED
; ;
; GENERAL OPERATION:
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS
; COPY FLASH CODE TO CODE BUFFER
; CALL RELOCATED FLASH CODE
; RETURN WITH ID CODE.
;====================================================================== ;======================================================================
; ;
FF_FNCALL: ; USING HBX_BUF FOR CODE AREA
CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY
FF_FNCALL:
PUSH HL ; USING HBX_BUF FOR CODE AREA
PUSH DE
PUSH BC
CALL FF_CALCA ; GET BANK AND SECTOR DATA IN BC
; ;
POP HL ; GET ROUTINE TO CALL POP HL ; GET ROUTINE TO CALL
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,HBX_BUFSIZ ; MAX. CODE SIZE POSSIBLE
@ -749,8 +779,7 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA
LD D,B ; PRESET DE TO ZERO TO REDUCE LD D,B ; PRESET DE TO ZERO TO REDUCE
LD E,B ; CODE SIZE IN RELOCATABLE CODE LD E,B ; CODE SIZE IN RELOCATABLE CODE
; ;
PUSH IY ; PUT BANK AND SECTOR
POP BC ; DATA IN BC
POP BC ; PUT BANK AND SECTOR DATA IN BC
; ;
#IF (MD_FDBG==1) #IF (MD_FDBG==1)
CALL PRTHEXWORD CALL PRTHEXWORD
@ -773,15 +802,14 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA
LD A,C ; RETURN WITH STATUS IN A LD A,C ; RETURN WITH STATUS IN A
POP DE POP DE
POP HL POP HL
POP IY
RET ; RETURN TO MD_READF, MD_WRITEF RET ; RETURN TO MD_READF, MD_WRITEF
; ;
;====================================================================== ;======================================================================
; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS
; ;
; ON ENTRY DE:HL CONTAINS 32 BIT 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
; ON EXIT B CONTAINS BANK SELECT BYTE
; C CONTAINS HIGH BYTE OF SECTOR ADDRESS
; A CONTAINS CURRENT BANK HB_CURBNK ; A CONTAINS CURRENT BANK HB_CURBNK
; ;
; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL ; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL
@ -809,9 +837,6 @@ FF_CALCA:
RRA ; ADDRESS THAT GETS WRITTEN RRA ; ADDRESS THAT GETS WRITTEN
AND $70 ; TO BANK SELECT PORT AND $70 ; TO BANK SELECT PORT
LD C,A LD C,A
;
PUSH BC
POP IY
; ;
#IF (MD_FDBG==1) #IF (MD_FDBG==1)
CALL PRTHEXWORD ; DISPLAY BANK AND CALL PRTHEXWORD ; DISPLAY BANK AND
@ -823,32 +848,6 @@ FF_CALCA:
RET RET
; ;
;====================================================================== ;======================================================================
; IDENTIFY FLASH CHIP.
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS
; CREATE A CODE BUFFER IN HIGH MEMORY AREA
; COPY FLASH CODE TO CODE BUFFER
; CALL RELOCATED FLASH IDENTITY CODE
; RESTORE STACK
; RETURN WITH ID CODE.
;
; ON ENTRY DE:HL POINTS TO AN ADDRESS WITH THE ADDRESS RANGE OF THE
; CHIP TO BE IDENTIFIED.
; ON EXIT BC CONTAINS THE CHIP ID BYTES.
; NO STATUS IS RETURNED
;======================================================================
;
MD_FIDENT:
PUSH IY
PUSH HL
PUSH DE
;
PUSH HL ; SAVE ADDRESS INFO
LD HL,MD_FIDENT_R ; PUT ROUTINE TO CALL
EX (SP),HL ; ON THE STACK
;
JP FF_FNCALL ; EXECUTE
;
;======================================================================
; FLASH IDENTIFY ; FLASH IDENTIFY
; SELECT THE APPROPRIATE BANK / ADDRESS ; SELECT THE APPROPRIATE BANK / ADDRESS
; ISSUE ID COMMAND ; ISSUE ID COMMAND
@ -893,31 +892,6 @@ MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
.FILL 8,0 ; STACK SPACE .FILL 8,0 ; STACK SPACE
MD_FIST .DW 0 ; SAVE STACK 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
;======================================================================
; ERASE FLASH SECTOR
;
; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS.
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS
; CREATE A CODE BUFFER IN HIGH MEMORY AREA
; COPY FLASH CODE TO CODE BUFFER
; CALL RELOCATED FLASH ERASE CODE
; RESTORE STACK
; RETURN WITH STATUS CODE.
;
; ON ENTRY DE:HL POINTS TO AN ADDRESS IDENTIFYING THE CHIP
; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL
;======================================================================
;
MD_FERAS:
PUSH IY
PUSH HL
PUSH DE
;
PUSH HL ; SAVE ADDRESS INFO
LD HL,MD_FERAS_R ; PUT ROUTINE TO CALL
EX (SP),HL ; ON THE STACK
JP FF_FNCALL ; EXECUTE
; ;
;====================================================================== ;======================================================================
; ERASE FLASH SECTOR. ; ERASE FLASH SECTOR.
@ -995,37 +969,6 @@ FF_WT6: POP AF ; RETURN TO ORIGINAL BANK
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
; ;
;====================================================================== ;======================================================================
; READ FLASH SECTOR OF 4096 BYTES
;
; SET ADDRESS TO START OF SECTOR
; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS
; CREATE A CODE BUFFER IN HIGH MEMORY AREA
; COPY FLASH CODE TO CODE BUFFER
; CALL RELOCATED FLASH READ SECTOR CODE
; RESTORE STACK
;
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS.
; IX POINTS TO WHERE TO SAVE DATA
; ON EXIT NO STATUS IS RETURNED
;======================================================================
;
MD_FREAD:
PUSH IY
PUSH HL
PUSH DE
;
LD L,0 ; CHANGE ADDRESS
LD A,H ; TO SECTOR BOUNDARY
AND $F0 ; BY MASKING OFF
LD H,A ; LOWER 12 BITS
;
PUSH HL ; SAVE ADDRESS INFO
LD HL,MD_FREAD_R ; PUT ROUTINE TO CALL
EX (SP),HL ; ON THE STACK
JP FF_FNCALL ; EXECUTE
;
RET
;======================================================================
; FLASH READ SECTOR. ; FLASH READ SECTOR.
; ;
; SELECT THE APPROPRIATE BANK / ADDRESS ; SELECT THE APPROPRIATE BANK / ADDRESS
@ -1079,36 +1022,6 @@ 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
; ;
;====================================================================== ;======================================================================
; WRITE FLASH SECTOR OF 4096 BYTES
;
; SET ADDRESS TO START OF SECTOR
; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS
; CREATE A CODE BUFFER IN HIGH MEMORY AREA
; COPY FLASH CODE TO CODE BUFFER
; CALL RELOCATED FLASH WRITE SECTOR CODE
; RESTORE STACK
;
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS.
; IX POINTS TO DATA TO BE WRITTEN
; ON EXIT NO STATUS IS RETURNED
;======================================================================
;
MD_FWRIT:
PUSH IY
PUSH HL
PUSH DE
;
LD L,0 ; CHANGE ADDRESS
LD A,H ; TO SECTOR BOUNDARY
AND $F0 ; BY MASKING OFF
LD H,A ; LOWER 12 BITS
;
PUSH HL ; SAVE ADDRESS INFO
LD HL,MD_FWRIT_R ; PUT ROUTINE TO CALL
EX (SP),HL ; ON THE STACK
JP FF_FNCALL ; EXECUTE
;
;======================================================================
; FLASH WRITE SECTOR. ; FLASH WRITE SECTOR.
; ;
; SELECT THE APPROPRIATE BANK / ADDRESS ; SELECT THE APPROPRIATE BANK / ADDRESS

Loading…
Cancel
Save