diff --git a/Source/Doc/GettingStarted.md b/Source/Doc/GettingStarted.md index 5d96b795..5009a958 100644 --- a/Source/Doc/GettingStarted.md +++ b/Source/Doc/GettingStarted.md @@ -67,7 +67,7 @@ General features include: * Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD * Serial drivers including UART (16550-like), ASCI, ACIA, SIO * Video drivers including TMS9918, SY6545, MOS8563, HD6445 -* Real time clock drivers including DS1322, BQ4845 +* Real time clock drivers including DS1302, BQ4845 * Multiple OS support including CP/M 2.2, ZSDOS, CP/M 3, ZPM3 * Built-in VT-100 terminal emulation support diff --git a/Source/HBIOS/flashlib.inc b/Source/HBIOS/flashlib.inc new file mode 100644 index 00000000..9342a061 --- /dev/null +++ b/Source/HBIOS/flashlib.inc @@ -0,0 +1,268 @@ +;====================================================================== +; FLASH LIBRARY +;====================================================================== +; FLASH IDENTIFY +; SELECT THE APPROPRIATE BANK / ADDRESS +; ISSUE ID COMMAND +; READ IN ID WORD +; ISSUE ID EXIT COMMAND +; SELECT ORIGINAL BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; A CONTAINS CURRENT BANK +; ON EXIT BC CONTAINS ID WORD +; NO STATUS IS RETURNED +;====================================================================== +; +MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + LD D,A ; SAVE CURRENT BANK +; + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO PROGRAM +; + LD HL,$5555 ; LD A,$AA ; COMMAND + LD (HL),$AA ; LD ($5555),A ; SETUP + LD A,H ; LD A,$55 + LD ($2AAA),A ; LD ($2AAA),A + LD (HL),$90 ; LD A,$90 +; ; LD ($5555),A + LD BC,($0000) ; READ ID +; + LD A,$F0 ; LD A,$F0 ; EXIT + LD (HL),A ; LD ($5555),A ; COMMAND +; + LD A,D ; RETURN TO ORIGINAL BANK + JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; +MD_I_SZ .EQU $-MD_FIDEN_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED + .ECHO "MD_FIDEN_R occupies " + .ECHO MD_I_SZ + .ECHO " bytes.\n" +; +;====================================================================== +; ERASE FLASH SECTOR. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; ISSUE ERASE SECTOR COMMAND +; POLL TOGGLE BIT FOR COMPLETION STATUS. +; SELECT ORIGINAL BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; A CONTAINS CURRENT BANK +; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL +;====================================================================== +; +MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + PUSH AF ; SAVE CURRENT BANK + LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO PROGRAM +; + LD HL,$5555 ; LD ($5555),A + LD DE,$2AAA ; LD A,$55 + LD A,L ; LD ($2AAA),A + LD (HL),E ; LD A,$80 + LD (DE),A ; LD ($5555),A + LD (HL),$80 ; LD A,$AA + LD (HL),E ; LD ($5555),A + LD (DE),A ; LD A,$55 +; ; LD ($2AAA),A + LD H,C ; SECTOR + LD L,$00 ; ADDRESS +; + LD A,$30 ; SECTOR ERASE + LD (HL),A ; COMMAND +; +MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS + LD C,(HL) ; FROM THE SAME FLASH ADDRESS. + XOR C ; IF THE SAME ON BOTH READS + BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. +; + JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE + ; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE +; + LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). + BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS + JR Z,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 +; + LD A,(HL) ; WE GOT A TIMOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE + XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? + BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED + JR Z,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. +; + LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE + LD (HL),C ; WRITE DEVICE RESET + JR MD_WT6 +MD_WT5: LD C,L ; SET SUCCESS STATUS +; +MD_WT6: POP AF ; RETURN TO ORIGINAL BANK + JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; +MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED + .ECHO "MD_FERAS_R occupies " + .ECHO MD_S_SZ + .ECHO " bytes.\n" +; +;====================================================================== +; FLASH READ SECTOR. +; +; 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 +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; DE = 0000 BYTE COUNT +; IX POINTS TO DATA TO BE WRITTEN +; A CONTAINS CURRENT BANK +; ON EXIT NO STATUS RETURNED +;====================================================================== +; +MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + LD H,C ; SECTOR + LD L,D ; ADDRESS +; + PUSH AF ; SAVE CURRENT BANK +; +MD_FRD1:LD A,B ; CHANGE TO SOURCE BANK + CALL HBX_BNKSEL ; READ + LD C,(HL) ; BYTE +; + POP AF ; RESTORE CURRENT BANK + PUSH AF ; AND SAVE A COPY FOR NEXT LOOP + CALL HBX_BNKSEL ; SELECT BANK TO WRITE TO +; + 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,MD_FRD1 +; + POP AF + RET +; +MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED + .ECHO "MD_FREAD_R occupies " + .ECHO MD_R_SZ + .ECHO " bytes.\n" +; +;====================================================================== +; FLASH VERIFY SECTOR. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME +; SELECT SOURCE BANK, READ DATA, +; SELECT DESTINATION BANK, COMPARE DATA +; DESTINATION BANK IS ALWAYS CURRENT BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; DE = 0000 BYTE COUNT +; IX POINTS TO DATA TO BE VERIFIED +; A CONTAINS CURRENT BANK +; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL +;====================================================================== +; +MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + LD H,C ; SECTOR + LD L,D ; ADDRESS +; + PUSH AF ; SAVE CURRENT BANK +; +MD_FVE1:LD A,B ; SELECT BANK + CALL HBX_BNKSEL ; TO READ + LD C,(HL) ; READ BYTE +; + POP AF ; RESTORE CURRENT BANK + PUSH AF ; AND SAVE A COPY FOR NEXT LOOP + CALL HBX_BNKSEL ; TO VERIFY AGAINST +; + LD A,C + SUB (IX+0) ; COMPARE BYTE + LD C,A ; SET STATUS + JR NZ,MD_FVE2 ; EXIT IF MISMATCH +; + 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,MD_FVE1 +; +MD_FVE2:POP AF + RET +; +MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED + .ECHO "MD_FVERI_R occupies " + .ECHO MD_V_SZ + .ECHO " bytes.\n" +; +;====================================================================== +; FLASH WRITE SECTOR. +; +; SELECT THE APPROPRIATE BANK / ADDRESS +; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME +; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE +; POLL TOGGLE BIT FOR COMPLETION STATUS. +; SELECT ORIGINAL BANK +; +; ON ENTRY BC CONTAINS BANK AND SECTOR DATA +; IX POINTS TO DATA TO BE WRITTEN +; DE = 0000 BYTE COUNT +; A CONTAINS CURRENT BANK +; ON EXIT NO STATUS IS RETURNED +;====================================================================== +; +MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY +; + LD H,C ; SECTOR + LD L,D ; ADDRESS +; + PUSH AF ; SAVE CURRENT BANK +MD_FWR1:CALL HBX_BNKSEL ; SELECT BANK TO READ +; + 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 + LD A,$55 + LD ($2AAA),A +; + LD A,$A0 ; WRITE + LD ($5555),A ; COMMAND +; + LD (HL),C ; WRITE OUT BYTE +; +; ; DO TWO SUCCESSIVE READS +MD_FWR2:LD A,(HL) ; FROM THE SAME FLASH ADDRESS. + LD C,(HL) ; IF TOGGLE BIT (BIT 6) + XOR C ; IS THE SAME ON BOTH READS + BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT. + JR NZ,MD_FWR2 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. +; + INC HL ; NEXT DESTINATION LOCATION + INC IX ; NEXT SOURCE LOCATION +; + POP AF ; RESTORE CURRENT BANK + PUSH AF ; AND SAVE A COPY FOR NEXT LOOP +; + INC DE ; CONTINUE WRITING UNTIL + BIT 4,D ; WE HAVE DONE ONE SECTOR + JR Z,MD_FWR1 +; + POP AF ; RESTORE CURRENT BANK + JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY +; +MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED + .ECHO "MD_FWRIT_R occupies " + .ECHO MD_W_SZ + .ECHO " bytes.\n" diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 2a899669..42a42ce1 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -849,8 +849,6 @@ MD_FNCALL: ; USING HBX_BUF FOR CODE AREA CALL PRTHEXWORD #ENDIF ; - EX AF,AF' - PUSH AF LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK ; HB_DI @@ -859,9 +857,6 @@ MD_FNCALL: ; USING HBX_BUF FOR CODE AREA CALL HBX_BUF ; EXECUTE RELOCATED CODE LD SP,(MD_SAVSTK) ; RESTORE STACK HB_EI -; - POP AF - EX AF,AF' ; #IF (MD_FDBG==1) CALL PC_SPACE @@ -878,285 +873,7 @@ MD_FNCALL: ; USING HBX_BUF FOR CODE AREA ; MD_SAVSTK .DW 0 ; -;====================================================================== -; FLASH IDENTIFY -; SELECT THE APPROPRIATE BANK / ADDRESS -; ISSUE ID COMMAND -; READ IN ID WORD -; ISSUE ID EXIT COMMAND -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; A CONTAINS CURRENT BANK -; ON EXIT BC CONTAINS ID WORD -; NO STATUS IS RETURNED -;====================================================================== -; -MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD D,A ; SAVE CURRENT BANK -; - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM -; - LD HL,$5555 ; LD A,$AA ; COMMAND - LD (HL),$AA ; LD ($5555),A ; SETUP - LD A,H ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A - LD (HL),$90 ; LD A,$90 -; ; LD ($5555),A - LD BC,($0000) ; READ ID -; - LD A,$F0 ; LD A,$F0 ; EXIT - LD (HL),A ; LD ($5555),A ; COMMAND -; - LD A,D ; RETURN TO ORIGINAL BANK - JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; -; RET -; -MD_I_SZ .EQU $-MD_FIDEN_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FIDEN_R occupies " - .ECHO MD_I_SZ - .ECHO " bytes.\n" -; -;====================================================================== -; ERASE FLASH SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; ISSUE ERASE SECTOR COMMAND -; POLL TOGGLE BIT FOR COMPLETION STATUS. -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; A CONTAINS CURRENT BANK -; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL -;====================================================================== -; -MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - EX AF,AF' ; SAVE CURRENT BANK - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM -; - LD HL,$5555 ; LD ($5555),A - LD DE,$2AAA ; LD A,$55 - LD A,L ; LD ($2AAA),A - LD (HL),E ; LD A,$80 - LD (DE),A ; LD ($5555),A - LD (HL),$80 ; LD A,$AA - LD (HL),E ; LD ($5555),A - LD (DE),A ; LD A,$55 -; ; LD ($2AAA),A - LD H,C ; SECTOR - LD L,$00 ; ADDRESS -; - LD A,$30 ; SECTOR ERASE - LD (HL),A ; COMMAND -; -MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS - LD C,(HL) ; FROM THE SAME FLASH ADDRESS. - XOR C ; IF THE SAME ON BOTH READS - BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. -; - JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE - ; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE -; - LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). - BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS - JR Z,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 -; - LD A,(HL) ; WE GOT A TIMOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE - XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? - BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED - JR Z,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. -; - LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE - LD (HL),C ; WRITE DEVICE RESET - JR MD_WT6 -MD_WT5: LD C,L ; SET SUCCESS STATUS -; -MD_WT6: EX AF,AF' ; RETURN TO ORIGINAL BANK - JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; -; RET -; -MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FERAS_R occupies " - .ECHO MD_S_SZ - .ECHO " bytes.\n" -; -;====================================================================== -; FLASH READ SECTOR. -; -; 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 -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; DE = 0000 BYTE COUNT -; IX POINTS TO DATA TO BE WRITTEN -; A CONTAINS CURRENT BANK -; ON EXIT NO STATUS RETURNED -; AF' TRASHED -;====================================================================== -; -MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD H,C ; SECTOR - LD L,D ; ADDRESS -; - EX AF,AF' ; PUT DESTINATION BANK IN AF' -; -MD_FRD1: - LD A,B ; PUT SOURCE BANK IN AF - CALL HBX_BNKSEL ; READ ; SWITCH TO SOURCE BANK - LD C,(HL) ; BYTE -; - EX AF,AF' ; SELECT BANK ; SWITCH DESTINATION BANK - PUSH AF - CALL HBX_BNKSEL ; TO WRITE - POP AF - LD (IX+0),C ; WRITE BYTE - EX AF,AF' ; ; PUT SOURCE BANK IN AF -; - 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,MD_FRD1 -; - RET -; -MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FREAD_R occupies " - .ECHO MD_R_SZ - .ECHO " bytes.\n" -; -;====================================================================== -; FLASH VERIFY SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME -; SELECT SOURCE BANK, READ DATA, -; SELECT DESTINATION BANK, COMPARE DATA -; DESTINATION BANK IS ALWAYS CURRENT BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; DE = 0000 BYTE COUNT -; IX POINTS TO DATA TO BE VERIFIED -; A CONTAINS CURRENT BANK -; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL -;====================================================================== -; -MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD H,C ; SECTOR - LD L,D ; ADDRESS -; - EX AF,AF' ; PUT SOURCE BANK IN AF' (RAM) -; -MD_FVE1: - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO READ ; SWITCH TO FLASH BANK - LD A,(HL) ; READ BYTE -; - EX AF,AF' ; SELECT BANK ; SWITCH TO RAM BANK - PUSH AF - CALL HBX_BNKSEL ; TO VERIFY AGAINST - POP AF - EX AF,AF' -; - SUB (IX+0) ; COMPARE BYTE - JR NZ,MD_FVE2 ; EXIT IF MISMATCH -; - 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,MD_FVE1 -; -MD_FVE2: - LD C,A ; SET STATUS - EX AF,AF' -; - RET -; -MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FVERI_R occupies " - .ECHO MD_V_SZ - .ECHO " bytes.\n" -; -;====================================================================== -; FLASH WRITE SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME -; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE -; POLL TOGGLE BIT FOR COMPLETION STATUS. -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; IX POINTS TO DATA TO BE WRITTEN -; DE = 0000 BYTE COUNT -; A CONTAINS CURRENT BANK -; ON EXIT NO STATUS IS RETURNED -;====================================================================== -; -MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD H,C ; SECTOR - LD L,D ; ADDRESS -; -MD_FWRI1: - PUSH AF - CALL HBX_BNKSEL ; SELECT BANK TO READ - POP AF - EX AF,AF' ; SAVE CURRENT BANK -; - 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 - LD A,$55 - LD ($2AAA),A -; - LD A,$A0 ; WRITE - LD ($5555),A ; COMMAND -; - LD (HL),C ; WRITE OUT BYTE -; -; ; DO TWO SUCCESSIVE READS -MD_FW7: LD A,(HL) ; FROM THE SAME FLASH ADDRESS. - LD C,(HL) ; IF TOGGLE BIT (BIT 6) - XOR C ; IS THE SAME ON BOTH READS - 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 -; - EX AF,AF' ; RESTORE CURRENT BANK -; - INC DE ; CONTINUE WRITING UNTIL - BIT 4,D ; WE HAVE DONE ONE SECTOR - JR Z,MD_FWRI1 -; - JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY -; -; RET -; -MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED - .ECHO "MD_FWRIT_R occupies " - .ECHO MD_W_SZ - .ECHO " bytes.\n" +#INCLUDE "flashlib.inc" ; ;====================================================================== ; diff --git a/Source/HBIOS/updater.asm b/Source/HBIOS/updater.asm index 7497bd03..bf9a7a0e 100644 --- a/Source/HBIOS/updater.asm +++ b/Source/HBIOS/updater.asm @@ -222,7 +222,7 @@ CHPFND: LD (ERATYP),A ; SAVE ERASE TYPE RST 08 ; AND MULTIPLY LD A,L ; BY 4 ADD A,A ; TO CREATE - ADD A,A ; TIMOUT DELAY + ADD A,A ; TIMEOUT DELAY LD (TmoFct),A ; FACTOR ; MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING @@ -501,15 +501,15 @@ DISP1: LD C,' ' ; DISPLAY CALL PRTHEXB RET ; -; WAITS FOR UP TO A SECONDS FOR A CHARACTER TO BECOME AVAILABLE AND +; WAITS FOR UP TO B SECONDS FOR A CHARACTER TO BECOME AVAILABLE AND ; RETURNS IT IN A WITHOUT ECHO AND CARRY CLEAR. IF TIMEOUT THEN CARRY ; IT SET. ; -; 4MHZ 20 SECONDS B=16 -; 10MHZ 20 SECONDS B=39 +; 4MHZ 20 SECONDS TmoFct = 16 +; 10MHZ 20 SECONDS TmoFct = 39 ; GetCharTmo1: - LD B,1 + LD B,1 ; WAIT 1 SECOND FOR SERIAL INPUT GetCharTmo: CALL SERST ; IF THERE IS A OR A ; CHARACTER AVAILABLE @@ -1070,249 +1070,7 @@ MD_FNCALL: MD_FJPHL: JP (HL) ; -;====================================================================== -; FLASH IDENTIFY -; SELECT THE APPROPRIATE BANK / ADDRESS -; ISSUE ID COMMAND -; READ IN ID WORD -; ISSUE ID EXIT COMMAND -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; A CONTAINS CURRENT BANK -; ON EXIT BC CONTAINS ID WORD -; NO STATUS IS RETURNED -;====================================================================== -; -MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD D,A ; SAVE CURRENT BANK -; - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM -; - LD HL,$5555 ; LD A,$AA ; COMMAND - LD (HL),$AA ; LD ($5555),A ; SETUP - LD A,H ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A - LD (HL),$90 ; LD A,$90 -; ; LD ($5555),A - LD BC,($0000) ; READ ID -; - LD A,$F0 ; LD A,$F0 ; EXIT - LD (HL),A ; LD ($5555),A ; COMMAND -; - LD A,D ; RETURN TO ORIGINAL BANK - JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; -;====================================================================== -; ERASE FLASH SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; ISSUE ERASE SECTOR COMMAND -; POLL TOGGLE BIT FOR COMPLETION STATUS. -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; A CONTAINS CURRENT BANK -; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL -;====================================================================== -; -MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO PROGRAM -; - LD HL,$5555 ; LD ($5555),A - LD DE,$2AAA ; LD A,$55 - LD A,L ; LD ($2AAA),A - LD (HL),E ; LD A,$80 - LD (DE),A ; LD ($5555),A - LD (HL),$80 ; LD A,$AA - LD (HL),E ; LD ($5555),A - LD (DE),A ; LD A,$55 -; ; LD ($2AAA),A - LD H,C ; SECTOR - LD L,$00 ; ADDRESS -; - LD A,$30 ; SECTOR ERASE - LD (HL),A ; COMMAND -; -MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS - LD C,(HL) ; FROM THE SAME FLASH ADDRESS. - XOR C ; IF THE SAME ON BOTH READS - BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. -; - JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE - ; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE -; - LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5). - BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS - JR Z,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1 -; - LD A,(HL) ; WE GOT A TIMOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE - XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME? - BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED - JR Z,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT. -; - LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE - LD (HL),C ; WRITE DEVICE RESET - JR MD_WT6 -MD_WT5: LD C,L ; SET SUCCESS STATUS -; -MD_WT6: POP AF ; RETURN TO ORIGINAL BANK - JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY -; -;====================================================================== -; FLASH READ SECTOR. -; -; 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 -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; DE = 0000 BYTE COUNT -; IX POINTS TO DATA TO BE WRITTEN -; A CONTAINS CURRENT BANK -; ON EXIT NO STATUS RETURNED -; AF' TRASHED -;====================================================================== -; -MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD H,C ; SECTOR - LD L,D ; ADDRESS -; - PUSH AF ; SAVE CURRENT BANK -MD_FRD1: - LD A,B ; PUT SOURCE BANK IN AF - CALL HBX_BNKSEL ; READ ; SWITCH TO SOURCE BANK - LD C,(HL) ; BYTE -; - POP AF ; RESTORE CURRENT BANK - PUSH AF ; AND SAVE A COPY FOR NEXT LOOP - CALL HBX_BNKSEL ; SELECT BANK TO WRITE TO -; - 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,MD_FRD1 -; - POP AF - RET -; -;====================================================================== -; FLASH VERIFY SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME -; SELECT SOURCE BANK, READ DATA, -; SELECT DESTINATION BANK, COMPARE DATA -; DESTINATION BANK IS ALWAYS CURRENT BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; DE = 0000 BYTE COUNT -; IX POINTS TO DATA TO BE VERIFIED -; A CONTAINS CURRENT BANK -; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL -;====================================================================== -; -MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD H,C ; SECTOR - LD L,D ; ADDRESS -; - PUSH AF ; SAVE CURRENT BANK -MD_FVE1: - LD A,B ; SELECT BANK - CALL HBX_BNKSEL ; TO READ - LD C,(HL) ; READ BYTE -; - POP AF ; RESTORE CURRENT BANK - PUSH AF ; AND SAVE A COPY FOR NEXT LOOP - CALL HBX_BNKSEL ; TO VERIFY AGAINST -; - LD A,C - SUB (IX+0) ; COMPARE BYTE - LD C,A ; SET STATUS - JR NZ,MD_FVE2 ; EXIT IF MISMATCH -; - 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,MD_FVE1 -; -MD_FVE2:POP AF - RET -; -;====================================================================== -; FLASH WRITE SECTOR. -; -; SELECT THE APPROPRIATE BANK / ADDRESS -; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME -; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE -; POLL TOGGLE BIT FOR COMPLETION STATUS. -; SELECT ORIGINAL BANK -; -; ON ENTRY BC CONTAINS BANK AND SECTOR DATA -; IX POINTS TO DATA TO BE WRITTEN -; DE = 0000 BYTE COUNT -; A CONTAINS CURRENT BANK -; ON EXIT NO STATUS IS RETURNED -;====================================================================== -; -MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - LD H,C ; SECTOR - LD L,D ; ADDRESS -; - PUSH AF ; SAVE CURRENT BANK -MD_FWRI1: - CALL HBX_BNKSEL ; SELECT BANK TO READ -; - 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 - LD A,$55 - LD ($2AAA),A -; - LD A,$A0 ; WRITE - LD ($5555),A ; COMMAND -; - LD (HL),C ; WRITE OUT BYTE -; -; ; DO TWO SUCCESSIVE READS -MD_FW7: LD A,(HL) ; FROM THE SAME FLASH ADDRESS. - LD C,(HL) ; IF TOGGLE BIT (BIT 6) - XOR C ; IS THE SAME ON BOTH READS - 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 -; - POP AF ; RESTORE CURRENT BANK - PUSH AF ; AND SAVE A COPY FOR NEXT LOOP -; - INC DE ; CONTINUE WRITING UNTIL - BIT 4,D ; WE HAVE DONE ONE SECTOR - JR Z,MD_FWRI1 -; - POP AF ; RESTORE CURRENT BANK - JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY +#INCLUDE "flashlib.inc" ; MD_FEND .EQU $ MD_CSIZ .EQU MD_FEND-MD_FSTART ; HOW MUCH SPACE WE NEED FOR RELOCATABLE CODE