Browse Source

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.
patch
b1ackmai1er 5 years ago
parent
commit
17cfce2a12
  1. 2
      Doc/ChangeLog.txt
  2. 1
      Source/Doc/Architecture.md
  3. 11
      Source/HBIOS/hbios.asm
  4. 303
      Source/HBIOS/md.asm

2
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

1
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)

11
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

303
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

Loading…
Cancel
Save