@ -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 , DI ODEV_MD ; D := DEVICE TYPE
LD D , DI ODEV_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 , $ 000 A ; SET
LD HL , $ 8000 ; ADDRESS
CALL FF_SINIT ; SECTOR ERASE
CALL PRTHEXBYTE ; DISPLAY STATUS
# ENDIF
;
# IF ( 0 )
LD DE , $ 000 A ; 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 ( $ 2 AAA ), A ; LD ($2AAA),A
LD ( HL ), $ 80 ; LD A,$80
LD ( HL ), $ AA ; LD ($5555),A
LD A , L ; LD A,$AA
LD ( $ 2 AAA ), 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