From 17cfce2a1203a5765aae558ee8af256bac128fde Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 13 Dec 2020 09:37:46 +0800 Subject: [PATCH] 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