Browse Source

Merge pull request #178 from b1ackmai1er/dev

Add facility to backup flash
pull/199/head
Wayne Warthen 5 years ago
committed by GitHub
parent
commit
2a03295c41
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 271
      Source/HBIOS/updater.asm

271
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

Loading…
Cancel
Save