diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 6e9def1b..f5a161e7 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -53,7 +53,9 @@ MD_CFGTBL: ; ; MD_INIT: +#IF (MDFFENABLE) CALL MD_FINIT ; PROBE FLASH CAPABILITY +#ENDIF CALL NEWLINE ; FORMATTING PRTS("MD: UNITS=2 $") @@ -67,12 +69,14 @@ MD_INIT: ; ; SETUP THE DIO TABLE ENTRIES ; +#IF (MDFFENABLE) LD A,(MD_FFSEN) ; IF FLASH OR A ; FILESYSTEM JR NZ,MD_IN1 ; CAPABLE, LD A,MD_AFSH ; UPDATE ROM DIO LD (MD_CFGTBL + MD_CFGSIZ + MD_ATTRIB),A MD_IN1: +#ENDIF LD BC,MD_FNTBL LD DE,MD_CFGTBL PUSH BC @@ -211,10 +215,12 @@ MD_READ: ; ; HL POINTS TO HB_WRKBUF ; +#IF (MDFFENABLE) LD A,(IY+MD_ATTRIB) ; GET ADR OF SECTOR READ FUNC LD BC,MD_RDSECF ; CP MD_AFSH ; RAM / ROM = MD_RDSEC JR Z,MD_RD1 ; FLASH = MD_RDSECF +#ENDIF LD BC,MD_RDSEC MD_RD1: LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC @@ -225,12 +231,15 @@ MD_RD1: MD_WRITE: CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR ; +#IF (MDFFENABLE) LD A,(IY+MD_ATTRIB) ; GET ADR OF SECTOR WRITE FUNC LD BC,MD_WRSECF ; CP MD_AFSH ; RAM / ROM = MD_WRSEC JR Z,MD_WR1 ; FLASH = MD_WRSECF +#ENDIF LD BC,MD_WRSEC MD_WR1: + LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC LD A,(IY+MD_ATTRIB) ; IF THE DEVICES ATTRIBUTE CP MD_AROM ; IS NOT ROM THEN WE CAN @@ -276,6 +285,7 @@ MD_RW3: ; ; READ FLASH ; +#IF (MDFFENABLE) MD_RDSECF: ; CALLED FROM MD_RW ; CALL MD_IOSETUPF ; SETUP SOURCE ADDRESS @@ -344,39 +354,6 @@ MD_IOSETUPF: ; RET ; -MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR -; -; -; READ RAM / ROM -; -MD_RDSEC: - CALL MD_IOSETUP ; SETUP FOR MEMORY COPY -#IF (MDTRACE >= 2) - LD (MD_SRC),HL - LD (MD_DST),DE - LD (MD_LEN),BC -#ENDIF - PUSH BC - LD C,A ; SOURCE BANK - LD B,BID_BIOS ; DESTINATION BANK IS RAM BANK 1 (HBIOS) -#IF (MDTRACE >= 2) - LD (MD_SRCBNK),BC - CALL MD_PRT -#ENDIF - LD A,C ; GET SOURCE BANK - LD (HB_SRCBNK),A ; SET IT - LD A,B ; GET DESTINATION BANK - LD (HB_DSTBNK),A ; SET IT - POP BC -#IF (INTMODE == 1) - DI -#ENDIF - CALL HB_BNKCPY ; DO THE INTERBANK COPY -#IF (INTMODE == 1) - EI -#ENDIF - XOR A - RET ; ; WRITE FLASH ; @@ -385,26 +362,22 @@ MD_WRSECF: ; CALLED FROM MD_RW ; PUSH HL ; IS THE SECTOR LD HL,(MD_LBA4K) ; WE WANT TO - XOR A ; WRITE ALREADY + XOR A ; WRITE ALREADY SBC HL,BC ; IN THE 4K POP HL ; BLOCK WE HAVE JR Z,MD_SECM1 ; IN THE BUFFER ; LD (MD_LBA4K),BC ; SAVE 4K LBA ; - CALL PC_COLON PUSH IX LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS CALL MD_FREAD ; READ 4K SECTOR POP IX - CALL PC_COLON ; MD_SECM1: ; DESIRED SECTOR IS IN BUFFER - CALL PC_ASTERISK PUSH IX CALL MD_FERAS ; ERASE 4K SECTOR POP IX - CALL PC_ASTERISK ; PUSH HL PUSH DE @@ -428,19 +401,49 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER POP DE POP HL ; - CALL PC_COLON PUSH IX LD IX,MD_F4KBUF ; WRITE THE SECTOR CALL MD_FWRIT POP IX - CALL PC_COLON -; - PRTS("wf$"); XOR A RET ; +MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR +#ENDIF +; +; READ RAM / ROM +; +MD_RDSEC: + CALL MD_IOSETUP ; SETUP FOR MEMORY COPY +#IF (MDTRACE >= 2) + LD (MD_SRC),HL + LD (MD_DST),DE + LD (MD_LEN),BC +#ENDIF + PUSH BC + LD C,A ; SOURCE BANK + LD B,BID_BIOS ; DESTINATION BANK IS RAM BANK 1 (HBIOS) +#IF (MDTRACE >= 2) + LD (MD_SRCBNK),BC + CALL MD_PRT +#ENDIF + LD A,C ; GET SOURCE BANK + LD (HB_SRCBNK),A ; SET IT + LD A,B ; GET DESTINATION BANK + LD (HB_DSTBNK),A ; SET IT + POP BC +#IF (INTMODE == 1) + DI +#ENDIF + CALL HB_BNKCPY ; DO THE INTERBANK COPY +#IF (INTMODE == 1) + EI +#ENDIF + XOR A + RET +; ; WRITE RAM ; MD_WRSEC: @@ -545,12 +548,12 @@ MD_PRT: PUSH BC PUSH DE PUSH HL - +; CALL NEWLINE - +; LD DE,MDSTR_PREFIX CALL WRITESTR - +; CALL PC_SPACE LD DE,MDSTR_SRC CALL WRITESTR @@ -559,7 +562,7 @@ MD_PRT: CALL PC_COLON LD BC,(MD_SRC) CALL PRTHEXWORD - +; CALL PC_SPACE LD DE,MDSTR_DST CALL WRITESTR @@ -568,19 +571,24 @@ MD_PRT: CALL PC_COLON LD BC,(MD_DST) CALL PRTHEXWORD - +; CALL PC_SPACE LD DE,MDSTR_LEN CALL WRITESTR LD BC,(MD_LEN) CALL PRTHEXWORD - +; POP HL POP DE POP BC POP AF - +; RET +; +MDSTR_PREFIX .TEXT "MD:$" +MDSTR_SRC .TEXT "SRC=$" +MDSTR_DST .TEXT "DEST=$" +MDSTR_LEN .TEXT "LEN=$" #ENDIF ; ;================================================================================================== @@ -600,6 +608,7 @@ MD_PRT: ; ;================================================================================================== ; +#IF (MDFFENABLE) FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM ; ;====================================================================== @@ -610,11 +619,11 @@ FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM ;====================================================================== ; MD_FINIT: + LD A,+(ROMSIZE/512) ; DISLAY NUMBER #IF (MD_FVBS==1) - CALL NEWLINE ; DISLAY NUMBER - PRTS("MD: FLASH=$") ; OF UNITS - LD A,+(ROMSIZE/512) ; CONFIGURED FOR. - CALL PRTDECB + CALL NEWLINE ; OF UNITS + PRTS("MD: FLASH=$") + CALL PRTDECB ; CONFIGURED FOR. #ENDIF LD B,A ; NUMBER OF DEVICES TO PROBE LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL @@ -648,7 +657,7 @@ FF_PROBE: ; POP DE ; MEANS WE CAN'T POP HL ; ENABLE FLASH WRITING #IF (MD_FVBS==1) - CALL FF_LAND ; LOOKUP AND DISPLAY + CALL MD_LAND ; LOOKUP AND DISPLAY #ENDIF POP BC ; @@ -675,7 +684,7 @@ MD_PR1: ; ON EXIT A CONTAINS STATUS 0=SUCCESS, NZ=NOT IDENTIFIED ;====================================================================== ; -FF_LAND: +MD_LAND: ; #IF (MD_FDBG==1) PRTS(" ID:$") @@ -728,14 +737,13 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA ; POP HL ; GET ROUTINE TO CALL ; - LD DE,HBX_BUF ; PUT EXECUTE / START ADDRESS IN DE - LD BC,HBX_BUFSIZ ; CODE SIZE REQUIRED + LD DE,HBX_BUF ; EXECUTE / START ADDRESS + LD BC,HBX_BUFSIZ ; MAX. CODE SIZE POSSIBLE + LDIR ; COPY OUR RELOCATABLE CODE TO THE BUFFER +; + LD D,B ; PRESET DE TO ZERO TO REDUCE + LD E,B ; CODE SIZE IN RELOCATABLE CODE ; -; PUSH DE ; SAVE THE EXECUTE ADDRESS - ; COPY OUR RELOCATABLE - LDIR ; CODE TO THE BUFFER -; POP HL ; CALL OUR RELOCATABLE CODE - PUSH IY ; PUT BANK AND SECTOR POP BC ; DATA IN BC ; @@ -743,7 +751,6 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA CALL PRTHEXWORD #ENDIF ; - LD DE,0 HB_DI CALL HBX_BUF ; EXECUTE RELOCATED CODE HB_EI @@ -974,14 +981,12 @@ MD_FERAS_S ; LD A,$30 ; SECTOR ERASE LD (HL),A ; COMMAND -; -; LD DE,$0000 ; DEBUG COUNT ; LD A,(HL) ; DO TWO SUCCESSIVE READS FF_WT4: LD C,(HL) ; FROM THE SAME FLASH ADDRESS. XOR C ; IF THE SAME ON BOTH READS BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. -; INC DE ; +; JR Z,FF_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE ; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE ; @@ -1049,6 +1054,7 @@ MD_FREAD: ; DESTINATION BANK IS ALWAYS CURRENT BANK ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; DE = 0000 ; IX POINTS TO DATA TO BE WRITTEN ; A CONTAINS CURRENT BANK ; ON EXIT NO STATUS RETURNED @@ -1231,7 +1237,6 @@ FF_CHIP(0C2A4H,"MX29F040$ ") FF_T_CNT .EQU 17 FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT MD_UNKNOWN .DB "UNKNOWN$" -FF_STACK: .DW 0 ; ;====================================================================== ; @@ -1240,26 +1245,15 @@ FF_STACK: .DW 0 ;====================================================================== ; MD_F4KBUF .FILL 4096,$FF -MD_RWFNADR .DW 0 -MD_DSKBUF .DW 0 -MD_SRCBNK .DB 0 -MD_DSTBNK .DB 0 -MD_SRC .DW 0 -MD_DST .DW 0 -MD_LEN .DW 0 MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE ; -MDSTR_PREFIX .TEXT "MD:$" -MDSTR_SRC .TEXT "SRC=$" -MDSTR_DST .TEXT "DEST=$" -MDSTR_LEN .TEXT "LEN=$" -; ;====================================================================== ; ; RELOCATABLE CODE SPACE REQUIREMENTS CHECK ; ;====================================================================== ; +#IF (MD_FDBG==1) .ECHO "MD_FIDENT_R " .ECHO MD_I_SZ .ECHO "\n" @@ -1275,6 +1269,7 @@ MDSTR_LEN .TEXT "LEN=$" .ECHO "MD_FWRIT_R " .ECHO MD_W_SZ .ECHO "\n" +#ENDIF ; MD_CSIZE .EQU 0 ; @@ -1291,6 +1286,17 @@ MD_CSIZE .SET MD_I_SZ MD_CSIZE .SET MD_R_SZ #ENDIF ; - .ECHO "FF requires " - .ECHO MD_CSIZE - .ECHO " bytes high memory space.\n" +#IF (MD_CSIZE>HBX_BUFSIZ) + .ECHO "Warning: Flash code exceeds available space by " + .ECHO MD_CSIZE-HBX_BUFSIZ + .ECHO " bytes.\n" +#ENDIF +#ENDIF +; +MD_RWFNADR .DW 0 +MD_DSKBUF .DW 0 +MD_SRCBNK .DB 0 +MD_DSTBNK .DB 0 +MD_SRC .DW 0 +MD_DST .DW 0 +MD_LEN .DW 0