From 9022962734fb301b5f859d73cfddadd4d35e128c Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 6 Dec 2020 10:15:47 +0800 Subject: [PATCH 01/14] Update flashfs.asm Final update before integration in md.asm --- Source/HBIOS/flashfs.asm | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/Source/HBIOS/flashfs.asm b/Source/HBIOS/flashfs.asm index bfeee959..47c12eab 100644 --- a/Source/HBIOS/flashfs.asm +++ b/Source/HBIOS/flashfs.asm @@ -25,6 +25,9 @@ FF_DBG: .EQU 0 ; DEBUG FF_HBX: .EQU 1 ; =0 USE STACK, =1 USE HBX_BUF ; +FF_RW .DB 00h ; READ WRITE FLAG +FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM +; ;====================================================================== ; BIOS FLASH INITIALIZATION ; @@ -46,7 +49,7 @@ FF_PROBE: LD E,C ; LD H,D ; WE INCREASE E BY $08 LD L,D ; ON EACH CYCLE THROUGH -; +; PUSH BC CALL PC_SPACE LD A,+(ROMSIZE/512)+1 @@ -55,6 +58,20 @@ FF_PROBE: LD A,'=' ; NUMBER CALL COUT CALL FF_IINIT ; GET ID AT THIS ADDRESS +; + PUSH HL + PUSH DE + LD H,FF_TGT&$FF ; IF WE MATCH WITH + LD L,FF_TGT/$FF + CCF ; A NON 39SF040 + SBC HL,DE ; CHIP SET THE + LD A,(FF_RW) ; R/W FLAG TO R/O + OR H + OR L + LD (FF_RW),A + POP DE + POP HL +; CALL FF_LAND ; LOOKUP AND DISPLAY POP BC ; @@ -63,6 +80,13 @@ FF_PROBE: LD C,A ; DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE +; + LD A,(FF_RW) + OR A + JR NZ,FF_PR1 + CALL PRTSTRD + .TEXT " FLASH FILESYSTEM ENABLED$" +FF_PR1: ; #IF (FF_DBG==1) CALL FF_TESTING From 5707815f2a63197f240f9803b808b6a32defad60 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 6 Dec 2020 10:25:09 +0800 Subject: [PATCH 02/14] Initial integration of flash r/w code into md.asm --- Source/HBIOS/flashfs.asm | 835 ------------------------------------ Source/HBIOS/hbios.asm | 16 +- Source/HBIOS/md.asm | 885 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 875 insertions(+), 861 deletions(-) delete mode 100644 Source/HBIOS/flashfs.asm diff --git a/Source/HBIOS/flashfs.asm b/Source/HBIOS/flashfs.asm deleted file mode 100644 index 47c12eab..00000000 --- a/Source/HBIOS/flashfs.asm +++ /dev/null @@ -1,835 +0,0 @@ -; -;================================================================================================== -; FLASH DRIVER FOR FLASH & EEPROM PROGRAMMING -; -; 26 SEP 2020 - CHIP IDENTIFICATION IMPLEMENTED -- PHIL SUMMERS -; - CHIP ERASE IMPLEMENTED -; 23 OCT 2020 - SECTOR ERASE IMPLEMENTED -; 01 NOV 2020 - WRITE SECTOR IMPLEMENTED -; 04 DEC 2020 - READ SECTOR IMPLEMENTED -;================================================================================================== -; -; UPPER RAM BANK IS ALWAYS AVAILABLE REGARDLESS OF MEMORY BANK SELECTION. -; HBX_BNKSEL AND HB_CURBNK ARE ALWAYS AVAILABLE IN UPPER MEMORY. -; -; THE STACK IS IN UPPER MEMORY DURING BIOS INITIALIZATION BUT IS IN LOWER -; MEMORY DURING HBIOS CALLS. -; -; TO ACCESS THE FLASH CHIP FEATURES, CODE IS COPIED TO THE UPPER RAM BANK -; AND THE FLASH CHIP IS SWITCHED INTO THE LOWER BANK. -; -; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ -; -;================================================================================================== -; -FF_DBG: .EQU 0 ; DEBUG -FF_HBX: .EQU 1 ; =0 USE STACK, =1 USE HBX_BUF -; -FF_RW .DB 00h ; READ WRITE FLAG -FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM -; -;====================================================================== -; BIOS FLASH INITIALIZATION -; -; IDENTIFY AND DISPLAY FLASH CHIPS IN SYSTEM. -; USES MEMORY SIZE DEFINED BY BUILD CONFIGURATION. -;====================================================================== -; -; -FF_INIT: - CALL NEWLINE ; DISLAY NUMBER - PRTS("FF: UNITS=$") ; OF UNITS - LD A,+(ROMSIZE/512) ; CONFIGURED FOR. - CALL PRTDECB -; - LD B,A ; NUMBER OF DEVICES TO PROBE - LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL -FF_PROBE: - LD D,$00 ; SET ADDRESS IN DE:HL - LD E,C ; - LD H,D ; WE INCREASE E BY $08 - LD L,D ; ON EACH CYCLE THROUGH -; - PUSH BC - CALL PC_SPACE - LD A,+(ROMSIZE/512)+1 - SUB B ; PRINT - CALL PRTDECB ; DEVICE - LD A,'=' ; NUMBER - CALL COUT - CALL FF_IINIT ; GET ID AT THIS ADDRESS -; - PUSH HL - PUSH DE - LD H,FF_TGT&$FF ; IF WE MATCH WITH - LD L,FF_TGT/$FF - CCF ; A NON 39SF040 - SBC HL,DE ; CHIP SET THE - LD A,(FF_RW) ; R/W FLAG TO R/O - OR H - OR L - LD (FF_RW),A - POP DE - POP HL -; - CALL FF_LAND ; LOOKUP AND DISPLAY - POP BC -; - LD A,C ; UPDATE ADDRESS - ADD A,$08 ; TO NEXT DEVICE - LD C,A -; - DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE -; - LD A,(FF_RW) - OR A - JR NZ,FF_PR1 - CALL PRTSTRD - .TEXT " FLASH FILESYSTEM ENABLED$" -FF_PR1: -; -#IF (FF_DBG==1) - CALL FF_TESTING -#ENDIF -; - XOR A ; INIT SUCCEEDED - RET -; -;====================================================================== -; TEST CODE AREA -;====================================================================== -; -FF_TESTING: -; -#IF (0) - LD DE,$0008 ; SET - LD HL,$0000 ; ADDRESS - CALL FF_EINIT ; CHIP ERASE - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -; -#IF (0) - LD DE,$000A ; SET - LD HL,$8000 ; ADDRESS - CALL FF_SINIT ; SECTOR ERASE - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -; -#IF (0) - LD DE,$000A ; SET DESTINATION - LD HL,$8000 ; ADDRESS - LD IX,FF_BUFFER ; SET SOURCE ADDRESS - CALL FF_WINIT ; WRITE SECTOR - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -; -#IF (1) - LD DE,$0000 ; SET SOURCE - LD HL,$7000 ; ADDRESS - LD IX,FF_BUFFER ; SET DESTINATION ADDRESS - CALL FF_RINIT ; READ SECTOR - CALL PRTHEXBYTE ; DISPLAY STATUS - LD DE,FF_BUFFER - CALL DUMP_BUFFER -#ENDIF -; -#IF (1) - LD HL,FF_BUFFER ; FILL BUFFER - LD (HL),'J' - LD DE,FF_BUFFER+1 - LD BC,$1000-1 - LDIR -#ENDIF -; -#IF (1) - LD DE,$0000 ; SET - LD HL,$7000 ; ADDRESS - CALL FF_SINIT ; SECTOR ERASE - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -#IF (1) - LD DE,$0000 ; SET DESTINATION - LD HL,$7000 ; ADDRESS - LD IX,FF_BUFFER ; SET SOURCE ADDRESS - CALL FF_WINIT ; WRITE SECTOR - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -; -#IF (1) - LD DE,$0000 ; SET SOURCE - LD HL,$7000 ; ADDRESS - LD IX,FF_BUFFER ; SET DESTINATION ADDRESS - CALL FF_RINIT ; READ SECTOR - CALL PRTHEXBYTE ; DISPLAY STATUS - LD DE,FF_BUFFER - CALL DUMP_BUFFER -#ENDIF - RET -; -;====================================================================== -; LOOKUP AND DISPLAY CHIP -; -; ON ENTRY DE CONTAINS CHIP ID -; ON EXIT A CONTAINS STATUS 0=SUCCESS, NZ=NOT IDENTIFIED -;====================================================================== -; -FF_LAND: -; -#IF (FF_DBG==1) - PRTS(" ID:$") - LD H,E - LD L,D - CALL PRTHEXWORDHL ; DISPLAY FLASH ID - CALL PC_SPACE -#ENDIF -; - LD HL,FF_TABLE ; SEARCH THROUGH THE FLASH - LD BC,FF_T_CNT ; TABLE TO FIND A MATCH -FF_NXT1:LD A,(HL) - CP D - JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH -; - INC HL - LD A,(HL) - CP E - DEC HL - JR NZ,FF_NXT0 ; SECOND BYTE DOES NOT MATCH -; - INC HL - INC HL - JR FF_NXT2 ; MATCH SO EXIT -; -FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT - LD BC,FF_T_SZ ; TO THE NEXT TABLE ENTRY - ADD HL,BC - POP BC -; - LD A,B ; CHECK IF WE REACHED THE - OR C ; END OF THE TABLE - DEC BC - JR NZ,FF_NXT1 ; NOT AT END YET -; - LD HL,FF_UNKNOWN ; WE REACHED THE END WITHOUT A MATCH -; -FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT - RET -;====================================================================== -;COMMON FUNCTION CALL -; -;====================================================================== -; -#IF (FF_HBX==0) -FF_FNCALL: ; USING STACK FOR CODE AREA - CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY -; - POP DE ; GET ROUTINE TO CALL -; - LD (FF_STACK),SP ; SAVE STACK - LD HL,(FF_STACK) -; - LD BC,64 -; LD BC,FF_I_SZ ; CODE SIZE REQUIRED - CCF ; CREATE A RELOCATABLE - SBC HL,BC ; CODE BUFFER IN THE - LD SP,HL ; STACK AREA -; - PUSH HL ; SAVE THE EXECUTE ADDRESS - EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE -; LD HL,FF_IDENT ; 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 -; -#IF (FF_DBG==1) - CALL PRTHEXWORD -#ENDIF -; - HB_DI - CALL JPHL ; EXECUTE RELOCATED CODE - HB_EI -; - LD HL,(FF_STACK) ; RESTORE ORIGINAL - LD SP,HL ; STACK POSITION -; -#IF (FF_DBG==1) - CALL PC_SPACE - CALL PRTHEXWORD - CALL PC_SPACE - EX DE,HL - CALL PRTHEXWORDHL - CALL PC_SPACE - EX DE,HL -#ENDIF -; - LD A,C ; RETURN WITH STATUS IN A -; - RET -#ELSE -FF_FNCALL: ; USING HBX_BUF FOR CODE AREA - CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY -; - POP HL ; GET ROUTINE TO CALL -; - LD DE,HBX_BUF ; PUT EXECUTE / START ADDRESS IN DE - LD BC,HBX_BUFSIZ ; CODE SIZE REQUIRED -; - 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 -; -#IF (FF_DBG==1) - CALL PRTHEXWORD -#ENDIF -; - HB_DI - CALL JPHL ; EXECUTE RELOCATED CODE - HB_EI -; -#IF (FF_DBG==1) - CALL PC_SPACE - CALL PRTHEXWORD - CALL PC_SPACE - EX DE,HL - CALL PRTHEXWORDHL - CALL PC_SPACE - EX DE,HL -#ENDIF -; - LD A,C ; RETURN WITH STATUS IN A -; - RET - -#ENDIF -; -;====================================================================== -; IDENTIFY FLASH CHIP. -; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS -; CREATE A CODE BUFFER IN HIGH MEMORY AREA -; COPY FLASH CODE TO CODE BUFFER -; CALL RELOCATED FLASH IDENTITY CODE -; RESTORE STACK -; RETURN WITH ID CODE. -; -; ON ENTRY DE:HL POINTS TO AN ADDRESS WITH THE ADDRESS RANGE OF THE -; CHIP TO BE IDENTIFIED. -; ON EXIT DE CONTAINS THE CHIP ID BYTES. -; NO STATUS IS RETURNED -;====================================================================== -; -FF_IINIT: - PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_IDENT ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE -; -;====================================================================== -; FLASH IDENTIFY -; SELECT THE APPROPRIATE BANK / ADDRESS -; ISSUE ID COMMAND -; READ IN ID WORD -; ISSUE ID EXIT COMMAND -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; A CONTAINS CURRENT BANK -; ON EXIT DE CONTAINS ID WORD -; NO STATUS IS RETURNED -;====================================================================== -; -FF_IDENT: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM -; - LD HL,$5555 ; LD A,$AA ; COMMAND - LD (HL),$AA ; LD ($5555),A ; SETUP - LD A,H ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A - LD (HL),$90 ; LD A,$90 -; ; LD ($5555),A - LD DE,($0000) ; READ ID -; - LD A,$F0 ; ; EXIT - LD (HL),A ; LD ($5555),A ; COMMAND -; - POP AF ; RETURN TO ORIGINAL BANK - CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; - RET -; -FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED -; -;====================================================================== -; FLASH CHIP ERASE. -; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS -; CREATE A CODE BUFFER IN HIGH MEMORY AREA -; COPY FLASH CODE TO CODE BUFFER -; CALL RELOCATED FLASH ERASE CODE -; RESTORE STACK -; RETURN WITH STATUS CODE. -; -; ON ENTRY DE:HL POINTS TO AN ADDRESS IDENTIFYING THE CHIP -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL -;====================================================================== -; -FF_EINIT: - PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_ERASE ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE -; -;====================================================================== -; ERASE FLASH CHIP. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; ISSUE ERASE COMMAND -; POLL TOGGLE BIT FOR COMPLETION STATUS. -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; A CONTAINS CURRENT BANK -; ON EXIT DE CONTAINS ID WORD -; A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL -;====================================================================== -; -FF_ERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM -; - LD HL,$5555 ; LD A,$AA ; COMMAND - LD (HL),$AA ; LD ($5555),A ; SETUP - LD A,L ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A - LD (HL),$80 ; LD A,$80 - LD (HL),$AA ; LD ($5555),A - LD A,L ; LD A,$AA - LD ($2AAA),A ; LD ($5555),A - LD (HL),$10 ; LD A,$55 - ; LD ($2AAA),A - ; LD A,$10 - ; LD ($5555),A -; - LD A,(HL) ; DO TWO SUCCESSIVE READS FROM THE SAME FLASH ADDRESS. -FF_WT2: LD C,(HL) ; IF TOGGLE BIT (BIT 6) - XOR C ; IS THE SAME ON BOTH READS - BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. - JR Z,FF_WT1 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. -; - LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). - BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS - JR Z,FF_WT2 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 -; - LD A,(HL) ; WE GOT A TIMEOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE - XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? - BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED - JR Z,FF_WT1 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. -; - LD (HL),$F0 ; WRITE DEVICE RESET - LD C,$FF ; SET FAIL STATUS - JR FF_WT3 -; -FF_WT1: LD C,0 ; SET SUCCESS STATUS -FF_WT3: POP AF -; LD A,B ; RETURN TO ORIGINAL BANK - CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - RET -; -FF_E_SZ .EQU $-FF_ERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED -; -;====================================================================== -; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS -; -; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. -; ON EXIT I,B CONTAINS BANK SELECT BYTE -; Y,C CONTAINS HIGH BYTE OF SECTOR ADDRESS -; A CONTAINS CURRENT BANK HB_CURBNK -; -; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL -; 3322222222221111 1111110000000000 -; 1098765432109876 5432109876543210 -; XXXXXXXXXXXXSSSS SSSSXXXXXXXXXXXX < S = SECTOR -; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK -;====================================================================== -; -FF_CALCA: -; -#IF (FF_DBG==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 -; - PUSH BC - POP IY -; -#IF (FF_DBG==1) - CALL PRTHEXWORD ; DISPLAY BANK AND - CALL PC_SPACE ; SECTOR RESULT -#ENDIF -; - LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK -; - RET -; -;====================================================================== -; ERASE FLASH SECTOR -; -; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. -; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS -; CREATE A CODE BUFFER IN HIGH MEMORY AREA -; COPY FLASH CODE TO CODE BUFFER -; CALL RELOCATED FLASH ERASE CODE -; RESTORE STACK -; RETURN WITH STATUS CODE. -; -; ON ENTRY DE:HL POINTS TO AN ADDRESS IDENTIFYING THE CHIP -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL -;====================================================================== -; -FF_SINIT: - PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_SERASE ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE -; -;====================================================================== -; ERASE FLASH SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; ISSUE ERASE SECTOR COMMAND -; POLL TOGGLE BIT FOR COMPLETION STATUS. -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL -;====================================================================== -; -FF_SERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM - ; - LD HL,$5555 ; LD A,$AA ; COMMAND - LD A,L ; LD ($5555),A ; SETUP - LD (HL),$AA ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A - LD (HL),$80 ; LD A,$80 - LD (HL),$AA ; LD ($5555),A - LD ($2AAA),A ; LD A,$AA - ; LD ($5555),A - ; LD A,$55 - ; LD ($2AAA),A - - LD H,C ; SECTOR - LD L,$00 ; ADDRESS -; - 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 -; - LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). - BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS - JR Z,FF_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 -; - LD A,(HL) ; WE GOT A TIMOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE - XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? - BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED - JR Z,FF_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. -; - LD (HL),$F0 ; WRITE DEVICE RESET - LD C,$FF ; SET FAIL STATUS - JR FF_WT6 -; -FF_WT5: LD C,0 ; SET SUCCESS STATUS -FF_WT6: POP AF ; RETURN TO ORIGINAL BANK - CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; - RET -; -FF_S_SZ .EQU $-FF_SERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED -; -;====================================================================== -; READ FLASH SECTOR OF 4096 BYTES -; -; SET ADDRESS TO START OF SECTOR -; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS -; CREATE A CODE BUFFER IN HIGH MEMORY AREA -; COPY FLASH CODE TO CODE BUFFER -; CALL RELOCATED FLASH READ SECTOR CODE -; RESTORE STACK -; -; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. -; IX POINTS TO WHERE TO SAVE DATA -;====================================================================== -; -FF_RINIT: - LD L,0 ; CHANGE ADDRESS - LD A,H ; TO SECTOR BOUNDARY - AND $F0 ; BY MASKING OFF - LD H,A ; LOWER 12 BITS -; - PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_SREAD ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE -; - RET -;====================================================================== -; FLASH READ SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; READ SECTOR OF 4096 BYTES, BYTE AT A TIME -; SELECT SOURCE BANK, READ DATA, -; SELECT DESTINATION BANK, WRITE DATA -; DESTINATION BANK IS ALWAYS CURRENT BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; IX POINTS TO DATA TO BE WRITTEN -; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL -;====================================================================== -; -FF_SREAD: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK -; - LD H,C ; SECTOR - LD L,$00 ; ADDRESS - LD D,L ; INITIALIZE - LD E,L ; BYTE COUNT -; -FF_RD1: - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO READ - LD C,(HL) ; READ BYTE -; - POP AF - PUSH AF ; SELECT BANK - CALL HBX_BNKSEL ; TO WRITE - LD (IX+0),C ; WRITE BYTE - - INC HL ; NEXT SOURCE LOCATION - INC IX ; NEXT DESTINATION LOCATION -; - INC DE ; CONTINUE READING UNTIL - BIT 4,D ; WE HAVE DONE ONE SECTOR - JR Z,FF_RD1 - - POP AF ; RETURN TO ORIGINAL BANK -; CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - XOR A -; - RET -; -FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED -; -;====================================================================== -; WRITE FLASH SECTOR OF 4096 BYTES -; -; SET ADDRESS TO START OF SECTOR -; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS -; CREATE A CODE BUFFER IN HIGH MEMORY AREA -; COPY FLASH CODE TO CODE BUFFER -; CALL RELOCATED FLASH WRITE SECTOR CODE -; RESTORE STACK -; -; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. -; IX POINTS TO DATA TO BE WRITTEN -;====================================================================== -; -FF_WINIT: - LD L,0 ; CHANGE ADDRESS - LD A,H ; TO SECTOR BOUNDARY - AND $F0 ; BY MASKING OFF - LD H,A ; LOWER 12 BITS -; - PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_SWRITE ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE -; -;====================================================================== -; FLASH WRITE SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME -; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE -; POLL TOGGLE BIT FOR COMPLETION STATUS. -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; IX POINTS TO DATA TO BE WRITTEN -; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL -;====================================================================== -; -FF_SWRITE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK -; - LD H,C ; SECTOR - LD L,$00 ; ADDRESS - LD D,L ; INITIALIZE - LD E,L ; BYTE COUNT -; -FF_WR1: - POP AF ; SELECT BANK - PUSH AF ; TO READ - CALL HBX_BNKSEL -; - LD C,(IX+0) ; READ IN BYTE -; - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM -; - LD A,$AA ; COMMAND - LD ($5555),A ; SETUP - LD A,$55 - LD ($2AAA),A -; - LD A,$A0 ; WRITE - LD ($5555),A ; COMMAND -; - LD (HL),C ; WRITE OUT BYTE -; -; ; DO TWO SUCCESSIVE READS - LD A,(HL) ; FROM THE SAME FLASH ADDRESS. -FF_WT7: LD C,(HL) ; IF TOGGLE BIT (BIT 6) - XOR C ; IS THE SAME ON BOTH READS - BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. - JR NZ,FF_WT7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. -; - INC HL ; NEXT DESTINATION LOCATION - INC IX ; NEXT SOURCE LOCATION -; - INC DE ; CONTINUE WRITING UNTIL - BIT 4,D ; WE HAVE DONE ONE SECTOR - JR Z,FF_WR1 -; - POP AF ; RETURN TO ORIGINAL BANK - CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; - RET -; -FF_W_SZ .EQU $-FF_SWRITE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED -; -;====================================================================== -; -; FLASH STYLE -; -;====================================================================== -; -ST_NORMAL .EQU 0 -ST_ERASE_CHIP .EQU 1 ; SECTOR BASED ERASE NOT SUPPORTED -ST_PROGRAM_SECT .EQU 2 -; -;====================================================================== -; -; FLASH CHIP MACRO -; -;====================================================================== -; -#DEFINE FF_CHIP(FFROMID,FFROMNM,FFROMSS,FFROMSC,FFROMMD)\ -#DEFCONT ; \ -#DEFCONT .DW FFROMID \ -#DEFCONT .DB FFROMNM \ -#DEFCONT .DW FFROMSS \ -#DEFCONT .DW FFROMSC \ -#DEFCONT .DB FFROMMD \ -#DEFCONT ; -; -;====================================================================== -; -; FLASH CHIP LIST -; -;====================================================================== -; -FF_TABLE: -FF_CHIP(00120H,"29F010$ ",128,8,ST_NORMAL) -FF_CHIP(001A4H,"29F040$ ",512,8,ST_NORMAL) -FF_CHIP(01F04H,"AT49F001NT$",1024,1,ST_ERASE_CHIP) -FF_CHIP(01F05H,"AT49F001N$ ",1024,1,ST_ERASE_CHIP) -FF_CHIP(01F07H,"AT49F002N$ ",2048,1,ST_ERASE_CHIP) -FF_CHIP(01F08H,"AT49F002NT$",2048,1,ST_ERASE_CHIP) -FF_CHIP(01F13H,"AT49F040$ ",4096,1,ST_ERASE_CHIP) -FF_CHIP(01F5DH,"AT29C512$ ",1,512,ST_PROGRAM_SECT) -FF_CHIP(01FA4H,"AT29C040$ ",2,2048,ST_PROGRAM_SECT) -FF_CHIP(01FD5H,"AT29C010$ ",1,1024,ST_PROGRAM_SECT) -FF_CHIP(01FDAH,"AT29C020$ ",2,1024,ST_PROGRAM_SECT) -FF_CHIP(02020H,"M29F010$ ",128,8,ST_PROGRAM_SECT) -FF_CHIP(020E2H,"M29F040$ ",512,8,ST_NORMAL) -FF_CHIP(0BFB5H,"39F010$ ",32,32,ST_NORMAL) -FF_CHIP(0BFB6H,"39F020$ ",32,64,ST_NORMAL) -FF_CHIP(0BFB7H,"39F040$ ",32,128,ST_NORMAL) -FF_CHIP(0C2A4H,"MX29F040$ ",512,8,ST_NORMAL) -; -FF_T_CNT .EQU 17 -FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT -FF_UNKNOWN .DB "UNKNOWN$" -FF_STACK: .DW 0 -; -;====================================================================== -; -; 4K FLASH BUFFER -; -;====================================================================== -; -FF_BUFFER .FILL 4096,$FF -;====================================================================== -; -; RELOCATABLE CODE SPACE REQUIREMENTS -; -;====================================================================== -; -FF_CSIZE .EQU 0 -; -#IF (FF_W_SZ>FF_CSIZE) -FF_CSIZE .SET FF_W_SZ -#ENDIF -#IF (FF_S_SZ>FF_CSIZE) -FF_CSIZE .SET FF_S_SZ -#ENDIF -#IF (FF_E_SZ>FF_CSIZE) -FF_CSIZE .SET FF_E_SZ -#ENDIF -#IF (FF_I_SZ>FF_CSIZE) -FF_CSIZE .SET FF_I_SZ -#ENDIF -#IF (FF_R_SZ>FF_CSIZE) -FF_CSIZE .SET FF_R_SZ -#ENDIF -; - .ECHO "FF requires " - .ECHO FF_CSIZE - .ECHO " bytes high memory space.\n" diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 1205b0c3..cf0e7b82 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1905,9 +1905,6 @@ HB_INITTBL: #IF (MDENABLE) .DW MD_INIT #ENDIF -#IF (FFENABLE) - .DW FF_INIT -#ENDIF #IF (FDENABLE) .DW FD_INIT #ENDIF @@ -3626,14 +3623,6 @@ SIZ_MD .EQU $ - ORG_MD .ECHO SIZ_MD .ECHO " bytes.\n" #ENDIF -#IF (FFENABLE) -ORG_FF .EQU $ - #INCLUDE "flashfs.asm" -SIZ_FF .EQU $ - ORG_FF - .ECHO "FF occupies " - .ECHO SIZ_FF - .ECHO " bytes.\n" -#ENDIF ; #IF (FDENABLE) ORG_FD .EQU $ @@ -4101,6 +4090,8 @@ PS_PRTDC: JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB CP 5 ; RAM DISK? JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB + CP 7 ; FLASH DISK? + JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB ; ; PRINT HARD DISK STORAGE SIZE IN MB LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY @@ -4501,7 +4492,7 @@ PS_DDHDSK .TEXT "HDSK$" ; PS_DTSTRREF: .DW PS_DTFLOP, PS_DTHARD, PS_DTCF, PS_DTSD - .DW PS_DTUSB, PS_DTROM, PS_DTRAM, PS_DTRF + .DW PS_DTUSB, PS_DTROM, PS_DTRAM, PS_DTRF, PS_DTFSH ; PS_DTFLOP .TEXT "Floppy Disk$" PS_DTHARD .TEXT "Hard Disk$" @@ -4511,6 +4502,7 @@ PS_DTUSB .TEXT "USB Drive$" PS_DTROM .TEXT "ROM Disk$" PS_DTRAM .TEXT "RAM Disk$" PS_DTRF .TEXT "RAM Floppy$" +PS_DTFSH .TEXT "Flash Drive$" PS_DTOTHER .TEXT "???$" ; ; FLOPPY ATTRIBUTE STRINGS diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 1761b530..b3fb5180 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -6,11 +6,19 @@ ; MD DEVICE CONFIGURATION ; MD_DEVCNT .EQU 2 ; NUMBER OF MD DEVICES SUPPORTED -MD_CFGSIZ .EQU 6 ; SIZE OF CFG TBL ENTRIES +MD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES ; MD_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) MD_STAT .EQU 1 ; OFFSET OF STATUS (BYTE) MD_LBA .EQU 2 ; OFFSET OF LBA (DWORD) +MD_MID .EQU 6 ; OFFSET OF MEDIA ID (BYTE) +MD_ATTRIB .EQU 7 ; OFFSET OF ATTRIBUTE (BYTE) +; +MD_AROM .EQU %00100000 ; ROM ATTRIBUTE +MD_ARAM .EQU %00101000 ; RAM ATTRIBUTE +MD_AFSH .EQU %00111000 ; FLASH ATTRIBUTE +; +MID_MDFS .EQU 10 ; REWRITEABLE FLASH MEDIA ; ; DEVICE CONFIG TABLE (RAM DEVICE FIRST TO MAKE IT ALWAYS FIRST DRIVE) ; @@ -19,10 +27,14 @@ MD_CFGTBL: .DB 1 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS .DW 0,0 ; CURRENT LBA + .DB MID_MDRAM ; DEVICE MEDIA ID + .DB MD_ARAM ; DEVICE ATTRIBUTE ; DEVICE 0 (ROM) .DB 0 ; DEVICE NUMBER .DB 0 ; DEVICE STATUS .DW 0,0 ; CURRENT LBA + .DB MID_MDROM ; DEVICE MEDIA ID + .DB MD_AROM ; DEVICE ATTRIBUTE ; #IF ($ - MD_CFGTBL) != (MD_DEVCNT * MD_CFGSIZ) .ECHO "*** INVALID MD CONFIG TABLE ***\n" @@ -33,6 +45,8 @@ MD_CFGTBL: ; ; MD_INIT: + CALL FF_INIT ; PROBE FLASH CAPABILITY + CALL NEWLINE ; FORMATTING PRTS("MD: UNITS=2 $") PRTS("ROMDISK=$") @@ -50,9 +64,14 @@ MD_INIT: PUSH BC CALL DIO_ADDENT POP BC +;#IF (FFENABLE) ; IF FLASH +; LD A,(FF_RW) ; FILESYSTEM +; OR A ; ENABLED SKIP +; JR Z,MD_IN1 ; ROM DISK +;#ENDIF LD DE,MD_CFGTBL + MD_CFGSIZ CALL DIO_ADDENT -; +MD_IN1: XOR A ; INIT SUCCEEDED RET ; RETURN ; @@ -88,8 +107,8 @@ MD_DEFMED: ; ; MD_STATUS: - XOR A ; ALWAYS OK - RET +; XOR A ; ALWAYS OK +; RET ; ; ; @@ -130,7 +149,7 @@ MD_GEOM: ; A DISK DEVICE WITH 1 HEAD AND 16 SECTORS / TRACK. CALL MD_CAP ; HL := CAPACITY IN BLOCKS LD D,1 | $80 ; HEADS / CYL := 1 BY DEFINITION, SET LBA CAPABILITY BIT - LD E,16 ; SECTORS / TRACK := 16 BY DEFINTION + LD E,16 ; SECTORS / TRACK := 16 BY DEFINITION LD B,4 ; PREPARE TO DIVIDE BY 16 MD_GEOM1: SRL H ; SHIFT H @@ -143,12 +162,14 @@ MD_GEOM1: ; MD_DEVICE: LD D,DIODEV_MD ; D := DEVICE TYPE - LD A,(IY+MD_DEV) ; GET DEVICE NUMBER - LD E,A ; PUT IN E FOR RETURN - OR A ; SET FLAGS - LD C,%00100000 ; ASSUME ROM DISK ATTRIBUTES - JR Z,MD_DEVICE1 ; IF ZERO, IT IS ROM DISK, DONE - LD C,%00101000 ; USE RAM DISK ATTRIBUTES +; LD A,(IY+MD_DEV) ; GET DEVICE NUMBER +; LD E,A ; PUT IN E FOR RETURN +; OR A ; SET FLAGS + LD E,(IY+MD_DEV) + LD C,(IY+MD_ATTRIB) +; LD C,%00100000 ; ASSUME ROM DISK ATTRIBUTES +; JR Z,MD_DEVICE1 ; IF ZERO, IT IS ROM DISK, DONE +; LD C,%00101000 ; USE RAM DISK ATTRIBUTES LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,0 ; L := 0, NO BASE I/O ADDRESS MD_DEVICE1: @@ -158,9 +179,10 @@ MD_DEVICE1: ; ; MD_MEDIA: - LD A,(IY+MD_DEV) ; GET DEVICE NUM - ADD A,MID_MDROM ; OFFSET BY MD ROM - LD E,A ; RESULTANT MEDIA ID TO E +; LD A,(IY+MD_DEV) ; GET DEVICE NUM +; ADD A,MID_MDROM ; OFFSET BY MD ROM +; LD E,A ; RESULTANT MEDIA ID TO E + LD E,(IY+MD_MID) LD D,0 ; D:0=0 MEANS NO MEDIA CHANGE XOR A ; SIGNAL SUCCESS RET @@ -409,6 +431,841 @@ MD_PRT: ; ; ; +;================================================================================================== +; FLASH DRIVER FOR FLASH & EEPROM PROGRAMMING +; +; 26 SEP 2020 - CHIP IDENTIFICATION IMPLEMENTED -- PHIL SUMMERS +; - CHIP ERASE IMPLEMENTED +; 23 OCT 2020 - SECTOR ERASE IMPLEMENTED +; 01 NOV 2020 - WRITE SECTOR IMPLEMENTED +; 04 DEC 2020 - READ SECTOR IMPLEMENTED +;================================================================================================== +; +; UPPER RAM BANK IS ALWAYS AVAILABLE REGARDLESS OF MEMORY BANK SELECTION. +; HBX_BNKSEL AND HB_CURBNK ARE ALWAYS AVAILABLE IN UPPER MEMORY. +; +; THE STACK IS IN UPPER MEMORY DURING BIOS INITIALIZATION BUT IS IN LOWER +; MEMORY DURING HBIOS CALLS. +; +; TO ACCESS THE FLASH CHIP FEATURES, CODE IS COPIED TO THE UPPER RAM BANK +; AND THE FLASH CHIP IS SWITCHED INTO THE LOWER BANK. +; +; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ +; +;================================================================================================== +; +FF_DBG: .EQU 0 ; DEBUG +FF_HBX: .EQU 1 ; =0 USE STACK, =1 USE HBX_BUF +; +FF_RW .DB 00h ; READ WRITE FLAG +FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM +; +;====================================================================== +; BIOS FLASH INITIALIZATION +; +; IDENTIFY AND DISPLAY FLASH CHIPS IN SYSTEM. +; USES MEMORY SIZE DEFINED BY BUILD CONFIGURATION. +;====================================================================== +; +; +FF_INIT: + CALL NEWLINE ; DISLAY NUMBER + PRTS("FF: UNITS=$") ; OF UNITS + LD A,+(ROMSIZE/512) ; CONFIGURED FOR. + CALL PRTDECB +; + LD B,A ; NUMBER OF DEVICES TO PROBE + LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL +FF_PROBE: + LD D,$00 ; SET ADDRESS IN DE:HL + LD E,C ; + LD H,D ; WE INCREASE E BY $08 + LD L,D ; ON EACH CYCLE THROUGH +; + PUSH BC + CALL PC_SPACE + LD A,+(ROMSIZE/512)+1 + SUB B ; PRINT + CALL PRTDECB ; DEVICE + LD A,'=' ; NUMBER + CALL COUT + CALL FF_IINIT ; GET ID AT THIS ADDRESS +; + PUSH HL + PUSH DE + LD H,FF_TGT&$FF ; IF WE MATCH WITH + LD L,FF_TGT/$FF + CCF ; A NON 39SF040 + SBC HL,DE ; CHIP SET THE + LD A,(FF_RW) ; R/W FLAG TO R/O + OR H + OR L + LD (FF_RW),A + POP DE + POP HL +; + CALL FF_LAND ; LOOKUP AND DISPLAY + POP BC +; + LD A,C ; UPDATE ADDRESS + ADD A,$08 ; TO NEXT DEVICE + LD C,A +; + DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE +; + LD A,(FF_RW) + OR A + JR NZ,FF_PR1 + CALL PRTSTRD + .TEXT " FLASH FILESYSTEM ENABLED$" +FF_PR1: +; +#IF (FF_DBG==1) + CALL FF_TESTING +#ENDIF +; + XOR A ; INIT SUCCEEDED + RET +; +;====================================================================== +; TEST CODE AREA +;====================================================================== +; +FF_TESTING: +; +#IF (0) + LD DE,$0008 ; SET + LD HL,$0000 ; ADDRESS + CALL FF_EINIT ; CHIP ERASE + CALL PRTHEXBYTE ; DISPLAY STATUS +#ENDIF +; +#IF (0) + LD DE,$000A ; SET + LD HL,$8000 ; ADDRESS + CALL FF_SINIT ; SECTOR ERASE + CALL PRTHEXBYTE ; DISPLAY STATUS +#ENDIF +; +#IF (0) + LD DE,$000A ; SET DESTINATION + LD HL,$8000 ; ADDRESS + LD IX,FF_BUFFER ; SET SOURCE ADDRESS + CALL FF_WINIT ; WRITE SECTOR + CALL PRTHEXBYTE ; DISPLAY STATUS +#ENDIF +; +#IF (1) + LD DE,$0000 ; SET SOURCE + LD HL,$7000 ; ADDRESS + LD IX,FF_BUFFER ; SET DESTINATION ADDRESS + CALL FF_RINIT ; READ SECTOR + CALL PRTHEXBYTE ; DISPLAY STATUS + LD DE,FF_BUFFER + CALL DUMP_BUFFER +#ENDIF +; +#IF (1) + LD HL,FF_BUFFER ; FILL BUFFER + LD (HL),'J' + LD DE,FF_BUFFER+1 + LD BC,$1000-1 + LDIR +#ENDIF +; +#IF (1) + LD DE,$0000 ; SET + LD HL,$7000 ; ADDRESS + CALL FF_SINIT ; SECTOR ERASE + CALL PRTHEXBYTE ; DISPLAY STATUS +#ENDIF +#IF (1) + LD DE,$0000 ; SET DESTINATION + LD HL,$7000 ; ADDRESS + LD IX,FF_BUFFER ; SET SOURCE ADDRESS + CALL FF_WINIT ; WRITE SECTOR + CALL PRTHEXBYTE ; DISPLAY STATUS +#ENDIF +; +#IF (1) + LD DE,$0000 ; SET SOURCE + LD HL,$7000 ; ADDRESS + LD IX,FF_BUFFER ; SET DESTINATION ADDRESS + CALL FF_RINIT ; READ SECTOR + CALL PRTHEXBYTE ; DISPLAY STATUS + LD DE,FF_BUFFER + CALL DUMP_BUFFER +#ENDIF + RET +; +;====================================================================== +; LOOKUP AND DISPLAY CHIP +; +; ON ENTRY DE CONTAINS CHIP ID +; ON EXIT A CONTAINS STATUS 0=SUCCESS, NZ=NOT IDENTIFIED +;====================================================================== +; +FF_LAND: +; +#IF (FF_DBG==1) + PRTS(" ID:$") + LD H,E + LD L,D + CALL PRTHEXWORDHL ; DISPLAY FLASH ID + CALL PC_SPACE +#ENDIF +; + LD HL,FF_TABLE ; SEARCH THROUGH THE FLASH + LD BC,FF_T_CNT ; TABLE TO FIND A MATCH +FF_NXT1:LD A,(HL) + CP D + JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH +; + INC HL + LD A,(HL) + CP E + DEC HL + JR NZ,FF_NXT0 ; SECOND BYTE DOES NOT MATCH +; + INC HL + INC HL + JR FF_NXT2 ; MATCH SO EXIT +; +FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT + LD BC,FF_T_SZ ; TO THE NEXT TABLE ENTRY + ADD HL,BC + POP BC +; + LD A,B ; CHECK IF WE REACHED THE + OR C ; END OF THE TABLE + DEC BC + JR NZ,FF_NXT1 ; NOT AT END YET +; + LD HL,FF_UNKNOWN ; WE REACHED THE END WITHOUT A MATCH +; +FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT + RET +;====================================================================== +;COMMON FUNCTION CALL +; +;====================================================================== +; +#IF (FF_HBX==0) +FF_FNCALL: ; USING STACK FOR CODE AREA + CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY +; + POP DE ; GET ROUTINE TO CALL +; + LD (FF_STACK),SP ; SAVE STACK + LD HL,(FF_STACK) +; + LD BC,64 +; LD BC,FF_I_SZ ; CODE SIZE REQUIRED + CCF ; CREATE A RELOCATABLE + SBC HL,BC ; CODE BUFFER IN THE + LD SP,HL ; STACK AREA +; + PUSH HL ; SAVE THE EXECUTE ADDRESS + EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE +; LD HL,FF_IDENT ; 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 +; +#IF (FF_DBG==1) + CALL PRTHEXWORD +#ENDIF +; + HB_DI + CALL JPHL ; EXECUTE RELOCATED CODE + HB_EI +; + LD HL,(FF_STACK) ; RESTORE ORIGINAL + LD SP,HL ; STACK POSITION +; +#IF (FF_DBG==1) + CALL PC_SPACE + CALL PRTHEXWORD + CALL PC_SPACE + EX DE,HL + CALL PRTHEXWORDHL + CALL PC_SPACE + EX DE,HL +#ENDIF +; + LD A,C ; RETURN WITH STATUS IN A +; + RET +#ELSE +FF_FNCALL: ; USING HBX_BUF FOR CODE AREA + CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY +; + POP HL ; GET ROUTINE TO CALL +; + LD DE,HBX_BUF ; PUT EXECUTE / START ADDRESS IN DE + LD BC,HBX_BUFSIZ ; CODE SIZE REQUIRED +; + 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 +; +#IF (FF_DBG==1) + CALL PRTHEXWORD +#ENDIF +; + HB_DI + CALL JPHL ; EXECUTE RELOCATED CODE + HB_EI +; +#IF (FF_DBG==1) + CALL PC_SPACE + CALL PRTHEXWORD + CALL PC_SPACE + EX DE,HL + CALL PRTHEXWORDHL + CALL PC_SPACE + EX DE,HL +#ENDIF +; + LD A,C ; RETURN WITH STATUS IN A +; + RET + +#ENDIF +; +;====================================================================== +; IDENTIFY FLASH CHIP. +; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS +; CREATE A CODE BUFFER IN HIGH MEMORY AREA +; COPY FLASH CODE TO CODE BUFFER +; CALL RELOCATED FLASH IDENTITY CODE +; RESTORE STACK +; RETURN WITH ID CODE. +; +; ON ENTRY DE:HL POINTS TO AN ADDRESS WITH THE ADDRESS RANGE OF THE +; CHIP TO BE IDENTIFIED. +; ON EXIT DE CONTAINS THE CHIP ID BYTES. +; NO STATUS IS RETURNED +;====================================================================== +; +FF_IINIT: + PUSH HL ; SAVE ADDRESS INFO + LD HL,FF_IDENT ; PUT ROUTINE TO CALL + EX (SP),HL ; ON THE STACK + JP FF_FNCALL ; EXECUTE +; +;====================================================================== +; FLASH IDENTIFY +; SELECT THE APPROPRIATE BANK / ADDRESS +; ISSUE ID COMMAND +; READ IN ID WORD +; ISSUE ID EXIT COMMAND +; SELECT ORIGINAL BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; A CONTAINS CURRENT BANK +; ON EXIT DE CONTAINS ID WORD +; NO STATUS IS RETURNED +;====================================================================== +; +FF_IDENT: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + PUSH AF ; SAVE CURRENT BANK + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO PROGRAM +; + LD HL,$5555 ; LD A,$AA ; COMMAND + LD (HL),$AA ; LD ($5555),A ; SETUP + LD A,H ; LD A,$55 + LD ($2AAA),A ; LD ($2AAA),A + LD (HL),$90 ; LD A,$90 +; ; LD ($5555),A + LD DE,($0000) ; READ ID +; + LD A,$F0 ; ; EXIT + LD (HL),A ; LD ($5555),A ; COMMAND +; + POP AF ; RETURN TO ORIGINAL BANK + CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + RET +; +FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +; +;====================================================================== +; FLASH CHIP ERASE. +; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS +; CREATE A CODE BUFFER IN HIGH MEMORY AREA +; COPY FLASH CODE TO CODE BUFFER +; CALL RELOCATED FLASH ERASE CODE +; RESTORE STACK +; RETURN WITH STATUS CODE. +; +; ON ENTRY DE:HL POINTS TO AN ADDRESS IDENTIFYING THE CHIP +; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +;====================================================================== +; +FF_EINIT: + PUSH HL ; SAVE ADDRESS INFO + LD HL,FF_ERASE ; PUT ROUTINE TO CALL + EX (SP),HL ; ON THE STACK + JP FF_FNCALL ; EXECUTE +; +;====================================================================== +; ERASE FLASH CHIP. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; ISSUE ERASE COMMAND +; POLL TOGGLE BIT FOR COMPLETION STATUS. +; SELECT ORIGINAL BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; A CONTAINS CURRENT BANK +; ON EXIT DE CONTAINS ID WORD +; A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +;====================================================================== +; +FF_ERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + PUSH AF ; SAVE CURRENT BANK + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO PROGRAM +; + LD HL,$5555 ; LD A,$AA ; COMMAND + LD (HL),$AA ; LD ($5555),A ; SETUP + LD A,L ; LD A,$55 + LD ($2AAA),A ; LD ($2AAA),A + LD (HL),$80 ; LD A,$80 + LD (HL),$AA ; LD ($5555),A + LD A,L ; LD A,$AA + LD ($2AAA),A ; LD ($5555),A + LD (HL),$10 ; LD A,$55 + ; LD ($2AAA),A + ; LD A,$10 + ; LD ($5555),A +; + LD A,(HL) ; DO TWO SUCCESSIVE READS FROM THE SAME FLASH ADDRESS. +FF_WT2: LD C,(HL) ; IF TOGGLE BIT (BIT 6) + XOR C ; IS THE SAME ON BOTH READS + BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. + JR Z,FF_WT1 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. +; + LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). + BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS + JR Z,FF_WT2 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 +; + LD A,(HL) ; WE GOT A TIMEOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE + XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? + BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED + JR Z,FF_WT1 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. +; + LD (HL),$F0 ; WRITE DEVICE RESET + LD C,$FF ; SET FAIL STATUS + JR FF_WT3 +; +FF_WT1: LD C,0 ; SET SUCCESS STATUS +FF_WT3: POP AF +; LD A,B ; RETURN TO ORIGINAL BANK + CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY + RET +; +FF_E_SZ .EQU $-FF_ERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +; +;====================================================================== +; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS +; +; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. +; ON EXIT I,B CONTAINS BANK SELECT BYTE +; Y,C CONTAINS HIGH BYTE OF SECTOR ADDRESS +; A CONTAINS CURRENT BANK HB_CURBNK +; +; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL +; 3322222222221111 1111110000000000 +; 1098765432109876 5432109876543210 +; XXXXXXXXXXXXSSSS SSSSXXXXXXXXXXXX < S = SECTOR +; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK +;====================================================================== +; +FF_CALCA: +; +#IF (FF_DBG==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 +; + PUSH BC + POP IY +; +#IF (FF_DBG==1) + CALL PRTHEXWORD ; DISPLAY BANK AND + CALL PC_SPACE ; SECTOR RESULT +#ENDIF +; + LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK +; + RET +; +;====================================================================== +; ERASE FLASH SECTOR +; +; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. +; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS +; CREATE A CODE BUFFER IN HIGH MEMORY AREA +; COPY FLASH CODE TO CODE BUFFER +; CALL RELOCATED FLASH ERASE CODE +; RESTORE STACK +; RETURN WITH STATUS CODE. +; +; ON ENTRY DE:HL POINTS TO AN ADDRESS IDENTIFYING THE CHIP +; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +;====================================================================== +; +FF_SINIT: + PUSH HL ; SAVE ADDRESS INFO + LD HL,FF_SERASE ; PUT ROUTINE TO CALL + EX (SP),HL ; ON THE STACK + JP FF_FNCALL ; EXECUTE +; +;====================================================================== +; ERASE FLASH SECTOR. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; ISSUE ERASE SECTOR COMMAND +; POLL TOGGLE BIT FOR COMPLETION STATUS. +; SELECT ORIGINAL BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; A CONTAINS CURRENT BANK +; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +;====================================================================== +; +FF_SERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + PUSH AF ; SAVE CURRENT BANK + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO PROGRAM + ; + LD HL,$5555 ; LD A,$AA ; COMMAND + LD A,L ; LD ($5555),A ; SETUP + LD (HL),$AA ; LD A,$55 + LD ($2AAA),A ; LD ($2AAA),A + LD (HL),$80 ; LD A,$80 + LD (HL),$AA ; LD ($5555),A + LD ($2AAA),A ; LD A,$AA + ; LD ($5555),A + ; LD A,$55 + ; LD ($2AAA),A + + LD H,C ; SECTOR + LD L,$00 ; ADDRESS +; + 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 +; + LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). + BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS + JR Z,FF_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 +; + LD A,(HL) ; WE GOT A TIMOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE + XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? + BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED + JR Z,FF_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. +; + LD (HL),$F0 ; WRITE DEVICE RESET + LD C,$FF ; SET FAIL STATUS + JR FF_WT6 +; +FF_WT5: LD C,0 ; SET SUCCESS STATUS +FF_WT6: POP AF ; RETURN TO ORIGINAL BANK + CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + RET +; +FF_S_SZ .EQU $-FF_SERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +; +;====================================================================== +; READ FLASH SECTOR OF 4096 BYTES +; +; SET ADDRESS TO START OF SECTOR +; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS +; CREATE A CODE BUFFER IN HIGH MEMORY AREA +; COPY FLASH CODE TO CODE BUFFER +; CALL RELOCATED FLASH READ SECTOR CODE +; RESTORE STACK +; +; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. +; IX POINTS TO WHERE TO SAVE DATA +;====================================================================== +; +FF_RINIT: + LD L,0 ; CHANGE ADDRESS + LD A,H ; TO SECTOR BOUNDARY + AND $F0 ; BY MASKING OFF + LD H,A ; LOWER 12 BITS +; + PUSH HL ; SAVE ADDRESS INFO + LD HL,FF_SREAD ; PUT ROUTINE TO CALL + EX (SP),HL ; ON THE STACK + JP FF_FNCALL ; EXECUTE +; + RET +;====================================================================== +; FLASH READ SECTOR. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; READ SECTOR OF 4096 BYTES, BYTE AT A TIME +; SELECT SOURCE BANK, READ DATA, +; SELECT DESTINATION BANK, WRITE DATA +; DESTINATION BANK IS ALWAYS CURRENT BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; IX POINTS TO DATA TO BE WRITTEN +; A CONTAINS CURRENT BANK +; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +;====================================================================== +; +FF_SREAD: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + PUSH AF ; SAVE CURRENT BANK +; + LD H,C ; SECTOR + LD L,$00 ; ADDRESS + LD D,L ; INITIALIZE + LD E,L ; BYTE COUNT +; +FF_RD1: + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO READ + LD C,(HL) ; READ BYTE +; + POP AF + PUSH AF ; SELECT BANK + CALL HBX_BNKSEL ; TO WRITE + LD (IX+0),C ; WRITE BYTE + + INC HL ; NEXT SOURCE LOCATION + INC IX ; NEXT DESTINATION LOCATION +; + INC DE ; CONTINUE READING UNTIL + BIT 4,D ; WE HAVE DONE ONE SECTOR + JR Z,FF_RD1 + + POP AF ; RETURN TO ORIGINAL BANK +; CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY + XOR A +; + RET +; +FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +; +;====================================================================== +; WRITE FLASH SECTOR OF 4096 BYTES +; +; SET ADDRESS TO START OF SECTOR +; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS +; CREATE A CODE BUFFER IN HIGH MEMORY AREA +; COPY FLASH CODE TO CODE BUFFER +; CALL RELOCATED FLASH WRITE SECTOR CODE +; RESTORE STACK +; +; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. +; IX POINTS TO DATA TO BE WRITTEN +;====================================================================== +; +FF_WINIT: + LD L,0 ; CHANGE ADDRESS + LD A,H ; TO SECTOR BOUNDARY + AND $F0 ; BY MASKING OFF + LD H,A ; LOWER 12 BITS +; + PUSH HL ; SAVE ADDRESS INFO + LD HL,FF_SWRITE ; PUT ROUTINE TO CALL + EX (SP),HL ; ON THE STACK + JP FF_FNCALL ; EXECUTE +; +;====================================================================== +; FLASH WRITE SECTOR. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME +; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE +; POLL TOGGLE BIT FOR COMPLETION STATUS. +; SELECT ORIGINAL BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; IX POINTS TO DATA TO BE WRITTEN +; A CONTAINS CURRENT BANK +; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +;====================================================================== +; +FF_SWRITE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + PUSH AF ; SAVE CURRENT BANK +; + LD H,C ; SECTOR + LD L,$00 ; ADDRESS + LD D,L ; INITIALIZE + LD E,L ; BYTE COUNT +; +FF_WR1: + POP AF ; SELECT BANK + PUSH AF ; TO READ + CALL HBX_BNKSEL +; + LD C,(IX+0) ; READ IN BYTE +; + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO PROGRAM +; + LD A,$AA ; COMMAND + LD ($5555),A ; SETUP + LD A,$55 + LD ($2AAA),A +; + LD A,$A0 ; WRITE + LD ($5555),A ; COMMAND +; + LD (HL),C ; WRITE OUT BYTE +; +; ; DO TWO SUCCESSIVE READS + LD A,(HL) ; FROM THE SAME FLASH ADDRESS. +FF_WT7: LD C,(HL) ; IF TOGGLE BIT (BIT 6) + XOR C ; IS THE SAME ON BOTH READS + BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. + JR NZ,FF_WT7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. +; + INC HL ; NEXT DESTINATION LOCATION + INC IX ; NEXT SOURCE LOCATION +; + INC DE ; CONTINUE WRITING UNTIL + BIT 4,D ; WE HAVE DONE ONE SECTOR + JR Z,FF_WR1 +; + POP AF ; RETURN TO ORIGINAL BANK + CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + RET +; +FF_W_SZ .EQU $-FF_SWRITE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +; +;====================================================================== +; +; FLASH STYLE +; +;====================================================================== +; +ST_NORMAL .EQU 0 +ST_ERASE_CHIP .EQU 1 ; SECTOR BASED ERASE NOT SUPPORTED +ST_PROGRAM_SECT .EQU 2 +; +;====================================================================== +; +; FLASH CHIP MACRO +; +;====================================================================== +; +#DEFINE FF_CHIP(FFROMID,FFROMNM,FFROMSS,FFROMSC,FFROMMD)\ +#DEFCONT ; \ +#DEFCONT .DW FFROMID \ +#DEFCONT .DB FFROMNM \ +#DEFCONT .DW FFROMSS \ +#DEFCONT .DW FFROMSC \ +#DEFCONT .DB FFROMMD \ +#DEFCONT ; +; +;====================================================================== +; +; FLASH CHIP LIST +; +;====================================================================== +; +FF_TABLE: +FF_CHIP(00120H,"29F010$ ",128,8,ST_NORMAL) +FF_CHIP(001A4H,"29F040$ ",512,8,ST_NORMAL) +FF_CHIP(01F04H,"AT49F001NT$",1024,1,ST_ERASE_CHIP) +FF_CHIP(01F05H,"AT49F001N$ ",1024,1,ST_ERASE_CHIP) +FF_CHIP(01F07H,"AT49F002N$ ",2048,1,ST_ERASE_CHIP) +FF_CHIP(01F08H,"AT49F002NT$",2048,1,ST_ERASE_CHIP) +FF_CHIP(01F13H,"AT49F040$ ",4096,1,ST_ERASE_CHIP) +FF_CHIP(01F5DH,"AT29C512$ ",1,512,ST_PROGRAM_SECT) +FF_CHIP(01FA4H,"AT29C040$ ",2,2048,ST_PROGRAM_SECT) +FF_CHIP(01FD5H,"AT29C010$ ",1,1024,ST_PROGRAM_SECT) +FF_CHIP(01FDAH,"AT29C020$ ",2,1024,ST_PROGRAM_SECT) +FF_CHIP(02020H,"M29F010$ ",128,8,ST_PROGRAM_SECT) +FF_CHIP(020E2H,"M29F040$ ",512,8,ST_NORMAL) +FF_CHIP(0BFB5H,"39F010$ ",32,32,ST_NORMAL) +FF_CHIP(0BFB6H,"39F020$ ",32,64,ST_NORMAL) +FF_CHIP(0BFB7H,"39F040$ ",32,128,ST_NORMAL) +FF_CHIP(0C2A4H,"MX29F040$ ",512,8,ST_NORMAL) +; +FF_T_CNT .EQU 17 +FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT +FF_UNKNOWN .DB "UNKNOWN$" +FF_STACK: .DW 0 +; +;====================================================================== +; +; 4K FLASH BUFFER +; +;====================================================================== +; +FF_BUFFER .FILL 4096,$FF +;====================================================================== +; +; RELOCATABLE CODE SPACE REQUIREMENTS +; +;====================================================================== +; +FF_CSIZE .EQU 0 +; +#IF (FF_W_SZ>FF_CSIZE) +FF_CSIZE .SET FF_W_SZ +#ENDIF +#IF (FF_S_SZ>FF_CSIZE) +FF_CSIZE .SET FF_S_SZ +#ENDIF +#IF (FF_E_SZ>FF_CSIZE) +FF_CSIZE .SET FF_E_SZ +#ENDIF +#IF (FF_I_SZ>FF_CSIZE) +FF_CSIZE .SET FF_I_SZ +#ENDIF +#IF (FF_R_SZ>FF_CSIZE) +FF_CSIZE .SET FF_R_SZ +#ENDIF +; + .ECHO "FF requires " + .ECHO FF_CSIZE + .ECHO " bytes high memory space.\n" + MD_RWFNADR .DW 0 ; MD_DSKBUF .DW 0 From f3437487e59bf26819ad6d7881cc2d2895c8101f Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 6 Dec 2020 14:09:49 +0800 Subject: [PATCH 03/14] Memory disk driver updates Updates to disk media id's --- Source/CBIOS/cbios.asm | 1 + Source/Doc/Architecture.md | 6 ++++-- Source/HBIOS/hbios.inc | 1 + Source/HBIOS/md.asm | 43 ++++++++++++++++++++++++-------------- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index a9850fc6..6240a81b 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -290,6 +290,7 @@ DPBMAP: .DW DPB_FD120 ; MID_FD120 .DW DPB_FD111 ; MID_FD111 .DW DPB_HDNEW ; MID_HDNEW (1024 DIR ENTRIES) + .DW DPB_ROM ; MID_MDFSH ; DPBCNT .EQU ($ - DPBMAP) / 2 ; diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index f194f9a9..572b7838 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -607,6 +607,8 @@ MID\_FD144 | 6 | 3.5" 1.44M Floppy MID\_FD360 | 7 | 5.25" 360K Floppy MID\_FD120 | 8 | 5.25" 1.2M Floppy MID\_FD111 | 9 | 8" 1.11M Floppy +MID\_HDNEW | 10 | Hard Disk with 1024 Directory entries +MID\_MDFSH | 11 | FLASH Drive ### Function 0x10 -- Disk Status (DIOSTATUS) @@ -765,9 +767,9 @@ Bit 7: 1=Floppy, 0=Hard Disk (or similar, e.g. CF, SD, RAM) | Bits 1-0: Reserved | If Hard Disk: -| Bit 6: Removable\ +| Bit 6: Removable | Bits: 5-3: Type (0=Hard, 1=CF, 2=SD, 3=USB, -| 4=ROM, 5=RAM, 6=RAMF, 7=Reserved) +| 4=ROM, 5=RAM, 6=RAMF, 7=FLASH) | Bits 2-0: Reserved Each disk device is handled by an appropriate driver (IDE, SD, diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 2457bc9c..95f08bf8 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -148,6 +148,7 @@ MID_FD360 .EQU 7 MID_FD120 .EQU 8 MID_FD111 .EQU 9 MID_HDNEW .EQU 10 +MID_MDFSH .EQU 11 ; ; CHAR DEVICE IDS ; diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index b3fb5180..3538832a 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -5,6 +5,13 @@ ; ; MD DEVICE CONFIGURATION ; +; +; DISK DEVICE TYPE ID MEDIA ID ATTRIBUTE +;-------------------------------------------------------------------------------------------------- +; 0x00 MEMORY DISK 0x02 RAM DRIVE %00101000 HD STYLE, NON-REMOVABLE, TYPE-RAM +; 0x00 MEMORY DISK 0x01 ROM DRIVE %00100000 HD STYLE, NON-REMOVABLE, TYPE-ROM +; 0x00 MEMORY DISK 0x0B FLASH DRIVE %00111000 HD STYLE, NON-REMOVABLE, TYPE-FLASH +; MD_DEVCNT .EQU 2 ; NUMBER OF MD DEVICES SUPPORTED MD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES ; @@ -18,8 +25,6 @@ MD_AROM .EQU %00100000 ; ROM ATTRIBUTE MD_ARAM .EQU %00101000 ; RAM ATTRIBUTE MD_AFSH .EQU %00111000 ; FLASH ATTRIBUTE ; -MID_MDFS .EQU 10 ; REWRITEABLE FLASH MEDIA -; ; DEVICE CONFIG TABLE (RAM DEVICE FIRST TO MAKE IT ALWAYS FIRST DRIVE) ; MD_CFGTBL: @@ -59,19 +64,22 @@ MD_INIT: ; ; SETUP THE DIO TABLE ENTRIES ; + LD A,(FF_RW) ; IF FLASH + OR A ; FILESYSTEM + JR NZ,MD_IN1 ; CAPABLE, + LD A,MID_MDFSH ; UPDATE ROM DIO + LD (MD_CFGTBL + MD_CFGSIZ + MD_MID),A + LD A,MD_AFSH + LD (MD_CFGTBL + MD_CFGSIZ + MD_ATTRIB),A +MD_IN1: LD BC,MD_FNTBL LD DE,MD_CFGTBL PUSH BC - CALL DIO_ADDENT + CALL DIO_ADDENT ; ADD FIRST ENTRY POP BC -;#IF (FFENABLE) ; IF FLASH -; LD A,(FF_RW) ; FILESYSTEM -; OR A ; ENABLED SKIP -; JR Z,MD_IN1 ; ROM DISK -;#ENDIF LD DE,MD_CFGTBL + MD_CFGSIZ - CALL DIO_ADDENT -MD_IN1: + CALL DIO_ADDENT ; ADD SECOND ENTRY + XOR A ; INIT SUCCEEDED RET ; RETURN ; @@ -216,9 +224,12 @@ MD_WRITE: CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR LD BC,MD_WRSEC ; GET ADR OF SECTOR WRITE FUNC LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC - LD A,(IY+MD_DEV) ; GET DEVICE NUMBER - OR A ; SET FLAGS TO TEST FOR ROM (UNIT 0) - JR NZ,MD_RW ; NOT ROM, SO OK TO WRITE, CONTINUE +; LD A,(IY+MD_DEV) ; GET DEVICE NUMBER +; OR A ; SET FLAGS TO TEST FOR ROM (UNIT 0) +; JR NZ,MD_RW ; NOT ROM, SO OK TO WRITE, CONTINUE + LD A,(IY+MD_MID ) ; IF THE DEVICES MEDIA + CP MID_MDROM ; IS NOT ROM THEN WE CAN + JR NZ,MD_RW ; WRITE TO IT LD E,0 ; UNIT IS READ ONLY, ZERO SECTORS WRITTEN LD A,ERR_READONLY ; SIGNAL ERROR OR A ; SET FLAGS @@ -500,9 +511,9 @@ FF_PROBE: LD A,(FF_RW) ; R/W FLAG TO R/O OR H OR L - LD (FF_RW),A - POP DE - POP HL + LD (FF_RW),A ; A NON ZERO VALUE + POP DE ; MEANS WE CAN'T + POP HL ; ENABLE FLASH WRITING ; CALL FF_LAND ; LOOKUP AND DISPLAY POP BC From bdbe5df54ed3cf5f13112ca95493bf66d2eb8832 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 6 Dec 2020 14:52:03 +0800 Subject: [PATCH 04/14] Update Build.ps1 Make all the rom / flash disk files read only for additional protection. --- Source/HBIOS/Build.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index 755dea90..327f9a6f 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -226,6 +226,9 @@ foreach ($App in $RomApps) cpmcp -f $RomFmt $RomDiskFile ..\cpm22\cpm_${Bios}.sys 0:cpm.sys cpmcp -f $RomFmt $RomDiskFile ..\zsdos\zsys_${Bios}.sys 0:zsys.sys +# Set all the files in the ROM disk image to read only for extra protection under flash file system. +cpmchattr -f $RomFmt $RomDiskFile r 0:*.* + # # Finally, the individual binary components are concatenated together to produce # the final images. From 65d244523711031aadfd5e2d7918b912950a6c62 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 6 Dec 2020 22:45:52 +0800 Subject: [PATCH 05/14] Update md.asm Add some flash read / write hooks for flash --- Source/HBIOS/md.asm | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 3538832a..d195df20 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -213,7 +213,13 @@ MD_SEEK: ; MD_READ: CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR - LD BC,MD_RDSEC ; GET ADR OF SECTOR READ FUNC +; + LD A,(IY+MD_MID) ; GET ADR OF SECTOR READ FUNC + LD BC,MD_RDSECF ; + CP MID_MDFSH ; RAM / ROM = MD_RDSEC + JR Z,MD_RD1 ; FLASH = MD_RDSECF + LD BC,MD_RDSEC +MD_RD1: LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC JR MD_RW ; CONTINUE TO GENERIC R/W ROUTINE @@ -222,12 +228,18 @@ MD_READ: ; MD_WRITE: CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR - LD BC,MD_WRSEC ; GET ADR OF SECTOR WRITE FUNC +; + LD A,(IY+MD_MID) ; GET ADR OF SECTOR WRITE FUNC + LD BC,MD_WRSECF ; + CP MID_MDFSH ; RAM / ROM = MD_WRSEC + JR Z,MD_WR1 ; FLASH = MD_WRSECF + LD BC,MD_WRSEC +MD_WR1: LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC ; LD A,(IY+MD_DEV) ; GET DEVICE NUMBER ; OR A ; SET FLAGS TO TEST FOR ROM (UNIT 0) ; JR NZ,MD_RW ; NOT ROM, SO OK TO WRITE, CONTINUE - LD A,(IY+MD_MID ) ; IF THE DEVICES MEDIA + LD A,(IY+MD_MID) ; IF THE DEVICES MEDIA CP MID_MDROM ; IS NOT ROM THEN WE CAN JR NZ,MD_RW ; WRITE TO IT LD E,0 ; UNIT IS READ ONLY, ZERO SECTORS WRITTEN @@ -269,7 +281,13 @@ MD_RW3: OR A ; SET FLAGS BASED ON RETURN CODE RET ; AND RETURN, A HAS RETURN CODE ; +; READ FLASH +; +MD_RDSECF: + CALL MD_RDSEC + RET ; +; READ RAM / ROM ; MD_RDSEC: CALL MD_IOSETUP ; SETUP FOR MEMORY COPY @@ -300,7 +318,13 @@ MD_RDSEC: XOR A RET ; +; WRITE FLASH +; +MD_WRSECF: + CALL MD_WRSEC + RET ; +; WRITE RAM ; MD_WRSEC: CALL MD_IOSETUP ; SETUP FOR MEMORY COPY From d7e5a445a9fcdf1c507f9af63dc74dbd3cb42463 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 7 Dec 2020 06:28:23 +0800 Subject: [PATCH 06/14] Revert new media id --- Source/Doc/Architecture.md | 1 - Source/HBIOS/hbios.inc | 1 - Source/HBIOS/md.asm | 15 ++++++--------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 572b7838..cad546bd 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -608,7 +608,6 @@ MID\_FD360 | 7 | 5.25" 360K Floppy MID\_FD120 | 8 | 5.25" 1.2M Floppy MID\_FD111 | 9 | 8" 1.11M Floppy MID\_HDNEW | 10 | Hard Disk with 1024 Directory entries -MID\_MDFSH | 11 | FLASH Drive ### Function 0x10 -- Disk Status (DIOSTATUS) diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 95f08bf8..2457bc9c 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -148,7 +148,6 @@ MID_FD360 .EQU 7 MID_FD120 .EQU 8 MID_FD111 .EQU 9 MID_HDNEW .EQU 10 -MID_MDFSH .EQU 11 ; ; CHAR DEVICE IDS ; diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index d195df20..cbcf0255 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -10,7 +10,7 @@ ;-------------------------------------------------------------------------------------------------- ; 0x00 MEMORY DISK 0x02 RAM DRIVE %00101000 HD STYLE, NON-REMOVABLE, TYPE-RAM ; 0x00 MEMORY DISK 0x01 ROM DRIVE %00100000 HD STYLE, NON-REMOVABLE, TYPE-ROM -; 0x00 MEMORY DISK 0x0B FLASH DRIVE %00111000 HD STYLE, NON-REMOVABLE, TYPE-FLASH +; 0x00 MEMORY DISK 0x01 FLASH DRIVE %00111000 HD STYLE, NON-REMOVABLE, TYPE-FLASH ; MD_DEVCNT .EQU 2 ; NUMBER OF MD DEVICES SUPPORTED MD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES @@ -67,9 +67,7 @@ MD_INIT: LD A,(FF_RW) ; IF FLASH OR A ; FILESYSTEM JR NZ,MD_IN1 ; CAPABLE, - LD A,MID_MDFSH ; UPDATE ROM DIO - LD (MD_CFGTBL + MD_CFGSIZ + MD_MID),A - LD A,MD_AFSH + LD A,MD_AFSH ; UPDATE ROM DIO LD (MD_CFGTBL + MD_CFGSIZ + MD_ATTRIB),A MD_IN1: LD BC,MD_FNTBL @@ -214,24 +212,23 @@ MD_SEEK: MD_READ: CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR ; - LD A,(IY+MD_MID) ; GET ADR OF SECTOR READ FUNC + LD A,(IY+MD_ATTRIB) ; GET ADR OF SECTOR READ FUNC LD BC,MD_RDSECF ; - CP MID_MDFSH ; RAM / ROM = MD_RDSEC + CP MD_AFSH ; RAM / ROM = MD_RDSEC JR Z,MD_RD1 ; FLASH = MD_RDSECF LD BC,MD_RDSEC MD_RD1: LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC JR MD_RW ; CONTINUE TO GENERIC R/W ROUTINE - ; ; ; MD_WRITE: CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR ; - LD A,(IY+MD_MID) ; GET ADR OF SECTOR WRITE FUNC + LD A,(IY+MD_ATTRIB) ; GET ADR OF SECTOR WRITE FUNC LD BC,MD_WRSECF ; - CP MID_MDFSH ; RAM / ROM = MD_WRSEC + CP MD_AFSH ; RAM / ROM = MD_WRSEC JR Z,MD_WR1 ; FLASH = MD_WRSECF LD BC,MD_WRSEC MD_WR1: From bf313e7c43cbd28ff6dda511fde70e7c121195ee Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 11 Dec 2020 20:21:45 +0800 Subject: [PATCH 07/14] Update Architecture.md Can you please check and confirm that upper 32k limitation has now been removed. I think the limitation is that you cant/shouldnt cross a boundary. Sorry if I'm wrong on that. --- Source/Doc/Architecture.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index cad546bd..017363cc 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -587,7 +587,7 @@ _Id_ | _Device Type / Driver_ Disk Input/Output (DIO) ----------------------- -Character input/output functions require that a character unit be specified +Disk input/output functions require that a disk unit be specified in the C register. This is the logical disk unit number assigned during the boot process that identifies all disk i/o devices uniquely. @@ -613,11 +613,12 @@ MID\_HDNEW | 10 | Hard Disk with 1024 Directory entries | _Entry Parameters_ | B: 0x10 +| C: Disk Device Unit ID | _Exit Results_ | A: Status (0=OK, else error) -### Function 0x11 -- Disk Status (DIORESET) +### Function 0x11 -- Disk Reset (DIORESET) | _Entry Parameters_ | B: 0x11 @@ -668,6 +669,7 @@ determine if the device supports LBA addressing. | _Entry Parameters_ | B: 0x13 | C: Disk Device Unit ID +| D: Bank ID | E: Block Count | HL: Buffer Address @@ -683,14 +685,14 @@ read. On error, current sector is sector where error occurred. Blocks read indicates number of sectors successfully read. Caller must ensure: 1) buffer address is large enough to contain data for -all sectors requested, and 2) entire buffer area resides in upper 32K of -memory. +all sectors requested, and 2) does not cross a 32k memory bank boundary. ### Function 0x14 -- Disk Write (DIOWRITE) | _Entry Parameters_ | B: 0x14 | C: Disk Device Unit ID +| D: Bank ID | E: Block Count | HL: Buffer Address @@ -705,9 +707,7 @@ function. Current sector is incremented after each sector successfully written. On error, current sector is sector where error occurred. Blocks written indicates number of sectors successfully written. -Caller must ensure: 1) buffer address is large enough to contain data for -all sectors being written, and 2) entire buffer area resides in upper 32K -of memory. +Caller must ensure the source buffer does not cross a 32k memory bank boundary. ### Function 0x15 -- Disk Verify (DIOVERIFY) From 2e6294830997976fe36e8f408075a907801962cf Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 11 Dec 2020 21:19:41 +0800 Subject: [PATCH 08/14] md updates --- Source/CBIOS/cbios.asm | 1 - Source/HBIOS/Build.sh | 4 + Source/HBIOS/md.asm | 172 +++++++++++++++++++++-------------------- 3 files changed, 93 insertions(+), 84 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 6240a81b..a9850fc6 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -290,7 +290,6 @@ DPBMAP: .DW DPB_FD120 ; MID_FD120 .DW DPB_FD111 ; MID_FD111 .DW DPB_HDNEW ; MID_HDNEW (1024 DIR ENTRIES) - .DW DPB_ROM ; MID_MDFSH ; DPBCNT .EQU ($ - DPBMAP) / 2 ; diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 91d4e22c..f8986645 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -4,6 +4,7 @@ set -e CPMCP=../../Tools/`uname`/cpmcp +CPMCH=../../Tools/`uname`/cpmchattrib timestamp=$(date +%Y-%m-%d) #timestamp="2020-02-24" @@ -144,6 +145,9 @@ echo "copying systems to $romdiskfile" $CPMCP -f $romfmt $romdiskfile ../CPM22/cpm_$BIOS.sys 0:cpm.sys $CPMCP -f $romfmt $romdiskfile ../ZSDOS/zsys_$BIOS.sys 0:zsys.sys +echo "setting files in the ROM disk image to read only" +$CPMCH -f $romfmt $romdiskfile r 0:*.* + if [ $platform = UNA ] ; then cp osimg.bin $outdir/UNA_WBW_SYS.bin cp $romdiskfile $outdir/UNA_WBW_ROM$romsize.bin diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 4e0f27ae..936f3ac1 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -10,7 +10,7 @@ ;-------------------------------------------------------------------------------------------------- ; 0x00 MEMORY DISK 0x02 RAM DRIVE %00101000 HD STYLE, NON-REMOVABLE, TYPE-RAM ; 0x00 MEMORY DISK 0x01 ROM DRIVE %00100000 HD STYLE, NON-REMOVABLE, TYPE-ROM -; 0x00 MEMORY DISK 0x01 FLASH DRIVE %00111000 HD STYLE, NON-REMOVABLE, TYPE-FLASH +; 0x00 MEMORY DISK 0x01 ROM DRIVE %00111000 HD STYLE, NON-REMOVABLE, TYPE-FLASH ; MD_DEVCNT .EQU 2 ; NUMBER OF MD DEVICES SUPPORTED MD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES @@ -173,27 +173,17 @@ MD_GEOM1: ; MD_DEVICE: LD D,DIODEV_MD ; D := DEVICE TYPE -; LD A,(IY+MD_DEV) ; GET DEVICE NUMBER -; LD E,A ; PUT IN E FOR RETURN -; OR A ; SET FLAGS - LD E,(IY+MD_DEV) - LD C,(IY+MD_ATTRIB) -; LD C,%00100000 ; ASSUME ROM DISK ATTRIBUTES -; JR Z,MD_DEVICE1 ; IF ZERO, IT IS ROM DISK, DONE -; LD C,%00101000 ; USE RAM DISK ATTRIBUTES + LD E,(IY+MD_DEV) ; GET DEVICE NUMBER + LD C,(IY+MD_ATTRIB) ; GET ATTRIBUTE LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,0 ; L := 0, NO BASE I/O ADDRESS -MD_DEVICE1: XOR A ; SIGNAL SUCCESS RET ; ; ; MD_MEDIA: -; LD A,(IY+MD_DEV) ; GET DEVICE NUM -; ADD A,MID_MDROM ; OFFSET BY MD ROM -; LD E,A ; RESULTANT MEDIA ID TO E - LD E,(IY+MD_MID) + LD E,(IY+MD_MID) ; GET MEDIA ID LD D,0 ; D:0=0 MEANS NO MEDIA CHANGE XOR A ; SIGNAL SUCCESS RET @@ -210,7 +200,6 @@ MD_SEEK: LD (IY+MD_LBA+3),D ; ... XOR A ; SIGNAL SUCCESS RET ; AND RETURN - ; ; ; @@ -238,11 +227,8 @@ MD_WRITE: LD BC,MD_WRSEC MD_WR1: LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC -; LD A,(IY+MD_DEV) ; GET DEVICE NUMBER -; OR A ; SET FLAGS TO TEST FOR ROM (UNIT 0) -; JR NZ,MD_RW ; NOT ROM, SO OK TO WRITE, CONTINUE - LD A,(IY+MD_MID) ; IF THE DEVICES MEDIA - CP MID_MDROM ; IS NOT ROM THEN WE CAN + LD A,(IY+MD_ATTRIB) ; IF THE DEVICES ATTRIBUTE + CP MD_AROM ; IS NOT ROM THEN WE CAN JR NZ,MD_RW ; WRITE TO IT LD E,0 ; UNIT IS READ ONLY, ZERO SECTORS WRITTEN LD A,ERR_READONLY ; SIGNAL ERROR @@ -286,9 +272,73 @@ MD_RW3: ; READ FLASH ; MD_RDSECF: + CALL MD_IOSETUPF CALL MD_RDSEC + PRTS("rf$"); RET ; +; +; +MD_IOSETUPF: + PUSH IY + LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA + LD H,(IY+MD_LBA+1) + INC H ; SKIP FIRST 128MB (256 SECTORS) +; LD DE,256 +; ADD HL,DE +; + CALL PRTHEXWORDHL +; + LD A,L ; SAVE LBA 4K + AND %11111000 ; BLOCK WE ARE + LD C,A ; GOING TO + LD B,H ; ACCESS +; + LD D,0 ; CONVERT LBA + LD E,H ; TO ADDRESS + LD H,L ; MULTIPLY BY 512 + LD L,D ; DE:HL = HLX512 + SLA H + RL E + RL D +; + CALL PC_COLON + CALL PRTHEX32 + CALL PC_SPACE +; + PUSH HL ; IS THE SECTOR + LD HL,MD_LBA4K ; WE WANT TO + LD A,C ; READ ALREADY + CP (HL) ; IN THE 4K + JR NZ,MD_SECR ; BLOCK WE HAVE + INC HL ; IN THE BUFFER + LD A,B + CP (HL) + JR Z,MD_SECM +; +MD_SECR: + POP HL ; 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 +; + LD IX,FF_BUFFER ; SET DESTINATION ADDRESS + CALL FF_RINIT ; READ 4K SECTOR +; + LD DE,FF_BUFFER + CALL DUMP_BUFFER + PUSH HL +; +MD_SECM:POP HL + POP IY + RET +; +MD_LBA4K .DW $FFFF + +; +; ; READ RAM / ROM ; MD_RDSEC: @@ -324,6 +374,7 @@ MD_RDSEC: ; MD_WRSECF: CALL MD_WRSEC + PRTS("wf$"); RET ; ; WRITE RAM @@ -424,6 +475,7 @@ MD_IOSETUP2: ; ROM ; ; ; +#IF (MDTRACE >= 2) MD_PRT: PUSH AF PUSH BC @@ -465,6 +517,7 @@ MD_PRT: POP AF RET +#ENDIF ; ; ; @@ -492,7 +545,6 @@ MD_PRT: ;================================================================================================== ; FF_DBG: .EQU 0 ; DEBUG -FF_HBX: .EQU 1 ; =0 USE STACK, =1 USE HBX_BUF ; FF_RW .DB 00h ; READ WRITE FLAG FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM @@ -687,55 +739,6 @@ FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT ; ;====================================================================== ; -#IF (FF_HBX==0) -FF_FNCALL: ; USING STACK FOR CODE AREA - CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY -; - POP DE ; GET ROUTINE TO CALL -; - LD (FF_STACK),SP ; SAVE STACK - LD HL,(FF_STACK) -; - LD BC,64 -; LD BC,FF_I_SZ ; CODE SIZE REQUIRED - CCF ; CREATE A RELOCATABLE - SBC HL,BC ; CODE BUFFER IN THE - LD SP,HL ; STACK AREA -; - PUSH HL ; SAVE THE EXECUTE ADDRESS - EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE -; LD HL,FF_IDENT ; 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 -; -#IF (FF_DBG==1) - CALL PRTHEXWORD -#ENDIF -; - HB_DI - CALL JPHL ; EXECUTE RELOCATED CODE - HB_EI -; - LD HL,(FF_STACK) ; RESTORE ORIGINAL - LD SP,HL ; STACK POSITION -; -#IF (FF_DBG==1) - CALL PC_SPACE - CALL PRTHEXWORD - CALL PC_SPACE - EX DE,HL - CALL PRTHEXWORDHL - CALL PC_SPACE - EX DE,HL -#ENDIF -; - LD A,C ; RETURN WITH STATUS IN A -; - RET -#ELSE FF_FNCALL: ; USING HBX_BUF FOR CODE AREA CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY ; @@ -744,10 +747,10 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA LD DE,HBX_BUF ; PUT EXECUTE / START ADDRESS IN DE LD BC,HBX_BUFSIZ ; CODE SIZE REQUIRED ; - PUSH DE ; SAVE THE EXECUTE ADDRESS +; PUSH DE ; SAVE THE EXECUTE ADDRESS ; COPY OUR RELOCATABLE LDIR ; CODE TO THE BUFFER - POP HL ; CALL OUR RELOCATABLE CODE +; POP HL ; CALL OUR RELOCATABLE CODE PUSH IY ; PUT BANK AND SECTOR POP BC ; DATA IN BC @@ -757,7 +760,7 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA #ENDIF ; HB_DI - CALL JPHL ; EXECUTE RELOCATED CODE + CALL HBX_BUF ; EXECUTE RELOCATED CODE HB_EI ; #IF (FF_DBG==1) @@ -773,8 +776,6 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA LD A,C ; RETURN WITH STATUS IN A ; RET - -#ENDIF ; ;====================================================================== ; IDENTIFY FLASH CHIP. @@ -865,7 +866,7 @@ FF_EINIT: ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; A CONTAINS CURRENT BANK ; ON EXIT DE CONTAINS ID WORD -; A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +; C RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== ; FF_ERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY @@ -1086,19 +1087,22 @@ FF_RINIT: ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; IX POINTS TO DATA TO BE WRITTEN ; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +; ON EXIT NO STATUS RETURNED ;====================================================================== ; FF_SREAD: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK ; LD H,C ; SECTOR LD L,$00 ; ADDRESS LD D,L ; INITIALIZE LD E,L ; BYTE COUNT ; -FF_RD1: + LD (FF_RST),SP ; SAVE STACK + LD SP,HBX_BUF + (FF_RD1-FF_SREAD) ; SETUP TEMP STACK +; + PUSH AF ; SAVE CURRENT BANK +; +FF_RD1: LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO READ LD C,(HL) ; READ BYTE @@ -1107,7 +1111,7 @@ FF_RD1: PUSH AF ; SELECT BANK CALL HBX_BNKSEL ; TO WRITE LD (IX+0),C ; WRITE BYTE - +; INC HL ; NEXT SOURCE LOCATION INC IX ; NEXT DESTINATION LOCATION ; @@ -1116,10 +1120,12 @@ FF_RD1: JR Z,FF_RD1 POP AF ; RETURN TO ORIGINAL BANK -; CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - XOR A + CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; LD C,D ; RETURN STATUS + LD SP,(FF_RST) ; RESTORE STACK ; RET +FF_RST .DW 0 ; SAVE STACK ; FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; From 17cfce2a1203a5765aae558ee8af256bac128fde Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 13 Dec 2020 09:37:46 +0800 Subject: [PATCH 09/14] md updates Trim flash portions of driver. with flash filesystem enabled, rad routine now used flash drive code to read 4k secctors. Twice as slow as normal rom read routine. --- Doc/ChangeLog.txt | 2 +- Source/Doc/Architecture.md | 1 - Source/HBIOS/hbios.asm | 11 +- Source/HBIOS/md.asm | 303 ++++++++----------------------------- 4 files changed, 74 insertions(+), 243 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 5be4fde8..d0a05938 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -10,7 +10,7 @@ Version 3.1.1 - S?K: Support for Tiny Z80 by Sergey - E?B: Support for v6 YM/AY sound card - C?M: Support for RC2014 bus PropIO V2 -- W?S: Updated FLASH software to v1.3.3 +- W?S: Updated FLASH software to v1.3.4 - PMS: Preliminary support for writing to FLASH ROMs Version 3.1 diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 017363cc..d70b32ab 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -819,7 +819,6 @@ function will return an error status. | _Entry Parameters_ | B: 0x1A | C: Disk Device Unit ID -| HL: Buffer Address | _Exit Results_ | A: Status (0=OK, else error) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index cf0e7b82..2d53fc12 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2137,10 +2137,11 @@ DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES ; IMPLEMENTS MULTI SECTOR READS AND I/O TO/FROM ; BANKED RAM VIA BOUNCE BUFFER ; -; TOS=READ FN ADR -; HL=BUF ADR -; E=SEC COUNT -; D=BUF BANK ID +; ON ENTRY: +; TOS=READ FN ADR +; HL=BUF ADR +; E=SEC COUNT +; D=BUF BANK ID ; HB_DSKREAD: ; @@ -3263,7 +3264,7 @@ HB_DISPCALL1: ; EXIT: HL=FUNC ADR, IY=DATA BLOB ADR ; HB_DISPCALC: - ; CHECK INCOMING UNIT INDEX IN C FOR VAILIDITY + ; CHECK INCOMING UNIT INDEX IN C FOR VALIDITY LD A,C ; A := INCOMING DISK UNIT INDEX CP (IY-1) ; COMPARE TO COUNT JR NC,HB_UNITERR ; HANDLE INVALID UNIT INDEX diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 936f3ac1..5aa03942 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -123,8 +123,8 @@ MD_RESET: RET ; ; -; -MD_CAP: +; +MD_CAP: ; ASSUMES THAT UNIT 1 IS RAM, UNIT 0 IS ROM LD A,(IY+MD_DEV) ; GET DEVICE NUMBER OR A ; SET FLAGS JR Z,MD_CAP0 ; UNIT 0 @@ -172,7 +172,7 @@ MD_GEOM1: ; ; MD_DEVICE: - LD D,DIODEV_MD ; D := DEVICE TYPE + LD D,DIODEV_MD ; D := DEVICE TYPE - ALL ARE MEMORY DISKS LD E,(IY+MD_DEV) ; GET DEVICE NUMBER LD C,(IY+MD_ATTRIB) ; GET ATTRIBUTE LD H,0 ; H := 0, DRIVER HAS NO MODES @@ -205,6 +205,8 @@ MD_SEEK: ; MD_READ: CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR +; +; HL POINTS TO HB_WRKBUF ; LD A,(IY+MD_ATTRIB) ; GET ADR OF SECTOR READ FUNC LD BC,MD_RDSECF ; @@ -271,23 +273,32 @@ MD_RW3: ; ; READ FLASH ; -MD_RDSECF: +MD_RDSECF: ; CALLED FROM MD_RW CALL MD_IOSETUPF - CALL MD_RDSEC - PRTS("rf$"); + LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK + AND %00000111 ; AND CALCULATE OFFSET OFFSET + ADD A,A + LD D,A ; FROM THE START + LD E,0 +; + LD HL,FF_BUFFER ; POINT TO THE SECTOR WE + ADD HL,DE ; WANT TO COPY + LD DE,(MD_DSKBUF) + LD BC,512 + LDIR +; + XOR A RET ; ; ; MD_IOSETUPF: + PUSH DE + PUSH HL PUSH IY LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA LD H,(IY+MD_LBA+1) INC H ; SKIP FIRST 128MB (256 SECTORS) -; LD DE,256 -; ADD HL,DE -; - CALL PRTHEXWORDHL ; LD A,L ; SAVE LBA 4K AND %11111000 ; BLOCK WE ARE @@ -301,10 +312,6 @@ MD_IOSETUPF: SLA H RL E RL D -; - CALL PC_COLON - CALL PRTHEX32 - CALL PC_SPACE ; PUSH HL ; IS THE SECTOR LD HL,MD_LBA4K ; WE WANT TO @@ -316,7 +323,7 @@ MD_IOSETUPF: CP (HL) JR Z,MD_SECM ; -MD_SECR: +MD_SECR: POP HL ; DESIRED SECTOR ; IS NOT IN BUFFER LD (MD_LBA4K),BC ; WE WILL READ IN @@ -327,16 +334,15 @@ MD_SECR: LD IX,FF_BUFFER ; SET DESTINATION ADDRESS CALL FF_RINIT ; READ 4K SECTOR ; - LD DE,FF_BUFFER - CALL DUMP_BUFFER PUSH HL ; MD_SECM:POP HL POP IY + POP HL + POP DE RET ; -MD_LBA4K .DW $FFFF - +MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR ; ; ; READ RAM / ROM @@ -558,10 +564,10 @@ FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM ; ; FF_INIT: - CALL NEWLINE ; DISLAY NUMBER - PRTS("FF: UNITS=$") ; OF UNITS - LD A,+(ROMSIZE/512) ; CONFIGURED FOR. - CALL PRTDECB +; CALL NEWLINE ; DISLAY NUMBER +; PRTS("FF: UNITS=$") ; OF UNITS +; LD A,+(ROMSIZE/512) ; CONFIGURED FOR. +; CALL PRTDECB ; LD B,A ; NUMBER OF DEVICES TO PROBE LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL @@ -572,12 +578,12 @@ FF_PROBE: LD L,D ; ON EACH CYCLE THROUGH ; PUSH BC - CALL PC_SPACE - LD A,+(ROMSIZE/512)+1 - SUB B ; PRINT - CALL PRTDECB ; DEVICE - LD A,'=' ; NUMBER - CALL COUT +; CALL PC_SPACE +; LD A,+(ROMSIZE/512)+1 +; SUB B ; PRINT +; CALL PRTDECB ; DEVICE +; LD A,'=' ; NUMBER +; CALL COUT CALL FF_IINIT ; GET ID AT THIS ADDRESS ; PUSH HL @@ -593,7 +599,7 @@ FF_PROBE: POP DE ; MEANS WE CAN'T POP HL ; ENABLE FLASH WRITING ; - CALL FF_LAND ; LOOKUP AND DISPLAY +; CALL FF_LAND ; LOOKUP AND DISPLAY POP BC ; LD A,C ; UPDATE ADDRESS @@ -602,92 +608,17 @@ FF_PROBE: ; DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE ; - LD A,(FF_RW) - OR A - JR NZ,FF_PR1 - CALL PRTSTRD - .TEXT " FLASH FILESYSTEM ENABLED$" -FF_PR1: -; -#IF (FF_DBG==1) - CALL FF_TESTING -#ENDIF +; LD A,(FF_RW) +; OR A +; JR NZ,FF_PR1 +; CALL PRTSTRD +; .TEXT " FLASH FILESYSTEM ENABLED$" +;FF_PR1: ; XOR A ; INIT SUCCEEDED RET ; ;====================================================================== -; TEST CODE AREA -;====================================================================== -; -FF_TESTING: -; -#IF (0) - LD DE,$0008 ; SET - LD HL,$0000 ; ADDRESS - CALL FF_EINIT ; CHIP ERASE - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -; -#IF (0) - LD DE,$000A ; SET - LD HL,$8000 ; ADDRESS - CALL FF_SINIT ; SECTOR ERASE - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -; -#IF (0) - LD DE,$000A ; SET DESTINATION - LD HL,$8000 ; ADDRESS - LD IX,FF_BUFFER ; SET SOURCE ADDRESS - CALL FF_WINIT ; WRITE SECTOR - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -; -#IF (1) - LD DE,$0000 ; SET SOURCE - LD HL,$7000 ; ADDRESS - LD IX,FF_BUFFER ; SET DESTINATION ADDRESS - CALL FF_RINIT ; READ SECTOR - CALL PRTHEXBYTE ; DISPLAY STATUS - LD DE,FF_BUFFER - CALL DUMP_BUFFER -#ENDIF -; -#IF (1) - LD HL,FF_BUFFER ; FILL BUFFER - LD (HL),'J' - LD DE,FF_BUFFER+1 - LD BC,$1000-1 - LDIR -#ENDIF -; -#IF (1) - LD DE,$0000 ; SET - LD HL,$7000 ; ADDRESS - CALL FF_SINIT ; SECTOR ERASE - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -#IF (1) - LD DE,$0000 ; SET DESTINATION - LD HL,$7000 ; ADDRESS - LD IX,FF_BUFFER ; SET SOURCE ADDRESS - CALL FF_WINIT ; WRITE SECTOR - CALL PRTHEXBYTE ; DISPLAY STATUS -#ENDIF -; -#IF (1) - LD DE,$0000 ; SET SOURCE - LD HL,$7000 ; ADDRESS - LD IX,FF_BUFFER ; SET DESTINATION ADDRESS - CALL FF_RINIT ; READ SECTOR - CALL PRTHEXBYTE ; DISPLAY STATUS - LD DE,FF_BUFFER - CALL DUMP_BUFFER -#ENDIF - RET -; -;====================================================================== ; LOOKUP AND DISPLAY CHIP ; ; ON ENTRY DE CONTAINS CHIP ID @@ -837,85 +768,6 @@ FF_IDENT: ; THIS CODE GETS RELOCATED TO HIGH MEMORY FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== -; FLASH CHIP ERASE. -; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS -; CREATE A CODE BUFFER IN HIGH MEMORY AREA -; COPY FLASH CODE TO CODE BUFFER -; CALL RELOCATED FLASH ERASE CODE -; RESTORE STACK -; RETURN WITH STATUS CODE. -; -; ON ENTRY DE:HL POINTS TO AN ADDRESS IDENTIFYING THE CHIP -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL -;====================================================================== -; -FF_EINIT: - PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_ERASE ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE -; -;====================================================================== -; ERASE FLASH CHIP. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; ISSUE ERASE COMMAND -; POLL TOGGLE BIT FOR COMPLETION STATUS. -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; A CONTAINS CURRENT BANK -; ON EXIT DE CONTAINS ID WORD -; C RETURNS STATUS FLASH 0=SUCCESS FF=FAIL -;====================================================================== -; -FF_ERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM -; - LD HL,$5555 ; LD A,$AA ; COMMAND - LD (HL),$AA ; LD ($5555),A ; SETUP - LD A,L ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A - LD (HL),$80 ; LD A,$80 - LD (HL),$AA ; LD ($5555),A - LD A,L ; LD A,$AA - LD ($2AAA),A ; LD ($5555),A - LD (HL),$10 ; LD A,$55 - ; LD ($2AAA),A - ; LD A,$10 - ; LD ($5555),A -; - LD A,(HL) ; DO TWO SUCCESSIVE READS FROM THE SAME FLASH ADDRESS. -FF_WT2: LD C,(HL) ; IF TOGGLE BIT (BIT 6) - XOR C ; IS THE SAME ON BOTH READS - BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. - JR Z,FF_WT1 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. -; - LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). - BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS - JR Z,FF_WT2 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 -; - LD A,(HL) ; WE GOT A TIMEOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE - XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? - BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED - JR Z,FF_WT1 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. -; - LD (HL),$F0 ; WRITE DEVICE RESET - LD C,$FF ; SET FAIL STATUS - JR FF_WT3 -; -FF_WT1: LD C,0 ; SET SUCCESS STATUS -FF_WT3: POP AF -; LD A,B ; RETURN TO ORIGINAL BANK - CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - RET -; -FF_E_SZ .EQU $-FF_ERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED -; -;====================================================================== ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS ; ; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. @@ -1221,53 +1073,34 @@ FF_W_SZ .EQU $-FF_SWRITE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; -; FLASH STYLE -; -;====================================================================== -; -ST_NORMAL .EQU 0 -ST_ERASE_CHIP .EQU 1 ; SECTOR BASED ERASE NOT SUPPORTED -ST_PROGRAM_SECT .EQU 2 -; -;====================================================================== -; -; FLASH CHIP MACRO +; FLASH CHIP LIST ; ;====================================================================== ; -#DEFINE FF_CHIP(FFROMID,FFROMNM,FFROMSS,FFROMSC,FFROMMD)\ -#DEFCONT ; \ -#DEFCONT .DW FFROMID \ -#DEFCONT .DB FFROMNM \ -#DEFCONT .DW FFROMSS \ -#DEFCONT .DW FFROMSC \ -#DEFCONT .DB FFROMMD \ +#DEFINE FF_CHIP(FFROMID,FFROMNM) \ +#DEFCONT ; \ +#DEFCONT .DW FFROMID \ +#DEFCONT .DB FFROMNM \ #DEFCONT ; ; -;====================================================================== -; -; FLASH CHIP LIST -; -;====================================================================== -; FF_TABLE: -FF_CHIP(00120H,"29F010$ ",128,8,ST_NORMAL) -FF_CHIP(001A4H,"29F040$ ",512,8,ST_NORMAL) -FF_CHIP(01F04H,"AT49F001NT$",1024,1,ST_ERASE_CHIP) -FF_CHIP(01F05H,"AT49F001N$ ",1024,1,ST_ERASE_CHIP) -FF_CHIP(01F07H,"AT49F002N$ ",2048,1,ST_ERASE_CHIP) -FF_CHIP(01F08H,"AT49F002NT$",2048,1,ST_ERASE_CHIP) -FF_CHIP(01F13H,"AT49F040$ ",4096,1,ST_ERASE_CHIP) -FF_CHIP(01F5DH,"AT29C512$ ",1,512,ST_PROGRAM_SECT) -FF_CHIP(01FA4H,"AT29C040$ ",2,2048,ST_PROGRAM_SECT) -FF_CHIP(01FD5H,"AT29C010$ ",1,1024,ST_PROGRAM_SECT) -FF_CHIP(01FDAH,"AT29C020$ ",2,1024,ST_PROGRAM_SECT) -FF_CHIP(02020H,"M29F010$ ",128,8,ST_PROGRAM_SECT) -FF_CHIP(020E2H,"M29F040$ ",512,8,ST_NORMAL) -FF_CHIP(0BFB5H,"39F010$ ",32,32,ST_NORMAL) -FF_CHIP(0BFB6H,"39F020$ ",32,64,ST_NORMAL) -FF_CHIP(0BFB7H,"39F040$ ",32,128,ST_NORMAL) -FF_CHIP(0C2A4H,"MX29F040$ ",512,8,ST_NORMAL) +FF_CHIP(00120H,"29F010$ ") +FF_CHIP(001A4H,"29F040$ ") +FF_CHIP(01F04H,"AT49F001NT$") +FF_CHIP(01F05H,"AT49F001N$ ") +FF_CHIP(01F07H,"AT49F002N$ ") +FF_CHIP(01F08H,"AT49F002NT$") +FF_CHIP(01F13H,"AT49F040$ ") +FF_CHIP(01F5DH,"AT29C512$ ") +FF_CHIP(01FA4H,"AT29C040$ ") +FF_CHIP(01FD5H,"AT29C010$ ") +FF_CHIP(01FDAH,"AT29C020$ ") +FF_CHIP(02020H,"M29F010$ ") +FF_CHIP(020E2H,"M29F040$ ") +FF_CHIP(0BFB5H,"39F010$ ") +FF_CHIP(0BFB6H,"39F020$ ") +FF_CHIP(0BFB7H,"39F040$ ") +FF_CHIP(0C2A4H,"MX29F040$ ") ; FF_T_CNT .EQU 17 FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT @@ -1276,14 +1109,15 @@ FF_STACK: .DW 0 ; ;====================================================================== ; -; 4K FLASH BUFFER +; 4K FLASH SECTOR BUFFER ; ;====================================================================== ; FF_BUFFER .FILL 4096,$FF +; ;====================================================================== ; -; RELOCATABLE CODE SPACE REQUIREMENTS +; RELOCATABLE CODE SPACE REQUIREMENTS CHECK ; ;====================================================================== ; @@ -1295,9 +1129,6 @@ FF_CSIZE .SET FF_W_SZ #IF (FF_S_SZ>FF_CSIZE) FF_CSIZE .SET FF_S_SZ #ENDIF -#IF (FF_E_SZ>FF_CSIZE) -FF_CSIZE .SET FF_E_SZ -#ENDIF #IF (FF_I_SZ>FF_CSIZE) FF_CSIZE .SET FF_I_SZ #ENDIF From ad1b2423e18e294511344a7740bf895986212d8f Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 14 Dec 2020 21:21:34 +0800 Subject: [PATCH 10/14] Update md.asm First successful write/verify to flash --- Source/HBIOS/md.asm | 482 ++++++++++++++++++++++++++++---------------- 1 file changed, 311 insertions(+), 171 deletions(-) diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 5aa03942..6e9def1b 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -25,6 +25,9 @@ MD_AROM .EQU %00100000 ; ROM ATTRIBUTE MD_ARAM .EQU %00101000 ; RAM ATTRIBUTE MD_AFSH .EQU %00111000 ; FLASH ATTRIBUTE ; +MD_FDBG .EQU 0 ; FLASH DEBUG CODE +MD_FVBS .EQU 1 ; FLASH VERBOSE OUTPUT +; ; DEVICE CONFIG TABLE (RAM DEVICE FIRST TO MAKE IT ALWAYS FIRST DRIVE) ; MD_CFGTBL: @@ -50,7 +53,7 @@ MD_CFGTBL: ; ; MD_INIT: - CALL FF_INIT ; PROBE FLASH CAPABILITY + CALL MD_FINIT ; PROBE FLASH CAPABILITY CALL NEWLINE ; FORMATTING PRTS("MD: UNITS=2 $") @@ -64,7 +67,7 @@ MD_INIT: ; ; SETUP THE DIO TABLE ENTRIES ; - LD A,(FF_RW) ; IF FLASH + LD A,(MD_FFSEN) ; IF FLASH OR A ; FILESYSTEM JR NZ,MD_IN1 ; CAPABLE, LD A,MD_AFSH ; UPDATE ROM DIO @@ -274,28 +277,54 @@ MD_RW3: ; READ FLASH ; MD_RDSECF: ; CALLED FROM MD_RW - CALL MD_IOSETUPF +; + CALL MD_IOSETUPF ; SETUP SOURCE ADDRESS +; + PUSH HL ; IS THE SECTOR + LD HL,(MD_LBA4K) ; WE WANT TO + XOR A ; WRITE ALREADY + SBC HL,BC ; IN THE 4K + 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 +; + ; DE:HL CONTAIN SOURCE ADDRESS + ; WHICH WAS SETUP BY MD_IOSETUPF + PUSH IX + LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS + CALL MD_FREAD ; READ 4K SECTOR + POP IX +; +MD_SECM: LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK AND %00000111 ; AND CALCULATE OFFSET OFFSET ADD A,A LD D,A ; FROM THE START LD E,0 ; - LD HL,FF_BUFFER ; POINT TO THE SECTOR WE + LD HL,MD_F4KBUF ; POINT TO THE SECTOR WE ADD HL,DE ; WANT TO COPY LD DE,(MD_DSKBUF) - LD BC,512 - LDIR + LD BC,512 ; COPY ONE 512B SECTOR FROM THE + LDIR ; 4K SECTOR TO THE DISK BUFFER ; XOR A RET ; +; SETUP DE:HL AS THE SECTOR ADDRESS TO READ OR WRITE ; +; ON EXIT +; BC = LBA 4K BLOCK WE ARE ACCESSING +; DE:HL = MEMORY ADDRESS TO READ FROM IN FLASH ; MD_IOSETUPF: - PUSH DE - PUSH HL - PUSH IY LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA LD H,(IY+MD_LBA+1) INC H ; SKIP FIRST 128MB (256 SECTORS) @@ -303,7 +332,7 @@ MD_IOSETUPF: LD A,L ; SAVE LBA 4K AND %11111000 ; BLOCK WE ARE LD C,A ; GOING TO - LD B,H ; ACCESS + LD A,H ; ACCESS ; LD D,0 ; CONVERT LBA LD E,H ; TO ADDRESS @@ -313,33 +342,6 @@ MD_IOSETUPF: RL E RL D ; - PUSH HL ; IS THE SECTOR - LD HL,MD_LBA4K ; WE WANT TO - LD A,C ; READ ALREADY - CP (HL) ; IN THE 4K - JR NZ,MD_SECR ; BLOCK WE HAVE - INC HL ; IN THE BUFFER - LD A,B - CP (HL) - JR Z,MD_SECM -; -MD_SECR: - POP HL ; 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 -; - LD IX,FF_BUFFER ; SET DESTINATION ADDRESS - CALL FF_RINIT ; READ 4K SECTOR -; - PUSH HL -; -MD_SECM:POP HL - POP IY - POP HL - POP DE RET ; MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR @@ -378,9 +380,65 @@ MD_RDSEC: ; ; WRITE FLASH ; -MD_WRSECF: - CALL MD_WRSEC +MD_WRSECF: ; CALLED FROM MD_RW + CALL MD_IOSETUPF ; SETUP DESTINATION ADDRESS +; + PUSH HL ; IS THE SECTOR + LD HL,(MD_LBA4K) ; WE WANT TO + 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 + ; + ; COPY 512B SECTOR INTO 4K SECTOR + ; + LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK + AND %00000111 ; AND CALCULATE OFFSET OFFSET + ADD A,A + LD D,A ; FROM THE START + LD E,0 +; + LD HL,MD_F4KBUF ; POINT TO THE SECTOR WE + ADD HL,DE ; WANT TO COPY + EX DE,HL +; + LD HL,(MD_DSKBUF) + LD BC,512 ; COPY ONE 512B SECTOR FROM THE + LDIR ; THE DISK BUFFER TO 4K SECTOR +; + 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 ; ; WRITE RAM @@ -525,16 +583,8 @@ MD_PRT: RET #ENDIF ; -; -; ;================================================================================================== -; FLASH DRIVER FOR FLASH & EEPROM PROGRAMMING -; -; 26 SEP 2020 - CHIP IDENTIFICATION IMPLEMENTED -- PHIL SUMMERS -; - CHIP ERASE IMPLEMENTED -; 23 OCT 2020 - SECTOR ERASE IMPLEMENTED -; 01 NOV 2020 - WRITE SECTOR IMPLEMENTED -; 04 DEC 2020 - READ SECTOR IMPLEMENTED +; FLASH DRIVERS ;================================================================================================== ; ; UPPER RAM BANK IS ALWAYS AVAILABLE REGARDLESS OF MEMORY BANK SELECTION. @@ -550,9 +600,6 @@ MD_PRT: ; ;================================================================================================== ; -FF_DBG: .EQU 0 ; DEBUG -; -FF_RW .DB 00h ; READ WRITE FLAG FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM ; ;====================================================================== @@ -562,13 +609,13 @@ FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM ; USES MEMORY SIZE DEFINED BY BUILD CONFIGURATION. ;====================================================================== ; -; -FF_INIT: -; CALL NEWLINE ; DISLAY NUMBER -; PRTS("FF: UNITS=$") ; OF UNITS -; LD A,+(ROMSIZE/512) ; CONFIGURED FOR. -; CALL PRTDECB -; +MD_FINIT: +#IF (MD_FVBS==1) + CALL NEWLINE ; DISLAY NUMBER + PRTS("MD: FLASH=$") ; OF UNITS + LD A,+(ROMSIZE/512) ; CONFIGURED FOR. + CALL PRTDECB +#ENDIF LD B,A ; NUMBER OF DEVICES TO PROBE LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL FF_PROBE: @@ -578,28 +625,31 @@ FF_PROBE: LD L,D ; ON EACH CYCLE THROUGH ; PUSH BC -; CALL PC_SPACE -; LD A,+(ROMSIZE/512)+1 -; SUB B ; PRINT -; CALL PRTDECB ; DEVICE -; LD A,'=' ; NUMBER -; CALL COUT - CALL FF_IINIT ; GET ID AT THIS ADDRESS -; +#IF (MD_FVBS==1) + CALL PC_SPACE + LD A,+(ROMSIZE/512)+1 + SUB B ; PRINT + CALL PRTDECB ; DEVICE + LD A,'=' ; NUMBER + CALL COUT +#ENDIF + CALL MD_FIDENT ; GET ID AT THIS ADDRESS + PUSH HL - PUSH DE +; PUSH DE LD H,FF_TGT&$FF ; IF WE MATCH WITH LD L,FF_TGT/$FF - CCF ; A NON 39SF040 - SBC HL,DE ; CHIP SET THE - LD A,(FF_RW) ; R/W FLAG TO R/O + CCF ; A NON 39SF040 + SBC HL,BC ; CHIP SET THE + LD A,(MD_FFSEN) ; R/W FLAG TO R/O OR H OR L - LD (FF_RW),A ; A NON ZERO VALUE - POP DE ; MEANS WE CAN'T + LD (MD_FFSEN),A ; A NON ZERO VALUE +; POP DE ; MEANS WE CAN'T POP HL ; ENABLE FLASH WRITING -; -; CALL FF_LAND ; LOOKUP AND DISPLAY +#IF (MD_FVBS==1) + CALL FF_LAND ; LOOKUP AND DISPLAY +#ENDIF POP BC ; LD A,C ; UPDATE ADDRESS @@ -607,43 +657,43 @@ FF_PROBE: LD C,A ; DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE -; -; LD A,(FF_RW) -; OR A -; JR NZ,FF_PR1 -; CALL PRTSTRD -; .TEXT " FLASH FILESYSTEM ENABLED$" -;FF_PR1: -; +#IF (MD_FVBS==1) + LD A,(MD_FFSEN) + OR A + JR NZ,MD_PR1 + CALL PRTSTRD + .TEXT " FLASH FILE SYSTEM ENABLED$" +MD_PR1: +#ENDIF XOR A ; INIT SUCCEEDED RET ; ;====================================================================== ; LOOKUP AND DISPLAY CHIP ; -; ON ENTRY DE CONTAINS CHIP ID +; ON ENTRY BC CONTAINS CHIP ID ; ON EXIT A CONTAINS STATUS 0=SUCCESS, NZ=NOT IDENTIFIED ;====================================================================== ; FF_LAND: ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) PRTS(" ID:$") - LD H,E - LD L,D - CALL PRTHEXWORDHL ; DISPLAY FLASH ID +; LD H,C +; LD L,B + CALL PRTHEXWORD ; DISPLAY FLASH ID CALL PC_SPACE #ENDIF ; LD HL,FF_TABLE ; SEARCH THROUGH THE FLASH - LD BC,FF_T_CNT ; TABLE TO FIND A MATCH + LD DE,FF_T_CNT ; TABLE TO FIND A MATCH FF_NXT1:LD A,(HL) - CP D + CP B JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH ; INC HL LD A,(HL) - CP E + CP C DEC HL JR NZ,FF_NXT0 ; SECOND BYTE DOES NOT MATCH ; @@ -656,14 +706,17 @@ FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT ADD HL,BC POP BC ; - LD A,B ; CHECK IF WE REACHED THE - OR C ; END OF THE TABLE - DEC BC + LD A,D ; CHECK IF WE REACHED THE + OR E ; END OF THE TABLE + DEC DE JR NZ,FF_NXT1 ; NOT AT END YET ; - LD HL,FF_UNKNOWN ; WE REACHED THE END WITHOUT A MATCH + LD HL,MD_UNKNOWN ; WE REACHED THE END WITHOUT A MATCH ; -FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT +FF_NXT2: +#IF (MD_FVBS==1) + CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT +#ENDIF RET ;====================================================================== ;COMMON FUNCTION CALL @@ -686,15 +739,16 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA PUSH IY ; PUT BANK AND SECTOR POP BC ; DATA IN BC ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) CALL PRTHEXWORD #ENDIF ; + LD DE,0 HB_DI CALL HBX_BUF ; EXECUTE RELOCATED CODE HB_EI ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) CALL PC_SPACE CALL PRTHEXWORD CALL PC_SPACE @@ -705,8 +759,10 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA #ENDIF ; LD A,C ; RETURN WITH STATUS IN A -; - RET + POP DE + POP HL + POP IY + RET ; RETURN TO MD_READF, MD_WRITEF ; ;====================================================================== ; IDENTIFY FLASH CHIP. @@ -719,14 +775,19 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA ; ; ON ENTRY DE:HL POINTS TO AN ADDRESS WITH THE ADDRESS RANGE OF THE ; CHIP TO BE IDENTIFIED. -; ON EXIT DE CONTAINS THE CHIP ID BYTES. +; ON EXIT BC CONTAINS THE CHIP ID BYTES. ; NO STATUS IS RETURNED ;====================================================================== ; -FF_IINIT: +MD_FIDENT: + PUSH IY + PUSH HL + PUSH DE +; PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_IDENT ; PUT ROUTINE TO CALL + LD HL,MD_FIDENT_R ; PUT ROUTINE TO CALL EX (SP),HL ; ON THE STACK +; JP FF_FNCALL ; EXECUTE ; ;====================================================================== @@ -739,13 +800,17 @@ FF_IINIT: ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; A CONTAINS CURRENT BANK -; ON EXIT DE CONTAINS ID WORD +; ON EXIT BC CONTAINS ID WORD ; NO STATUS IS RETURNED ;====================================================================== ; -FF_IDENT: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + LD (HBX_BUF+MD_FIST-MD_FIDENT_R),SP ; SAVE STACK + LD SP,HBX_BUF + (MD_FIST-MD_FIDENT_R) ; SETUP TEMP STACK ; PUSH AF ; SAVE CURRENT BANK +; LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM ; @@ -755,17 +820,21 @@ FF_IDENT: ; THIS CODE GETS RELOCATED TO HIGH MEMORY LD ($2AAA),A ; LD ($2AAA),A LD (HL),$90 ; LD A,$90 ; ; LD ($5555),A - LD DE,($0000) ; READ ID + LD BC,($0000) ; READ ID ; LD A,$F0 ; ; EXIT LD (HL),A ; LD ($5555),A ; COMMAND ; POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + LD SP,(HBX_BUF + (MD_FIST-MD_FIDENT_R)) ; RESTORE STACK ; RET ; -FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED + .FILL 8,0 ; STACK SPACE +MD_FIST .DW 0 ; SAVE STACK +MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS @@ -784,7 +853,7 @@ FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; FF_CALCA: ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) CALL PC_SPACE ; DISPLAY SECTOR CALL PRTHEX32 ; SECTOR ADDRESS CALL PC_SPACE ; IN DE:HL @@ -804,7 +873,7 @@ FF_CALCA: PUSH BC POP IY ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) CALL PRTHEXWORD ; DISPLAY BANK AND CALL PC_SPACE ; SECTOR RESULT #ENDIF @@ -828,9 +897,13 @@ FF_CALCA: ; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== ; -FF_SINIT: +MD_FERAS: + PUSH IY + PUSH HL + PUSH DE +; PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_SERASE ; PUT ROUTINE TO CALL + LD HL,MD_FERAS_R ; PUT ROUTINE TO CALL EX (SP),HL ; ON THE STACK JP FF_FNCALL ; EXECUTE ; @@ -847,23 +920,55 @@ FF_SINIT: ; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== ; -FF_SERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; + LD (HBX_BUF+MD_FEST-MD_FERAS_R),SP ; SAVE STACK + LD SP,HBX_BUF + (MD_FERAS_S-MD_FERAS_R) ; SETUP TEMP STACK +; + LD HL,$5555 ; LD A,$AA ; COMMAND + LD DE,$2AAA ;+3 +MD_FERAS_S PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM ; - LD HL,$5555 ; LD A,$AA ; COMMAND +; LD HL,$5555 ; LD A,$AA ; COMMAND +; LD A,L ; LD ($5555),A ; SETUP +; LD (HL),$AA ; LD A,$55 +; LD ($2AAA),A ; LD ($2AAA),A +; LD (HL),$80 ; LD A,$80 +; LD (HL),$AA ; LD ($5555),A +; LD ($2AAA),A ; LD A,$AA + ; LD ($5555),A + ; LD A,$55 + ; LD ($2AAA),A +; +; LD HL,$5555 ; LD A,$AA ; COMMAND +; LD DE,$2AAA ;+3 +; LD A,L ; LD ($5555),A ; SETUP +; LD (HL),$AA ; LD A,$55 +; LD (DE),A ;-2 ; LD ($2AAA),A +; LD (HL),$80 ; LD A,$80 +; LD (HL),$AA ; LD ($5555),A +; LD (DE),A ;-2 ; LD A,$AA + ; LD ($5555),A + ; LD A,$55 + ; LD ($2AAA),A +; +; LD HL,$5555 ; LD A,$AA ; COMMAND +; LD DE,$2AAA ;+3 LD A,L ; LD ($5555),A ; SETUP - LD (HL),$AA ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A + LD (HL),E ;-1 ; LD A,$55 + LD (DE),A ;-2 ; LD ($2AAA),A LD (HL),$80 ; LD A,$80 - LD (HL),$AA ; LD ($5555),A - LD ($2AAA),A ; LD A,$AA + LD (HL),E ;-1 ; LD ($5555),A + LD (DE),A ;-2 ; LD A,$AA ; LD ($5555),A ; LD A,$55 ; LD ($2AAA),A + + LD H,C ; SECTOR LD L,$00 ; ADDRESS ; @@ -889,17 +994,20 @@ FF_WT4: LD C,(HL) ; FROM THE SAME FLASH ADDRESS. BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED JR Z,FF_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. ; - LD (HL),$F0 ; WRITE DEVICE RESET - LD C,$FF ; SET FAIL STATUS +; LD (HL),$F0 ; WRITE DEVICE RESET +; LD C,$FF ; SET FAIL STATUS JR FF_WT6 ; -FF_WT5: LD C,0 ; SET SUCCESS STATUS +FF_WT5: LD C,L ; SET SUCCESS STATUS FF_WT6: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + LD SP,(HBX_BUF + (MD_FEST-MD_FERAS_R)) ; RESTORE STACK ; RET ; -FF_S_SZ .EQU $-FF_SERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +MD_FEST .DW 0 +MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; READ FLASH SECTOR OF 4096 BYTES @@ -915,14 +1023,18 @@ FF_S_SZ .EQU $-FF_SERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; IX POINTS TO WHERE TO SAVE DATA ;====================================================================== ; -FF_RINIT: +MD_FREAD: + PUSH IY + PUSH HL + PUSH DE +; LD L,0 ; CHANGE ADDRESS LD A,H ; TO SECTOR BOUNDARY AND $F0 ; BY MASKING OFF LD H,A ; LOWER 12 BITS ; PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_SREAD ; PUT ROUTINE TO CALL + LD HL,MD_FREAD_R ; PUT ROUTINE TO CALL EX (SP),HL ; ON THE STACK JP FF_FNCALL ; EXECUTE ; @@ -942,19 +1054,20 @@ FF_RINIT: ; ON EXIT NO STATUS RETURNED ;====================================================================== ; -FF_SREAD: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; LD H,C ; SECTOR LD L,$00 ; ADDRESS - LD D,L ; INITIALIZE - LD E,L ; BYTE COUNT +; LD D,L ; INITIALIZE +; LD E,L ; BYTE COUNT ; - LD (FF_RST),SP ; SAVE STACK - LD SP,HBX_BUF + (FF_RD1-FF_SREAD) ; SETUP TEMP STACK + LD (HBX_BUF+MD_FRST-MD_FREAD_R),SP ; SAVE STACK +MD_FRD_S: + LD SP,HBX_BUF + (MD_FRD_S-MD_FREAD_R) ; SETUP TEMP STACK ; PUSH AF ; SAVE CURRENT BANK ; -FF_RD1: +MD_FRD1: LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO READ LD C,(HL) ; READ BYTE @@ -969,17 +1082,18 @@ FF_RD1: ; INC DE ; CONTINUE READING UNTIL BIT 4,D ; WE HAVE DONE ONE SECTOR - JR Z,FF_RD1 + JR Z,MD_FRD1 POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; LD C,D ; RETURN STATUS - LD SP,(FF_RST) ; RESTORE STACK +; + LD SP,(HBX_BUF+MD_FRST-MD_FREAD_R) ; RESTORE STACK ; RET -FF_RST .DW 0 ; SAVE STACK ; -FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +MD_FRST .DW 0 ; SAVE STACK +MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; WRITE FLASH SECTOR OF 4096 BYTES @@ -995,14 +1109,18 @@ FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; IX POINTS TO DATA TO BE WRITTEN ;====================================================================== ; -FF_WINIT: +MD_FWRIT: + PUSH IY + PUSH HL + PUSH DE +; LD L,0 ; CHANGE ADDRESS LD A,H ; TO SECTOR BOUNDARY AND $F0 ; BY MASKING OFF LD H,A ; LOWER 12 BITS ; PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_SWRITE ; PUT ROUTINE TO CALL + LD HL,MD_FWRIT_R ; PUT ROUTINE TO CALL EX (SP),HL ; ON THE STACK JP FF_FNCALL ; EXECUTE ; @@ -1021,16 +1139,22 @@ FF_WINIT: ; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== ; -FF_SWRITE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; - PUSH AF ; SAVE CURRENT BANK +MD_FWST .EQU $+2 ; SAVE STACK ; LD H,C ; SECTOR LD L,$00 ; ADDRESS - LD D,L ; INITIALIZE - LD E,L ; BYTE COUNT +; LD D,L ; INITIALIZE +; LD E,L ; BYTE COUNT + + LD (HBX_BUF+MD_FWST-MD_FWRIT_R),SP ; SAVE STACK + LD SP, HBX_BUF+(MD_FWRIT_S-MD_FWRIT_R) ; SETUP TEMP STACK +MD_FWRIT_S: ; -FF_WR1: + PUSH AF ; SAVE CURRENT BANK +; +MD_FWRI1: POP AF ; SELECT BANK PUSH AF ; TO READ CALL HBX_BNKSEL @@ -1052,24 +1176,26 @@ FF_WR1: ; ; ; DO TWO SUCCESSIVE READS LD A,(HL) ; FROM THE SAME FLASH ADDRESS. -FF_WT7: LD C,(HL) ; IF TOGGLE BIT (BIT 6) +MD_FW7: LD C,(HL) ; IF TOGGLE BIT (BIT 6) XOR C ; IS THE SAME ON BOTH READS - BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. - JR NZ,FF_WT7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. + BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT. + JR NZ,MD_FW7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. ; INC HL ; NEXT DESTINATION LOCATION INC IX ; NEXT SOURCE LOCATION ; INC DE ; CONTINUE WRITING UNTIL BIT 4,D ; WE HAVE DONE ONE SECTOR - JR Z,FF_WR1 + JR Z,MD_FWRI1 ; POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + LD SP,(HBX_BUF+MD_FWST-MD_FWRIT_R) ; RESTORE STACK ; RET ; -FF_W_SZ .EQU $-FF_SWRITE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; @@ -1104,7 +1230,7 @@ FF_CHIP(0C2A4H,"MX29F040$ ") ; FF_T_CNT .EQU 17 FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT -FF_UNKNOWN .DB "UNKNOWN$" +MD_UNKNOWN .DB "UNKNOWN$" FF_STACK: .DW 0 ; ;====================================================================== @@ -1113,7 +1239,20 @@ FF_STACK: .DW 0 ; ;====================================================================== ; -FF_BUFFER .FILL 4096,$FF +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=$" ; ;====================================================================== ; @@ -1121,36 +1260,37 @@ FF_BUFFER .FILL 4096,$FF ; ;====================================================================== ; -FF_CSIZE .EQU 0 + .ECHO "MD_FIDENT_R " + .ECHO MD_I_SZ + .ECHO "\n" +; + .ECHO "MD_FREAD_R " + .ECHO MD_R_SZ + .ECHO "\n" +; + .ECHO "MD_FERAS_R " + .ECHO MD_S_SZ + .ECHO "\n" + + .ECHO "MD_FWRIT_R " + .ECHO MD_W_SZ + .ECHO "\n" +; +MD_CSIZE .EQU 0 ; -#IF (FF_W_SZ>FF_CSIZE) -FF_CSIZE .SET FF_W_SZ +#IF (MD_W_SZ>MD_CSIZE) +MD_CSIZE .SET MD_W_SZ #ENDIF -#IF (FF_S_SZ>FF_CSIZE) -FF_CSIZE .SET FF_S_SZ +#IF (MD_S_SZ>MD_CSIZE) +MD_CSIZE .SET MD_S_SZ #ENDIF -#IF (FF_I_SZ>FF_CSIZE) -FF_CSIZE .SET FF_I_SZ +#IF (MD_I_SZ>MD_CSIZE) +MD_CSIZE .SET MD_I_SZ #ENDIF -#IF (FF_R_SZ>FF_CSIZE) -FF_CSIZE .SET FF_R_SZ +#IF (MD_R_SZ>MD_CSIZE) +MD_CSIZE .SET MD_R_SZ #ENDIF ; .ECHO "FF requires " - .ECHO FF_CSIZE + .ECHO MD_CSIZE .ECHO " bytes high memory space.\n" - -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 -; -MDSTR_PREFIX .TEXT "MD:$" -MDSTR_SRC .TEXT "SRC=$" -MDSTR_DST .TEXT "DEST=$" -MDSTR_LEN .TEXT "LEN=$" \ No newline at end of file From fd5dd1550689aedd5d1b733cb7631739f23b6d29 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Tue, 15 Dec 2020 18:17:57 +0800 Subject: [PATCH 11/14] Update config files --- Source/HBIOS/cfg_dyno.asm | 3 +-- Source/HBIOS/cfg_ezz80.asm | 3 +-- Source/HBIOS/cfg_master.asm | 3 +-- Source/HBIOS/cfg_mk4.asm | 3 +-- Source/HBIOS/cfg_n8.asm | 3 +-- Source/HBIOS/cfg_rcz180.asm | 3 +-- Source/HBIOS/cfg_rcz280.asm | 3 +-- Source/HBIOS/cfg_rcz80.asm | 3 +-- Source/HBIOS/cfg_sbc.asm | 4 ++-- Source/HBIOS/cfg_scz180.asm | 3 +-- Source/HBIOS/cfg_zeta.asm | 3 +-- Source/HBIOS/cfg_zeta2.asm | 3 +-- 12 files changed, 13 insertions(+), 24 deletions(-) diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 0584d066..84d6c6de 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -36,8 +36,6 @@ MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; Z180_BASE .EQU $C0 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) @@ -102,6 +100,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_DYNO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index f6eb252d..b545f425 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -35,8 +35,6 @@ MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; RTCIO .EQU $C0 ; RTC LATCH REGISTER ADR WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR ; @@ -134,6 +132,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 2ef0c8b4..41001df5 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -35,8 +35,6 @@ MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; Z180_BASE .EQU $40 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) @@ -177,6 +175,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_NONE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 890e8240..d22df261 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -31,8 +31,6 @@ RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) MEMMGR .EQU MM_Z180 ; MM_[SBC|Z2|N8|Z180|Z280|ZRC]: MEMORY MANAGER RAMBIAS .EQU 512 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; Z180_BASE .EQU $40 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) @@ -120,6 +118,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index e5fbe20c..ba20d707 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -31,8 +31,6 @@ RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) MEMMGR .EQU MM_N8 ; MM_[SBC|Z2|N8|Z180|Z280|ZRC]: MEMORY MANAGER RAMBIAS .EQU 0 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; Z180_BASE .EQU $40 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) @@ -123,6 +121,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 4c9d8edb..bbc0dddc 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -36,8 +36,6 @@ MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; Z180_BASE .EQU $C0 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) @@ -138,6 +136,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 913b67fc..a620c197 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -35,8 +35,6 @@ MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; Z280_MEMWAIT .EQU 0 ; Z280: MEMORY WAIT STATES (0-3) Z280_IOWAIT .EQU 1 ; Z280: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) Z280_INTWAIT .EQU 0 ; Z280: INT ACK WAIT STATUS (0-3) @@ -148,6 +146,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index a6e70e90..9fb0f401 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -35,8 +35,6 @@ MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; RTCIO .EQU $C0 ; RTC LATCH REGISTER ADR ; KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT @@ -144,6 +142,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 034a004d..babfb669 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -32,8 +32,6 @@ MEMMGR .EQU MM_SBC ; MM_[SBC|Z2|N8|Z180|Z280|ZRC]: MEMORY MANAGER MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; RTCIO .EQU $70 ; RTC LATCH REGISTER ADR PPIBASE .EQU $60 ; PRIMARY PARALLEL PORT REGISTERS BASE ADR ; @@ -124,6 +122,8 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 4cac4122..ff392d0b 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -31,8 +31,6 @@ RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) MEMMGR .EQU MM_Z180 ; MM_[SBC|Z2|N8|Z180|Z280|ZRC]: MEMORY MANAGER RAMBIAS .EQU 512 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; Z180_BASE .EQU $C0 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) @@ -133,6 +131,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 793a01b1..b05e3e18 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -32,8 +32,6 @@ MEMMGR .EQU MM_SBC ; MM_[SBC|Z2|N8|Z180|Z280|ZRC]: MEMORY MANAGER MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; RTCIO .EQU $70 ; RTC LATCH REGISTER ADR PPIBASE .EQU $60 ; PRIMARY PARALLEL PORT REGISTERS BASE ADR ; @@ -99,6 +97,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 7d08114f..4c72a4db 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -35,8 +35,6 @@ MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) ; -FFENABLE .EQU FALSE ; FF: ENABLE FLASH/EEPROM IDENTIFICATION/DRIVER -; RTCIO .EQU $70 ; RTC LATCH REGISTER ADR PPIBASE .EQU $60 ; PRIMARY PARALLEL PORT REGISTERS BASE ADR ; @@ -110,6 +108,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] From f40a1c963decbf5eaaa96cd738e7fe369585b89a Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Tue, 15 Dec 2020 20:00:03 +0800 Subject: [PATCH 12/14] Update md.asm Code cleanup --- Source/HBIOS/md.asm | 170 +++++++++++++++++++++++--------------------- 1 file changed, 88 insertions(+), 82 deletions(-) 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 From 4327d0a0f10c8348379569c11558611dd35c35a8 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Tue, 15 Dec 2020 21:36:37 +0800 Subject: [PATCH 13/14] Update md.asm Optimization and cleanup --- Source/HBIOS/md.asm | 193 +++++++++++++++++++------------------------- 1 file changed, 83 insertions(+), 110 deletions(-) diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index f5a161e7..9c26c860 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -601,15 +601,19 @@ MDSTR_LEN .TEXT "LEN=$" ; THE STACK IS IN UPPER MEMORY DURING BIOS INITIALIZATION BUT IS IN LOWER ; MEMORY DURING HBIOS CALLS. ; -; TO ACCESS THE FLASH CHIP FEATURES, CODE IS COPIED TO THE UPPER RAM BANK +; TO ACCESS THE FLASH CHIP FEATURES, CODE IS COPIED TO THE UPPER RAM BANK (HBX_BUF) ; AND THE FLASH CHIP IS SWITCHED INTO THE LOWER BANK. ; +; EACH FLASH ROUTINE MUST FIT INTO TO THE HBX_BUF, INCLUDING IT'S LOCAL STACK WHICH +; IS REQUIRED FOR CALLING THE BANK SWITCH ROUTINES. IN SOME CASES THIS MEANS +; OVERLAYING THE STACK ON THE INITIALIZATION CODE. +; ; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ ; ;================================================================================================== ; #IF (MDFFENABLE) -FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM +FF_TGT .EQU 0B7BFH ; TARGET CHIP FOR R/W FILESYSTEM ; ;====================================================================== ; BIOS FLASH INITIALIZATION @@ -646,9 +650,9 @@ FF_PROBE: PUSH HL ; PUSH DE - LD H,FF_TGT&$FF ; IF WE MATCH WITH - LD L,FF_TGT/$FF - CCF ; A NON 39SF040 + LD HL,FF_TGT ; IF WE MATCH WITH +; LD L,FF_TGT&$FF + XOR A ; A NON 39SF040 SBC HL,BC ; CHIP SET THE LD A,(MD_FFSEN) ; R/W FLAG TO R/O OR H @@ -772,6 +776,52 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA RET ; RETURN TO MD_READF, MD_WRITEF ; ;====================================================================== +; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS +; +; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. +; ON EXIT I,B CONTAINS BANK SELECT BYTE +; Y,C CONTAINS HIGH BYTE OF SECTOR ADDRESS +; A CONTAINS CURRENT BANK HB_CURBNK +; +; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL +; 3322222222221111 1111110000000000 +; 1098765432109876 5432109876543210 +; XXXXXXXXXXXXSSSS SSSSXXXXXXXXXXXX < S = SECTOR +; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK +;====================================================================== +; +FF_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 +; + PUSH BC + POP IY +; +#IF (MD_FDBG==1) + CALL PRTHEXWORD ; DISPLAY BANK AND + CALL PC_SPACE ; SECTOR RESULT +#ENDIF +; + LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK +; + RET +; +;====================================================================== ; IDENTIFY FLASH CHIP. ; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS ; CREATE A CODE BUFFER IN HIGH MEMORY AREA @@ -842,53 +892,7 @@ MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY .FILL 8,0 ; STACK SPACE MD_FIST .DW 0 ; SAVE STACK MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED -; -;====================================================================== -; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS -; -; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. -; ON EXIT I,B CONTAINS BANK SELECT BYTE -; Y,C CONTAINS HIGH BYTE OF SECTOR ADDRESS -; A CONTAINS CURRENT BANK HB_CURBNK -; -; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL -; 3322222222221111 1111110000000000 -; 1098765432109876 5432109876543210 -; XXXXXXXXXXXXSSSS SSSSXXXXXXXXXXXX < S = SECTOR -; XXXXXXXXXXXXBBBB BXXXXXXXXXXXXXXX < B = BANK -;====================================================================== -; -FF_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 -; - PUSH BC - POP IY -; -#IF (MD_FDBG==1) - CALL PRTHEXWORD ; DISPLAY BANK AND - CALL PC_SPACE ; SECTOR RESULT -#ENDIF -; - LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK -; - RET -; + ;====================================================================== ; ERASE FLASH SECTOR ; @@ -924,58 +928,34 @@ MD_FERAS: ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FAIL=NZ ;====================================================================== ; MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; - LD (HBX_BUF+MD_FEST-MD_FERAS_R),SP ; SAVE STACK - LD SP,HBX_BUF + (MD_FERAS_S-MD_FERAS_R) ; SETUP TEMP STACK +MD_FEST .EQU $+2 ; SAVE STACK +; + LD HL,$5555 ; COMMAND ; LOCAL STACK + LD DE,$2AAA ; PRELOAD ; LOCAL STACK + LD (HBX_BUF+MD_FEST-MD_FERAS_R),SP ; SAVE STACK ; LOCAL STACK + LD SP,HBX_BUF + (MD_FERAS_S-MD_FERAS_R) ; SETUP TEMP STACK ; LOCAL STACK ; - LD HL,$5555 ; LD A,$AA ; COMMAND - LD DE,$2AAA ;+3 MD_FERAS_S PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM - ; -; LD HL,$5555 ; LD A,$AA ; COMMAND -; LD A,L ; LD ($5555),A ; SETUP -; LD (HL),$AA ; LD A,$55 -; LD ($2AAA),A ; LD ($2AAA),A -; LD (HL),$80 ; LD A,$80 -; LD (HL),$AA ; LD ($5555),A -; LD ($2AAA),A ; LD A,$AA - ; LD ($5555),A - ; LD A,$55 - ; LD ($2AAA),A ; -; LD HL,$5555 ; LD A,$AA ; COMMAND -; LD DE,$2AAA ;+3 -; LD A,L ; LD ($5555),A ; SETUP -; LD (HL),$AA ; LD A,$55 -; LD (DE),A ;-2 ; LD ($2AAA),A -; LD (HL),$80 ; LD A,$80 -; LD (HL),$AA ; LD ($5555),A -; LD (DE),A ;-2 ; LD A,$AA - ; LD ($5555),A - ; LD A,$55 - ; LD ($2AAA),A -; -; LD HL,$5555 ; LD A,$AA ; COMMAND -; LD DE,$2AAA ;+3 - LD A,L ; LD ($5555),A ; SETUP - LD (HL),E ;-1 ; LD A,$55 - LD (DE),A ;-2 ; LD ($2AAA),A + + LD A,L ; LD ($5555),A ; COMMAND + LD (HL),E ; LD A,$55 ; SETUP + LD (DE),A ; LD ($2AAA),A LD (HL),$80 ; LD A,$80 - LD (HL),E ;-1 ; LD ($5555),A - LD (DE),A ;-2 ; LD A,$AA + LD (HL),E ; LD ($5555),A + LD (DE),A ; LD A,$AA ; LD ($5555),A ; LD A,$55 ; LD ($2AAA),A - - LD H,C ; SECTOR LD L,$00 ; ADDRESS ; @@ -999,11 +979,11 @@ FF_WT4: LD C,(HL) ; FROM THE SAME FLASH ADDRESS. BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED JR Z,FF_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. ; -; LD (HL),$F0 ; WRITE DEVICE RESET -; LD C,$FF ; SET FAIL STATUS + LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE + LD (HL),C ; WRITE DEVICE RESET JR FF_WT6 -; FF_WT5: LD C,L ; SET SUCCESS STATUS +; FF_WT6: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; @@ -1011,7 +991,6 @@ FF_WT6: POP AF ; RETURN TO ORIGINAL BANK ; RET ; -MD_FEST .DW 0 MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== @@ -1054,7 +1033,7 @@ MD_FREAD: ; DESTINATION BANK IS ALWAYS CURRENT BANK ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; DE = 0000 +; DE = 0000 BYTE COUNT ; IX POINTS TO DATA TO BE WRITTEN ; A CONTAINS CURRENT BANK ; ON EXIT NO STATUS RETURNED @@ -1062,14 +1041,11 @@ MD_FREAD: ; MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; - LD H,C ; SECTOR - LD L,$00 ; ADDRESS -; LD D,L ; INITIALIZE -; LD E,L ; BYTE COUNT -; - LD (HBX_BUF+MD_FRST-MD_FREAD_R),SP ; SAVE STACK + LD H,C ; SECTOR ; LOCAL STACK + LD L,D ; ADDRESS ; LOCAL STACK + LD (HBX_BUF+MD_FRST-MD_FREAD_R),SP ; SAVE STACK ; LOCAL STACK + LD SP,HBX_BUF + (MD_FRD_S-MD_FREAD_R) ; SETUP TEMP STACK ; LOCAL STACK MD_FRD_S: - LD SP,HBX_BUF + (MD_FRD_S-MD_FREAD_R) ; SETUP TEMP STACK ; PUSH AF ; SAVE CURRENT BANK ; @@ -1092,7 +1068,6 @@ MD_FRD1: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; LD C,D ; RETURN STATUS ; LD SP,(HBX_BUF+MD_FRST-MD_FREAD_R) ; RESTORE STACK ; @@ -1141,6 +1116,7 @@ MD_FWRIT: ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; IX POINTS TO DATA TO BE WRITTEN +; DE = 0000 BYTE COUNT ; A CONTAINS CURRENT BANK ; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== @@ -1149,13 +1125,10 @@ MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; MD_FWST .EQU $+2 ; SAVE STACK ; - LD H,C ; SECTOR - LD L,$00 ; ADDRESS -; LD D,L ; INITIALIZE -; LD E,L ; BYTE COUNT - - LD (HBX_BUF+MD_FWST-MD_FWRIT_R),SP ; SAVE STACK - LD SP, HBX_BUF+(MD_FWRIT_S-MD_FWRIT_R) ; SETUP TEMP STACK + LD H,C ; SECTOR ; LOCAL STACK + LD L,D ; ADDRESS ; LOCAL STACK + LD (HBX_BUF+MD_FWST-MD_FWRIT_R),SP ; SAVE STACK ; LOCAL STACK + LD SP, HBX_BUF+(MD_FWRIT_S-MD_FWRIT_R) ; SETUP TEMP STACK ; LOCAL STACK MD_FWRIT_S: ; PUSH AF ; SAVE CURRENT BANK @@ -1253,7 +1226,7 @@ MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE ; ;====================================================================== ; -#IF (MD_FDBG==1) +#IF (MD_FDBG==0) .ECHO "MD_FIDENT_R " .ECHO MD_I_SZ .ECHO "\n" From e3fa34e5246c3265f967a3ea2d9e854bebc8fa92 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Tue, 15 Dec 2020 22:02:01 +0800 Subject: [PATCH 14/14] Update md.asm Finalize --- Source/HBIOS/md.asm | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 9c26c860..ac1fd6e8 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -378,6 +378,8 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER PUSH IX CALL MD_FERAS ; ERASE 4K SECTOR POP IX + OR A + RET NZ ; RETURN IF ERROR ; PUSH HL PUSH DE @@ -405,9 +407,9 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER LD IX,MD_F4KBUF ; WRITE THE SECTOR CALL MD_FWRIT POP IX - +; XOR A - +; RET ; MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR @@ -613,7 +615,7 @@ MDSTR_LEN .TEXT "LEN=$" ;================================================================================================== ; #IF (MDFFENABLE) -FF_TGT .EQU 0B7BFH ; TARGET CHIP FOR R/W FILESYSTEM +MD_TGTDEV .EQU 0B7BFH ; TARGET CHIP FOR R/W FILESYSTEM 39SF040 ; ;====================================================================== ; BIOS FLASH INITIALIZATION @@ -624,7 +626,7 @@ FF_TGT .EQU 0B7BFH ; TARGET CHIP FOR R/W FILESYSTEM ; MD_FINIT: LD A,+(ROMSIZE/512) ; DISLAY NUMBER -#IF (MD_FVBS==1) +#IF (MD_FVBS==1) CALL NEWLINE ; OF UNITS PRTS("MD: FLASH=$") CALL PRTDECB ; CONFIGURED FOR. @@ -638,7 +640,7 @@ FF_PROBE: LD L,D ; ON EACH CYCLE THROUGH ; PUSH BC -#IF (MD_FVBS==1) +#IF (MD_FVBS==1) CALL PC_SPACE LD A,+(ROMSIZE/512)+1 SUB B ; PRINT @@ -650,8 +652,7 @@ FF_PROBE: PUSH HL ; PUSH DE - LD HL,FF_TGT ; IF WE MATCH WITH -; LD L,FF_TGT&$FF + LD HL,MD_TGTDEV ; IF WE MATCH WITH XOR A ; A NON 39SF040 SBC HL,BC ; CHIP SET THE LD A,(MD_FFSEN) ; R/W FLAG TO R/O @@ -905,7 +906,7 @@ MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; RETURN WITH STATUS CODE. ; ; ON ENTRY DE:HL POINTS TO AN ADDRESS IDENTIFYING THE CHIP -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL ;====================================================================== ; MD_FERAS: @@ -928,7 +929,7 @@ MD_FERAS: ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FAIL=NZ +; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL ;====================================================================== ; MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY @@ -1005,6 +1006,7 @@ MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. ; IX POINTS TO WHERE TO SAVE DATA +; ON EXIT NO STATUS IS RETURNED ;====================================================================== ; MD_FREAD: @@ -1088,6 +1090,7 @@ MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. ; IX POINTS TO DATA TO BE WRITTEN +; ON EXIT NO STATUS IS RETURNED ;====================================================================== ; MD_FWRIT: @@ -1118,7 +1121,7 @@ MD_FWRIT: ; IX POINTS TO DATA TO BE WRITTEN ; DE = 0000 BYTE COUNT ; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +; ON EXIT NO STATUS IS RETURNED ;====================================================================== ; MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY @@ -1226,7 +1229,7 @@ MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE ; ;====================================================================== ; -#IF (MD_FDBG==0) +#IF (MD_FDBG==1) .ECHO "MD_FIDENT_R " .ECHO MD_I_SZ .ECHO "\n"