|
|
|
@ -2,15 +2,20 @@ |
|
|
|
;================================================================================================== |
|
|
|
; FLASH DRIVER FOR FLASH & EEPROM PROGRAMMING |
|
|
|
; |
|
|
|
; 26 SEP 2020 - CHIP IDENTIFICATION IMPLMENTED -- PHIL SUMMERS |
|
|
|
; 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 |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
; UPPER RAM BANK IS ALWAYS AVAILABLE REGARDLESS OF MEMORY BANK SELECTION. HBX_BNKSEL AND |
|
|
|
; HB_CURBNK ARE ALWAYS AVAILABLE IN UPPER MEMORY AND THE STACK IS ALSO IN UPPER MEMORY DURING |
|
|
|
; BIOS INITIALIZATION. TO ACCESS THE FLASH CHIP FEATURES, CODE IS COPIED TO THE UPPER RAM BANK |
|
|
|
; UPPER RAM BANK IS ALWAYS AVAILABLE REGARDLESS OF MEMORY BANK SELECTION. |
|
|
|
; HBX_BNKSEL AND HB_CURBNK ARE ALWAYS AVAILABLE IN UPPER MEMORY. |
|
|
|
; |
|
|
|
; THE STACK IS IN UPPER MEMORY DURING BIOS INITIALIZATION BUT IS IN LOWER |
|
|
|
; MEMORY DURING HBIOS CALLS. |
|
|
|
; |
|
|
|
; TO ACCESS THE FLASH CHIP FEATURES, CODE IS COPIED TO THE UPPER RAM BANK |
|
|
|
; AND THE FLASH CHIP IS SWITCHED INTO THE LOWER BANK. |
|
|
|
; |
|
|
|
; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ |
|
|
|
@ -18,6 +23,7 @@ |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
FF_DBG: .EQU 0 ; DEBUG |
|
|
|
FF_HBX: .EQU 1 ; =0 USE STACK, =1 USE HBX_BUF |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; BIOS FLASH INITIALIZATION |
|
|
|
@ -30,7 +36,7 @@ FF_DBG: .EQU 0 ; DEBUG |
|
|
|
FF_INIT: |
|
|
|
CALL NEWLINE ; DISLAY NUMBER |
|
|
|
PRTS("FF: UNITS=$") ; OF UNITS |
|
|
|
LD A,+(ROMSIZE/512)+1 ; CONFIGURED FOR. |
|
|
|
LD A,+(ROMSIZE/512) ; CONFIGURED FOR. |
|
|
|
CALL PRTDECB |
|
|
|
; |
|
|
|
LD B,A ; NUMBER OF DEVICES TO PROBE |
|
|
|
@ -43,7 +49,7 @@ FF_PROBE: |
|
|
|
; |
|
|
|
PUSH BC |
|
|
|
CALL PC_SPACE |
|
|
|
LD A,+(ROMSIZE/512)+2 |
|
|
|
LD A,+(ROMSIZE/512)+1 |
|
|
|
SUB B ; PRINT |
|
|
|
CALL PRTDECB ; DEVICE |
|
|
|
LD A,'=' ; NUMBER |
|
|
|
@ -71,7 +77,7 @@ FF_PROBE: |
|
|
|
; |
|
|
|
FF_TESTING: |
|
|
|
; |
|
|
|
#IF (1) |
|
|
|
#IF (0) |
|
|
|
LD DE,$0008 ; SET |
|
|
|
LD HL,$0000 ; ADDRESS |
|
|
|
CALL FF_EINIT ; CHIP ERASE |
|
|
|
@ -85,14 +91,55 @@ FF_TESTING: |
|
|
|
CALL PRTHEXBYTE ; DISPLAY STATUS |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (1) |
|
|
|
#IF (0) |
|
|
|
LD DE,$000A ; SET DESTINATION |
|
|
|
LD HL,$8000 ; ADDRESS |
|
|
|
LD IX,$F000 ; SET SOURCE ADDRESS |
|
|
|
LD IX,FF_BUFFER ; SET SOURCE ADDRESS |
|
|
|
CALL FF_WINIT ; WRITE SECTOR |
|
|
|
CALL PRTHEXBYTE ; DISPLAY STATUS |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (1) |
|
|
|
LD DE,$0000 ; SET SOURCE |
|
|
|
LD HL,$7000 ; ADDRESS |
|
|
|
LD IX,FF_BUFFER ; SET DESTINATION ADDRESS |
|
|
|
CALL FF_RINIT ; READ SECTOR |
|
|
|
CALL PRTHEXBYTE ; DISPLAY STATUS |
|
|
|
LD DE,FF_BUFFER |
|
|
|
CALL DUMP_BUFFER |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (1) |
|
|
|
LD HL,FF_BUFFER ; FILL BUFFER |
|
|
|
LD (HL),'J' |
|
|
|
LD DE,FF_BUFFER+1 |
|
|
|
LD BC,$1000-1 |
|
|
|
LDIR |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (1) |
|
|
|
LD DE,$0000 ; SET |
|
|
|
LD HL,$7000 ; ADDRESS |
|
|
|
CALL FF_SINIT ; SECTOR ERASE |
|
|
|
CALL PRTHEXBYTE ; DISPLAY STATUS |
|
|
|
#ENDIF |
|
|
|
#IF (1) |
|
|
|
LD DE,$0000 ; SET DESTINATION |
|
|
|
LD HL,$7000 ; ADDRESS |
|
|
|
LD IX,FF_BUFFER ; SET SOURCE ADDRESS |
|
|
|
CALL FF_WINIT ; WRITE SECTOR |
|
|
|
CALL PRTHEXBYTE ; DISPLAY STATUS |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (1) |
|
|
|
LD DE,$0000 ; SET SOURCE |
|
|
|
LD HL,$7000 ; ADDRESS |
|
|
|
LD IX,FF_BUFFER ; SET DESTINATION ADDRESS |
|
|
|
CALL FF_RINIT ; READ SECTOR |
|
|
|
CALL PRTHEXBYTE ; DISPLAY STATUS |
|
|
|
LD DE,FF_BUFFER |
|
|
|
CALL DUMP_BUFFER |
|
|
|
#ENDIF |
|
|
|
RET |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
@ -142,50 +189,120 @@ FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT |
|
|
|
; |
|
|
|
FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT |
|
|
|
RET |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; IDENTIFY FLASH CHIP. |
|
|
|
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS |
|
|
|
; CREATE A CODE BUFFER IN THE STACK AREA |
|
|
|
; COPY FLASH CODE TO CODE BUFFER |
|
|
|
; CALL RELOCATED FLASH IDENTITY CODE |
|
|
|
; RESTORE STACK |
|
|
|
; RETURN WITH ID CODE. |
|
|
|
;COMMON FUNCTION CALL |
|
|
|
; |
|
|
|
; 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. |
|
|
|
; NO STATUS IS RETURNED |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_IINIT: |
|
|
|
#IF (FF_HBX==0) |
|
|
|
FF_FNCALL: ; USING STACK FOR CODE AREA |
|
|
|
CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY |
|
|
|
; |
|
|
|
POP DE ; GET ROUTINE TO CALL |
|
|
|
; |
|
|
|
LD (FF_STACK),SP ; SAVE STACK |
|
|
|
LD HL,(FF_STACK) |
|
|
|
; |
|
|
|
LD BC,FF_I_SZ ; CODE SIZE REQUIRED |
|
|
|
LD BC,64 |
|
|
|
; LD BC,FF_I_SZ ; CODE SIZE REQUIRED |
|
|
|
CCF ; CREATE A RELOCATABLE |
|
|
|
SBC HL,BC ; CODE BUFFER IN THE |
|
|
|
LD SP,HL ; STACK AREA |
|
|
|
; |
|
|
|
PUSH HL ; SAVE THE EXECUTE ADDRESS |
|
|
|
EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE |
|
|
|
LD HL,FF_IDENT ; COPY OUR RELOCATABLE |
|
|
|
; LD HL,FF_IDENT ; COPY OUR RELOCATABLE |
|
|
|
LDIR ; CODE TO THE BUFFER |
|
|
|
POP HL ; CALL OUR RELOCATABLE CODE |
|
|
|
|
|
|
|
PUSH IY ; PUT BANK AND SECTOR |
|
|
|
POP BC ; DATA IN BC |
|
|
|
; |
|
|
|
#IF (FF_DBG==1) |
|
|
|
CALL PRTHEXWORD |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
HB_DI |
|
|
|
CALL JPHL ; EXECUTE FF_IDENT |
|
|
|
CALL JPHL ; EXECUTE RELOCATED CODE |
|
|
|
HB_EI |
|
|
|
; |
|
|
|
LD HL,(FF_STACK) ; RESTORE ORIGINAL |
|
|
|
LD SP,HL ; STACK POSITION |
|
|
|
; |
|
|
|
#IF (FF_DBG==1) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXWORD |
|
|
|
CALL PC_SPACE |
|
|
|
EX DE,HL |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
CALL PC_SPACE |
|
|
|
EX DE,HL |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
LD A,C ; RETURN WITH STATUS IN A |
|
|
|
; |
|
|
|
RET |
|
|
|
#ELSE |
|
|
|
FF_FNCALL: ; USING HBX_BUF FOR CODE AREA |
|
|
|
CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY |
|
|
|
; |
|
|
|
POP HL ; GET ROUTINE TO CALL |
|
|
|
; |
|
|
|
LD DE,HBX_BUF ; PUT EXECUTE / START ADDRESS IN DE |
|
|
|
LD BC,HBX_BUFSIZ ; CODE SIZE REQUIRED |
|
|
|
; |
|
|
|
PUSH DE ; SAVE THE EXECUTE ADDRESS |
|
|
|
; COPY OUR RELOCATABLE |
|
|
|
LDIR ; CODE TO THE BUFFER |
|
|
|
POP HL ; CALL OUR RELOCATABLE CODE |
|
|
|
|
|
|
|
PUSH IY ; PUT BANK AND SECTOR |
|
|
|
POP BC ; DATA IN BC |
|
|
|
; |
|
|
|
#IF (FF_DBG==1) |
|
|
|
CALL PRTHEXWORD |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
HB_DI |
|
|
|
CALL JPHL ; EXECUTE RELOCATED CODE |
|
|
|
HB_EI |
|
|
|
; |
|
|
|
#IF (FF_DBG==1) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXWORD |
|
|
|
CALL PC_SPACE |
|
|
|
EX DE,HL |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
CALL PC_SPACE |
|
|
|
EX DE,HL |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
LD A,C ; RETURN WITH STATUS IN A |
|
|
|
; |
|
|
|
RET |
|
|
|
|
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; IDENTIFY FLASH CHIP. |
|
|
|
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS |
|
|
|
; CREATE A CODE BUFFER IN HIGH MEMORY AREA |
|
|
|
; COPY FLASH CODE TO CODE BUFFER |
|
|
|
; CALL RELOCATED FLASH IDENTITY CODE |
|
|
|
; RESTORE STACK |
|
|
|
; RETURN WITH ID CODE. |
|
|
|
; |
|
|
|
; 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. |
|
|
|
; NO STATUS IS RETURNED |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_IINIT: |
|
|
|
PUSH HL ; SAVE ADDRESS INFO |
|
|
|
LD HL,FF_IDENT ; PUT ROUTINE TO CALL |
|
|
|
EX (SP),HL ; ON THE STACK |
|
|
|
JP FF_FNCALL ; EXECUTE |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; FLASH IDENTIFY |
|
|
|
@ -201,7 +318,7 @@ FF_IINIT: |
|
|
|
; NO STATUS IS RETURNED |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_IDENT: ; THIS CODE GETS RELOCATED TO THE STACK |
|
|
|
FF_IDENT: ; THIS CODE GETS RELOCATED TO HIGH MEMORY |
|
|
|
; |
|
|
|
PUSH AF ; SAVE CURRENT BANK |
|
|
|
LD A,B ; SELECT BANK |
|
|
|
@ -228,7 +345,7 @@ FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED |
|
|
|
;====================================================================== |
|
|
|
; FLASH CHIP ERASE. |
|
|
|
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS |
|
|
|
; CREATE A CODE BUFFER IN THE STACK AREA |
|
|
|
; CREATE A CODE BUFFER IN HIGH MEMORY AREA |
|
|
|
; COPY FLASH CODE TO CODE BUFFER |
|
|
|
; CALL RELOCATED FLASH ERASE CODE |
|
|
|
; RESTORE STACK |
|
|
|
@ -239,34 +356,10 @@ FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_EINIT: |
|
|
|
CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY |
|
|
|
|
|
|
|
LD (FF_STACK),SP ; SAVE STACK |
|
|
|
LD HL,(FF_STACK) |
|
|
|
; |
|
|
|
LD BC,FF_E_SZ ; CODE SIZE REQUIRED |
|
|
|
CCF ; CREATE A RELOCATABLE |
|
|
|
SBC HL,BC ; CODE BUFFER IN THE |
|
|
|
LD SP,HL ; STACK AREA |
|
|
|
; |
|
|
|
PUSH HL ; SAVE THE EXECUTE ADDRESS |
|
|
|
EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE |
|
|
|
LD HL,FF_ERASE ; COPY OUR RELOCATABLE |
|
|
|
LDIR ; CODE TO THE BUFFER |
|
|
|
POP HL ; CALL OUR RELOCATABLE CODE |
|
|
|
; |
|
|
|
PUSH IY ; PUT BANK AND SECTOR |
|
|
|
POP BC ; DATA IN BC |
|
|
|
; |
|
|
|
HB_DI |
|
|
|
CALL JPHL ; EXECUTE FF_ERASE |
|
|
|
HB_EI |
|
|
|
; |
|
|
|
LD HL,(FF_STACK) ; RESTORE ORIGINAL |
|
|
|
LD SP,HL ; STACK POSITION |
|
|
|
; |
|
|
|
LD A,C ; RETURN WITH STATUS IN A |
|
|
|
RET |
|
|
|
PUSH HL ; SAVE ADDRESS INFO |
|
|
|
LD HL,FF_ERASE ; PUT ROUTINE TO CALL |
|
|
|
EX (SP),HL ; ON THE STACK |
|
|
|
JP FF_FNCALL ; EXECUTE |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; ERASE FLASH CHIP. |
|
|
|
@ -282,7 +375,7 @@ FF_EINIT: |
|
|
|
; A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_ERASE: ; THIS CODE GETS RELOCATED TO THE STACK |
|
|
|
FF_ERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY |
|
|
|
; |
|
|
|
PUSH AF ; SAVE CURRENT BANK |
|
|
|
LD A,B ; SELECT BANK |
|
|
|
@ -379,7 +472,7 @@ FF_CALCA: |
|
|
|
; |
|
|
|
; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. |
|
|
|
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS |
|
|
|
; CREATE A CODE BUFFER IN THE STACK AREA |
|
|
|
; CREATE A CODE BUFFER IN HIGH MEMORY AREA |
|
|
|
; COPY FLASH CODE TO CODE BUFFER |
|
|
|
; CALL RELOCATED FLASH ERASE CODE |
|
|
|
; RESTORE STACK |
|
|
|
@ -390,46 +483,10 @@ FF_CALCA: |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_SINIT: |
|
|
|
CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY |
|
|
|
; |
|
|
|
LD (FF_STACK),SP ; SAVE STACK |
|
|
|
LD HL,(FF_STACK) |
|
|
|
; |
|
|
|
LD BC,FF_S_SZ ; CODE SIZE REQUIRED |
|
|
|
CCF ; CREATE A RELOCATABLE |
|
|
|
SBC HL,BC ; CODE BUFFER IN THE |
|
|
|
LD SP,HL ; STACK AREA |
|
|
|
; |
|
|
|
PUSH HL ; SAVE THE EXECUTE ADDRESS |
|
|
|
EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE |
|
|
|
LD HL,FF_SERASE ; COPY OUR RELOCATABLE |
|
|
|
LDIR ; CODE TO THE BUFFER |
|
|
|
POP HL ; CALL OUR RELOCATABLE CODE |
|
|
|
; |
|
|
|
PUSH IY ; PUT BANK AND SECTOR |
|
|
|
POP BC ; DATA IN BC |
|
|
|
; |
|
|
|
#IF (FF_DBG==1) |
|
|
|
CALL PRTHEXWORD |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
HB_DI |
|
|
|
CALL JPHL ; CALL FF_SERASE |
|
|
|
HB_EI |
|
|
|
; |
|
|
|
LD HL,(FF_STACK) ; RESTORE ORIGINAL |
|
|
|
LD SP,HL ; STACK POSITION |
|
|
|
; |
|
|
|
#IF (FF_DBG==1) |
|
|
|
CALL PRTHEXWORD |
|
|
|
CALL PC_SPACE |
|
|
|
EX DE,HL |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
CALL PC_SPACE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
LD A,C ; RETURN WITH STATUS IN A |
|
|
|
RET |
|
|
|
PUSH HL ; SAVE ADDRESS INFO |
|
|
|
LD HL,FF_SERASE ; PUT ROUTINE TO CALL |
|
|
|
EX (SP),HL ; ON THE STACK |
|
|
|
JP FF_FNCALL ; EXECUTE |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; ERASE FLASH SECTOR. |
|
|
|
@ -444,7 +501,7 @@ FF_SINIT: |
|
|
|
; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_SERASE: ; THIS CODE GETS RELOCATED TO THE STACK |
|
|
|
FF_SERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY |
|
|
|
; |
|
|
|
PUSH AF ; SAVE CURRENT BANK |
|
|
|
LD A,B ; SELECT BANK |
|
|
|
@ -499,61 +556,105 @@ FF_WT6: POP AF ; RETURN TO ORIGINAL BANK |
|
|
|
FF_S_SZ .EQU $-FF_SERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; WRITE FLASH SECTOR OF 4096 BYTES |
|
|
|
; READ FLASH SECTOR OF 4096 BYTES |
|
|
|
; |
|
|
|
; SET ADDRESS TO START OF SECTOR |
|
|
|
; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS |
|
|
|
; CREATE A CODE BUFFER IN THE STACK AREA |
|
|
|
; CREATE A CODE BUFFER IN HIGH MEMORY AREA |
|
|
|
; COPY FLASH CODE TO CODE BUFFER |
|
|
|
; CALL RELOCATED FLASH WRITE SECTOR CODE |
|
|
|
; CALL RELOCATED FLASH READ SECTOR CODE |
|
|
|
; RESTORE STACK |
|
|
|
; |
|
|
|
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. |
|
|
|
; IX POINTS TO DATA TO BE WRITTEN |
|
|
|
; IX POINTS TO WHERE TO SAVE DATA |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_WINIT: |
|
|
|
FF_RINIT: |
|
|
|
LD L,0 ; CHANGE ADDRESS |
|
|
|
LD A,H ; TO SECTOR BOUNDARY |
|
|
|
AND $F0 ; BY MASKING OFF |
|
|
|
LD H,A ; LOWER 12 BITS |
|
|
|
; |
|
|
|
CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY |
|
|
|
PUSH HL ; SAVE ADDRESS INFO |
|
|
|
LD HL,FF_SREAD ; PUT ROUTINE TO CALL |
|
|
|
EX (SP),HL ; ON THE STACK |
|
|
|
JP FF_FNCALL ; EXECUTE |
|
|
|
; |
|
|
|
LD (FF_STACK),SP ; SAVE STACK |
|
|
|
LD HL,(FF_STACK) |
|
|
|
RET |
|
|
|
;====================================================================== |
|
|
|
; FLASH READ SECTOR. |
|
|
|
; |
|
|
|
LD BC,FF_W_SZ ; CODE SIZE REQUIRED |
|
|
|
CCF ; CREATE A RELOCATABLE |
|
|
|
SBC HL,BC ; CODE BUFFER IN THE |
|
|
|
LD SP,HL ; STACK AREA |
|
|
|
; 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 |
|
|
|
; |
|
|
|
PUSH HL ; SAVE THE EXECUTE ADDRESS |
|
|
|
EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE |
|
|
|
LD HL,FF_SWRITE ; COPY OUR RELOCATABLE |
|
|
|
LDIR ; CODE TO THE BUFFER |
|
|
|
POP HL ; CALL OUR RELOCATABLE CODE |
|
|
|
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA |
|
|
|
; IX POINTS TO DATA TO BE WRITTEN |
|
|
|
; A CONTAINS CURRENT BANK |
|
|
|
; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
PUSH IY ; PUT BANK AND SECTOR |
|
|
|
POP BC ; DATA IN BC |
|
|
|
FF_SREAD: ; THIS CODE GETS RELOCATED TO HIGH MEMORY |
|
|
|
; |
|
|
|
HB_DI |
|
|
|
CALL JPHL ; CALL FF_SWRITE |
|
|
|
HB_EI |
|
|
|
PUSH AF ; SAVE CURRENT BANK |
|
|
|
; |
|
|
|
LD HL,(FF_STACK) ; RESTORE ORIGINAL |
|
|
|
LD SP,HL ; STACK POSITION |
|
|
|
LD H,C ; SECTOR |
|
|
|
LD L,$00 ; ADDRESS |
|
|
|
LD D,L ; INITIALIZE |
|
|
|
LD E,L ; BYTE COUNT |
|
|
|
; |
|
|
|
#IF (FF_DBG==1) |
|
|
|
CALL PC_SPACE |
|
|
|
EX DE,HL |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
CALL PC_SPACE |
|
|
|
#ENDIF |
|
|
|
FF_RD1: |
|
|
|
LD A,B ; SELECT BANK |
|
|
|
CALL HBX_BNKSEL ; TO READ |
|
|
|
LD C,(HL) ; READ BYTE |
|
|
|
; |
|
|
|
POP AF |
|
|
|
PUSH AF ; SELECT BANK |
|
|
|
CALL HBX_BNKSEL ; TO WRITE |
|
|
|
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,FF_RD1 |
|
|
|
|
|
|
|
POP AF ; RETURN TO ORIGINAL BANK |
|
|
|
; CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY |
|
|
|
XOR A |
|
|
|
; |
|
|
|
XOR A ; SET SUCCESS STATUS |
|
|
|
RET |
|
|
|
; |
|
|
|
FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; WRITE FLASH SECTOR OF 4096 BYTES |
|
|
|
; |
|
|
|
; SET ADDRESS TO START OF SECTOR |
|
|
|
; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS |
|
|
|
; CREATE A CODE BUFFER IN HIGH MEMORY AREA |
|
|
|
; COPY FLASH CODE TO CODE BUFFER |
|
|
|
; CALL RELOCATED FLASH WRITE SECTOR CODE |
|
|
|
; RESTORE STACK |
|
|
|
; |
|
|
|
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. |
|
|
|
; IX POINTS TO DATA TO BE WRITTEN |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_WINIT: |
|
|
|
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 |
|
|
|
EX (SP),HL ; ON THE STACK |
|
|
|
JP FF_FNCALL ; EXECUTE |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; FLASH WRITE SECTOR. |
|
|
|
; |
|
|
|
@ -569,11 +670,9 @@ FF_WINIT: |
|
|
|
; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_SWRITE: ; THIS CODE GETS RELOCATED TO THE STACK |
|
|
|
FF_SWRITE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY |
|
|
|
; |
|
|
|
PUSH AF ; SAVE CURRENT BANK |
|
|
|
LD A,B ; SELECT BANK |
|
|
|
CALL HBX_BNKSEL ; TO PROGRAM |
|
|
|
; |
|
|
|
LD H,C ; SECTOR |
|
|
|
LD L,$00 ; ADDRESS |
|
|
|
@ -581,7 +680,14 @@ FF_SWRITE: ; THIS CODE GETS RELOCATED TO THE STACK |
|
|
|
LD E,L ; BYTE COUNT |
|
|
|
; |
|
|
|
FF_WR1: |
|
|
|
POP AF ; SELECT BANK |
|
|
|
PUSH AF ; TO READ |
|
|
|
CALL HBX_BNKSEL |
|
|
|
; |
|
|
|
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 |
|
|
|
@ -671,6 +777,13 @@ FF_STACK: .DW 0 |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
; 4K FLASH BUFFER |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FF_BUFFER .FILL 4096,$FF |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
; RELOCATABLE CODE SPACE REQUIREMENTS |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
@ -689,7 +802,10 @@ FF_CSIZE .SET FF_E_SZ |
|
|
|
#IF (FF_I_SZ>FF_CSIZE) |
|
|
|
FF_CSIZE .SET FF_I_SZ |
|
|
|
#ENDIF |
|
|
|
#IF (FF_R_SZ>FF_CSIZE) |
|
|
|
FF_CSIZE .SET FF_R_SZ |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
.ECHO "FF requires " |
|
|
|
.ECHO FF_CSIZE |
|
|
|
.ECHO " bytes stack space.\n" |
|
|
|
.ECHO " bytes high memory space.\n" |
|
|
|
|