Browse Source

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
pull/183/head
b1ackmai1er 5 years ago
parent
commit
47d2ff82a9
  1. 158
      Source/HBIOS/updater.asm

158
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

Loading…
Cancel
Save