Browse Source

Merge pull request #172 from b1ackmai1er/dev

Stack and calling optimizations
patch
Wayne Warthen 5 years ago
committed by GitHub
parent
commit
60ec6c87c2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      Source/HBIOS/Build.ps1
  2. 201
      Source/HBIOS/md.asm

2
Source/HBIOS/Build.ps1

@ -100,7 +100,7 @@ $env:PATH = $TasmPath + ';' + $CpmToolsPath + ';' + $env:PATH
# Initialize working variables
$OutDir = "../../Binary" # Output directory for final image file
$RomFmt = "wbw_rom${RomSize}" # Location of files to imbed in ROM disk
$BlankROM = "Blank${RomSize}KB.dat" # An initial "empty" image for the ROM disk of propoer size
$BlankROM = "Blank${RomSize}KB.dat" # An initial "empty" image for the ROM disk of proper size
$RomDiskFile = "RomDisk.tmp" # Temporary filename used to create ROM disk image
$RomFile = "${OutDir}/${RomName}.rom" # Final name of ROM image
$ComFile = "${OutDir}/${RomName}.com" # Final name of COM image (command line loadable HBIOS/CBIOS)

201
Source/HBIOS/md.asm

@ -299,24 +299,19 @@ MD_RDSECF: ; CALLED FROM MD_RW
;
PUSH HL ; IS THE SECTOR
LD HL,(MD_LBA4K) ; WE WANT TO
XOR A ; WRITE ALREADY
XOR A ; READ ALREADY
SBC HL,BC ; IN THE 4K
POP HL ; BLOCK WE HAVE
JR Z,MD_SECM ; IN THE BUFFER
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
; 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
;
; DE:HL CONTAIN SOURCE ADDRESS
; WHICH WAS SETUP BY MD_IOSETUPF
CALL MD_CALBAS ; SETUP BANK AND SECTOR
;
LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS
LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL
LD HL,MD_FREAD_R ; PUT ROUTINE TO CALL
CALL MD_FNCALL ; EXECUTE: READ 4K SECTOR
;
MD_SECM:
@ -349,7 +344,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 +352,54 @@ MD_IOSETUPF:
LD L,D ; DE:HL = HLX512
SLA H
RL E
RL D
RL D
;
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
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
RET
;
; WRITE FLASH
;
@ -375,19 +414,18 @@ 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
LD HL,MD_FREAD_R ; PUT ROUTINE TO CALL
CALL MD_FNCALL ; EXECUTE: READ 4K SECTOR
;
MD_SECM1: ; DESIRED SECTOR IS IN BUFFER
LD BC,MD_FERAS_R ; PUT ROUTINE TO CALL
LD HL,MD_FERAS_R ; PUT ROUTINE TO CALL
CALL MD_FNCALL ; EXECUTE: ERASE 4K SECTOR
OR A
RET NZ ; RETURN IF ERROR
;
PUSH HL
PUSH DE
;
; COPY 512B SECTOR INTO 4K SECTOR
;
@ -404,30 +442,27 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER
LD HL,(MD_DSKBUF)
LD BC,512 ; COPY ONE 512B SECTOR FROM THE
LDIR ; THE DISK BUFFER TO 4K SECTOR
;
POP DE
POP HL
;
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS
LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL
LD HL,MD_FWRIT_R ; PUT ROUTINE TO CALL
CALL MD_FNCALL ; EXECUTE: WRITE 4K SECTOR
;
XOR A ; PRESUME SUCCESS STATUS
;
#IF (MD_FVAR==1)
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS
LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL
LD HL,MD_FVERI_R ; PUT ROUTINE TO CALL
CALL MD_FNCALL ; EXECUTE: VERIFY 4K SECTOR
;
OR A
RET Z ; RETURN IF SUCCESSFUL
;
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; RETRY
LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL ; WRITE
LD HL,MD_FWRIT_R ; PUT ROUTINE TO CALL ; WRITE
CALL MD_FNCALL ; EXECUTE: WRITE 4K SECTOR ; ONCE
;
LD IX,MD_F4KBUF ; SET SOURCE ADDRESS ; VERIFY
LD BC,MD_FVERI_R ; PUT ROUTINE TO CALL ; AGAIN
LD HL,MD_FVERI_R ; PUT ROUTINE TO CALL ; AGAIN
CALL MD_FNCALL ; EXECUTE: VERIFY 4K SECTOR
;
OR A ; SET FINAL STATUS AFTER RETRY
@ -436,6 +471,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 +670,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,10 +708,11 @@ MD_PROBE:
LD A,'=' ; NUMBER
CALL COUT
#ENDIF
LD BC,MD_FIDENT_R ; PUT ROUTINE TO CALL
PUSH HL
CALL MD_CALBAS ; SETUP BANK AND SECTOR
LD HL,MD_FIDENT_R ; PUT ROUTINE TO CALL
CALL MD_FNCALL ; EXECUTE: IDENTIFY FLASH CHIP
PUSH HL
LD HL,MD_TGTDEV ; IF WE MATCH WITH
XOR A ; A NON 39SF040
SBC HL,BC ; CHIP SET THE
@ -760,45 +799,41 @@ FF_NXT2:
; 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
; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED
; HL POINTS TO THE ROUTINE TO RELOCATED AND CALLED
; 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
; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED
; HL POINTS TO THE ROUTINE TO RELOCATED AND CALLED
; 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
; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED
; HL POINTS TO THE ROUTINE TO RELOCATED AND CALLED
; IX POINTS TO WHERE TO SAVE DATA
; ON EXIT A NO STATUS IS RETURNED
;
; MD_VERI_R - VERIFY FLASH SECTOR
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS.
; IX POINTS TO DATA TO COMPARE.
; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL
; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED
; HL POINTS TO THE ROUTINE TO RELOCATED AND CALLED
; IX POINTS TO DATA TO COMPARE.
; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL
;
; 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
; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED
; HL POINTS TO THE ROUTINE TO RELOCATED AND CALLED
; 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.
;======================================================================
;
MD_FNCALL:
PUSH HL ; USING HBX_BUF FOR CODE AREA
PUSH DE
PUSH BC
CALL MD_CALCA ; GET BANK AND SECTOR DATA IN BC
;
POP HL ; GET ROUTINE TO CALL
PUSH BC
MD_FNCALL: ; USING HBX_BUF FOR CODE AREA
;
LD DE,HBX_BUF ; EXECUTE / START ADDRESS
LD BC,MD_CSIZE ; CODE SIZE. MAXIMUM 64 BYTES
@ -807,7 +842,7 @@ 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
LD BC,(MD_FBAS) ; PUT BANK AND SECTOR DATA IN BC
;
#IF (MD_FDBG==1)
CALL PRTHEXWORD
@ -838,51 +873,9 @@ MD_FNCALL:
#ENDIF
;
LD A,C ; RETURN WITH STATUS IN A
POP DE
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
@ -938,7 +931,7 @@ MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
;
MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
PUSH AF ; SAVE CURRENT BANK
EX AF,AF' ; SAVE CURRENT BANK
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
;
@ -979,7 +972,7 @@ MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS
JR MD_WT6
MD_WT5: LD C,L ; SET SUCCESS STATUS
;
MD_WT6: POP AF ; RETURN TO ORIGINAL BANK
MD_WT6: EX AF,AF' ; RETURN TO ORIGINAL BANK
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
; RET
@ -1101,13 +1094,10 @@ MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
PUSH AF ; SAVE CURRENT BANK
;
MD_FWRI1:
POP AF ; SELECT BANK
PUSH AF ; TO READ
CALL HBX_BNKSEL
CALL HBX_BNKSEL ; SELECT BANK TO READ
EX AF,AF' ; SAVE CURRENT BANK
;
LD C,(IX+0) ; READ IN BYTE
;
@ -1133,13 +1123,14 @@ MD_FW7: LD A,(HL) ; FROM THE SAME FLASH ADDRESS.
;
INC HL ; NEXT DESTINATION LOCATION
INC IX ; NEXT SOURCE LOCATION
;
EX AF,AF' ; RESTORE CURRENT BANK
;
INC DE ; CONTINUE WRITING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FWRI1
;
POP AF ; RETURN TO ORIGINAL BANK
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY
;
; RET
;

Loading…
Cancel
Save