|
|
@ -25,6 +25,9 @@ MD_AROM .EQU %00100000 ; ROM ATTRIBUTE |
|
|
MD_ARAM .EQU %00101000 ; RAM ATTRIBUTE |
|
|
MD_ARAM .EQU %00101000 ; RAM ATTRIBUTE |
|
|
MD_AFSH .EQU %00111000 ; FLASH 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) |
|
|
; DEVICE CONFIG TABLE (RAM DEVICE FIRST TO MAKE IT ALWAYS FIRST DRIVE) |
|
|
; |
|
|
; |
|
|
MD_CFGTBL: |
|
|
MD_CFGTBL: |
|
|
@ -50,7 +53,7 @@ MD_CFGTBL: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
MD_INIT: |
|
|
MD_INIT: |
|
|
CALL FF_INIT ; PROBE FLASH CAPABILITY |
|
|
|
|
|
|
|
|
CALL MD_FINIT ; PROBE FLASH CAPABILITY |
|
|
|
|
|
|
|
|
CALL NEWLINE ; FORMATTING |
|
|
CALL NEWLINE ; FORMATTING |
|
|
PRTS("MD: UNITS=2 $") |
|
|
PRTS("MD: UNITS=2 $") |
|
|
@ -64,7 +67,7 @@ MD_INIT: |
|
|
; |
|
|
; |
|
|
; SETUP THE DIO TABLE ENTRIES |
|
|
; SETUP THE DIO TABLE ENTRIES |
|
|
; |
|
|
; |
|
|
LD A,(FF_RW) ; IF FLASH |
|
|
|
|
|
|
|
|
LD A,(MD_FFSEN) ; IF FLASH |
|
|
OR A ; FILESYSTEM |
|
|
OR A ; FILESYSTEM |
|
|
JR NZ,MD_IN1 ; CAPABLE, |
|
|
JR NZ,MD_IN1 ; CAPABLE, |
|
|
LD A,MD_AFSH ; UPDATE ROM DIO |
|
|
LD A,MD_AFSH ; UPDATE ROM DIO |
|
|
@ -274,28 +277,54 @@ MD_RW3: |
|
|
; READ FLASH |
|
|
; READ FLASH |
|
|
; |
|
|
; |
|
|
MD_RDSECF: ; CALLED FROM MD_RW |
|
|
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 |
|
|
LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK |
|
|
AND %00000111 ; AND CALCULATE OFFSET OFFSET |
|
|
AND %00000111 ; AND CALCULATE OFFSET OFFSET |
|
|
ADD A,A |
|
|
ADD A,A |
|
|
LD D,A ; FROM THE START |
|
|
LD D,A ; FROM THE START |
|
|
LD E,0 |
|
|
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 |
|
|
ADD HL,DE ; WANT TO COPY |
|
|
LD DE,(MD_DSKBUF) |
|
|
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 |
|
|
XOR A |
|
|
RET |
|
|
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: |
|
|
MD_IOSETUPF: |
|
|
PUSH DE |
|
|
|
|
|
PUSH HL |
|
|
|
|
|
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) |
|
|
@ -303,7 +332,7 @@ MD_IOSETUPF: |
|
|
LD A,L ; SAVE LBA 4K |
|
|
LD A,L ; SAVE LBA 4K |
|
|
AND %11111000 ; BLOCK WE ARE |
|
|
AND %11111000 ; BLOCK WE ARE |
|
|
LD C,A ; GOING TO |
|
|
LD C,A ; GOING TO |
|
|
LD B,H ; ACCESS |
|
|
|
|
|
|
|
|
LD A,H ; ACCESS |
|
|
; |
|
|
; |
|
|
LD D,0 ; CONVERT LBA |
|
|
LD D,0 ; CONVERT LBA |
|
|
LD E,H ; TO ADDRESS |
|
|
LD E,H ; TO ADDRESS |
|
|
@ -313,33 +342,6 @@ MD_IOSETUPF: |
|
|
RL E |
|
|
RL E |
|
|
RL D |
|
|
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 |
|
|
RET |
|
|
; |
|
|
; |
|
|
MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR |
|
|
MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR |
|
|
@ -378,9 +380,65 @@ MD_RDSEC: |
|
|
; |
|
|
; |
|
|
; WRITE FLASH |
|
|
; 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$"); |
|
|
PRTS("wf$"); |
|
|
|
|
|
|
|
|
|
|
|
XOR A |
|
|
|
|
|
|
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; WRITE RAM |
|
|
; WRITE RAM |
|
|
@ -525,16 +583,8 @@ MD_PRT: |
|
|
RET |
|
|
RET |
|
|
#ENDIF |
|
|
#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. |
|
|
; 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 |
|
|
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. |
|
|
; 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 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 |
|
|
FF_PROBE: |
|
|
FF_PROBE: |
|
|
@ -578,28 +625,31 @@ 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 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 HL |
|
|
PUSH DE |
|
|
|
|
|
|
|
|
; PUSH DE |
|
|
LD H,FF_TGT&$FF ; IF WE MATCH WITH |
|
|
LD H,FF_TGT&$FF ; IF WE MATCH WITH |
|
|
LD L,FF_TGT/$FF |
|
|
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 H |
|
|
OR L |
|
|
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 |
|
|
POP HL ; ENABLE FLASH WRITING |
|
|
; |
|
|
|
|
|
; CALL FF_LAND ; LOOKUP AND DISPLAY |
|
|
|
|
|
|
|
|
#IF (MD_FVBS==1) |
|
|
|
|
|
CALL FF_LAND ; LOOKUP AND DISPLAY |
|
|
|
|
|
#ENDIF |
|
|
POP BC |
|
|
POP BC |
|
|
; |
|
|
; |
|
|
LD A,C ; UPDATE ADDRESS |
|
|
LD A,C ; UPDATE ADDRESS |
|
|
@ -607,43 +657,43 @@ FF_PROBE: |
|
|
LD C,A |
|
|
LD C,A |
|
|
; |
|
|
; |
|
|
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 (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 |
|
|
XOR A ; INIT SUCCEEDED |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; LOOKUP AND DISPLAY CHIP |
|
|
; 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 |
|
|
; ON EXIT A CONTAINS STATUS 0=SUCCESS, NZ=NOT IDENTIFIED |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; |
|
|
; |
|
|
FF_LAND: |
|
|
FF_LAND: |
|
|
; |
|
|
; |
|
|
#IF (FF_DBG==1) |
|
|
|
|
|
|
|
|
#IF (MD_FDBG==1) |
|
|
PRTS(" ID:$") |
|
|
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 |
|
|
CALL PC_SPACE |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
LD HL,FF_TABLE ; SEARCH THROUGH THE FLASH |
|
|
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) |
|
|
FF_NXT1:LD A,(HL) |
|
|
CP D |
|
|
|
|
|
|
|
|
CP B |
|
|
JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH |
|
|
JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH |
|
|
; |
|
|
; |
|
|
INC HL |
|
|
INC HL |
|
|
LD A,(HL) |
|
|
LD A,(HL) |
|
|
CP E |
|
|
|
|
|
|
|
|
CP C |
|
|
DEC HL |
|
|
DEC HL |
|
|
JR NZ,FF_NXT0 ; SECOND BYTE DOES NOT MATCH |
|
|
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 |
|
|
ADD HL,BC |
|
|
POP 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 |
|
|
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 |
|
|
RET |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
;COMMON FUNCTION CALL |
|
|
;COMMON FUNCTION CALL |
|
|
@ -686,15 +739,16 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA |
|
|
PUSH IY ; PUT BANK AND SECTOR |
|
|
PUSH IY ; PUT BANK AND SECTOR |
|
|
POP BC ; DATA IN BC |
|
|
POP BC ; DATA IN BC |
|
|
; |
|
|
; |
|
|
#IF (FF_DBG==1) |
|
|
|
|
|
|
|
|
#IF (MD_FDBG==1) |
|
|
CALL PRTHEXWORD |
|
|
CALL PRTHEXWORD |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
|
|
|
LD DE,0 |
|
|
HB_DI |
|
|
HB_DI |
|
|
CALL HBX_BUF ; EXECUTE RELOCATED CODE |
|
|
CALL HBX_BUF ; EXECUTE RELOCATED CODE |
|
|
HB_EI |
|
|
HB_EI |
|
|
; |
|
|
; |
|
|
#IF (FF_DBG==1) |
|
|
|
|
|
|
|
|
#IF (MD_FDBG==1) |
|
|
CALL PC_SPACE |
|
|
CALL PC_SPACE |
|
|
CALL PRTHEXWORD |
|
|
CALL PRTHEXWORD |
|
|
CALL PC_SPACE |
|
|
CALL PC_SPACE |
|
|
@ -705,8 +759,10 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
LD A,C ; RETURN WITH STATUS IN A |
|
|
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. |
|
|
; 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 |
|
|
; ON ENTRY DE:HL POINTS TO AN ADDRESS WITH THE ADDRESS RANGE OF THE |
|
|
; CHIP TO BE IDENTIFIED. |
|
|
; CHIP TO BE IDENTIFIED. |
|
|
; ON EXIT DE CONTAINS THE CHIP ID BYTES. |
|
|
|
|
|
|
|
|
; ON EXIT BC CONTAINS THE CHIP ID BYTES. |
|
|
; NO STATUS IS RETURNED |
|
|
; NO STATUS IS RETURNED |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; |
|
|
; |
|
|
FF_IINIT: |
|
|
|
|
|
|
|
|
MD_FIDENT: |
|
|
|
|
|
PUSH IY |
|
|
|
|
|
PUSH HL |
|
|
|
|
|
PUSH DE |
|
|
|
|
|
; |
|
|
PUSH HL ; SAVE ADDRESS INFO |
|
|
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 |
|
|
EX (SP),HL ; ON THE STACK |
|
|
|
|
|
; |
|
|
JP FF_FNCALL ; EXECUTE |
|
|
JP FF_FNCALL ; EXECUTE |
|
|
; |
|
|
; |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
@ -739,13 +800,17 @@ FF_IINIT: |
|
|
; |
|
|
; |
|
|
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA |
|
|
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA |
|
|
; A CONTAINS CURRENT BANK |
|
|
; A CONTAINS CURRENT BANK |
|
|
; ON EXIT DE CONTAINS ID WORD |
|
|
|
|
|
|
|
|
; ON EXIT BC CONTAINS ID WORD |
|
|
; NO STATUS IS RETURNED |
|
|
; 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 |
|
|
PUSH AF ; SAVE CURRENT BANK |
|
|
|
|
|
; |
|
|
LD A,B ; SELECT BANK |
|
|
LD A,B ; SELECT BANK |
|
|
CALL HBX_BNKSEL ; TO PROGRAM |
|
|
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 ($2AAA),A ; LD ($2AAA),A |
|
|
LD (HL),$90 ; LD A,$90 |
|
|
LD (HL),$90 ; LD A,$90 |
|
|
; ; LD ($5555),A |
|
|
; ; LD ($5555),A |
|
|
LD DE,($0000) ; READ ID |
|
|
|
|
|
|
|
|
LD BC,($0000) ; READ ID |
|
|
; |
|
|
; |
|
|
LD A,$F0 ; ; EXIT |
|
|
LD A,$F0 ; ; EXIT |
|
|
LD (HL),A ; LD ($5555),A ; COMMAND |
|
|
LD (HL),A ; LD ($5555),A ; COMMAND |
|
|
; |
|
|
; |
|
|
POP AF ; RETURN TO ORIGINAL BANK |
|
|
POP AF ; RETURN TO ORIGINAL BANK |
|
|
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
|
|
|
; |
|
|
|
|
|
LD SP,(HBX_BUF + (MD_FIST-MD_FIDENT_R)) ; RESTORE STACK |
|
|
; |
|
|
; |
|
|
RET |
|
|
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 |
|
|
; 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: |
|
|
FF_CALCA: |
|
|
; |
|
|
; |
|
|
#IF (FF_DBG==1) |
|
|
|
|
|
|
|
|
#IF (MD_FDBG==1) |
|
|
CALL PC_SPACE ; DISPLAY SECTOR |
|
|
CALL PC_SPACE ; DISPLAY SECTOR |
|
|
CALL PRTHEX32 ; SECTOR ADDRESS |
|
|
CALL PRTHEX32 ; SECTOR ADDRESS |
|
|
CALL PC_SPACE ; IN DE:HL |
|
|
CALL PC_SPACE ; IN DE:HL |
|
|
@ -804,7 +873,7 @@ FF_CALCA: |
|
|
PUSH BC |
|
|
PUSH BC |
|
|
POP IY |
|
|
POP IY |
|
|
; |
|
|
; |
|
|
#IF (FF_DBG==1) |
|
|
|
|
|
|
|
|
#IF (MD_FDBG==1) |
|
|
CALL PRTHEXWORD ; DISPLAY BANK AND |
|
|
CALL PRTHEXWORD ; DISPLAY BANK AND |
|
|
CALL PC_SPACE ; SECTOR RESULT |
|
|
CALL PC_SPACE ; SECTOR RESULT |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -828,9 +897,13 @@ FF_CALCA: |
|
|
; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL |
|
|
; 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 |
|
|
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 |
|
|
EX (SP),HL ; ON THE STACK |
|
|
JP FF_FNCALL ; EXECUTE |
|
|
JP FF_FNCALL ; EXECUTE |
|
|
; |
|
|
; |
|
|
@ -847,23 +920,55 @@ FF_SINIT: |
|
|
; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL |
|
|
; 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 |
|
|
PUSH AF ; SAVE CURRENT BANK |
|
|
LD A,B ; SELECT BANK |
|
|
LD A,B ; SELECT BANK |
|
|
CALL HBX_BNKSEL ; TO PROGRAM |
|
|
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 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),$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 ($5555),A |
|
|
; LD A,$55 |
|
|
; LD A,$55 |
|
|
; LD ($2AAA),A |
|
|
; LD ($2AAA),A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LD H,C ; SECTOR |
|
|
LD H,C ; SECTOR |
|
|
LD L,$00 ; ADDRESS |
|
|
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 |
|
|
BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED |
|
|
JR Z,FF_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. |
|
|
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 |
|
|
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 |
|
|
FF_WT6: POP AF ; RETURN TO ORIGINAL BANK |
|
|
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
|
|
|
; |
|
|
|
|
|
LD SP,(HBX_BUF + (MD_FEST-MD_FERAS_R)) ; RESTORE STACK |
|
|
; |
|
|
; |
|
|
RET |
|
|
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 |
|
|
; 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 |
|
|
; IX POINTS TO WHERE TO SAVE DATA |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; |
|
|
; |
|
|
FF_RINIT: |
|
|
|
|
|
|
|
|
MD_FREAD: |
|
|
|
|
|
PUSH IY |
|
|
|
|
|
PUSH HL |
|
|
|
|
|
PUSH DE |
|
|
|
|
|
; |
|
|
LD L,0 ; CHANGE ADDRESS |
|
|
LD L,0 ; CHANGE ADDRESS |
|
|
LD A,H ; TO SECTOR BOUNDARY |
|
|
LD A,H ; TO SECTOR BOUNDARY |
|
|
AND $F0 ; BY MASKING OFF |
|
|
AND $F0 ; BY MASKING OFF |
|
|
LD H,A ; LOWER 12 BITS |
|
|
LD H,A ; LOWER 12 BITS |
|
|
; |
|
|
; |
|
|
PUSH HL ; SAVE ADDRESS INFO |
|
|
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 |
|
|
EX (SP),HL ; ON THE STACK |
|
|
JP FF_FNCALL ; EXECUTE |
|
|
JP FF_FNCALL ; EXECUTE |
|
|
; |
|
|
; |
|
|
@ -942,19 +1054,20 @@ FF_RINIT: |
|
|
; ON EXIT NO STATUS RETURNED |
|
|
; 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 H,C ; SECTOR |
|
|
LD L,$00 ; ADDRESS |
|
|
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 |
|
|
PUSH AF ; SAVE CURRENT BANK |
|
|
; |
|
|
; |
|
|
FF_RD1: |
|
|
|
|
|
|
|
|
MD_FRD1: |
|
|
LD A,B ; SELECT BANK |
|
|
LD A,B ; SELECT BANK |
|
|
CALL HBX_BNKSEL ; TO READ |
|
|
CALL HBX_BNKSEL ; TO READ |
|
|
LD C,(HL) ; READ BYTE |
|
|
LD C,(HL) ; READ BYTE |
|
|
@ -969,17 +1082,18 @@ FF_RD1: |
|
|
; |
|
|
; |
|
|
INC DE ; CONTINUE READING UNTIL |
|
|
INC DE ; CONTINUE READING UNTIL |
|
|
BIT 4,D ; WE HAVE DONE ONE SECTOR |
|
|
BIT 4,D ; WE HAVE DONE ONE SECTOR |
|
|
JR Z,FF_RD1 |
|
|
|
|
|
|
|
|
JR Z,MD_FRD1 |
|
|
|
|
|
|
|
|
POP AF ; RETURN TO ORIGINAL BANK |
|
|
POP AF ; RETURN TO ORIGINAL BANK |
|
|
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
; LD C,D ; RETURN STATUS |
|
|
; LD C,D ; RETURN STATUS |
|
|
LD SP,(FF_RST) ; RESTORE STACK |
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
LD SP,(HBX_BUF+MD_FRST-MD_FREAD_R) ; RESTORE STACK |
|
|
; |
|
|
; |
|
|
RET |
|
|
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 |
|
|
; 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 |
|
|
; IX POINTS TO DATA TO BE WRITTEN |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; |
|
|
; |
|
|
FF_WINIT: |
|
|
|
|
|
|
|
|
MD_FWRIT: |
|
|
|
|
|
PUSH IY |
|
|
|
|
|
PUSH HL |
|
|
|
|
|
PUSH DE |
|
|
|
|
|
; |
|
|
LD L,0 ; CHANGE ADDRESS |
|
|
LD L,0 ; CHANGE ADDRESS |
|
|
LD A,H ; TO SECTOR BOUNDARY |
|
|
LD A,H ; TO SECTOR BOUNDARY |
|
|
AND $F0 ; BY MASKING OFF |
|
|
AND $F0 ; BY MASKING OFF |
|
|
LD H,A ; LOWER 12 BITS |
|
|
LD H,A ; LOWER 12 BITS |
|
|
; |
|
|
; |
|
|
PUSH HL ; SAVE ADDRESS INFO |
|
|
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 |
|
|
EX (SP),HL ; ON THE STACK |
|
|
JP FF_FNCALL ; EXECUTE |
|
|
JP FF_FNCALL ; EXECUTE |
|
|
; |
|
|
; |
|
|
@ -1021,16 +1139,22 @@ FF_WINIT: |
|
|
; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL |
|
|
; 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 H,C ; SECTOR |
|
|
LD L,$00 ; ADDRESS |
|
|
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 |
|
|
POP AF ; SELECT BANK |
|
|
PUSH AF ; TO READ |
|
|
PUSH AF ; TO READ |
|
|
CALL HBX_BNKSEL |
|
|
CALL HBX_BNKSEL |
|
|
@ -1052,24 +1176,26 @@ FF_WR1: |
|
|
; |
|
|
; |
|
|
; ; DO TWO SUCCESSIVE READS |
|
|
; ; DO TWO SUCCESSIVE READS |
|
|
LD A,(HL) ; FROM THE SAME FLASH ADDRESS. |
|
|
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 |
|
|
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 HL ; NEXT DESTINATION LOCATION |
|
|
INC IX ; NEXT SOURCE LOCATION |
|
|
INC IX ; NEXT SOURCE LOCATION |
|
|
; |
|
|
; |
|
|
INC DE ; CONTINUE WRITING UNTIL |
|
|
INC DE ; CONTINUE WRITING UNTIL |
|
|
BIT 4,D ; WE HAVE DONE ONE SECTOR |
|
|
BIT 4,D ; WE HAVE DONE ONE SECTOR |
|
|
JR Z,FF_WR1 |
|
|
|
|
|
|
|
|
JR Z,MD_FWRI1 |
|
|
; |
|
|
; |
|
|
POP AF ; RETURN TO ORIGINAL BANK |
|
|
POP AF ; RETURN TO ORIGINAL BANK |
|
|
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
|
|
|
; |
|
|
|
|
|
LD SP,(HBX_BUF+MD_FWST-MD_FWRIT_R) ; RESTORE STACK |
|
|
; |
|
|
; |
|
|
RET |
|
|
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_CNT .EQU 17 |
|
|
FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT |
|
|
FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT |
|
|
FF_UNKNOWN .DB "UNKNOWN$" |
|
|
|
|
|
|
|
|
MD_UNKNOWN .DB "UNKNOWN$" |
|
|
FF_STACK: .DW 0 |
|
|
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 |
|
|
#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 |
|
|
#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 |
|
|
#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 |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
.ECHO "FF requires " |
|
|
.ECHO "FF requires " |
|
|
.ECHO FF_CSIZE |
|
|
|
|
|
|
|
|
.ECHO MD_CSIZE |
|
|
.ECHO " bytes high memory space.\n" |
|
|
.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=$" |
|
|
|