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_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=$"
Loading…
Cancel
Save