diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index ac1fd6e8..75e1dd6e 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -261,7 +261,13 @@ MD_RW: MD_RW1: PUSH BC ; SAVE COUNTERS LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS +#IF (MDFFENABLE) + PUSH IX CALL JPHL ; ... AND CALL IT + POP IX +#ELSE + CALL JPHL ; ... AND CALL IT +#ENDIF JR NZ,MD_RW2 ; IF ERROR, SKIP INCREMENT ; INCREMENT LBA LD A,MD_LBA ; LBA OFFSET IN CFG ENTRY @@ -297,7 +303,7 @@ MD_RDSECF: ; CALLED FROM MD_RW POP HL ; BLOCK WE HAVE JR Z,MD_SECM ; IN THE BUFFER ; -MD_SECR: +;MD_SECR: ; DESIRED SECTOR ; IS NOT IN BUFFER LD (MD_LBA4K),BC ; WE WILL READ IN @@ -307,10 +313,10 @@ MD_SECR: ; ; 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 + LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL + CALL FF_FNCALL ; EXECUTE: READ 4K SECTOR ; MD_SECM: LD A,(IY+MD_LBA+0) ; GET SECTOR WITHIN 4K BLOCK @@ -332,7 +338,7 @@ MD_SECM: ; ; ON EXIT ; BC = LBA 4K BLOCK WE ARE ACCESSING -; DE:HL = MEMORY ADDRESS TO READ FROM IN FLASH +; DE:HL = MEMORY ADDRESS TO ACCESS IN FLASH ; MD_IOSETUPF: LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA @@ -369,15 +375,13 @@ MD_WRSECF: ; CALLED FROM MD_RW ; LD (MD_LBA4K),BC ; SAVE 4K LBA ; - PUSH IX LD IX,MD_F4KBUF ; SET DESTINATION ADDRESS - CALL MD_FREAD ; READ 4K SECTOR - POP IX + LD BC,MD_FREAD_R ; PUT ROUTINE TO CALL + CALL FF_FNCALL ; EXECUTE: READ 4K SECTOR ; MD_SECM1: ; DESIRED SECTOR IS IN BUFFER - PUSH IX - CALL MD_FERAS ; ERASE 4K SECTOR - POP IX + LD BC,MD_FERAS_R ; PUT ROUTINE TO CALL + CALL FF_FNCALL ; EXECUTE: ERASE 4K SECTOR OR A RET NZ ; RETURN IF ERROR ; @@ -403,10 +407,9 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER POP DE POP HL ; - PUSH IX - LD IX,MD_F4KBUF ; WRITE THE SECTOR - CALL MD_FWRIT - POP IX + LD IX,MD_F4KBUF ; SET SOURCE ADDRESS + LD BC,MD_FWRIT_R ; PUT ROUTINE TO CALL + CALL FF_FNCALL ; EXECUTE: WRITE 4K SECTOR ; XOR A ; @@ -648,18 +651,17 @@ FF_PROBE: LD A,'=' ; NUMBER CALL COUT #ENDIF - CALL MD_FIDENT ; GET ID AT THIS ADDRESS + LD BC,MD_FIDENT_R ; PUT ROUTINE TO CALL + CALL FF_FNCALL ; EXECUTE: IDENTIFY FLASH CHIP PUSH HL -; PUSH DE LD HL,MD_TGTDEV ; IF WE MATCH WITH XOR A ; A NON 39SF040 SBC HL,BC ; CHIP SET THE LD A,(MD_FFSEN) ; R/W FLAG TO R/O OR H - OR L - LD (MD_FFSEN),A ; A NON ZERO VALUE -; POP DE ; MEANS WE CAN'T + OR L ; A NON ZERO VALUE + LD (MD_FFSEN),A ; MEANS WE CAN'T POP HL ; ENABLE FLASH WRITING #IF (MD_FVBS==1) CALL MD_LAND ; LOOKUP AND DISPLAY @@ -693,8 +695,6 @@ MD_LAND: ; #IF (MD_FDBG==1) PRTS(" ID:$") -; LD H,C -; LD L,B CALL PRTHEXWORD ; DISPLAY FLASH ID CALL PC_SPACE #ENDIF @@ -732,15 +732,45 @@ FF_NXT2: CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT #ENDIF RET +; ;====================================================================== -;COMMON FUNCTION CALL +; COMMON FUNCTION CALL FOR: +; +; MD_FIDENT_R - IDENTIFY FLASH CHIP +; ON ENTRY DE:HL POINTS TO AN ADDRESS WITH THE ADDRESS RANGE OF THE +; CHIP TO BE IDENTIFIED. +; ON EXIT BC CONTAINS THE CHIP ID BYTES. +; A NO STATUS IS RETURNED +; +; MD_FERAS_R - ERASE FLASH SECTOR +; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. +; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL +; +; MD_FREAD_R - READ FLASH SECTOR +; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. +; IX POINTS TO WHERE TO SAVE DATA +; ON EXIT A NO STATUS IS RETURNED + +; MD_FWRIT_R - WRITE FLASH SECTOR +; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. +; IX POINTS TO DATA TO BE WRITTEN +; ON EXIT A NO STATUS IS RETURNED ; +; GENERAL OPERATION: +; CALCULATE BANK AND ADDRESS DATA FROM ENTRY ADDRESS +; COPY FLASH CODE TO CODE BUFFER +; CALL RELOCATED FLASH CODE +; RETURN WITH ID CODE. ;====================================================================== ; -FF_FNCALL: ; USING HBX_BUF FOR CODE AREA - CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY +FF_FNCALL: + PUSH HL ; USING HBX_BUF FOR CODE AREA + PUSH DE + PUSH BC + CALL FF_CALCA ; GET BANK AND SECTOR DATA IN BC ; POP HL ; GET ROUTINE TO CALL + PUSH BC ; LD DE,HBX_BUF ; EXECUTE / START ADDRESS LD BC,HBX_BUFSIZ ; MAX. CODE SIZE POSSIBLE @@ -749,8 +779,7 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA LD D,B ; PRESET DE TO ZERO TO REDUCE LD E,B ; CODE SIZE IN RELOCATABLE CODE ; - PUSH IY ; PUT BANK AND SECTOR - POP BC ; DATA IN BC + POP BC ; PUT BANK AND SECTOR DATA IN BC ; #IF (MD_FDBG==1) CALL PRTHEXWORD @@ -773,15 +802,14 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA LD A,C ; RETURN WITH STATUS IN A POP DE POP HL - POP IY RET ; RETURN TO MD_READF, MD_WRITEF ; ;====================================================================== ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS ; ; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. -; ON EXIT I,B CONTAINS BANK SELECT BYTE -; Y,C CONTAINS HIGH BYTE OF SECTOR ADDRESS +; ON EXIT B CONTAINS BANK SELECT BYTE +; C CONTAINS HIGH BYTE OF SECTOR ADDRESS ; A CONTAINS CURRENT BANK HB_CURBNK ; ; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL @@ -809,9 +837,6 @@ FF_CALCA: RRA ; ADDRESS THAT GETS WRITTEN AND $70 ; TO BANK SELECT PORT LD C,A -; - PUSH BC - POP IY ; #IF (MD_FDBG==1) CALL PRTHEXWORD ; DISPLAY BANK AND @@ -823,32 +848,6 @@ FF_CALCA: 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 BC CONTAINS THE CHIP ID BYTES. -; NO STATUS IS RETURNED -;====================================================================== -; -MD_FIDENT: - PUSH IY - PUSH HL - PUSH DE -; - PUSH HL ; SAVE ADDRESS INFO - LD HL,MD_FIDENT_R ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK -; - JP FF_FNCALL ; EXECUTE -; -;====================================================================== ; FLASH IDENTIFY ; SELECT THE APPROPRIATE BANK / ADDRESS ; ISSUE ID COMMAND @@ -893,31 +892,6 @@ MD_FIDENT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY .FILL 8,0 ; STACK SPACE MD_FIST .DW 0 ; SAVE STACK MD_I_SZ .EQU $-MD_FIDENT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - -;====================================================================== -; ERASE FLASH SECTOR -; -; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. -; 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 ERASE CODE -; RESTORE STACK -; RETURN WITH STATUS CODE. -; -; ON ENTRY DE:HL POINTS TO AN ADDRESS IDENTIFYING THE CHIP -; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL -;====================================================================== -; -MD_FERAS: - PUSH IY - PUSH HL - PUSH DE -; - PUSH HL ; SAVE ADDRESS INFO - LD HL,MD_FERAS_R ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE ; ;====================================================================== ; ERASE FLASH SECTOR. @@ -995,37 +969,6 @@ FF_WT6: POP AF ; RETURN TO ORIGINAL BANK MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ;====================================================================== -; 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 HIGH MEMORY AREA -; COPY FLASH CODE TO CODE BUFFER -; CALL RELOCATED FLASH READ SECTOR CODE -; RESTORE STACK -; -; ON ENTRY DE:HL POINTS TO A 32 BIT MEMORY ADDRESS. -; IX POINTS TO WHERE TO SAVE DATA -; ON EXIT NO STATUS IS RETURNED -;====================================================================== -; -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,MD_FREAD_R ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE -; - RET -;====================================================================== ; FLASH READ SECTOR. ; ; SELECT THE APPROPRIATE BANK / ADDRESS @@ -1079,36 +1022,6 @@ 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 -; -; 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 -; ON EXIT NO STATUS IS RETURNED -;====================================================================== -; -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,MD_FWRIT_R ; PUT ROUTINE TO CALL - EX (SP),HL ; ON THE STACK - JP FF_FNCALL ; EXECUTE -; -;====================================================================== ; FLASH WRITE SECTOR. ; ; SELECT THE APPROPRIATE BANK / ADDRESS