diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index 327f9a6f..bd74126c 100644 --- a/Source/HBIOS/Build.ps1 +++ b/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) diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index dc130510..47160004 100644 --- a/Source/HBIOS/md.asm +++ b/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 ;