Browse Source

Update md.asm

First successful write/verify to flash
pull/163/head
b1ackmai1er 5 years ago
parent
commit
ad1b2423e1
  1. 482
      Source/HBIOS/md.asm

482
Source/HBIOS/md.asm

@ -25,6 +25,9 @@ MD_AROM .EQU %00100000 ; ROM ATTRIBUTE
MD_ARAM .EQU %00101000 ; RAM 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)
;
MD_CFGTBL:
@ -50,7 +53,7 @@ MD_CFGTBL:
;
;
MD_INIT:
CALL FF_INIT ; PROBE FLASH CAPABILITY
CALL MD_FINIT ; PROBE FLASH CAPABILITY
CALL NEWLINE ; FORMATTING
PRTS("MD: UNITS=2 $")
@ -64,7 +67,7 @@ MD_INIT:
;
; SETUP THE DIO TABLE ENTRIES
;
LD A,(FF_RW) ; IF FLASH
LD A,(MD_FFSEN) ; IF FLASH
OR A ; FILESYSTEM
JR NZ,MD_IN1 ; CAPABLE,
LD A,MD_AFSH ; UPDATE ROM DIO
@ -274,28 +277,54 @@ MD_RW3:
; READ FLASH
;
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
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
LD HL,MD_F4KBUF ; POINT TO THE SECTOR WE
ADD HL,DE ; WANT TO COPY
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
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:
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)
@ -303,7 +332,7 @@ MD_IOSETUPF:
LD A,L ; SAVE LBA 4K
AND %11111000 ; BLOCK WE ARE
LD C,A ; GOING TO
LD B,H ; ACCESS
LD A,H ; ACCESS
;
LD D,0 ; CONVERT LBA
LD E,H ; TO ADDRESS
@ -313,33 +342,6 @@ MD_IOSETUPF:
RL E
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
;
MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR
@ -378,9 +380,65 @@ MD_RDSEC:
;
; 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$");
XOR A
RET
;
; WRITE RAM
@ -525,16 +583,8 @@ MD_PRT:
RET
#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.
@ -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
;
;======================================================================
@ -562,13 +609,13 @@ FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM
; 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 C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL
FF_PROBE:
@ -578,28 +625,31 @@ 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 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 DE
; PUSH DE
LD H,FF_TGT&$FF ; IF WE MATCH WITH
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 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
;
; CALL FF_LAND ; LOOKUP AND DISPLAY
#IF (MD_FVBS==1)
CALL FF_LAND ; LOOKUP AND DISPLAY
#ENDIF
POP BC
;
LD A,C ; UPDATE ADDRESS
@ -607,43 +657,43 @@ FF_PROBE:
LD C,A
;
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
RET
;
;======================================================================
; 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
;======================================================================
;
FF_LAND:
;
#IF (FF_DBG==1)
#IF (MD_FDBG==1)
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
#ENDIF
;
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)
CP D
CP B
JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH
;
INC HL
LD A,(HL)
CP E
CP C
DEC HL
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
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
;
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
;======================================================================
;COMMON FUNCTION CALL
@ -686,15 +739,16 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA
PUSH IY ; PUT BANK AND SECTOR
POP BC ; DATA IN BC
;
#IF (FF_DBG==1)
#IF (MD_FDBG==1)
CALL PRTHEXWORD
#ENDIF
;
LD DE,0
HB_DI
CALL HBX_BUF ; EXECUTE RELOCATED CODE
HB_EI
;
#IF (FF_DBG==1)
#IF (MD_FDBG==1)
CALL PC_SPACE
CALL PRTHEXWORD
CALL PC_SPACE
@ -705,8 +759,10 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA
#ENDIF
;
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.
@ -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
; CHIP TO BE IDENTIFIED.
; ON EXIT DE CONTAINS THE CHIP ID BYTES.
; ON EXIT BC CONTAINS THE CHIP ID BYTES.
; NO STATUS IS RETURNED
;======================================================================
;
FF_IINIT:
MD_FIDENT:
PUSH IY
PUSH HL
PUSH DE
;
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
;
JP FF_FNCALL ; EXECUTE
;
;======================================================================
@ -739,13 +800,17 @@ FF_IINIT:
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; A CONTAINS CURRENT BANK
; ON EXIT DE CONTAINS ID WORD
; ON EXIT BC CONTAINS ID WORD
; 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
;
LD A,B ; SELECT BANK
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 (HL),$90 ; LD A,$90
; ; LD ($5555),A
LD DE,($0000) ; READ ID
LD BC,($0000) ; READ ID
;
LD A,$F0 ; ; EXIT
LD (HL),A ; LD ($5555),A ; COMMAND
;
POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
LD SP,(HBX_BUF + (MD_FIST-MD_FIDENT_R)) ; RESTORE STACK
;
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
@ -784,7 +853,7 @@ FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
;
FF_CALCA:
;
#IF (FF_DBG==1)
#IF (MD_FDBG==1)
CALL PC_SPACE ; DISPLAY SECTOR
CALL PRTHEX32 ; SECTOR ADDRESS
CALL PC_SPACE ; IN DE:HL
@ -804,7 +873,7 @@ FF_CALCA:
PUSH BC
POP IY
;
#IF (FF_DBG==1)
#IF (MD_FDBG==1)
CALL PRTHEXWORD ; DISPLAY BANK AND
CALL PC_SPACE ; SECTOR RESULT
#ENDIF
@ -828,9 +897,13 @@ FF_CALCA:
; 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
LD HL,FF_SERASE ; PUT ROUTINE TO CALL
LD HL,MD_FERAS_R ; PUT ROUTINE TO CALL
EX (SP),HL ; ON THE STACK
JP FF_FNCALL ; EXECUTE
;
@ -847,23 +920,55 @@ FF_SINIT:
; 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
LD A,B ; SELECT BANK
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 (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),$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 A,$55
; LD ($2AAA),A
LD H,C ; SECTOR
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
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
;
FF_WT5: LD C,0 ; SET SUCCESS STATUS
FF_WT5: LD C,L ; SET SUCCESS STATUS
FF_WT6: POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
LD SP,(HBX_BUF + (MD_FEST-MD_FERAS_R)) ; RESTORE STACK
;
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
@ -915,14 +1023,18 @@ FF_S_SZ .EQU $-FF_SERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
; IX POINTS TO WHERE TO SAVE DATA
;======================================================================
;
FF_RINIT:
MD_FREAD:
PUSH IY
PUSH HL
PUSH DE
;
LD L,0 ; CHANGE ADDRESS
LD A,H ; TO SECTOR BOUNDARY
AND $F0 ; BY MASKING OFF
LD H,A ; LOWER 12 BITS
;
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
JP FF_FNCALL ; EXECUTE
;
@ -942,19 +1054,20 @@ FF_RINIT:
; 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 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
;
FF_RD1:
MD_FRD1:
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO READ
LD C,(HL) ; READ BYTE
@ -969,17 +1082,18 @@ FF_RD1:
;
INC DE ; CONTINUE READING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,FF_RD1
JR Z,MD_FRD1
POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
; LD C,D ; RETURN STATUS
LD SP,(FF_RST) ; RESTORE STACK
;
LD SP,(HBX_BUF+MD_FRST-MD_FREAD_R) ; RESTORE STACK
;
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
@ -995,14 +1109,18 @@ FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
; IX POINTS TO DATA TO BE WRITTEN
;======================================================================
;
FF_WINIT:
MD_FWRIT:
PUSH IY
PUSH HL
PUSH DE
;
LD L,0 ; CHANGE ADDRESS
LD A,H ; TO SECTOR BOUNDARY
AND $F0 ; BY MASKING OFF
LD H,A ; LOWER 12 BITS
;
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
JP FF_FNCALL ; EXECUTE
;
@ -1021,16 +1139,22 @@ FF_WINIT:
; 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 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
PUSH AF ; TO READ
CALL HBX_BNKSEL
@ -1052,24 +1176,26 @@ FF_WR1:
;
; ; DO TWO SUCCESSIVE READS
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
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 IX ; NEXT SOURCE LOCATION
;
INC DE ; CONTINUE WRITING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,FF_WR1
JR Z,MD_FWRI1
;
POP AF ; RETURN TO ORIGINAL BANK
CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
LD SP,(HBX_BUF+MD_FWST-MD_FWRIT_R) ; RESTORE STACK
;
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_SZ .EQU ($-FF_TABLE) / FF_T_CNT
FF_UNKNOWN .DB "UNKNOWN$"
MD_UNKNOWN .DB "UNKNOWN$"
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
#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
#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
#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
;
.ECHO "FF requires "
.ECHO FF_CSIZE
.ECHO MD_CSIZE
.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=$"
Loading…
Cancel
Save