Browse Source

Update md.asm

Calculate bank and sector only when needed
pull/172/head
b1ackmai1er 5 years ago
parent
commit
83e102a043
  1. 119
      Source/HBIOS/md.asm

119
Source/HBIOS/md.asm

@ -304,13 +304,16 @@ 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:
; 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
; A NEW 4K SECTOR. ; A NEW 4K SECTOR.
; SAVE THE 4K LBA ; SAVE THE 4K LBA
; FOR FUTURE CHECKS ; FOR FUTURE CHECKS
CALL MD_CALBAS ; SETUP BANK AND SECTOR
; ;
; DE:HL CONTAIN SOURCE ADDRESS ; DE:HL CONTAIN SOURCE ADDRESS
; WHICH WAS SETUP BY MD_IOSETUPF ; WHICH WAS SETUP BY MD_IOSETUPF
@ -349,7 +352,7 @@ MD_IOSETUPF:
LD A,L ; SAVE LBA 4K LD A,L ; SAVE LBA 4K
AND %11111000 ; BLOCK WE ARE AND %11111000 ; BLOCK WE ARE
LD C,A ; GOING TO LD C,A ; GOING TO
LD A,H ; ACCESS
LD B,H ; ACCESS
; ;
LD D,0 ; CONVERT LBA LD D,0 ; CONVERT LBA
LD E,H ; TO ADDRESS LD E,H ; TO ADDRESS
@ -357,10 +360,58 @@ MD_IOSETUPF:
LD L,D ; DE:HL = HLX512 LD L,D ; DE:HL = HLX512
SLA H SLA H
RL E RL E
RL D
RL D
; CALL MD_CALCA
; ;
RET 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 ; WRITE FLASH
; ;
@ -375,6 +426,8 @@ MD_WRSECF: ; CALLED FROM MD_RW
JR Z,MD_SECM1 ; IN THE BUFFER JR Z,MD_SECM1 ; IN THE BUFFER
; ;
LD (MD_LBA4K),BC ; SAVE 4K LBA LD (MD_LBA4K),BC ; SAVE 4K LBA
;
CALL MD_CALBAS ; SETUP BANK AND SECTOR
; ;
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
@ -436,6 +489,7 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER
RET RET
; ;
MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR
MD_FBAS .DW $FFFF ; BANK AND SECTOR
#ENDIF #ENDIF
; ;
; READ RAM / ROM ; READ RAM / ROM
@ -634,6 +688,8 @@ MDSTR_LEN .TEXT "LEN=$"
; ;
; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ ; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/
; ;
; REFERENCE ww1.microchip.com/downloads/en/DeviceDoc/SST39SF040.txt
;
;================================================================================================== ;==================================================================================================
; ;
#IF (MDFFENABLE) #IF (MDFFENABLE)
@ -670,6 +726,7 @@ MD_PROBE:
LD A,'=' ; NUMBER LD A,'=' ; NUMBER
CALL COUT CALL COUT
#ENDIF #ENDIF
CALL MD_CALBAS ; SETUP BANK AND SECTOR
LD BC,MD_FIDENT_R ; PUT ROUTINE TO CALL LD BC,MD_FIDENT_R ; PUT ROUTINE TO CALL
CALL MD_FNCALL ; EXECUTE: IDENTIFY FLASH CHIP CALL MD_FNCALL ; EXECUTE: IDENTIFY FLASH CHIP
@ -794,11 +851,14 @@ FF_NXT2:
MD_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
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 DE,HBX_BUF ; EXECUTE / START ADDRESS
LD BC,MD_CSIZE ; CODE SIZE. MAXIMUM 64 BYTES 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 D,B ; PRESET DE TO ZERO TO REDUCE
LD E,B ; CODE SIZE IN RELOCATABLE CODE 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) #IF (MD_FDBG==1)
CALL PRTHEXWORD CALL PRTHEXWORD
@ -842,47 +903,7 @@ MD_FNCALL:
POP HL POP HL
RET ; RETURN TO MD_READF, MD_WRITEF 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 ; FLASH IDENTIFY

Loading…
Cancel
Save