From 83e102a043843cebae56aa483a47e2bbcb7bfa7b Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 27 Dec 2020 10:52:25 +0800 Subject: [PATCH] Update md.asm Calculate bank and sector only when needed --- Source/HBIOS/md.asm | 119 ++++++++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 49 deletions(-) diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index e7958d2a..a53485ac 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -304,13 +304,16 @@ MD_RDSECF: ; CALLED FROM MD_RW POP HL ; BLOCK WE HAVE JR Z,MD_SECM ; IN THE BUFFER ; -;MD_SECR: + + ; DESIRED SECTOR ; IS NOT IN BUFFER LD (MD_LBA4K),BC ; WE WILL READ IN ; A NEW 4K SECTOR. ; SAVE THE 4K LBA ; FOR FUTURE CHECKS + + CALL MD_CALBAS ; SETUP BANK AND SECTOR ; ; DE:HL CONTAIN SOURCE ADDRESS ; WHICH WAS SETUP BY MD_IOSETUPF @@ -349,7 +352,7 @@ MD_IOSETUPF: LD A,L ; SAVE LBA 4K AND %11111000 ; BLOCK WE ARE LD C,A ; GOING TO - LD A,H ; ACCESS + LD B,H ; ACCESS ; LD D,0 ; CONVERT LBA LD E,H ; TO ADDRESS @@ -357,10 +360,58 @@ MD_IOSETUPF: LD L,D ; DE:HL = HLX512 SLA H RL E - RL D + RL D + +; CALL MD_CALCA ; RET ; +;====================================================================== +; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS +; +; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. +; ON EXIT B CONTAINS BANK SELECT BYTE +; C CONTAINS HIGH BYTE OF SECTOR ADDRESS +; +; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL +; 3322222222221111 1111110000000000 +; 1098765432109876 5432109876543210 +; XXXXXXXXXXXXSSSS SSSSXXXXXXXXXXXX < S = SECTOR +; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK +;====================================================================== +; +MD_CALBAS: +; +#IF (MD_FDBG==1) + CALL PC_SPACE ; DISPLAY SECTOR + CALL PRTHEX32 ; SECTOR ADDRESS + CALL PC_SPACE ; IN DE:HL +#ENDIF +; + PUSH HL + PUSH BC + 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 + + POP HL +; + LD (MD_FBAS),BC ; SAVE BANK AND SECTOR FOR USE IN FLASH ROUTINES +; +#IF (MD_FDBG==1) + CALL PRTHEXWORD ; DISPLAY BANK AND + CALL PC_SPACE ; SECTOR RESULT +#ENDIF +; + POP BC + RET ; ; WRITE FLASH ; @@ -375,6 +426,8 @@ MD_WRSECF: ; CALLED FROM MD_RW JR Z,MD_SECM1 ; IN THE BUFFER ; LD (MD_LBA4K),BC ; SAVE 4K LBA +; + CALL MD_CALBAS ; SETUP BANK AND SECTOR ; LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL @@ -436,6 +489,7 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER RET ; MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR +MD_FBAS .DW $FFFF ; BANK AND SECTOR #ENDIF ; ; READ RAM / ROM @@ -634,6 +688,8 @@ MDSTR_LEN .TEXT "LEN=$" ; ; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ ; +; REFERENCE ww1.microchip.com/downloads/en/DeviceDoc/SST39SF040.txt +; ;================================================================================================== ; #IF (MDFFENABLE) @@ -670,6 +726,7 @@ MD_PROBE: LD A,'=' ; NUMBER CALL COUT #ENDIF + CALL MD_CALBAS ; SETUP BANK AND SECTOR LD BC,MD_FIDENT_R ; PUT ROUTINE TO CALL CALL MD_FNCALL ; EXECUTE: IDENTIFY FLASH CHIP @@ -794,11 +851,14 @@ FF_NXT2: MD_FNCALL: PUSH HL ; USING HBX_BUF FOR CODE AREA PUSH DE - PUSH BC - CALL MD_CALCA ; GET BANK AND SECTOR DATA IN BC + + PUSH BC ; GET ROUTINE TO CALL + POP HL + +; CALL MD_CALCA ; GET BANK AND SECTOR DATA IN BC ; - POP HL ; GET ROUTINE TO CALL - PUSH BC + +; PUSH BC ; LD DE,HBX_BUF ; EXECUTE / START ADDRESS LD BC,MD_CSIZE ; CODE SIZE. MAXIMUM 64 BYTES @@ -807,7 +867,8 @@ MD_FNCALL: LD D,B ; PRESET DE TO ZERO TO REDUCE LD E,B ; CODE SIZE IN RELOCATABLE CODE ; - POP BC ; PUT BANK AND SECTOR DATA IN BC +; POP BC ; PUT BANK AND SECTOR DATA IN BC + LD BC,(MD_FBAS) ; PUT BANK AND SECTOR DATA IN BC ; #IF (MD_FDBG==1) CALL PRTHEXWORD @@ -842,47 +903,7 @@ MD_FNCALL: POP HL RET ; RETURN TO MD_READF, MD_WRITEF ; -MD_SAVSTK .DW 0 -; -;====================================================================== -; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS -; -; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. -; ON EXIT B CONTAINS BANK SELECT BYTE -; C CONTAINS HIGH BYTE OF SECTOR ADDRESS -; -; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL -; 3322222222221111 1111110000000000 -; 1098765432109876 5432109876543210 -; XXXXXXXXXXXXSSSS SSSSXXXXXXXXXXXX < S = SECTOR -; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK -;====================================================================== -; -MD_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 -; -#IF (MD_FDBG==1) - CALL PRTHEXWORD ; DISPLAY BANK AND - CALL PC_SPACE ; SECTOR RESULT -#ENDIF -; - RET +MD_SAVSTK .DW 0 ; ;====================================================================== ; FLASH IDENTIFY