diff --git a/Source/HBIOS/flashfs.asm b/Source/HBIOS/flashfs.asm index 9c93111c..bfeee959 100644 --- a/Source/HBIOS/flashfs.asm +++ b/Source/HBIOS/flashfs.asm @@ -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"