Browse Source

Merge pull request #159 from b1ackmai1er/dev

Update to flashfs
pull/173/head
Wayne Warthen 5 years ago
committed by GitHub
parent
commit
6ee684029e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 382
      Source/HBIOS/flashfs.asm

382
Source/HBIOS/flashfs.asm

@ -2,15 +2,20 @@
;================================================================================================== ;==================================================================================================
; FLASH DRIVER FOR FLASH & EEPROM PROGRAMMING ; 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 ; - CHIP ERASE IMPLEMENTED
; 23 OCT 2020 - SECTOR ERASE IMPLEMENTED ; 23 OCT 2020 - SECTOR ERASE IMPLEMENTED
; 01 NOV 2020 - WRITE SECTOR 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. ; AND THE FLASH CHIP IS SWITCHED INTO THE LOWER BANK.
; ;
; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/ ; INSPIRED BY WILL SOWERBUTTS FLASH4 UTILITY - https://github.com/willsowerbutts/flash4/
@ -18,6 +23,7 @@
;================================================================================================== ;==================================================================================================
; ;
FF_DBG: .EQU 0 ; DEBUG FF_DBG: .EQU 0 ; DEBUG
FF_HBX: .EQU 1 ; =0 USE STACK, =1 USE HBX_BUF
; ;
;====================================================================== ;======================================================================
; BIOS FLASH INITIALIZATION ; BIOS FLASH INITIALIZATION
@ -30,7 +36,7 @@ FF_DBG: .EQU 0 ; DEBUG
FF_INIT: FF_INIT:
CALL NEWLINE ; DISLAY NUMBER CALL NEWLINE ; DISLAY NUMBER
PRTS("FF: UNITS=$") ; OF UNITS PRTS("FF: UNITS=$") ; OF UNITS
LD A,+(ROMSIZE/512)+1 ; CONFIGURED FOR.
LD A,+(ROMSIZE/512) ; CONFIGURED FOR.
CALL PRTDECB CALL PRTDECB
; ;
LD B,A ; NUMBER OF DEVICES TO PROBE LD B,A ; NUMBER OF DEVICES TO PROBE
@ -43,7 +49,7 @@ FF_PROBE:
; ;
PUSH BC PUSH BC
CALL PC_SPACE CALL PC_SPACE
LD A,+(ROMSIZE/512)+2
LD A,+(ROMSIZE/512)+1
SUB B ; PRINT SUB B ; PRINT
CALL PRTDECB ; DEVICE CALL PRTDECB ; DEVICE
LD A,'=' ; NUMBER LD A,'=' ; NUMBER
@ -71,7 +77,7 @@ FF_PROBE:
; ;
FF_TESTING: FF_TESTING:
; ;
#IF (1)
#IF (0)
LD DE,$0008 ; SET LD DE,$0008 ; SET
LD HL,$0000 ; ADDRESS LD HL,$0000 ; ADDRESS
CALL FF_EINIT ; CHIP ERASE CALL FF_EINIT ; CHIP ERASE
@ -85,14 +91,55 @@ FF_TESTING:
CALL PRTHEXBYTE ; DISPLAY STATUS CALL PRTHEXBYTE ; DISPLAY STATUS
#ENDIF #ENDIF
; ;
#IF (1)
#IF (0)
LD DE,$000A ; SET DESTINATION LD DE,$000A ; SET DESTINATION
LD HL,$8000 ; ADDRESS LD HL,$8000 ; ADDRESS
LD IX,$F000 ; SET SOURCE ADDRESS
LD IX,FF_BUFFER ; SET SOURCE ADDRESS
CALL FF_WINIT ; WRITE SECTOR CALL FF_WINIT ; WRITE SECTOR
CALL PRTHEXBYTE ; DISPLAY STATUS CALL PRTHEXBYTE ; DISPLAY STATUS
#ENDIF #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 RET
; ;
;====================================================================== ;======================================================================
@ -142,50 +189,120 @@ FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT
; ;
FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT
RET 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 CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY
;
POP DE ; GET ROUTINE TO CALL
; ;
LD (FF_STACK),SP ; SAVE STACK LD (FF_STACK),SP ; SAVE STACK
LD HL,(FF_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 CCF ; CREATE A RELOCATABLE
SBC HL,BC ; CODE BUFFER IN THE SBC HL,BC ; CODE BUFFER IN THE
LD SP,HL ; STACK AREA LD SP,HL ; STACK AREA
; ;
PUSH HL ; SAVE THE EXECUTE ADDRESS PUSH HL ; SAVE THE EXECUTE ADDRESS
EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE 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 LDIR ; CODE TO THE BUFFER
POP HL ; CALL OUR RELOCATABLE CODE POP HL ; CALL OUR RELOCATABLE CODE
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)
CALL PRTHEXWORD
#ENDIF
; ;
HB_DI HB_DI
CALL JPHL ; EXECUTE FF_IDENT
CALL JPHL ; EXECUTE RELOCATED CODE
HB_EI HB_EI
; ;
LD HL,(FF_STACK) ; RESTORE ORIGINAL LD HL,(FF_STACK) ; RESTORE ORIGINAL
LD SP,HL ; STACK POSITION 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 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 ; FLASH IDENTIFY
@ -201,7 +318,7 @@ FF_IINIT:
; NO STATUS IS RETURNED ; 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 PUSH AF ; SAVE CURRENT BANK
LD A,B ; SELECT 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. ; FLASH CHIP ERASE.
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY 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 ; COPY FLASH CODE TO CODE BUFFER
; CALL RELOCATED FLASH ERASE CODE ; CALL RELOCATED FLASH ERASE CODE
; RESTORE STACK ; RESTORE STACK
@ -239,34 +356,10 @@ FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
;====================================================================== ;======================================================================
; ;
FF_EINIT: 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. ; ERASE FLASH CHIP.
@ -282,7 +375,7 @@ FF_EINIT:
; A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ; 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 PUSH AF ; SAVE CURRENT BANK
LD A,B ; SELECT BANK LD A,B ; SELECT BANK
@ -379,7 +472,7 @@ FF_CALCA:
; ;
; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. ; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS.
; CALCULATE BANK AND ADDRESS DATA FROM ENTRY 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 ; COPY FLASH CODE TO CODE BUFFER
; CALL RELOCATED FLASH ERASE CODE ; CALL RELOCATED FLASH ERASE CODE
; RESTORE STACK ; RESTORE STACK
@ -390,46 +483,10 @@ FF_CALCA:
;====================================================================== ;======================================================================
; ;
FF_SINIT: 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. ; ERASE FLASH SECTOR.
@ -444,7 +501,7 @@ 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 THE STACK
FF_SERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
; ;
PUSH AF ; SAVE CURRENT BANK PUSH AF ; SAVE CURRENT BANK
LD A,B ; SELECT 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 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 ; SET ADDRESS TO START OF SECTOR
; CALCULATE BANK AND ADDRESS DATA FROM SECTOR START ADDRESS ; 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 ; COPY FLASH CODE TO CODE BUFFER
; CALL RELOCATED FLASH WRITE SECTOR CODE
; CALL RELOCATED FLASH READ SECTOR CODE
; RESTORE STACK ; RESTORE STACK
; ;
; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. ; 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 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
; ;
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 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. ; FLASH WRITE SECTOR.
; ;
@ -569,11 +670,9 @@ 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 THE STACK
FF_SWRITE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
; ;
PUSH AF ; SAVE CURRENT BANK PUSH AF ; SAVE CURRENT BANK
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
; ;
LD H,C ; SECTOR LD H,C ; SECTOR
LD L,$00 ; ADDRESS LD L,$00 ; ADDRESS
@ -581,7 +680,14 @@ FF_SWRITE: ; THIS CODE GETS RELOCATED TO THE STACK
LD E,L ; BYTE COUNT LD E,L ; BYTE COUNT
; ;
FF_WR1: FF_WR1:
POP AF ; SELECT BANK
PUSH AF ; TO READ
CALL HBX_BNKSEL
;
LD C,(IX+0) ; READ IN BYTE LD C,(IX+0) ; READ IN BYTE
;
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
; ;
LD A,$AA ; COMMAND LD A,$AA ; COMMAND
LD ($5555),A ; SETUP LD ($5555),A ; SETUP
@ -671,6 +777,13 @@ FF_STACK: .DW 0
; ;
;====================================================================== ;======================================================================
; ;
; 4K FLASH BUFFER
;
;======================================================================
;
FF_BUFFER .FILL 4096,$FF
;======================================================================
;
; RELOCATABLE CODE SPACE REQUIREMENTS ; RELOCATABLE CODE SPACE REQUIREMENTS
; ;
;====================================================================== ;======================================================================
@ -689,7 +802,10 @@ FF_CSIZE .SET FF_E_SZ
#IF (FF_I_SZ>FF_CSIZE) #IF (FF_I_SZ>FF_CSIZE)
FF_CSIZE .SET FF_I_SZ FF_CSIZE .SET FF_I_SZ
#ENDIF #ENDIF
#IF (FF_R_SZ>FF_CSIZE)
FF_CSIZE .SET FF_R_SZ
#ENDIF
; ;
.ECHO "FF requires " .ECHO "FF requires "
.ECHO FF_CSIZE .ECHO FF_CSIZE
.ECHO " bytes stack space.\n"
.ECHO " bytes high memory space.\n"

Loading…
Cancel
Save