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.
pull/163/head
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 - S?K: Support for Tiny Z80 by Sergey
- E?B: Support for v6 YM/AY sound card - E?B: Support for v6 YM/AY sound card
- C?M: Support for RC2014 bus PropIO V2 - 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 - PMS: Preliminary support for writing to FLASH ROMs
Version 3.1 Version 3.1

1
Source/Doc/Architecture.md

@ -819,7 +819,6 @@ function will return an error status.
| _Entry Parameters_ | _Entry Parameters_
| B: 0x1A | B: 0x1A
| C: Disk Device Unit ID | C: Disk Device Unit ID
| HL: Buffer Address
| _Exit Results_ | _Exit Results_
| A: Status (0=OK, else error) | 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 ; IMPLEMENTS MULTI SECTOR READS AND I/O TO/FROM
; BANKED RAM VIA BOUNCE BUFFER ; 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: HB_DSKREAD:
; ;
@ -3263,7 +3264,7 @@ HB_DISPCALL1:
; EXIT: HL=FUNC ADR, IY=DATA BLOB ADR ; EXIT: HL=FUNC ADR, IY=DATA BLOB ADR
; ;
HB_DISPCALC: 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 LD A,C ; A := INCOMING DISK UNIT INDEX
CP (IY-1) ; COMPARE TO COUNT CP (IY-1) ; COMPARE TO COUNT
JR NC,HB_UNITERR ; HANDLE INVALID UNIT INDEX JR NC,HB_UNITERR ; HANDLE INVALID UNIT INDEX

303
Source/HBIOS/md.asm

@ -123,8 +123,8 @@ MD_RESET:
RET RET
; ;
; ;
;
MD_CAP:
;
MD_CAP: ; ASSUMES THAT UNIT 1 IS RAM, UNIT 0 IS ROM
LD A,(IY+MD_DEV) ; GET DEVICE NUMBER LD A,(IY+MD_DEV) ; GET DEVICE NUMBER
OR A ; SET FLAGS OR A ; SET FLAGS
JR Z,MD_CAP0 ; UNIT 0 JR Z,MD_CAP0 ; UNIT 0
@ -172,7 +172,7 @@ MD_GEOM1:
; ;
; ;
MD_DEVICE: 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 E,(IY+MD_DEV) ; GET DEVICE NUMBER
LD C,(IY+MD_ATTRIB) ; GET ATTRIBUTE LD C,(IY+MD_ATTRIB) ; GET ATTRIBUTE
LD H,0 ; H := 0, DRIVER HAS NO MODES LD H,0 ; H := 0, DRIVER HAS NO MODES
@ -205,6 +205,8 @@ MD_SEEK:
; ;
MD_READ: MD_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR 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 A,(IY+MD_ATTRIB) ; GET ADR OF SECTOR READ FUNC
LD BC,MD_RDSECF ; LD BC,MD_RDSECF ;
@ -271,23 +273,32 @@ MD_RW3:
; ;
; READ FLASH ; READ FLASH
; ;
MD_RDSECF:
MD_RDSECF: ; CALLED FROM MD_RW
CALL MD_IOSETUPF 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 RET
; ;
; ;
; ;
MD_IOSETUPF: MD_IOSETUPF:
PUSH DE
PUSH HL
PUSH IY PUSH IY
LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA
LD H,(IY+MD_LBA+1) LD H,(IY+MD_LBA+1)
INC H ; SKIP FIRST 128MB (256 SECTORS) INC H ; SKIP FIRST 128MB (256 SECTORS)
; LD DE,256
; ADD HL,DE
;
CALL PRTHEXWORDHL
; ;
LD A,L ; SAVE LBA 4K LD A,L ; SAVE LBA 4K
AND %11111000 ; BLOCK WE ARE AND %11111000 ; BLOCK WE ARE
@ -301,10 +312,6 @@ MD_IOSETUPF:
SLA H SLA H
RL E RL E
RL D RL D
;
CALL PC_COLON
CALL PRTHEX32
CALL PC_SPACE
; ;
PUSH HL ; IS THE SECTOR PUSH HL ; IS THE SECTOR
LD HL,MD_LBA4K ; WE WANT TO LD HL,MD_LBA4K ; WE WANT TO
@ -316,7 +323,7 @@ MD_IOSETUPF:
CP (HL) CP (HL)
JR Z,MD_SECM JR Z,MD_SECM
; ;
MD_SECR:
MD_SECR:
POP HL ; DESIRED SECTOR POP HL ; DESIRED SECTOR
; IS NOT IN BUFFER ; IS NOT IN BUFFER
LD (MD_LBA4K),BC ; WE WILL READ IN LD (MD_LBA4K),BC ; WE WILL READ IN
@ -327,16 +334,15 @@ MD_SECR:
LD IX,FF_BUFFER ; SET DESTINATION ADDRESS LD IX,FF_BUFFER ; SET DESTINATION ADDRESS
CALL FF_RINIT ; READ 4K SECTOR CALL FF_RINIT ; READ 4K SECTOR
; ;
LD DE,FF_BUFFER
CALL DUMP_BUFFER
PUSH HL PUSH HL
; ;
MD_SECM:POP HL MD_SECM:POP HL
POP IY POP IY
POP HL
POP DE
RET RET
; ;
MD_LBA4K .DW $FFFF
MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR
; ;
; ;
; READ RAM / ROM ; READ RAM / ROM
@ -558,10 +564,10 @@ FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM
; ;
; ;
FF_INIT: 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 B,A ; NUMBER OF DEVICES TO PROBE
LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL
@ -572,12 +578,12 @@ FF_PROBE:
LD L,D ; ON EACH CYCLE THROUGH LD L,D ; ON EACH CYCLE THROUGH
; ;
PUSH BC 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 CALL FF_IINIT ; GET ID AT THIS ADDRESS
; ;
PUSH HL PUSH HL
@ -593,7 +599,7 @@ FF_PROBE:
POP DE ; MEANS WE CAN'T POP DE ; MEANS WE CAN'T
POP HL ; ENABLE FLASH WRITING POP HL ; ENABLE FLASH WRITING
; ;
CALL FF_LAND ; LOOKUP AND DISPLAY
; CALL FF_LAND ; LOOKUP AND DISPLAY
POP BC POP BC
; ;
LD A,C ; UPDATE ADDRESS LD A,C ; UPDATE ADDRESS
@ -602,92 +608,17 @@ FF_PROBE:
; ;
DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE 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 XOR A ; INIT SUCCEEDED
RET 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 ; LOOKUP AND DISPLAY CHIP
; ;
; ON ENTRY DE CONTAINS CHIP ID ; 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 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 ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS
; ;
; ON ENTRY DE:HL CONTAINS 32 BIT 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 ; #DEFCONT ;
; ;
;======================================================================
;
; FLASH CHIP LIST
;
;======================================================================
;
FF_TABLE: 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_CNT .EQU 17
FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT 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 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) #IF (FF_S_SZ>FF_CSIZE)
FF_CSIZE .SET FF_S_SZ FF_CSIZE .SET FF_S_SZ
#ENDIF #ENDIF
#IF (FF_E_SZ>FF_CSIZE)
FF_CSIZE .SET FF_E_SZ
#ENDIF
#IF (FF_I_SZ>FF_CSIZE) #IF (FF_I_SZ>FF_CSIZE)
FF_CSIZE .SET FF_I_SZ FF_CSIZE .SET FF_I_SZ
#ENDIF #ENDIF

Loading…
Cancel
Save