From 47d2ff82a98dcdccd75ca71499c4410fdb3a9c01 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 18 Jan 2021 02:10:10 +0800 Subject: [PATCH] Update updater.asm Add support for other 512K flash devices. Devices that do not support sector erase will be chip erased prior to writing. Only AM29F040 tested. Additional debug options added --- Source/HBIOS/updater.asm | 158 +++++++++++++++++++++++++++++---------- 1 file changed, 118 insertions(+), 40 deletions(-) diff --git a/Source/HBIOS/updater.asm b/Source/HBIOS/updater.asm index bf9a7a0e..4b9906cb 100644 --- a/Source/HBIOS/updater.asm +++ b/Source/HBIOS/updater.asm @@ -68,14 +68,16 @@ ; OPTION (T) - DEBUG OPTION - TEST TIMER FOR 32S, 16S, 8S, 4S, 2S & 1S ; ; -; V.DEV 13/1/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM +; V.DEV 18/1/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM ; b1ackmai1er ON RETROBREWCOMPUTERS.ORG ; ; ; NOTES: ; TESTED WITH TERATERM XMODEM. -; ONLY SST39F040 FLASH CHIP IS SUPPORTED DUE TO 4K SECTOR REQUIREMENT. +; PARTIAL WRITES CAN BE COMPLETED WITH 39SF040 CHIPS +; OTHER CHIPS REQUIRE ENTIRE FLASH TO BE ERASED BEFORE BEFORE BEING WRITTEN. ; SBC V2-005 MEGAFLASH REQUIRED FOR 1MB FLASH SUPPORT. +; ASSUMES BOTH CHIPS ARE SAME TYPE ; FAILURE HANDLING HAS NOT BEEN TESTED. ; TIMING BROADLY CALIBRATED ON A Z80 SBC-V2 ; UNABIOS NOT SUPPORTED @@ -183,7 +185,6 @@ RESTART: LD A,0 JR Z,CHPFND ; YES IT IS ... ; -#IF (XFUDBG) LD HL,$A401 ; IS IT A 29F040 XOR A SBC HL,BC @@ -211,12 +212,11 @@ RESTART: LD HL,$A4C2 ; IS IT AN MX29F040 SBC HL,BC LD A,5 -; -#ENDIF ; JP NZ,FAILBC ; SUPPORTED CHIP NOT FOUND ; -CHPFND: LD (ERATYP),A ; SAVE ERASE TYPE +CHPFND: LD A,2 + LD (ERATYP),A ; SAVE ERASE TYPE LD BC,$F8F0 ; GET CPU SPEED RST 08 ; AND MULTIPLY @@ -227,6 +227,9 @@ CHPFND: LD (ERATYP),A ; SAVE ERASE TYPE ; MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING LD (MD_FBAS),DE ; AT BANK 0 SECTOR 0 + + LD HL,ERATYP + RES 7,(HL) ; LD HL,msgCRLF CALL PRTSTR0 @@ -256,20 +259,29 @@ MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING JP Z,OPTIOND ; FLASH ; CP '1' ; CALCULATE - JP Z,OPTION1 ; CRC FLASH #1 + JP Z,OPTION1 ; CRC 512K FLASH ; CP '2' ; CALCULATE - JP Z,OPTION2 ; CRC FLASH #2 + JP Z,OPTION2 ; CRC 1024K FLASH ; #IF (XFUDBG) + CP '3' ; CALCULATE + JP Z,OPTION3 ; CRC FLASH #2 +; CP 'T' ; TEST TIMEOUT JP Z,OPTIONT ; LOOP ; CP 'H' ; HALF JP Z,OPTIONH ; SPEED SWITCH ; - CP 'F' ; DUMP - JP Z,OPTIONF ; BUFFER + CP 'F' ; DEBUG + JP Z,OPTIONF ; DUMP +; + CP 'E' ; ERASE + JP Z,OPTIONE ; CHIP #1 +; + CP 'Z' ; ERASE + JP Z,OPTIONR ; CHIP #2 #ENDIF ; JR MENULP @@ -443,9 +455,21 @@ Die1: LD B,BF_SYSRESET ; SYSTEM RESTART WSEC: CALL DISPROG ; DISPLAY PROGRESS ; -WSEC1: LD HL,MD_FERAS ; ERASE - CALL MD_FNCALL ; AND WRITE - LD IX,sector4k ; THIS +WSEC1: LD A,(ERATYP) ; SECTOR + OR A ; ERASE? + JP Z,WSEC4 +; + JP M,WSEC3 ; SKIP ERASE? +; + LD HL,MD_FERAC ; SETUP CHIP ERASE + SET 7,A ; SET FLAG SO + LD (ERATYP),A ; WE DONT ERASE AGAIN + JR WSEC2 +; +WSEC4: LD HL,MD_FERAS ; SET ERASE SECTOR +WSEC2: CALL MD_FNCALL ; ERASE CHIP OR SECTOR +; +WSEC3: LD IX,sector4k ; WRITE THIS LD HL,MD_FWRIT ; BANK / SECTOR CALL MD_FNCALL ; @@ -468,7 +492,12 @@ NOVER: LD DE,sector4k ; POINT BACK TO START OF 4K BUFFER LD (HL),A ; RESET SECTOR TO 0 INC HL INC (HL) ; NEXT BANK - JR NXTS3 +; + CP $10 ; IF WE ARE AT THE + JR NZ,NXTS3 ; START OF A NEW + LD HL,ERATYP ; CHIP THEN ALLOW + RES 7,(HL) ; CHIP ERASE BY + JR NXTS3 ; RESETTING FLAG ; NXTS2: LD A,$10 ; NEXT SECTOR ADD A,(HL) ; EACH SECTOR IS $1000 @@ -605,9 +634,20 @@ OPTIOND:CALL COUTON ; TURN ON OUTPUT CP 'Y' ; PROCEED JP NZ,MENULP DUPL: LD HL,msgCopying - CALL PRTSTR0 + CALL PRTSTR0 +; + LD A,(ERATYP) ; CHECK IF WE + OR A ; NEED TO DO + JR Z,NOERA1 ; A CHIP ERASE ; - LD B,16 ; LOOP THROUGH 16 BANKS + LD HL,$1000 + LD (MD_FBAS),HL + LD HL,MD_FERAC ; ERASE + CALL MD_FNCALL ; CHIP #2 + OR A + JP FAILWF +; +NOERA1: LD B,16 ; LOOP THROUGH 16 BANKS ; XOR A ; START AT LD (MD_BANK),A ; BANK 0 @@ -628,13 +668,17 @@ NXTS: PUSH BC ; LD HL,MD_BANK ; SET CHIP #2 SET 4,(HL) +; + LD A,(ERATYP) ; SKIP ERASE + OR A ; IF SECTOR ERASE + JR NZ,NOERA2 ; IS NOT SUPPORTED ; LD HL,MD_FERAS ; ERASE SECTOR CALL MD_FNCALL ; ON ROM #2 OR A JR NZ,VERF ; - LD IX,sector4k ; WRITE SECTOR +NOERA2: LD IX,sector4k ; WRITE SECTOR LD HL,MD_FWRIT ; ON ROM #2 CALL MD_FNCALL ; @@ -729,18 +773,22 @@ OPTIONH:LD A,8 ; TURN ON THE SBC-V2-004+ ; OPTIONF:LD HL,msgCRLF ; DISPLAY CALL PRTSTR0 ; BANK - LD C,'B' ; SECTOR + LD C,'b' ; SECTOR CALL CONOUT ; TIMEOUT - LD A,(MD_BANK) + LD A,(MD_BANK) ; CHIP CALL PRTHEXB - LD C,'S' + LD C,'s' CALL CONOUT LD A,(MD_SECT) CALL PRTHEXB - LD C,'T' + LD C,'t' CALL CONOUT LD A,(TmoFct) CALL PRTHEXB + LD C,'c' + CALL CONOUT + LD A,(ERATYP) + CALL PRTHEXB ; LD HL,msgCRLF ; DISPLAY CALL PRTSTR0 ; ACK/NAK BYTE @@ -769,11 +817,27 @@ DMPBUF: LD A,(HL) ; PACKET LD HL,msgCRLF CALL PRTSTR0 POP HL -DMPBUF1: - - INC HL +DMPBUF1:INC HL DJNZ DMPBUF JP MENULP +; +OPTIONR:LD HL,msgErase ; DISPLAY + CALL PRTSTR0 ; ERASE CHIP + LD HL,$1000 ; SET CHIP + LD (MD_FBAS),HL ; ADDRESS + LD HL,MD_FERAC ; ERASE + CALL MD_FNCALL ; AND WRITE + OR A + JP NZ,FAILWF + JP Done1 +; +OPTIONE:LD HL,msgErase ; DISPLAY + CALL PRTSTR0 ; ERASE CHIP + LD HL,MD_FERAC ; ERASE + CALL MD_FNCALL ; AND WRITE + OR A + JP NZ,FAILWF + JP Done1 #ENDIF ; SEROUT: PUSH HL ; SERIAL OUTPUT CHARACTER IN C @@ -889,14 +953,19 @@ HEXCONV:AND 0FH ; CONVERT LOW NIBBLE OF A TO ASCII HEX DAA RET -OPTION1:LD HL,$0000 - LD (MD_FBAS),HL - LD C,$00 +OPTION3:LD HL,$1000 ; CRC32 STARTING + LD (MD_FBAS),HL ; BANK $10 SECTOR $00 + LD B,16 ; 16 BANKS (512K) + JR CALCCRC + +OPTION1:LD HL,$0000 ; CRC32 STARTING + LD (MD_FBAS),HL ; BANK $00 SECTOR $00 + LD B,16 ; 16 BANKS (512K) JR CALCCRC ; -OPTION2:LD HL,$1000 - LD (MD_FBAS),HL - LD C,$10 +OPTION2:LD HL,$0000 ; CRC32 STARTING + LD (MD_FBAS),HL ; BANK $00 SECTOR $00 + LD B,32 ; 32 BANKS (1024K) ; CALCCRC:CALL COUTON ; TURN ON OUTPUT ; @@ -907,8 +976,8 @@ CALCCRC:CALL COUTON ; TURN ON OUTPUT LD (CRC),HL ; START CRC LD (CRC+2),HL ; CONDITION - LD B,16 ; LOOP THROUGH -CRCLP1: PUSH BC ; 16 BANKS +; LD B,16 ; +CRCLP1: PUSH BC ; LOOP THROUGH ALL BANKS LD B,8 ; LOOP THROUGH CRCLP2: PUSH BC ; 8 SECTORS ; @@ -1048,10 +1117,15 @@ MD_FSTART: .EQU $ ; FLASH ROUTINES WHICH GET RELOCATED TO HIGH MEMORY ; IX POINTS TO DATA TO BE WRITTEN ; ON EXIT A NO STATUS IS RETURNED ; +; MD_FERAC_R - ERASE FLASH CHIP +; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED +; HL POINTS TO THE ROUTINE TO BE RELOCATED AND CALLED +; ON EXIT A RETURNS STATUS 0=SUCCESS FF=FAIL +; ; GENERAL OPERATION: -; COPY FLASH CODE TO UPPER MEMORY -; CALL RELOCATED FLASH CODE -; RETURN WITH ID CODE. +; FLASH LIBRARY CODE NEEDS TO BE RELOCATED TO UPPER MEMORY +; STACK NEEDS TO BE SETUP IN UPPER MEMORY +; DEPENDING ON ROUTINE, RETURNS WITH STATUS CODE IN A. ;====================================================================== ; MD_FNCALL: @@ -1080,7 +1154,7 @@ MD_FERAS .EQU HBX_START-MD_CSIZ+MD_FERAS_R-MD_FSTART ; CALL ADDRESS FOR ERASE FL MD_FREAD .EQU HBX_START-MD_CSIZ+MD_FREAD_R-MD_FSTART ; CALL ADDRESS FOR READ FLASH SECTOR MD_FVERI .EQU HBX_START-MD_CSIZ+MD_FVERI_R-MD_FSTART ; CALL ADDRESS FOR VERIFY FLASH SECTOR MD_FWRIT .EQU HBX_START-MD_CSIZ+MD_FWRIT_R-MD_FSTART ; CALL ADDRESS FOR WRITE FLASH SECTOR -;MD_FERAC .EQU HBX_START-MD_CSIZ+MD_FERAC_R-MD_FSTART ; CALL ADDRESS FOR ERASE FLASH CHIP +MD_FERAC .EQU HBX_START-MD_CSIZ+MD_FERAC_R-MD_FSTART ; CALL ADDRESS FOR ERASE FLASH CHIP ; ; Message strings ; @@ -1092,7 +1166,8 @@ msgBank: .DB CR,LF,"BANK ",0 msgUnsupC: .DB CR,LF,"FLASH CHIP NOT SUPPORTED",CR,LF,0 msgReboot: .DB CR,LF,"REBOOTING ...",CR,LF,0 msgCopying: .DB CR,LF,"COPYING ...",CR,LF,0 -msgCalc: .DB CR,LF,"CALCULATING CRC32 ...",CR,LF,0 +msgCalc: .DB CR,LF,"CALCULATING ...",CR,LF,0 +msgErase: .DB CR,LF,"ERASING ...",CR,LF,0 msgCRC32: .DB CR,LF,CR,LF,"CRC32 : ",0 msgFailWrt: .DB CR,LF,"FLASH WRITE FAILED",CR,LF,0 msgFailure: .DB CR,LF,"TRANSMISSION FAILED",CR,LF,0 @@ -1104,12 +1179,15 @@ msgBegin: .DB CR,LF,"(R) Reboot" .DB CR,LF,"(U) Begin Update" .DB CR,LF,"(X) Exit to Rom Loader" .DB CR,LF,"(D) Duplicate Flash #1 to #2" - .DB CR,LF,"(1) CRC Flash #1" - .DB CR,LF,"(2) CRC Flash #2" + .DB CR,LF,"(1) CRC 512K Flash" + .DB CR,LF,"(2) CRC 1024K Flash" #IF (XFUDBG) .DB CR,LF,"(H) Select half speed" .DB CR,LF,"(T) Test timeout" - .DB CR,LF,"(F) Dump last packet" + .DB CR,LF,"(F) Dump Debug Data" + .DB CR,LF,"(E) Erase Flash chip #1" + .DB CR,LF,"(Z) Erase Flash chip #2" + .DB CR,LF,"(3) CRC Flash chip #2" #ENDIF .DB CR,LF,CR,LF,"Select : ",0 msgSuccess: .DB CR,LF,CR,LF,"COMPLETED WITHOUT ERRORS ",CR,LF,0