From 506ecfe3e2957911dfceb575c481b89c45ce5078 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 8 Jan 2021 19:46:20 +0800 Subject: [PATCH] Add facility to backup flash --- Source/HBIOS/updater.asm | 271 +++++++++++++++++++++++++-------------- 1 file changed, 177 insertions(+), 94 deletions(-) diff --git a/Source/HBIOS/updater.asm b/Source/HBIOS/updater.asm index b402d0ba..60fc5811 100644 --- a/Source/HBIOS/updater.asm +++ b/Source/HBIOS/updater.asm @@ -58,11 +58,15 @@ ; IN THE CASE OF A FAILED UPDATE THIS OPTION COULD BE USED TO ATTEMPT TO ; LOAD CP/M AND PERFORM THE NORMAL XMODEM / FLASH PROCESS TO RECOVER. ; +; OPTION (D) - DUPLICATE FLASH #1 TO FLASH #2 WILL MAKE A COPY OF FLASH #1 +; ONTO FLASH #2. THE PURPOSE OF THIS IS TO ENABLE MAKING A BACKUP COPY OF +; THE CURRENT FLASH. +; ; OPTION (H) - DEBUG OPTION - SWITCH ON CPU CLOCK DIVIDER ON SBC-V2-004+ ; OPTION (T) - DEBUG OPTION - TEST TIMER FOR 20 SECONDS. * = START AND FINISH ; ; -; V.DEV 3/1/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM +; V.DEV 8/1/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM ; b1ackmai1er ON RETROBREWCOMPUTERS.ORG ; ; @@ -100,8 +104,6 @@ HBX_BNKSEL .EQU $FE2B HBX_START .EQU $FE00 ; -BIOSBID .EQU $00 ; BIOS BANK ID NUMBER -; #DEFINE HB_DI DI #DEFINE HB_EI EI ; @@ -150,11 +152,14 @@ BSPC: .EQU 'H'-40h ; ^H = Backspace LD (SERDEV),A ; RESTART: - LD DE,$0000 ; SET UP - LD HL,$0000 ; START - CALL MD_CALBAS ; BANK AND - LD HL,MD_FIDEN ; SECTOR - CALL MD_FNCALL +; LD DE,$0000 ; SET UP +; LD HL,$0000 ; START +; CALL MD_CALBAS ; BANK AND SECTOR + LD DE,$0000 + LD (MD_FBAS),DE + + LD HL,MD_FIDEN ; IDENTIFY CHIP + CALL MD_FNCALL ; AT THIS BANK/SECTOR LD HL,$B7BF ; FAIL XOR A ; IF FLASH SBC HL,BC ; CHIP IS @@ -171,10 +176,10 @@ MENULP: CALL MENU ; DISPLAY MENU CALL GETINP ; GET SELECTION ; CP 'U' ; BEGIN - JR Z,CLRSER ; TRANSFER + JR Z,BEGUPD ; TRANSFER ; CP 'V' ; CHECK FOR - CALL Z,OPTIONV ; VERIFY TOGGLE + JP Z,OPTIONV ; VERIFY TOGGLE ; CP 'X' ; CHECK FOR JP Z,FAILUX ; USER EXIT @@ -183,29 +188,29 @@ MENULP: CALL MENU ; DISPLAY MENU JP Z,REBOOT ; COLD REBOOT REQUEST ; CP 'C' ; CHECK FOR - CALL Z,OPTIONC ; CONSOLE CHANGE + JP Z,OPTIONC ; CONSOLE CHANGE ; CP 'S' ; CHECK FOR - CALL Z,OPTIONS ; SERIAL CHANGE + JP Z,OPTIONS ; SERIAL CHANGE ; -; CP 'D' ; DUPLICATE -; CALL Z,OPTIOND ; FLASH + CP 'D' ; DUPLICATE + JP Z,OPTIOND ; FLASH ; #IF (XFUDBG) CP 'T' ; TEST TIMEOUT - CALL Z,OPTIONT ; LOOP + JP Z,OPTIONT ; LOOP ; CP 'H' ; HALF - CALL Z,OPTIONH ; SPEED SWITCH + JP Z,OPTIONH ; SPEED SWITCH #ENDIF ; JR MENULP ; -CLRSER: CALL SERST ; EMPTY SERIAL BUFFER +BEGUPD: CALL SERST ; EMPTY SERIAL BUFFER OR A ; SO WE HAVE A CLEAN JR Z,SERCLR ; START ON TRANSFER CALL SERIN - JR CLRSER + JR BEGUPD ; SERCLR: LD HL,msgInstr ; PROVIDE CALL PRTSTR0 ; INSTRUCTION @@ -240,7 +245,7 @@ NPloop: LD B,5 ; 5 SECONDS OF TIMEOUT BEFORE EACH NEW BLOCK ; NotPacketTimeout: cp EOT ; DID UPLOADER SAY WE'RE FINISHED? - jp Z,Done ; YES, THEN WE'RE DONE + JP Z,Done ; YES, THEN WE'RE DONE cp CAN ; UPLOADER WANTS TO FAIL TRANSFER? jp Z,FAILCN ; YES, THEN WE'RE ALSO DONE cp SOH ; DID WE GET A START-OF-NEW-PACKET? @@ -281,7 +286,7 @@ GetRestOfPacket: LD B,128 XOR A csloop: add A,(HL) ; JUST ADD UP THE BYTES - inc HL + INC HL DJNZ csloop ; XOR (HL) ; HL POINTS TO THE RECEIVED CHECKSUM SO @@ -295,7 +300,7 @@ csloop: add A,(HL) ; JUST ADD UP THE BYTES ; LD HL,pktNo ; HAVE WE RECEIVED LD A,(HL) ; A BLOCK OF 32 - DEC A ; XMODEM PACKETS + DEC A ; XMODEM PACKETS? AND %00011111 ; IF YES THEN WERE WE CP %00011111 ; HAVE ENOUGH TO LD A,0 ; WRITE A FLASH SECTOR @@ -314,9 +319,13 @@ csloop: add A,(HL) ; JUST ADD UP THE BYTES ; JP GetNewPacket ; +COUTON: LD A,$FF ; TURN ON + LD (BLKCOUT),A ; OUTPUT + RET +; Done: LD C,ACK ; TELL UPLOADER CALL SEROUT ; WE'RE DONE - LD HL,msgSucces1 ; BACK TO +Done1: LD HL,msgSuccess ; BACK TO JR MSGRS ; MENU ; FAILTO: LD HL,msgTimout ; TIMOUT WAITING @@ -335,7 +344,7 @@ FAILPN: LD HL,msgPacErr ; PACKET JR ERRRX ; NUMBER ERROR ; FAILCN: LD HL,msgCancel ; TRANSMISSION - JR ERRRX ; FAILCN + JR ERRRX ; FAILURE ; FAILUX: LD HL,msgUserEx ; USER JR Die ; EXIT @@ -343,25 +352,22 @@ FAILUX: LD HL,msgUserEx ; USER FAILBC: LD HL,msgUnsupC ; UNSUPPORTED JR Die ; FLASH CHIP ; -ERRRX: LD A,$FF - LD (BLKCOUT),A ; TURN ON OUTPUT +ERRRX: CALL COUTON ; TURN ON OUTPUT CALL PRTSTR0 ; DISPLAY TRANSMISSION LD HL,msgFailure ; RECEIPT ERROR CALL PRTSTR0 JP RESTART ; -MSGRS: LD A,$FF - LD (BLKCOUT),A ; TURN ON OUTPUT - CALL PRTSTR0 ; DISPLAY TRANSMISSION - JP RESTART +MSGRS: CALL COUTON ; TURN ON OUTPUT + CALL PRTSTR0 ; DISPLAY + JP RESTART ; MESSAGE ; REBOOT: LD HL,msgReboot ; REBOOT MESSAGE CALL PRTSTR0 LD C,BF_SYSRES_COLD ; COLD RESTART JR Die1 ; -Die: LD A,$FF - LD (BLKCOUT),A ; TURN ON OUTPUT +Die: CALL COUTON ; TURN ON OUTPUT CALL PRTSTR0 ; Prints message and exits from program LD C,BF_SYSRES_WARM ; WARM START Die1: LD B,BF_SYSRESET ; SYSTEM RESTART @@ -373,28 +379,7 @@ WSEC: PUSH HL ; WRITE A PUSH BC ; FLASH PUSH DE ; SECTOR ; - LD A,(BLKCOUT) ; SKIP OUTPUT - OR A ; IF TRANSFERRING - JR Z,WSEC1 ; OVER CONSOLE -; - LD A,(MD_SECT) ; IF SECTOR IS 0 - OR A ; THEN DISPLAY - JR NZ,NXTS1 ; BANK # PREFIX - LD HL,msgBank - CALL PRTSTR0 - LD A,(MD_BANK) - CALL PRTHEXB -; -NXTS1: LD C,' ' ; DISPLAY - CALL CONOUT ; CURRENT - LD C,'S' ; SECTOR - CALL CONOUT - LD A,(MD_SECT) - RRCA - RRCA - RRCA - RRCA - CALL PRTHEXB + CALL DISPROG ; DISPLAY PROGRESS ; WSEC1: LD HL,MD_FERAS ; ERASE CALL MD_FNCALL ; AND WRITE @@ -404,7 +389,7 @@ WSEC1: LD HL,MD_FERAS ; ERASE ; LD A,(WRTVER) ; VERIFY OR A ; WRITE IF - JR Z,NOVER ; OPTION + JR Z,NOVER ; OPTION SET ; LD IX,sector4k ; VERIFY LD HL,MD_FVERI ; WRITE @@ -435,6 +420,30 @@ NXTS3: LD A,(VERRES) ; EXIT WITH STATUS POP HL RET ; +DISPROG:LD A,(BLKCOUT) ; SKIP OUTPUT + OR A ; IF OUTPUT + RET Z ; BLOCKED +; + LD A,(MD_SECT) ; IF SECTOR IS 0 + OR A ; THEN DISPLAY + JR NZ,DISP1 ; BANK # PREFIX + LD HL,msgBank + CALL PRTSTR0 + LD A,(MD_BANK) + CALL PRTHEXB +; +DISP1: LD C,' ' ; DISPLAY + CALL CONOUT ; CURRENT + LD C,'S' ; SECTOR + CALL CONOUT + LD A,(MD_SECT) + RRCA + RRCA + RRCA + RRCA + CALL PRTHEXB + RET +; ; WAITS FOR UP TO A SECONDS FOR A CHARACTER TO BECOME AVAILABLE AND ; RETURNS IT IN A WITHOUT ECHO AND CARRY CLEAR. IF TIMEOUT THEN CARRY ; IT SET. @@ -463,7 +472,7 @@ GCtmoc: PUSH BC DJNZ GCtmob POP BC DJNZ GetCharTmo - scf ; SET CARRY SIGNALS TIMEOUT + SCF ; SET CARRY SIGNALS TIMEOUT RET ; GotChar:POP BC @@ -475,7 +484,7 @@ GotChrX:CALL SERIN ; GETINP: CALL CONIN ; GET A CHARACTER LD C,A ; RETURN SEQUENCE - CALL CONOUT ; COVERT TO UPPERCASE + CALL CONOUT ; CONVERT TO UPPERCASE LD C,BSPC ; RETURN CHARACTER IN A CALL CONOUT LD B,A @@ -501,8 +510,8 @@ PRTSTR0:LD A,(HL) ; PRINT MESSAGE POINTED TOP HL UNTIL 0 RET Z ; IF ZERO RETURN TO CALLER LD C,A CALL CONOUT ; ELSE PRINT THE CHARACTER - inc HL - jp PRTSTR0 + INC HL + JP PRTSTR0 ; MENU: LD HL,msgConsole ; DISPLAY CALL PRTSTR0 ; CONSOLE @@ -531,13 +540,83 @@ MENU1: CALL PRTSTR0 CALL PRTSTR0 ; MENU OPTIONS RET ; -OPTIOND: - RET +OPTIOND:CALL COUTON ; TURN ON OUTPUT +; + LD HL,msgConfirm ; CONFIRM + CALL PRTSTR0 ; OK + CALL GETINP ; TO + CP 'Y' ; PROCEED + JP NZ,MENULP +DUPL: LD HL,msgCopying + CALL PRTSTR0 +; + LD B,16 ; LOOP THROUGH 16 BANKS +; + XOR A ; START AT + LD (MD_BANK),A ; BANK 0 +; +NXTB: PUSH BC +; + XOR A ; START AT + LD (MD_SECT),A ; SECTOR 0 +; + LD B,8 ; LOOP THROUGH 8 SECTORS +NXTS: PUSH BC +; + CALL DISPROG ; DISPLAY PROGRESS +; + LD IX,sector4k ; READ SECTOR + LD HL,MD_FREAD ; FROM ROM #1 + CALL MD_FNCALL +; + LD HL,MD_BANK ; SET CHIP #2 + SET 4,(HL) +; + LD HL,MD_FERAS ; ERASE SECTOR + CALL MD_FNCALL ; ON ROM #2 + OR A + JR NZ,VERF +; + LD IX,sector4k ; WRITE SECTOR + LD HL,MD_FWRIT ; ON ROM #2 + CALL MD_FNCALL +; + LD A,(WRTVER) ; VERIFY + OR A ; WRITE IF + JR Z,NOVER1 ; OPTION +; + LD IX,sector4k ; VERIFY + LD HL,MD_FVERI ; WRITE + CALL MD_FNCALL + OR A ; EXIT IF + JR NZ,VERF ; VERIFY FAILED +; +NOVER1: LD HL,MD_BANK ; RESET TO CHIP #1 + RES 4,(HL) +; + LD A,(MD_SECT) ; POINT TO + ADD A,$10 ; NEXT + LD (MD_SECT),A ; SECTOR +; + POP BC ; LOOP + DJNZ NXTS ; NEXT SECTOR +; + LD HL,MD_BANK ; POINT TO ; 00-15 = CHIP 1 + INC (HL) ; NEXT BANK ; 16-21 = CHIP 2 +; + POP BC ; LOOP + DJNZ NXTB ; NEXT BANK +; + JP Done1 ; SUCCESS. RETURN TO MENU +; +VERF: POP BC ; EXIT WITH FAIL + POP BC ; FAIL MESSAGE AND + JP FAILWF ; RETURN TO MENU ; OPTIONV:LD A,(WRTVER) ; TOGGLE CPL ; VERIFY LD (WRTVER),A ; FLAG - RET + JP MENULP ; BACK TO MENU ; OPTIONC:LD HL,msgEnterUnit ; GET CALL PRTSTR0 ; CONSOLE @@ -553,8 +632,8 @@ CLRCON: CALL CONST ; EMPTY CONSOLE BUFFER JR Z,CONCLR ; FALSE ENTRIES CALL CONIN JR CLRCON -CONCLR: XOR A - RET + +CONCLR: JP MENULP ; BACK TO MENU ; OPTIONS:LD HL,msgEnterUnit ; GET CALL PRTSTR0 ; CONSOLE @@ -565,23 +644,25 @@ OPTIONS:LD HL,msgEnterUnit ; GET JR NC,CONCLR SUB '0' ; NUMBER LD (SERDEV),A - XOR A - RET ; -#IF (XFUDBG) -OPTIONT:LD C,'*' - CALL CONOUT - LD B,20 - CALL GetCharTmo - LD C,'*' - CALL CONOUT - RET + JP MENULP ; BACK TO MENU ; -OPTIONH:LD A,8 ; TURN ON THE - OUT (RTCIO),A ; SBC-V2-004+ - LD HL,TmoFct ; CLOCK DIVIDER - SRL (HL) ; AND ADJUST - RET ; DELAY FACTOR (/2) +#IF (XFUDBG) +OPTIONT:LD HL,msgCRLF + CALL PRTSTR0 + LD C,'*' ; DISPLAY START + CALL CONOUT ; INDICATOR + LD B,20 ; DELAY 20 + CALL GetCharTmo ; SECONDS + LD C,'*' ; DISPLAY FINISH + CALL CONOUT ; INDICATOR + JP MENULP ; BACK TO MENU +; +OPTIONH:LD A,8 ; TURN ON THE SBC-V2-004+ + OUT (RTCIO),A ; CLOCK DIVIDER + LD HL,TmoFct ; AND ADJUST + SRL (HL) ; DELAY FACTOR (/2) + JP MENULP ; BACK TO MENU #ENDIF ; SEROUT: PUSH HL ; SERIAL OUTPUT CHARACTER IN C @@ -705,23 +786,23 @@ HEXCONV:AND 0FH ; CONVERT LOW NIBBLE OF A TO ASCII HEX ; C CONTAINS HIGH BYTE OF SECTOR ADDRESS ;====================================================================== ; -MD_CALBAS: +;MD_CALBAS: ; - PUSH HL - LD A,E ; BOTTOM PORTION OF SECTOR - AND $0F ; ADDRESS THAT GETS WRITTEN - RLC H ; WITH ERASE COMMAND BYTE - RLA ; A15 GETS DROPPED OFF AND - LD B,A ; ADDED TO BANK SELECT +; PUSH HL +; LD A,E ; BOTTOM PORTION OF SECTOR +; AND $0F ; ADDRESS THAT GETS WRITTEN +; RLC H ; WITH ERASE COMMAND BYTE +; RLA ; A15 GETS DROPPED OFF AND +; LD B,A ; ADDED TO BANK SELECT ; - LD A,H ; TOP SECTION OF SECTOR - RRA ; ADDRESS THAT GETS WRITTEN - AND $70 ; TO BANK SELECT PORT - LD C,A - POP HL +; LD A,H ; TOP SECTION OF SECTOR +; RRA ; ADDRESS THAT GETS WRITTEN +; AND $70 ; TO BANK SELECT PORT +; LD C,A +; POP HL ; - LD (MD_FBAS),BC ; SAVE BANK AND SECTOR FOR USE IN FLASH ROUTINES - RET +; LD (MD_FBAS),BC ; SAVE BANK AND SECTOR FOR USE IN FLASH ROUTINES +; RET ; MD_FSTART: .EQU $ ; FLASH ROUTINES WHICH GET RELOCATED TO HIGH MEMORY ; @@ -1040,11 +1121,13 @@ MD_FWRIT .EQU HBX_START-MD_CSIZ+MD_FWRIT_R-MD_FSTART ; CALL ADDRESS FOR WRITE F ; Message strings ; msgHeader: .DB CR,LF,CR,LF,"ROMWBW XMODEM FLASH UPDATER",CR,LF,0 +msgConfirm: .DB CR,LF,CR,LF,"ENTER Y TO CONFIRM OVERWRITE : ",0 msgInstr: .DB CR,LF,CR,LF,"START TRANSFER OF YOUR UPDATE IMAGE OR ROM",CR,LF,0 msgUserEx: .DB CR,LF,"UPDATER EXITED BY USER",CR,LF,0 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 msgFailWrt: .DB CR,LF,"FLASH WRITE FAILED",CR,LF,0 msgFailure: .DB CR,LF,"TRANSMISSION FAILED",CR,LF,0 msgCancel: .DB CR,LF,"TRANSMISSION CANCELLED",CR,LF,0 @@ -1054,13 +1137,13 @@ msgWriteV: .DB CR,LF,"(V) Toggle Write Verify : ",0 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 ROM #1 to #2" + .DB CR,LF,"(D) Duplicate Flash #1 to #2" #IF (XFUDBG) .DB CR,LF,"(H) Select half speed" .DB CR,LF,"(T) Test 20s timeout" #ENDIF .DB CR,LF,CR,LF,"Select : ",0 -msgSucces1: .DB CR,LF,CR,LF,"UPDATE COMPLETED WITHOUT ERRORS ",CR,LF,0 +msgSuccess: .DB CR,LF,CR,LF,"COMPLETED WITHOUT ERRORS ",CR,LF,0 msgEnterUnit: .DB CR,LF,"ENTER UNIT NUMBER : ",0 msgCRLF: .DB CR,LF,0 msgYES: .DB "YES",0