diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 5aa03942..6e9def1b 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -25,6 +25,9 @@ MD_AROM .EQU %00100000 ; ROM ATTRIBUTE MD_ARAM .EQU %00101000 ; RAM ATTRIBUTE MD_AFSH .EQU %00111000 ; FLASH ATTRIBUTE ; +MD_FDBG .EQU 0 ; FLASH DEBUG CODE +MD_FVBS .EQU 1 ; FLASH VERBOSE OUTPUT +; ; DEVICE CONFIG TABLE (RAM DEVICE FIRST TO MAKE IT ALWAYS FIRST DRIVE) ; MD_CFGTBL: @@ -50,7 +53,7 @@ MD_CFGTBL: ; ; MD_INIT: - CALL FF_INIT ; PROBE FLASH CAPABILITY + CALL MD_FINIT ; PROBE FLASH CAPABILITY CALL NEWLINE ; FORMATTING PRTS("MD: UNITS=2 $") @@ -64,7 +67,7 @@ MD_INIT: ; ; SETUP THE DIO TABLE ENTRIES ; - LD A,(FF_RW) ; IF FLASH + LD A,(MD_FFSEN) ; IF FLASH OR A ; FILESYSTEM JR NZ,MD_IN1 ; CAPABLE, LD A,MD_AFSH ; UPDATE ROM DIO @@ -274,28 +277,54 @@ MD_RW3: ; READ FLASH ; MD_RDSECF: ; CALLED FROM MD_RW - CALL MD_IOSETUPF +; + CALL MD_IOSETUPF ; SETUP SOURCE ADDRESS +; + PUSH HL ; IS THE SECTOR + LD HL,(MD_LBA4K) ; WE WANT TO + XOR A ; WRITE ALREADY + SBC HL,BC ; IN THE 4K + POP HL ; BLOCK WE HAVE + JR Z,MD_SECM ; IN THE BUFFER +; +MD_SECR: + ; DESIRED SECTOR + ; IS NOT IN BUFFER + LD (MD_LBA4K),BC ; WE WILL READ IN + ; A NEW 4K SECTOR. + ; SAVE THE 4K LBA + ; FOR FUTURE CHECKS +; + ; DE:HL CONTAIN SOURCE ADDRESS + ; WHICH WAS SETUP BY MD_IOSETUPF + PUSH IX + LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS + CALL MD_FREAD ; READ 4K SECTOR + POP IX +; +MD_SECM: LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK AND %00000111 ; AND CALCULATE OFFSET OFFSET ADD A,A LD D,A ; FROM THE START LD E,0 ; - LD HL,FF_BUFFER ; POINT TO THE SECTOR WE + LD HL,MD_F4KBUF ; POINT TO THE SECTOR WE ADD HL,DE ; WANT TO COPY LD DE,(MD_DSKBUF) - LD BC,512 - LDIR + LD BC,512 ; COPY ONE 512B SECTOR FROM THE + LDIR ; 4K SECTOR TO THE DISK BUFFER ; XOR A RET ; +; SETUP DE:HL AS THE SECTOR ADDRESS TO READ OR WRITE ; +; ON EXIT +; BC = LBA 4K BLOCK WE ARE ACCESSING +; DE:HL = MEMORY ADDRESS TO READ FROM IN FLASH ; MD_IOSETUPF: - PUSH DE - PUSH HL - PUSH IY LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA LD H,(IY+MD_LBA+1) INC H ; SKIP FIRST 128MB (256 SECTORS) @@ -303,7 +332,7 @@ MD_IOSETUPF: LD A,L ; SAVE LBA 4K AND %11111000 ; BLOCK WE ARE LD C,A ; GOING TO - LD B,H ; ACCESS + LD A,H ; ACCESS ; LD D,0 ; CONVERT LBA LD E,H ; TO ADDRESS @@ -313,33 +342,6 @@ MD_IOSETUPF: RL E RL D ; - PUSH HL ; IS THE SECTOR - LD HL,MD_LBA4K ; WE WANT TO - LD A,C ; READ ALREADY - CP (HL) ; IN THE 4K - JR NZ,MD_SECR ; BLOCK WE HAVE - INC HL ; IN THE BUFFER - LD A,B - CP (HL) - JR Z,MD_SECM -; -MD_SECR: - POP HL ; DESIRED SECTOR - ; IS NOT IN BUFFER - LD (MD_LBA4K),BC ; WE WILL READ IN - ; A NEW 4K SECTOR. - ; SAVE THE 4K LBA - ; FOR FUTURE CHECKS -; - LD IX,FF_BUFFER ; SET DESTINATION ADDRESS - CALL FF_RINIT ; READ 4K SECTOR -; - PUSH HL -; -MD_SECM:POP HL - POP IY - POP HL - POP DE RET ; MD_LBA4K .DW $FFFF ; LBA OF CURRENT SECTOR @@ -378,9 +380,65 @@ MD_RDSEC: ; ; WRITE FLASH ; -MD_WRSECF: - CALL MD_WRSEC +MD_WRSECF: ; CALLED FROM MD_RW + CALL MD_IOSETUPF ; SETUP DESTINATION ADDRESS +; + PUSH HL ; IS THE SECTOR + LD HL,(MD_LBA4K) ; WE WANT TO + XOR A ; WRITE ALREADY + SBC HL,BC ; IN THE 4K + POP HL ; BLOCK WE HAVE + JR Z,MD_SECM1 ; IN THE BUFFER +; + LD (MD_LBA4K),BC ; SAVE 4K LBA +; + CALL PC_COLON + PUSH IX + LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS + CALL MD_FREAD ; READ 4K SECTOR + POP IX + CALL PC_COLON +; +MD_SECM1: ; DESIRED SECTOR IS IN BUFFER + CALL PC_ASTERISK + PUSH IX + CALL MD_FERAS ; ERASE 4K SECTOR + POP IX + CALL PC_ASTERISK +; + PUSH HL + PUSH DE + ; + ; COPY 512B SECTOR INTO 4K SECTOR + ; + LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK + AND %00000111 ; AND CALCULATE OFFSET OFFSET + ADD A,A + LD D,A ; FROM THE START + LD E,0 +; + LD HL,MD_F4KBUF ; POINT TO THE SECTOR WE + ADD HL,DE ; WANT TO COPY + EX DE,HL +; + LD HL,(MD_DSKBUF) + LD BC,512 ; COPY ONE 512B SECTOR FROM THE + LDIR ; THE DISK BUFFER TO 4K SECTOR +; + POP DE + POP HL +; + CALL PC_COLON + PUSH IX + LD IX,MD_F4KBUF ; WRITE THE SECTOR + CALL MD_FWRIT + POP IX + CALL PC_COLON +; PRTS("wf$"); + + XOR A + RET ; ; WRITE RAM @@ -525,16 +583,8 @@ MD_PRT: RET #ENDIF ; -; -; ;================================================================================================== -; FLASH DRIVER FOR FLASH & EEPROM PROGRAMMING -; -; 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 +; FLASH DRIVERS ;================================================================================================== ; ; UPPER RAM BANK IS ALWAYS AVAILABLE REGARDLESS OF MEMORY BANK SELECTION. @@ -550,9 +600,6 @@ MD_PRT: ; ;================================================================================================== ; -FF_DBG: .EQU 0 ; DEBUG -; -FF_RW .DB 00h ; READ WRITE FLAG FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM ; ;====================================================================== @@ -562,13 +609,13 @@ FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM ; USES MEMORY SIZE DEFINED BY BUILD CONFIGURATION. ;====================================================================== ; -; -FF_INIT: -; CALL NEWLINE ; DISLAY NUMBER -; PRTS("FF: UNITS=$") ; OF UNITS -; LD A,+(ROMSIZE/512) ; CONFIGURED FOR. -; CALL PRTDECB -; +MD_FINIT: +#IF (MD_FVBS==1) + CALL NEWLINE ; DISLAY NUMBER + PRTS("MD: FLASH=$") ; OF UNITS + LD A,+(ROMSIZE/512) ; CONFIGURED FOR. + CALL PRTDECB +#ENDIF LD B,A ; NUMBER OF DEVICES TO PROBE LD C,$00 ; START ADDRESS IS 0000:0000 IN DE:HL FF_PROBE: @@ -578,28 +625,31 @@ FF_PROBE: LD L,D ; ON EACH CYCLE THROUGH ; PUSH BC -; CALL PC_SPACE -; LD A,+(ROMSIZE/512)+1 -; SUB B ; PRINT -; CALL PRTDECB ; DEVICE -; LD A,'=' ; NUMBER -; CALL COUT - CALL FF_IINIT ; GET ID AT THIS ADDRESS -; +#IF (MD_FVBS==1) + CALL PC_SPACE + LD A,+(ROMSIZE/512)+1 + SUB B ; PRINT + CALL PRTDECB ; DEVICE + LD A,'=' ; NUMBER + CALL COUT +#ENDIF + CALL MD_FIDENT ; GET ID AT THIS ADDRESS + PUSH HL - PUSH DE +; PUSH DE LD H,FF_TGT&$FF ; IF WE MATCH WITH LD L,FF_TGT/$FF - CCF ; A NON 39SF040 - SBC HL,DE ; CHIP SET THE - LD A,(FF_RW) ; R/W FLAG TO R/O + CCF ; A NON 39SF040 + SBC HL,BC ; CHIP SET THE + LD A,(MD_FFSEN) ; R/W FLAG TO R/O OR H OR L - LD (FF_RW),A ; A NON ZERO VALUE - POP DE ; MEANS WE CAN'T + LD (MD_FFSEN),A ; A NON ZERO VALUE +; POP DE ; MEANS WE CAN'T POP HL ; ENABLE FLASH WRITING -; -; CALL FF_LAND ; LOOKUP AND DISPLAY +#IF (MD_FVBS==1) + CALL FF_LAND ; LOOKUP AND DISPLAY +#ENDIF POP BC ; LD A,C ; UPDATE ADDRESS @@ -607,43 +657,43 @@ FF_PROBE: LD C,A ; DJNZ FF_PROBE ; ALWAYS AT LEAST ONE DEVICE -; -; LD A,(FF_RW) -; OR A -; JR NZ,FF_PR1 -; CALL PRTSTRD -; .TEXT " FLASH FILESYSTEM ENABLED$" -;FF_PR1: -; +#IF (MD_FVBS==1) + LD A,(MD_FFSEN) + OR A + JR NZ,MD_PR1 + CALL PRTSTRD + .TEXT " FLASH FILE SYSTEM ENABLED$" +MD_PR1: +#ENDIF XOR A ; INIT SUCCEEDED RET ; ;====================================================================== ; LOOKUP AND DISPLAY CHIP ; -; ON ENTRY DE CONTAINS CHIP ID +; ON ENTRY BC CONTAINS CHIP ID ; ON EXIT A CONTAINS STATUS 0=SUCCESS, NZ=NOT IDENTIFIED ;====================================================================== ; FF_LAND: ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) PRTS(" ID:$") - LD H,E - LD L,D - CALL PRTHEXWORDHL ; DISPLAY FLASH ID +; LD H,C +; LD L,B + CALL PRTHEXWORD ; DISPLAY FLASH ID CALL PC_SPACE #ENDIF ; LD HL,FF_TABLE ; SEARCH THROUGH THE FLASH - LD BC,FF_T_CNT ; TABLE TO FIND A MATCH + LD DE,FF_T_CNT ; TABLE TO FIND A MATCH FF_NXT1:LD A,(HL) - CP D + CP B JR NZ,FF_NXT0 ; FIRST BYTE DOES NOT MATCH ; INC HL LD A,(HL) - CP E + CP C DEC HL JR NZ,FF_NXT0 ; SECOND BYTE DOES NOT MATCH ; @@ -656,14 +706,17 @@ FF_NXT0:PUSH BC ; WE DIDN'T MATCH SO POINT ADD HL,BC POP BC ; - LD A,B ; CHECK IF WE REACHED THE - OR C ; END OF THE TABLE - DEC BC + LD A,D ; CHECK IF WE REACHED THE + OR E ; END OF THE TABLE + DEC DE JR NZ,FF_NXT1 ; NOT AT END YET ; - LD HL,FF_UNKNOWN ; WE REACHED THE END WITHOUT A MATCH + LD HL,MD_UNKNOWN ; WE REACHED THE END WITHOUT A MATCH ; -FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT +FF_NXT2: +#IF (MD_FVBS==1) + CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT +#ENDIF RET ;====================================================================== ;COMMON FUNCTION CALL @@ -686,15 +739,16 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA PUSH IY ; PUT BANK AND SECTOR POP BC ; DATA IN BC ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) CALL PRTHEXWORD #ENDIF ; + LD DE,0 HB_DI CALL HBX_BUF ; EXECUTE RELOCATED CODE HB_EI ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) CALL PC_SPACE CALL PRTHEXWORD CALL PC_SPACE @@ -705,8 +759,10 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA #ENDIF ; LD A,C ; RETURN WITH STATUS IN A -; - RET + POP DE + POP HL + POP IY + RET ; RETURN TO MD_READF, MD_WRITEF ; ;====================================================================== ; IDENTIFY FLASH CHIP. @@ -719,14 +775,19 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA ; ; 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. +; ON EXIT BC CONTAINS THE CHIP ID BYTES. ; NO STATUS IS RETURNED ;====================================================================== ; -FF_IINIT: +MD_FIDENT: + PUSH IY + PUSH HL + PUSH DE +; PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_IDENT ; PUT ROUTINE TO CALL + LD HL,MD_FIDENT_R ; PUT ROUTINE TO CALL EX (SP),HL ; ON THE STACK +; JP FF_FNCALL ; EXECUTE ; ;====================================================================== @@ -739,13 +800,17 @@ FF_IINIT: ; ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; A CONTAINS CURRENT BANK -; ON EXIT DE CONTAINS ID WORD +; ON EXIT BC CONTAINS ID WORD ; NO STATUS IS RETURNED ;====================================================================== ; -FF_IDENT: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + LD (HBX_BUF+MD_FIST-MD_FIDENT_R),SP ; SAVE STACK + LD SP,HBX_BUF + (MD_FIST-MD_FIDENT_R) ; SETUP TEMP STACK ; PUSH AF ; SAVE CURRENT BANK +; LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM ; @@ -755,17 +820,21 @@ FF_IDENT: ; THIS CODE GETS RELOCATED TO HIGH MEMORY LD ($2AAA),A ; LD ($2AAA),A LD (HL),$90 ; LD A,$90 ; ; LD ($5555),A - LD DE,($0000) ; READ ID + LD BC,($0000) ; READ ID ; LD A,$F0 ; ; EXIT LD (HL),A ; LD ($5555),A ; COMMAND ; POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + LD SP,(HBX_BUF + (MD_FIST-MD_FIDENT_R)) ; RESTORE STACK ; RET ; -FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED + .FILL 8,0 ; STACK SPACE +MD_FIST .DW 0 ; SAVE STACK +MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS @@ -784,7 +853,7 @@ FF_I_SZ .EQU $-FF_IDENT ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; FF_CALCA: ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) CALL PC_SPACE ; DISPLAY SECTOR CALL PRTHEX32 ; SECTOR ADDRESS CALL PC_SPACE ; IN DE:HL @@ -804,7 +873,7 @@ FF_CALCA: PUSH BC POP IY ; -#IF (FF_DBG==1) +#IF (MD_FDBG==1) CALL PRTHEXWORD ; DISPLAY BANK AND CALL PC_SPACE ; SECTOR RESULT #ENDIF @@ -828,9 +897,13 @@ FF_CALCA: ; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== ; -FF_SINIT: +MD_FERAS: + PUSH IY + PUSH HL + PUSH DE +; PUSH HL ; SAVE ADDRESS INFO - LD HL,FF_SERASE ; PUT ROUTINE TO CALL + LD HL,MD_FERAS_R ; PUT ROUTINE TO CALL EX (SP),HL ; ON THE STACK JP FF_FNCALL ; EXECUTE ; @@ -847,23 +920,55 @@ FF_SINIT: ; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== ; -FF_SERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; + LD (HBX_BUF+MD_FEST-MD_FERAS_R),SP ; SAVE STACK + LD SP,HBX_BUF + (MD_FERAS_S-MD_FERAS_R) ; SETUP TEMP STACK +; + LD HL,$5555 ; LD A,$AA ; COMMAND + LD DE,$2AAA ;+3 +MD_FERAS_S PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM ; - LD HL,$5555 ; LD A,$AA ; COMMAND +; LD HL,$5555 ; LD A,$AA ; COMMAND +; LD A,L ; LD ($5555),A ; SETUP +; LD (HL),$AA ; LD A,$55 +; LD ($2AAA),A ; LD ($2AAA),A +; LD (HL),$80 ; LD A,$80 +; LD (HL),$AA ; LD ($5555),A +; LD ($2AAA),A ; LD A,$AA + ; LD ($5555),A + ; LD A,$55 + ; LD ($2AAA),A +; +; LD HL,$5555 ; LD A,$AA ; COMMAND +; LD DE,$2AAA ;+3 +; LD A,L ; LD ($5555),A ; SETUP +; LD (HL),$AA ; LD A,$55 +; LD (DE),A ;-2 ; LD ($2AAA),A +; LD (HL),$80 ; LD A,$80 +; LD (HL),$AA ; LD ($5555),A +; LD (DE),A ;-2 ; LD A,$AA + ; LD ($5555),A + ; LD A,$55 + ; LD ($2AAA),A +; +; LD HL,$5555 ; LD A,$AA ; COMMAND +; LD DE,$2AAA ;+3 LD A,L ; LD ($5555),A ; SETUP - LD (HL),$AA ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A + LD (HL),E ;-1 ; LD A,$55 + LD (DE),A ;-2 ; LD ($2AAA),A LD (HL),$80 ; LD A,$80 - LD (HL),$AA ; LD ($5555),A - LD ($2AAA),A ; LD A,$AA + LD (HL),E ;-1 ; LD ($5555),A + LD (DE),A ;-2 ; LD A,$AA ; LD ($5555),A ; LD A,$55 ; LD ($2AAA),A + + LD H,C ; SECTOR LD L,$00 ; ADDRESS ; @@ -889,17 +994,20 @@ FF_WT4: LD C,(HL) ; FROM THE SAME FLASH ADDRESS. BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED JR Z,FF_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. ; - LD (HL),$F0 ; WRITE DEVICE RESET - LD C,$FF ; SET FAIL STATUS +; LD (HL),$F0 ; WRITE DEVICE RESET +; LD C,$FF ; SET FAIL STATUS JR FF_WT6 ; -FF_WT5: LD C,0 ; SET SUCCESS STATUS +FF_WT5: LD C,L ; SET SUCCESS STATUS FF_WT6: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + LD SP,(HBX_BUF + (MD_FEST-MD_FERAS_R)) ; RESTORE STACK ; RET ; -FF_S_SZ .EQU $-FF_SERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +MD_FEST .DW 0 +MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; READ FLASH SECTOR OF 4096 BYTES @@ -915,14 +1023,18 @@ FF_S_SZ .EQU $-FF_SERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; IX POINTS TO WHERE TO SAVE DATA ;====================================================================== ; -FF_RINIT: +MD_FREAD: + PUSH IY + PUSH HL + PUSH DE +; 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_SREAD ; PUT ROUTINE TO CALL + LD HL,MD_FREAD_R ; PUT ROUTINE TO CALL EX (SP),HL ; ON THE STACK JP FF_FNCALL ; EXECUTE ; @@ -942,19 +1054,20 @@ FF_RINIT: ; ON EXIT NO STATUS RETURNED ;====================================================================== ; -FF_SREAD: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; LD H,C ; SECTOR LD L,$00 ; ADDRESS - LD D,L ; INITIALIZE - LD E,L ; BYTE COUNT +; LD D,L ; INITIALIZE +; LD E,L ; BYTE COUNT ; - LD (FF_RST),SP ; SAVE STACK - LD SP,HBX_BUF + (FF_RD1-FF_SREAD) ; SETUP TEMP STACK + LD (HBX_BUF+MD_FRST-MD_FREAD_R),SP ; SAVE STACK +MD_FRD_S: + LD SP,HBX_BUF + (MD_FRD_S-MD_FREAD_R) ; SETUP TEMP STACK ; PUSH AF ; SAVE CURRENT BANK ; -FF_RD1: +MD_FRD1: LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO READ LD C,(HL) ; READ BYTE @@ -969,17 +1082,18 @@ FF_RD1: ; INC DE ; CONTINUE READING UNTIL BIT 4,D ; WE HAVE DONE ONE SECTOR - JR Z,FF_RD1 + JR Z,MD_FRD1 POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY ; LD C,D ; RETURN STATUS - LD SP,(FF_RST) ; RESTORE STACK +; + LD SP,(HBX_BUF+MD_FRST-MD_FREAD_R) ; RESTORE STACK ; RET -FF_RST .DW 0 ; SAVE STACK ; -FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +MD_FRST .DW 0 ; SAVE STACK +MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; WRITE FLASH SECTOR OF 4096 BYTES @@ -995,14 +1109,18 @@ FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; IX POINTS TO DATA TO BE WRITTEN ;====================================================================== ; -FF_WINIT: +MD_FWRIT: + PUSH IY + PUSH HL + PUSH DE +; 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 + LD HL,MD_FWRIT_R ; PUT ROUTINE TO CALL EX (SP),HL ; ON THE STACK JP FF_FNCALL ; EXECUTE ; @@ -1021,16 +1139,22 @@ FF_WINIT: ; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== ; -FF_SWRITE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY ; - PUSH AF ; SAVE CURRENT BANK +MD_FWST .EQU $+2 ; SAVE STACK ; LD H,C ; SECTOR LD L,$00 ; ADDRESS - LD D,L ; INITIALIZE - LD E,L ; BYTE COUNT +; LD D,L ; INITIALIZE +; LD E,L ; BYTE COUNT + + LD (HBX_BUF+MD_FWST-MD_FWRIT_R),SP ; SAVE STACK + LD SP, HBX_BUF+(MD_FWRIT_S-MD_FWRIT_R) ; SETUP TEMP STACK +MD_FWRIT_S: ; -FF_WR1: + PUSH AF ; SAVE CURRENT BANK +; +MD_FWRI1: POP AF ; SELECT BANK PUSH AF ; TO READ CALL HBX_BNKSEL @@ -1052,24 +1176,26 @@ FF_WR1: ; ; ; DO TWO SUCCESSIVE READS LD A,(HL) ; FROM THE SAME FLASH ADDRESS. -FF_WT7: LD C,(HL) ; IF TOGGLE BIT (BIT 6) +MD_FW7: LD C,(HL) ; IF TOGGLE BIT (BIT 6) XOR C ; IS THE SAME ON BOTH READS - BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. - JR NZ,FF_WT7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. + BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT. + JR NZ,MD_FW7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. ; INC HL ; NEXT DESTINATION LOCATION INC IX ; NEXT SOURCE LOCATION ; INC DE ; CONTINUE WRITING UNTIL BIT 4,D ; WE HAVE DONE ONE SECTOR - JR Z,FF_WR1 + JR Z,MD_FWRI1 ; POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; + LD SP,(HBX_BUF+MD_FWST-MD_FWRIT_R) ; RESTORE STACK ; RET ; -FF_W_SZ .EQU $-FF_SWRITE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED +MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== ; @@ -1104,7 +1230,7 @@ FF_CHIP(0C2A4H,"MX29F040$ ") ; FF_T_CNT .EQU 17 FF_T_SZ .EQU ($-FF_TABLE) / FF_T_CNT -FF_UNKNOWN .DB "UNKNOWN$" +MD_UNKNOWN .DB "UNKNOWN$" FF_STACK: .DW 0 ; ;====================================================================== @@ -1113,7 +1239,20 @@ FF_STACK: .DW 0 ; ;====================================================================== ; -FF_BUFFER .FILL 4096,$FF +MD_F4KBUF .FILL 4096,$FF +MD_RWFNADR .DW 0 +MD_DSKBUF .DW 0 +MD_SRCBNK .DB 0 +MD_DSTBNK .DB 0 +MD_SRC .DW 0 +MD_DST .DW 0 +MD_LEN .DW 0 +MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE +; +MDSTR_PREFIX .TEXT "MD:$" +MDSTR_SRC .TEXT "SRC=$" +MDSTR_DST .TEXT "DEST=$" +MDSTR_LEN .TEXT "LEN=$" ; ;====================================================================== ; @@ -1121,36 +1260,37 @@ FF_BUFFER .FILL 4096,$FF ; ;====================================================================== ; -FF_CSIZE .EQU 0 + .ECHO "MD_FIDENT_R " + .ECHO MD_I_SZ + .ECHO "\n" +; + .ECHO "MD_FREAD_R " + .ECHO MD_R_SZ + .ECHO "\n" +; + .ECHO "MD_FERAS_R " + .ECHO MD_S_SZ + .ECHO "\n" + + .ECHO "MD_FWRIT_R " + .ECHO MD_W_SZ + .ECHO "\n" +; +MD_CSIZE .EQU 0 ; -#IF (FF_W_SZ>FF_CSIZE) -FF_CSIZE .SET FF_W_SZ +#IF (MD_W_SZ>MD_CSIZE) +MD_CSIZE .SET MD_W_SZ #ENDIF -#IF (FF_S_SZ>FF_CSIZE) -FF_CSIZE .SET FF_S_SZ +#IF (MD_S_SZ>MD_CSIZE) +MD_CSIZE .SET MD_S_SZ #ENDIF -#IF (FF_I_SZ>FF_CSIZE) -FF_CSIZE .SET FF_I_SZ +#IF (MD_I_SZ>MD_CSIZE) +MD_CSIZE .SET MD_I_SZ #ENDIF -#IF (FF_R_SZ>FF_CSIZE) -FF_CSIZE .SET FF_R_SZ +#IF (MD_R_SZ>MD_CSIZE) +MD_CSIZE .SET MD_R_SZ #ENDIF ; .ECHO "FF requires " - .ECHO FF_CSIZE + .ECHO MD_CSIZE .ECHO " bytes high memory space.\n" - -MD_RWFNADR .DW 0 -; -MD_DSKBUF .DW 0 -; -MD_SRCBNK .DB 0 -MD_DSTBNK .DB 0 -MD_SRC .DW 0 -MD_DST .DW 0 -MD_LEN .DW 0 -; -MDSTR_PREFIX .TEXT "MD:$" -MDSTR_SRC .TEXT "SRC=$" -MDSTR_DST .TEXT "DEST=$" -MDSTR_LEN .TEXT "LEN=$" \ No newline at end of file