mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Extract flash routines to common library between md.asm and updater,asm
This commit is contained in:
268
Source/HBIOS/flashlib.inc
Normal file
268
Source/HBIOS/flashlib.inc
Normal file
@@ -0,0 +1,268 @@
|
||||
;======================================================================
|
||||
; FLASH LIBRARY
|
||||
;======================================================================
|
||||
; FLASH IDENTIFY
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; ISSUE ID COMMAND
|
||||
; READ IN ID WORD
|
||||
; ISSUE ID EXIT COMMAND
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT BC CONTAINS ID WORD
|
||||
; NO STATUS IS RETURNED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD D,A ; 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,H ; LD A,$55
|
||||
LD ($2AAA),A ; LD ($2AAA),A
|
||||
LD (HL),$90 ; LD A,$90
|
||||
; ; LD ($5555),A
|
||||
LD BC,($0000) ; READ ID
|
||||
;
|
||||
LD A,$F0 ; LD A,$F0 ; EXIT
|
||||
LD (HL),A ; LD ($5555),A ; COMMAND
|
||||
;
|
||||
LD A,D ; RETURN TO ORIGINAL BANK
|
||||
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
|
||||
;
|
||||
MD_I_SZ .EQU $-MD_FIDEN_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FIDEN_R occupies "
|
||||
.ECHO MD_I_SZ
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
;======================================================================
|
||||
; ERASE FLASH SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; ISSUE ERASE SECTOR COMMAND
|
||||
; POLL TOGGLE BIT FOR COMPLETION STATUS.
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
|
||||
;======================================================================
|
||||
;
|
||||
MD_FERAS_R: ; 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 ($5555),A
|
||||
LD DE,$2AAA ; LD A,$55
|
||||
LD A,L ; LD ($2AAA),A
|
||||
LD (HL),E ; LD A,$80
|
||||
LD (DE),A ; LD ($5555),A
|
||||
LD (HL),$80 ; LD A,$AA
|
||||
LD (HL),E ; LD ($5555),A
|
||||
LD (DE),A ; LD A,$55
|
||||
; ; LD ($2AAA),A
|
||||
LD H,C ; SECTOR
|
||||
LD L,$00 ; ADDRESS
|
||||
;
|
||||
LD A,$30 ; SECTOR ERASE
|
||||
LD (HL),A ; COMMAND
|
||||
;
|
||||
MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS
|
||||
LD C,(HL) ; FROM THE SAME FLASH ADDRESS.
|
||||
XOR C ; IF THE SAME ON BOTH READS
|
||||
BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT.
|
||||
;
|
||||
JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE
|
||||
; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE
|
||||
;
|
||||
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,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1
|
||||
;
|
||||
LD A,(HL) ; WE GOT A TIMOUT. 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,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT.
|
||||
;
|
||||
LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE
|
||||
LD (HL),C ; WRITE DEVICE RESET
|
||||
JR MD_WT6
|
||||
MD_WT5: LD C,L ; SET SUCCESS STATUS
|
||||
;
|
||||
MD_WT6: POP AF ; RETURN TO ORIGINAL BANK
|
||||
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
|
||||
;
|
||||
MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FERAS_R occupies "
|
||||
.ECHO MD_S_SZ
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH READ SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; READ SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; SELECT SOURCE BANK, READ DATA,
|
||||
; SELECT DESTINATION BANK, WRITE DATA
|
||||
; DESTINATION BANK IS ALWAYS CURRENT BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; DE = 0000 BYTE COUNT
|
||||
; IX POINTS TO DATA TO BE WRITTEN
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT NO STATUS RETURNED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
;
|
||||
MD_FRD1:LD A,B ; CHANGE TO SOURCE BANK
|
||||
CALL HBX_BNKSEL ; READ
|
||||
LD C,(HL) ; BYTE
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
CALL HBX_BNKSEL ; SELECT BANK TO WRITE TO
|
||||
;
|
||||
LD (IX+0),C ; WRITE BYTE
|
||||
;
|
||||
INC HL ; NEXT SOURCE LOCATION
|
||||
INC IX ; NEXT DESTINATION LOCATION
|
||||
;
|
||||
INC DE ; CONTINUE READING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FRD1
|
||||
;
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FREAD_R occupies "
|
||||
.ECHO MD_R_SZ
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH VERIFY SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; SELECT SOURCE BANK, READ DATA,
|
||||
; SELECT DESTINATION BANK, COMPARE DATA
|
||||
; DESTINATION BANK IS ALWAYS CURRENT BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; DE = 0000 BYTE COUNT
|
||||
; IX POINTS TO DATA TO BE VERIFIED
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
|
||||
;======================================================================
|
||||
;
|
||||
MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
;
|
||||
MD_FVE1:LD A,B ; SELECT BANK
|
||||
CALL HBX_BNKSEL ; TO READ
|
||||
LD C,(HL) ; READ BYTE
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
CALL HBX_BNKSEL ; TO VERIFY AGAINST
|
||||
;
|
||||
LD A,C
|
||||
SUB (IX+0) ; COMPARE BYTE
|
||||
LD C,A ; SET STATUS
|
||||
JR NZ,MD_FVE2 ; EXIT IF MISMATCH
|
||||
;
|
||||
INC HL ; NEXT SOURCE LOCATION
|
||||
INC IX ; NEXT DESTINATION LOCATION
|
||||
;
|
||||
INC DE ; CONTINUE READING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FVE1
|
||||
;
|
||||
MD_FVE2:POP AF
|
||||
RET
|
||||
;
|
||||
MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FVERI_R occupies "
|
||||
.ECHO MD_V_SZ
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH WRITE SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE
|
||||
; POLL TOGGLE BIT FOR COMPLETION STATUS.
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; IX POINTS TO DATA TO BE WRITTEN
|
||||
; DE = 0000 BYTE COUNT
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT NO STATUS IS RETURNED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
MD_FWR1:CALL HBX_BNKSEL ; SELECT BANK TO READ
|
||||
;
|
||||
LD C,(IX+0) ; READ IN BYTE
|
||||
;
|
||||
LD A,B ; SELECT BANK
|
||||
CALL HBX_BNKSEL ; TO PROGRAM
|
||||
;
|
||||
LD A,$AA ; COMMAND
|
||||
LD ($5555),A ; SETUP
|
||||
LD A,$55
|
||||
LD ($2AAA),A
|
||||
;
|
||||
LD A,$A0 ; WRITE
|
||||
LD ($5555),A ; COMMAND
|
||||
;
|
||||
LD (HL),C ; WRITE OUT BYTE
|
||||
;
|
||||
; ; DO TWO SUCCESSIVE READS
|
||||
MD_FWR2:LD A,(HL) ; FROM THE SAME FLASH ADDRESS.
|
||||
LD C,(HL) ; IF TOGGLE BIT (BIT 6)
|
||||
XOR C ; IS THE SAME ON BOTH READS
|
||||
BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT.
|
||||
JR NZ,MD_FWR2 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED.
|
||||
;
|
||||
INC HL ; NEXT DESTINATION LOCATION
|
||||
INC IX ; NEXT SOURCE LOCATION
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
;
|
||||
INC DE ; CONTINUE WRITING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FWR1
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY
|
||||
;
|
||||
MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FWRIT_R occupies "
|
||||
.ECHO MD_W_SZ
|
||||
.ECHO " bytes.\n"
|
||||
@@ -873,273 +873,7 @@ MD_FNCALL: ; USING HBX_BUF FOR CODE AREA
|
||||
;
|
||||
MD_SAVSTK .DW 0
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH IDENTIFY
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; ISSUE ID COMMAND
|
||||
; READ IN ID WORD
|
||||
; ISSUE ID EXIT COMMAND
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT BC CONTAINS ID WORD
|
||||
; NO STATUS IS RETURNED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD D,A ; 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,H ; LD A,$55
|
||||
LD ($2AAA),A ; LD ($2AAA),A
|
||||
LD (HL),$90 ; LD A,$90
|
||||
; ; LD ($5555),A
|
||||
LD BC,($0000) ; READ ID
|
||||
;
|
||||
LD A,$F0 ; LD A,$F0 ; EXIT
|
||||
LD (HL),A ; LD ($5555),A ; COMMAND
|
||||
;
|
||||
LD A,D ; RETURN TO ORIGINAL BANK
|
||||
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
|
||||
;
|
||||
MD_I_SZ .EQU $-MD_FIDEN_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FIDEN_R occupies "
|
||||
.ECHO MD_I_SZ
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
;======================================================================
|
||||
; ERASE FLASH SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; ISSUE ERASE SECTOR COMMAND
|
||||
; POLL TOGGLE BIT FOR COMPLETION STATUS.
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
|
||||
;======================================================================
|
||||
;
|
||||
MD_FERAS_R: ; 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 ($5555),A
|
||||
LD DE,$2AAA ; LD A,$55
|
||||
LD A,L ; LD ($2AAA),A
|
||||
LD (HL),E ; LD A,$80
|
||||
LD (DE),A ; LD ($5555),A
|
||||
LD (HL),$80 ; LD A,$AA
|
||||
LD (HL),E ; LD ($5555),A
|
||||
LD (DE),A ; LD A,$55
|
||||
; ; LD ($2AAA),A
|
||||
LD H,C ; SECTOR
|
||||
LD L,$00 ; ADDRESS
|
||||
;
|
||||
LD A,$30 ; SECTOR ERASE
|
||||
LD (HL),A ; COMMAND
|
||||
;
|
||||
MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS
|
||||
LD C,(HL) ; FROM THE SAME FLASH ADDRESS.
|
||||
XOR C ; IF THE SAME ON BOTH READS
|
||||
BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT.
|
||||
;
|
||||
JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE
|
||||
; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE
|
||||
;
|
||||
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,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1
|
||||
;
|
||||
LD A,(HL) ; WE GOT A TIMOUT. 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,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT.
|
||||
;
|
||||
LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE
|
||||
LD (HL),C ; WRITE DEVICE RESET
|
||||
JR MD_WT6
|
||||
MD_WT5: LD C,L ; SET SUCCESS STATUS
|
||||
;
|
||||
MD_WT6: POP AF ; RETURN TO ORIGINAL BANK
|
||||
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
|
||||
;
|
||||
MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FERAS_R occupies "
|
||||
.ECHO MD_S_SZ
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH READ SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; READ SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; SELECT SOURCE BANK, READ DATA,
|
||||
; SELECT DESTINATION BANK, WRITE DATA
|
||||
; DESTINATION BANK IS ALWAYS CURRENT BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; DE = 0000 BYTE COUNT
|
||||
; IX POINTS TO DATA TO BE WRITTEN
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT NO STATUS RETURNED
|
||||
; AF' TRASHED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
;
|
||||
MD_FRD1:LD A,B ; CHANGE TO SOURCE BANK
|
||||
CALL HBX_BNKSEL ; READ
|
||||
LD C,(HL) ; BYTE
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
CALL HBX_BNKSEL ; SELECT BANK TO WRITE TO
|
||||
;
|
||||
LD (IX+0),C ; WRITE BYTE
|
||||
;
|
||||
INC HL ; NEXT SOURCE LOCATION
|
||||
INC IX ; NEXT DESTINATION LOCATION
|
||||
;
|
||||
INC DE ; CONTINUE READING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FRD1
|
||||
;
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FREAD_R occupies "
|
||||
.ECHO MD_R_SZ
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH VERIFY SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; SELECT SOURCE BANK, READ DATA,
|
||||
; SELECT DESTINATION BANK, COMPARE DATA
|
||||
; DESTINATION BANK IS ALWAYS CURRENT BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; DE = 0000 BYTE COUNT
|
||||
; IX POINTS TO DATA TO BE VERIFIED
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
|
||||
;======================================================================
|
||||
;
|
||||
MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
;
|
||||
MD_FVE1:LD A,B ; SELECT BANK
|
||||
CALL HBX_BNKSEL ; TO READ
|
||||
LD C,(HL) ; READ BYTE
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
CALL HBX_BNKSEL ; TO VERIFY AGAINST
|
||||
;
|
||||
LD A,C
|
||||
SUB (IX+0) ; COMPARE BYTE
|
||||
LD C,A ; SET STATUS
|
||||
JR NZ,MD_FVE2 ; EXIT IF MISMATCH
|
||||
;
|
||||
INC HL ; NEXT SOURCE LOCATION
|
||||
INC IX ; NEXT DESTINATION LOCATION
|
||||
;
|
||||
INC DE ; CONTINUE READING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FVE1
|
||||
;
|
||||
MD_FVE2:POP AF
|
||||
RET
|
||||
;
|
||||
MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FVERI_R occupies "
|
||||
.ECHO MD_V_SZ
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH WRITE SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE
|
||||
; POLL TOGGLE BIT FOR COMPLETION STATUS.
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; IX POINTS TO DATA TO BE WRITTEN
|
||||
; DE = 0000 BYTE COUNT
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT NO STATUS IS RETURNED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
MD_FWR1:CALL HBX_BNKSEL ; SELECT BANK TO READ
|
||||
;
|
||||
LD C,(IX+0) ; READ IN BYTE
|
||||
;
|
||||
LD A,B ; SELECT BANK
|
||||
CALL HBX_BNKSEL ; TO PROGRAM
|
||||
;
|
||||
LD A,$AA ; COMMAND
|
||||
LD ($5555),A ; SETUP
|
||||
LD A,$55
|
||||
LD ($2AAA),A
|
||||
;
|
||||
LD A,$A0 ; WRITE
|
||||
LD ($5555),A ; COMMAND
|
||||
;
|
||||
LD (HL),C ; WRITE OUT BYTE
|
||||
;
|
||||
; ; DO TWO SUCCESSIVE READS
|
||||
MD_FWR2:LD A,(HL) ; FROM THE SAME FLASH ADDRESS.
|
||||
LD C,(HL) ; IF TOGGLE BIT (BIT 6)
|
||||
XOR C ; IS THE SAME ON BOTH READS
|
||||
BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT.
|
||||
JR NZ,MD_FWR2 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED.
|
||||
;
|
||||
INC HL ; NEXT DESTINATION LOCATION
|
||||
INC IX ; NEXT SOURCE LOCATION
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
;
|
||||
INC DE ; CONTINUE WRITING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FWR1
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY
|
||||
;
|
||||
MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
|
||||
.ECHO "MD_FWRIT_R occupies "
|
||||
.ECHO MD_W_SZ
|
||||
.ECHO " bytes.\n"
|
||||
#INCLUDE "flashlib.inc"
|
||||
;
|
||||
;======================================================================
|
||||
;
|
||||
|
||||
@@ -1070,248 +1070,7 @@ MD_FNCALL:
|
||||
MD_FJPHL:
|
||||
JP (HL)
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH IDENTIFY
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; ISSUE ID COMMAND
|
||||
; READ IN ID WORD
|
||||
; ISSUE ID EXIT COMMAND
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT BC CONTAINS ID WORD
|
||||
; NO STATUS IS RETURNED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD D,A ; 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,H ; LD A,$55
|
||||
LD ($2AAA),A ; LD ($2AAA),A
|
||||
LD (HL),$90 ; LD A,$90
|
||||
; ; LD ($5555),A
|
||||
LD BC,($0000) ; READ ID
|
||||
;
|
||||
LD A,$F0 ; LD A,$F0 ; EXIT
|
||||
LD (HL),A ; LD ($5555),A ; COMMAND
|
||||
;
|
||||
LD A,D ; RETURN TO ORIGINAL BANK
|
||||
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
|
||||
;
|
||||
;======================================================================
|
||||
; ERASE FLASH SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; ISSUE ERASE SECTOR COMMAND
|
||||
; POLL TOGGLE BIT FOR COMPLETION STATUS.
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
|
||||
;======================================================================
|
||||
;
|
||||
MD_FERAS_R: ; 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 ($5555),A
|
||||
LD DE,$2AAA ; LD A,$55
|
||||
LD A,L ; LD ($2AAA),A
|
||||
LD (HL),E ; LD A,$80
|
||||
LD (DE),A ; LD ($5555),A
|
||||
LD (HL),$80 ; LD A,$AA
|
||||
LD (HL),E ; LD ($5555),A
|
||||
LD (DE),A ; LD A,$55
|
||||
; ; LD ($2AAA),A
|
||||
LD H,C ; SECTOR
|
||||
LD L,$00 ; ADDRESS
|
||||
;
|
||||
LD A,$30 ; SECTOR ERASE
|
||||
LD (HL),A ; COMMAND
|
||||
;
|
||||
MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS
|
||||
LD C,(HL) ; FROM THE SAME FLASH ADDRESS.
|
||||
XOR C ; IF THE SAME ON BOTH READS
|
||||
BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT.
|
||||
;
|
||||
JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE
|
||||
; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE
|
||||
;
|
||||
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,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1
|
||||
;
|
||||
LD A,(HL) ; WE GOT A TIMOUT. 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,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT.
|
||||
;
|
||||
LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE
|
||||
LD (HL),C ; WRITE DEVICE RESET
|
||||
JR MD_WT6
|
||||
MD_WT5: LD C,L ; SET SUCCESS STATUS
|
||||
;
|
||||
MD_WT6: POP AF ; RETURN TO ORIGINAL BANK
|
||||
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH READ SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; READ SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; SELECT SOURCE BANK, READ DATA,
|
||||
; SELECT DESTINATION BANK, WRITE DATA
|
||||
; DESTINATION BANK IS ALWAYS CURRENT BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; DE = 0000 BYTE COUNT
|
||||
; IX POINTS TO DATA TO BE WRITTEN
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT NO STATUS RETURNED
|
||||
; AF' TRASHED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
;
|
||||
MD_FRD1:LD A,B ; CHANGE TO SOURCE BANK
|
||||
CALL HBX_BNKSEL ; READ
|
||||
LD C,(HL) ; BYTE
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
CALL HBX_BNKSEL ; SELECT BANK TO WRITE TO
|
||||
;
|
||||
LD (IX+0),C ; WRITE BYTE
|
||||
;
|
||||
INC HL ; NEXT SOURCE LOCATION
|
||||
INC IX ; NEXT DESTINATION LOCATION
|
||||
;
|
||||
INC DE ; CONTINUE READING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FRD1
|
||||
;
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH VERIFY SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; SELECT SOURCE BANK, READ DATA,
|
||||
; SELECT DESTINATION BANK, COMPARE DATA
|
||||
; DESTINATION BANK IS ALWAYS CURRENT BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; DE = 0000 BYTE COUNT
|
||||
; IX POINTS TO DATA TO BE VERIFIED
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
|
||||
;======================================================================
|
||||
;
|
||||
MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
;
|
||||
MD_FVE1:LD A,B ; SELECT BANK
|
||||
CALL HBX_BNKSEL ; TO READ
|
||||
LD C,(HL) ; READ BYTE
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
CALL HBX_BNKSEL ; TO VERIFY AGAINST
|
||||
;
|
||||
LD A,C
|
||||
SUB (IX+0) ; COMPARE BYTE
|
||||
LD C,A ; SET STATUS
|
||||
JR NZ,MD_FVE2 ; EXIT IF MISMATCH
|
||||
;
|
||||
INC HL ; NEXT SOURCE LOCATION
|
||||
INC IX ; NEXT DESTINATION LOCATION
|
||||
;
|
||||
INC DE ; CONTINUE READING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FVE1
|
||||
;
|
||||
MD_FVE2:POP AF
|
||||
RET
|
||||
;
|
||||
;======================================================================
|
||||
; FLASH WRITE SECTOR.
|
||||
;
|
||||
; SELECT THE APPROPRIATE BANK / ADDRESS
|
||||
; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME
|
||||
; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE
|
||||
; POLL TOGGLE BIT FOR COMPLETION STATUS.
|
||||
; SELECT ORIGINAL BANK
|
||||
;
|
||||
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
|
||||
; IX POINTS TO DATA TO BE WRITTEN
|
||||
; DE = 0000 BYTE COUNT
|
||||
; A CONTAINS CURRENT BANK
|
||||
; ON EXIT NO STATUS IS RETURNED
|
||||
;======================================================================
|
||||
;
|
||||
MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
|
||||
;
|
||||
LD H,C ; SECTOR
|
||||
LD L,D ; ADDRESS
|
||||
;
|
||||
PUSH AF ; SAVE CURRENT BANK
|
||||
MD_FWR1:CALL HBX_BNKSEL ; SELECT BANK TO READ
|
||||
;
|
||||
LD C,(IX+0) ; READ IN BYTE
|
||||
;
|
||||
LD A,B ; SELECT BANK
|
||||
CALL HBX_BNKSEL ; TO PROGRAM
|
||||
;
|
||||
LD A,$AA ; COMMAND
|
||||
LD ($5555),A ; SETUP
|
||||
LD A,$55
|
||||
LD ($2AAA),A
|
||||
;
|
||||
LD A,$A0 ; WRITE
|
||||
LD ($5555),A ; COMMAND
|
||||
;
|
||||
LD (HL),C ; WRITE OUT BYTE
|
||||
;
|
||||
; ; DO TWO SUCCESSIVE READS
|
||||
MD_FWR2:LD A,(HL) ; FROM THE SAME FLASH ADDRESS.
|
||||
LD C,(HL) ; IF TOGGLE BIT (BIT 6)
|
||||
XOR C ; IS THE SAME ON BOTH READS
|
||||
BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT.
|
||||
JR NZ,MD_FR2 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED.
|
||||
;
|
||||
INC HL ; NEXT DESTINATION LOCATION
|
||||
INC IX ; NEXT SOURCE LOCATION
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
|
||||
;
|
||||
INC DE ; CONTINUE WRITING UNTIL
|
||||
BIT 4,D ; WE HAVE DONE ONE SECTOR
|
||||
JR Z,MD_FWR1
|
||||
;
|
||||
POP AF ; RESTORE CURRENT BANK
|
||||
JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY
|
||||
#INCLUDE "flashlib.inc"
|
||||
;
|
||||
MD_FEND .EQU $
|
||||
MD_CSIZ .EQU MD_FEND-MD_FSTART ; HOW MUCH SPACE WE NEED FOR RELOCATABLE CODE
|
||||
|
||||
Reference in New Issue
Block a user