From 93cb50b2444aac591c21a57cc21487ebb2c9b008 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 24 Jul 2021 14:03:06 +0800 Subject: [PATCH] Preliminary integrated baud rate change --- Source/HBIOS/updater.asm | 298 ++++++++++++++++++++++++++++----------- 1 file changed, 219 insertions(+), 79 deletions(-) diff --git a/Source/HBIOS/updater.asm b/Source/HBIOS/updater.asm index d40d7c1f..414ab9a8 100644 --- a/Source/HBIOS/updater.asm +++ b/Source/HBIOS/updater.asm @@ -4,7 +4,7 @@ ; PROVIDES THE CAPABILTY TO UPDATE ROMWBW FROM THE SBC BOOT LOADER USING ; AN XMODEM FILE TRANSFER. ; -; THIS TOOL CAN BE LAUNCHED FROM THE ROMWBW BOOT LOADER USING OPTION 'R'. +; THIS TOOL CAN BE LAUNCHED FROM THE ROMWBW BOOT LOADER USING OPTION 'X'. ; ; OPTION (C) AND (S) - CONSOLE AND SERIAL DEVICE ; @@ -50,7 +50,7 @@ ; IF THE UPDATE FAILS IT IS RECOMMENDED THAT YOU RETRY BEFORE REBOOTING OR ; EXITING TO THE SBC BOOT LOADER AS YOUR MACHINE MAY NOT BE BOOTABLE. ; -; OPTION (X) - EXIT TO THE SBC BOOT LOADER. THE SBC IS RELOADED FROM ROM AND +; OPTION (Q) - EXIT TO THE SBC BOOT LOADER. THE SBC IS RELOADED FROM ROM AND ; EXECUTED. AFTER A SUCCESSFUL UPDATE A REBOOT SHOULD BE PERFORMED. HOWEVER, ; 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. @@ -60,12 +60,13 @@ ; THE CURRENT FLASH. ; ; OPTION (1) AND (2) - CALCULATE AND DISPLAY CRC32 OF 1ST OR 2ND 512K ROM. +; OPTION (3) - CALCULATE AND DISPLAY CRC32 OF A 1024K ROM. ; ; OPTION (H) - DEBUG OPTION - SWITCH ON CPU CLOCK DIVIDER ON SBC-V2-004+ ; OPTION (T) - DEBUG OPTION - TEST TIMER FOR 32S, 16S, 8S, 4S, 2S & 1S ; ; -; V.DEV 18/1/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM +; V.DEV 23/7/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM ; b1ackmai1er ON RETROBREWCOMPUTERS.ORG ; ; @@ -164,6 +165,9 @@ BSPC: .EQU 'H'-40h ; ^H = Backspace RST 08 ; TO USE AS LD A,E ; DEFAULT LD (SERDEV),A + + CALL GETDINFO ; SAVE INITIAL + LD (ORISPD),A ; SERIAL SPEED ; LD HL,msgHeader ; PRINT CALL PRTSTR0 ; GREETING @@ -195,9 +199,20 @@ CHPFND: LD (ERATYP),A ; SAVE ERASE TYPE LD BC,$F8F0 ; GET CPU SPEED RST 08 ; AND MULTIPLY LD A,L ; BY 4 + PUSH AF ADD A,A ; TO CREATE ADD A,A ; TIMEOUT DELAY LD (TmoFct),A ; FACTOR + POP AF +; + LD HL,CLKTBL-1 ; DETERMINE + ADD A,L ; RECOMMENDED + LD L,A ; SPEED BASED + ADC A,H ; ON CPU CLOCK + SUB L + LD H,A ; LOOK IT + LD A,(HL) ; UP IN THE + LD (RECSPD),A ; CLOCK TABLE ; MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING LD (MD_FBAS),DE ; AT BANK 0 SECTOR 0 @@ -207,6 +222,12 @@ MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING ; CALL MENU ; DISPLAY MENU CALL GETINP ; GET SELECTION +; + CP '>' ; CHANGE TO + JP Z,OPTIONG ; RECOMMENDED BAUD RATE +; + CP '<' ; REVERT TO + JP Z,OPTIONL ; ORIGINAL BAUD RATE ; CP 'U' ; BEGIN JR Z,BEGUPD ; TRANSFER @@ -230,13 +251,13 @@ MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING JP Z,OPTIOND ; FLASH ; CP '1' ; CALCULATE - JP Z,OPTION1 ; CRC 512K FLASH + JP Z,OPTION1 ; CRC FLASH #1 ; CP '2' ; CALCULATE - JP Z,OPTION2 ; CRC 1024K FLASH + JP Z,OPTION2 ; CRC FLASH #2 ; - CP '3' ; CALCULATE - JP Z,OPTION3 ; CRC FLASH #2 + CP '2' ; CALCULATE + JP Z,OPTION3 ; CRC 1024K FLASH ; #IF (XFUDBG) CP 'T' ; TEST TIMEOUT @@ -564,22 +585,6 @@ GETINP2:CALL CONIN AND ~$20 ; CONVERT CHARACTER TO LOWER GETINP3:RET ; -PRTSTR0:LD A,(HL) ; PRINT MESSAGE POINTED TOP HL UNTIL 0 - OR A ; CHECK IF GOT ZERO? - RET Z ; IF ZERO RETURN TO CALLER - LD C,A - CALL CONOUT ; ELSE PRINT THE CHARACTER - INC HL - JP PRTSTR0 -; -PRTSTRD:LD A,(HL) ; PRINT MESSAGE POINTED TOP HL UNTIL $ - CP '$' ; CHECK IF GOT IT? - RET Z ; IF MATCH RETURN TO CALLER - LD C,A - CALL CONOUT ; ELSE PRINT THE CHARACTER - INC HL - JP PRTSTRD -; MENU: CALL COUTON LD HL,msgConsole ; DISPLAY CALL PRTSTR0 ; CONSOLE @@ -604,6 +609,16 @@ MENU: CALL COUTON CALL CONOUT POP AF CALL DISPBAUD +; + LD HL,msgSetBaud ; DISPLAY + CALL PRTSTR0 ; RECOMMENDED + LD A,(RECSPD) ; BAUD RATE + CALL DECBAUD +; + LD HL,msgRevertBaud ; DISPLAY + CALL PRTSTR0 ; ORIGINAL + LD A,(ORISPD) ; BAUD RATE + CALL DECBAUD ; LD HL,msgWriteV ; DISPLAY CALL PRTSTR0 ; VERIFY @@ -618,7 +633,33 @@ MENU1: CALL PRTSTR0 CALL PRTSTR0 ; MENU OPTIONS RET ; +;====================================================================== +; DISPLAY THE BAUD RATE FOR THE DEVICE SPECIFIED IN A +;====================================================================== +; DISPBAUD: + CALL GETDINFO ; GET DEVICE INFO + RET NZ ; EXIT IF NOT SERIAL +DECBAUD:;CALL PRTHEXB + BIT 4,A ; CONVERT ; IF X > 15 X=(X-15)*2 + JR Z,UNDER15 ; DEVICE ; ELSE X=(X*2)-1 + AND %00001111 ; BAUD + INC A ; CODE TO + ADD A,A ; TABLE + JR WASOVER ; INDEX +UNDER15:AND %00001111 + ADD A,A + DEC A +WASOVER:;CALL PRTHEXB + LD DE,BAUDTBL ; DISPLAY + CALL PRTIDXDEA ; BAUD RATE + RET +; +; GET DEVICE INFO FOR DEVICE SPECIFIED IN A +; RETURN NZ FLAG IF NON SERIAL. +; RETURN Z FLAG IF SERIAL DEVICE AND A CONTAINING ENCODED BAUD BYTE +; +GETDINFO: PUSH AF LD C,A LD B,$06 ; GET @@ -631,21 +672,8 @@ DISPBAUD: LD C,B ; GET LD B,$05 ; DEVICE RST 08 ; INFO + XOR A LD A,D -; -; CALL PRTHEXB - BIT 4,A ; CONVERT ; IF X > 15 X=(X-15)*2 - JR Z,UNDER15 ; DEVICE ; ELSE X=(X*2)-1 - AND %00001111 ; BAUD - INC A ; CODE TO - ADD A,A ; TABLE - JR WASOVER ; INDEX -UNDER15:AND %00001111 - ADD A,A - DEC A -WASOVER:;CALL PRTHEXB - LD DE,BAUDTBL ; DISPLAY - CALL PRTIDXDEA ; BAUD RATE RET ; OPTIOND:CALL COUTON ; TURN ON OUTPUT @@ -736,6 +764,26 @@ VERF: POP BC ; EXIT WITH FAIL POP BC ; FAIL MESSAGE AND JP FAILWF ; RETURN TO MENU ; +OPTIONG:LD HL,msgChangeNow + CALL PRTSTR0 + LD A,(RECSPD) +; CALL PRTHEXB + CALL DECBAUD + LD HL,msgPressKey + CALL PRTSTR0 + CALL GETINP + JP MENULP +; +OPTIONL:LD HL,msgChangeNow + CALL PRTSTR0 + LD A,(ORISPD) +; CALL PRTHEXB + CALL DECBAUD + LD HL,msgPressKey + CALL PRTSTR0 + CALL GETINP + JP MENULP +; OPTIONV:LD A,(WRTVER) ; TOGGLE CPL ; VERIFY LD (WRTVER),A ; FLAG @@ -862,6 +910,10 @@ OPTIONE:LD HL,msgErase ; DISPLAY JP Done1 #ENDIF ; +;====================================================================== +; CONSOLE AND SERIAL I/O ROUTINES +;====================================================================== +; SEROUT: PUSH HL ; SERIAL OUTPUT CHARACTER IN C PUSH DE PUSH BC @@ -943,6 +995,10 @@ CONIN: PUSH HL ; CONSOLE INPUT. WAIT FOR A CHARACTER ADD RETURN IT IN A POP HL RET ; +;====================================================================== +; TEXT OUTPUT ROUTINES +;====================================================================== +; PRTHEXB:PUSH AF ; PRINT HEX BYTE IN A TO CONSOLE PUSH BC PUSH DE @@ -974,18 +1030,66 @@ HEXCONV:AND 0FH ; CONVERT LOW NIBBLE OF A TO ASCII HEX ADC A,40H DAA RET - -OPTION3:LD HL,$1000 ; CRC32 STARTING - LD (MD_FBAS),HL ; BANK $10 SECTOR $00 - LD B,16 ; 16 BANKS (512K) - JR CALCCRC - +; +; PRINT 0 TERMINATED STRING POINTED TO BY HL +; +PRTSTR0:LD A,(HL) ; PRINT MESSAGE POINTED TOP HL UNTIL 0 + OR A ; CHECK IF GOT ZERO? + RET Z ; IF ZERO RETURN TO CALLER + LD C,A + CALL CONOUT ; ELSE PRINT THE CHARACTER + INC HL + JP PRTSTR0 +; +; PRINT $ TERMINATED STRING POINTED TO BY HL +; +PRTSTRD:LD A,(HL) ; PRINT MESSAGE POINTED TOP HL UNTIL $ + CP '$' ; CHECK IF GOT IT? + RET Z ; IF MATCH RETURN TO CALLER + LD C,A + CALL CONOUT ; ELSE PRINT THE CHARACTER + INC HL + JP PRTSTRD +; +; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY $ +; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS +; TO THE START OF THE STRING LIST. +; +PRTIDXDEA: + PUSH BC + LD C,A ; INDEX COUNT + OR A + LD A,0 +PRTIDXDEA1: + JR Z,PRTIDXDEA3 +PRTIDXDEA2: + LD A,(DE) ; LOOP UNIT + INC DE ; WE REACH + CP '$' ; END OF STRING + JR NZ,PRTIDXDEA2 + DEC C ; AT STRING END. SO GO + JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH +PRTIDXDEA3: + POP BC + EX DE,HL + CALL PRTSTRD ; FALL THROUGH TO WRITESTR + RET +; +;====================================================================== +; CRC OPTIONS AND CALCULATIONS +;====================================================================== +; 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,$0000 ; CRC32 STARTING +OPTION2:LD HL,$1000 ; CRC32 STARTING + LD (MD_FBAS),HL ; BANK $10 SECTOR $00 + LD B,16 ; 16 BANKS (512K) + JR CALCCRC +; +OPTION3:LD HL,$0000 ; CRC32 STARTING LD (MD_FBAS),HL ; BANK $00 SECTOR $00 LD B,32 ; 32 BANKS (1024K) ; @@ -997,8 +1101,7 @@ CALCCRC:CALL COUTON ; TURN ON OUTPUT LD HL,$FFFF ; SET THE LD (CRC),HL ; START CRC LD (CRC+2),HL ; CONDITION - -; LD B,16 ; +; CRCLP1: PUSH BC ; LOOP THROUGH ALL BANKS LD B,8 ; LOOP THROUGH CRCLP2: PUSH BC ; 8 SECTORS @@ -1076,37 +1179,38 @@ CLEAR: DEC B JP NZ,BYTELP LD (CRC),DE LD (CRC+2),HL -; RET ; -;====================================================================== -; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY $ -; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS -; TO THE START OF THE STRING LIST. -;====================================================================== -; -PRTIDXDEA: - PUSH BC - LD C,A ; INDEX COUNT - OR A - LD A,0 -; LD (PRTIDXCNT),A ; RESET CHARACTER COUNT -PRTIDXDEA1: - JR Z,PRTIDXDEA3 -PRTIDXDEA2: - LD A,(DE) ; LOOP UNIT - INC DE ; WE REACH - CP '$' ; END OF STRING - JR NZ,PRTIDXDEA2 - DEC C ; AT STRING END. SO GO - JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH -PRTIDXDEA3: - POP BC - EX DE,HL - CALL PRTSTRD ; FALL THROUGH TO WRITESTR -; RET -; -#INCLUDE "decode.asm" +; multiply DE:HL by 10, exit wit C set if overflwo +; +multb10:call multb2 ; x2 + ret c + push de + push hl + call multb2 ; x4 + ret c + call multb2 ; x8 + ret c +; + pop bc ; x8 + 2 + add hl,bc + pop bc + jr nc,multbc + inc de + ret c +multbc: ex de,hl + add hl,bc + ex de,hl + ret + +multb2: ex de,hl ; multiply by 2 + add hl,hl + ret c + ex de,hl + add hl,hl + jr nc,multbnc + inc de +multbnc:ret ; ;====================================================================== ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS @@ -1223,16 +1327,20 @@ 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 msgCancel: .DB CR,LF,"TRANSMISSION CANCELLED",CR,LF,0 +msgChangeNow: .DB CR,LF,"Change speed now to ",0 +msgPressKey: .DB CR,LF,"Press a key to Resume.",CR,LF,0 msgConsole: .DB CR,LF,CR,LF,"(C) Set Console Device : ",0 msgIODevice: .DB CR,LF,"(S) Set Serial Device : ",0 +msgSetBaud: .DB CR,LF,"(>) Set Recommended Baud Rate : ",0 +msgRevertBaud: .DB CR,LF,"(<) Revert to Original Baud Rate : ",0 msgWriteV: .DB CR,LF,"(V) Toggle Write Verify : ",0 msgBegin: .DB CR,LF,"(R) Reboot" .DB CR,LF,"(U) Begin Update" .DB CR,LF,"(Q) Quit to Rom Loader" .DB CR,LF,"(D) Duplicate Flash #1 to #2" - .DB CR,LF,"(1) CRC 512K Flash" - .DB CR,LF,"(2) CRC 1024K Flash" - .DB CR,LF,"(3) CRC Flash chip #2" + .DB CR,LF,"(1) CRC 512K Flash #1" + .DB CR,LF,"(2) CRC 512K Flash #2" + .DB CR,LF,"(3) CRC 1024K Flash" #IF (XFUDBG) .DB CR,LF,"(H) Select half speed" .DB CR,LF,"(T) Test timeout" @@ -1260,6 +1368,9 @@ WRTVER: .DB $FF ; WRITE VERIFY OPTION FLAG VERRES: .DB $00 ; WRITE VERIFY RESULT BLKCOUT: .DB $FF ; BLOCK TEXT OUTPUT DURING TRANSFER IF ZERO ERATYP .DB $00 ; HOLDS THE ERASE TYPE FLAG FOR VARIOUS CHIPS +;CPUSPD: .DB 0 ; HOLDS CURRENT PROCESSOR SPEED +ORISPD: .DB 0 ; HOLDS ORIGINAL BAUD RATE SPEED +RECSPD: .DB 0 ; HOLDS RECOMMENDED BAUD RATE SPEED oldSP: .DW 0 ; The orginal SP to be restored before exiting retrycnt: .DB 0 ; Counter for retries before giving up chksum: .DB 0 ; For calculating the checksum of the packet @@ -1277,6 +1388,10 @@ packet: .DB 0 ; SOH .FILL 128,0 ; data*128, .DB 0 ; chksum ; +;====================================================================== +; SUPPORTED DEVICES AND ID CODES +;====================================================================== +; DEVICES: .DW $BFB7 ; 39SF040 0 .DW $01A4 ; 29F040 1 @@ -1289,7 +1404,7 @@ DEVICES: LSTDEV: .EQU $ ; ;====================================================================== -; BOARD RATE TABLE +; BAUD RATE TABLE ;====================================================================== ; BAUDTBL:.DB "75$" ; 0 0 @@ -1325,6 +1440,31 @@ BAUDTBL:.DB "75$" ; 0 0 .DB "3686400$" ; 30 30 .DB "7372800$" ; 31 16 ; +;====================================================================== +; CLOCK SETTING TABLE +;====================================================================== +; +CLKTBL: .DB 6 ; 1 4800 + .DB 7 ; 2 9600 + .DB 7 ; 3 9600 + .DB 8 ; 4 19200 + .DB 8 ; 5 19200 + .DB 8 ; 6 19200 + .DB 8 ; 7 19200 + .DB 9 ; 8 38400 + .DB 9 ; 9 38400 + .DB 9 ; 10 38400 + .DB 9 ; 11 38400 + .DB 9 ; 12 38400 + .DB 9 ; 13 38400 + .DB 9 ; 14 38400 + .DB 9 ; 15 38400 + .DB 9 ; 16 38400 + .DB 9 ; 17 38400 + .DB 9 ; 18 38400 + .DB 9 ; 19 38400 + .DB 9 ; 20 38400 +; sector4k: .EQU $ ; 32 PACKETS GET ACCUMULATED HERE BEFORE FLASHING ; SLACK .EQU (UPD_END - $)