Browse Source

Update flashfs.asm

Create common funtion. Add read sector capability
pull/159/head
b1ackmai1er 5 years ago
parent
commit
90bc8c9ef5
  1. 288
      Source/HBIOS/flashfs.asm

288
Source/HBIOS/flashfs.asm

@ -6,6 +6,7 @@
; - 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
@ -30,7 +31,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 +44,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 +72,7 @@ FF_PROBE:
;
FF_TESTING:
;
#IF (1)
#IF (0)
LD DE,$0008 ; SET
LD HL,$0000 ; ADDRESS
CALL FF_EINIT ; CHIP ERASE
@ -85,12 +86,23 @@ 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 (0)
LD DE,$0007 ; SET SOURCE
LD HL,$F000 ; 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,52 +154,80 @@ 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:
FF_FNCALL:
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 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
;
;======================================================================
; 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
; SELECT THE APPROPRIATE BANK / ADDRESS
; ISSUE ID COMMAND
@ -201,7 +241,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 +268,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 +279,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 +298,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 +395,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 +406,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 +424,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 +479,107 @@ 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
;
; *** SOURCE DATA MUST BE IN UPPER MEMORY
;
; 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,7 +595,7 @@ 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
@ -671,6 +697,13 @@ FF_STACK: .DW 0
;
;======================================================================
;
; 4K FLASH BUFFER
;
;======================================================================
;
FF_BUFFER .FILL 4096,$FF
;======================================================================
;
; RELOCATABLE CODE SPACE REQUIREMENTS
;
;======================================================================
@ -689,6 +722,9 @@ 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

Loading…
Cancel
Save