@ -68,14 +68,16 @@
; OPTION (T) - DEBUG OPTION - TEST TIMER FOR 32S, 16S, 8S, 4S, 2S & 1S
; 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
; b1ackmai1er ON RETROBREWCOMPUTERS.ORG
;
;
;
;
; NOTES:
; NOTES:
; TESTED WITH TERATERM XMODEM.
; 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.
; SBC V2-005 MEGAFLASH REQUIRED FOR 1MB FLASH SUPPORT.
; ASSUMES BOTH CHIPS ARE SAME TYPE
; FAILURE HANDLING HAS NOT BEEN TESTED.
; FAILURE HANDLING HAS NOT BEEN TESTED.
; TIMING BROADLY CALIBRATED ON A Z80 SBC-V2
; TIMING BROADLY CALIBRATED ON A Z80 SBC-V2
; UNABIOS NOT SUPPORTED
; UNABIOS NOT SUPPORTED
@ -183,7 +185,6 @@ RESTART:
LD A , 0
LD A , 0
JR Z , CH PFND ; YES IT IS ...
JR Z , CH PFND ; YES IT IS ...
;
;
# IF ( XFUDBG )
LD HL , $ A401 ; IS IT A 29F040
LD HL , $ A401 ; IS IT A 29F040
XOR A
XOR A
SBC HL , BC
SBC HL , BC
@ -211,12 +212,11 @@ RESTART:
LD HL , $ A4C2 ; IS IT AN MX29F040
LD HL , $ A4C2 ; IS IT AN MX29F040
SBC HL , BC
SBC HL , BC
LD A , 5
LD A , 5
;
# ENDIF
;
;
JP NZ , FAILBC ; SUPPORTED CHIP NOT FOUND
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
LD BC , $ F8F0 ; GET CPU SPEED
RST 08 ; AND MULTIPLY
RST 08 ; AND MULTIPLY
@ -227,6 +227,9 @@ CHPFND: LD (ERATYP),A ; SAVE ERASE TYPE
;
;
MENULP: LD DE , $ 0000 ; ENSURE WE ARE STARTING
MENULP: LD DE , $ 0000 ; ENSURE WE ARE STARTING
LD ( MD_FBAS ), DE ; AT BANK 0 SECTOR 0
LD ( MD_FBAS ), DE ; AT BANK 0 SECTOR 0
LD HL , ERATYP
RES 7 ,( HL )
;
;
LD HL , msgCRLF
LD HL , msgCRLF
CALL PRTSTR0
CALL PRTSTR0
@ -256,20 +259,29 @@ MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING
JP Z , OPTIOND ; FLASH
JP Z , OPTIOND ; FLASH
;
;
CP '1' ; CALCULATE
CP '1' ; CALCULATE
JP Z , OPTION1 ; CRC FLASH #1
JP Z , OPTION1 ; CRC 512K FLASH
;
;
CP '2' ; CALCULATE
CP '2' ; CALCULATE
JP Z , OPTION2 ; CRC FLASH #2
JP Z , OPTION2 ; CRC 1024K FLASH
;
;
# IF ( XFUDBG )
# IF ( XFUDBG )
CP '3' ; CALCULATE
JP Z , OPTION3 ; CRC FLASH #2
;
CP 'T' ; TEST TIMEOUT
CP 'T' ; TEST TIMEOUT
JP Z , OPTIONT ; LOOP
JP Z , OPTIONT ; LOOP
;
;
CP 'H' ; HALF
CP 'H' ; HALF
JP Z , OPTIONH ; SPEED SWITCH
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
# ENDIF
;
;
JR MENULP
JR MENULP
@ -443,9 +455,21 @@ Die1: LD B,BF_SYSRESET ; SYSTEM RESTART
WSEC: CALL DI SP ROG ; DISPLAY PROGRESS
WSEC: CALL DI SP ROG ; 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
LD HL , MD_FWRIT ; BANK / SECTOR
CALL MD_FNCALL
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
LD ( HL ), A ; RESET SECTOR TO 0
INC HL
INC HL
INC ( HL ) ; NEXT BANK
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
NXTS2: LD A , $ 10 ; NEXT SECTOR
ADD A ,( HL ) ; EACH SECTOR IS $1000
ADD A ,( HL ) ; EACH SECTOR IS $1000
@ -605,9 +634,20 @@ OPTIOND:CALL COUTON ; TURN ON OUTPUT
CP 'Y' ; PROCEED
CP 'Y' ; PROCEED
JP NZ , MENULP
JP NZ , MENULP
DUPL: LD HL , msgCopying
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
XOR A ; START AT
LD ( MD_BANK ), A ; BANK 0
LD ( MD_BANK ), A ; BANK 0
@ -628,13 +668,17 @@ NXTS: PUSH BC
;
;
LD HL , MD_BANK ; SET CHIP #2
LD HL , MD_BANK ; SET CHIP #2
SET 4 ,( HL )
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
LD HL , MD_FERAS ; ERASE SECTOR
CALL MD_FNCALL ; ON ROM #2
CALL MD_FNCALL ; ON ROM #2
OR A
OR A
JR NZ , VERF
JR NZ , VERF
;
;
LD IX , sector4k ; WRITE SECTOR
NOERA2: LD IX , sector4k ; WRITE SECTOR
LD HL , MD_FWRIT ; ON ROM #2
LD HL , MD_FWRIT ; ON ROM #2
CALL MD_FNCALL
CALL MD_FNCALL
;
;
@ -729,18 +773,22 @@ OPTIONH:LD A,8 ; TURN ON THE SBC-V2-004+
;
;
OPTIONF: LD HL , msgCRLF ; DISPLAY
OPTIONF: LD HL , msgCRLF ; DISPLAY
CALL PRTSTR0 ; BANK
CALL PRTSTR0 ; BANK
LD C , 'B ' ; SECTOR
LD C , 'b ' ; SECTOR
CALL CONOUT ; TIMEOUT
CALL CONOUT ; TIMEOUT
LD A ,( MD_BANK )
LD A ,( MD_BANK ) ; CHIP
CALL PRTHEXB
CALL PRTHEXB
LD C , 'S '
LD C , 's '
CALL CONOUT
CALL CONOUT
LD A ,( MD_SECT )
LD A ,( MD_SECT )
CALL PRTHEXB
CALL PRTHEXB
LD C , 'T '
LD C , 't '
CALL CONOUT
CALL CONOUT
LD A ,( TmoFct )
LD A ,( TmoFct )
CALL PRTHEXB
CALL PRTHEXB
LD C , 'c'
CALL CONOUT
LD A ,( ERATYP )
CALL PRTHEXB
;
;
LD HL , msgCRLF ; DISPLAY
LD HL , msgCRLF ; DISPLAY
CALL PRTSTR0 ; ACK/NAK BYTE
CALL PRTSTR0 ; ACK/NAK BYTE
@ -769,11 +817,27 @@ DMPBUF: LD A,(HL) ; PACKET
LD HL , msgCRLF
LD HL , msgCRLF
CALL PRTSTR0
CALL PRTSTR0
POP HL
POP HL
DMPBUF1:
INC HL
DMPBUF1: INC HL
DJNZ DMPBUF
DJNZ DMPBUF
JP MENULP
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
# ENDIF
;
;
SEROUT: PUSH HL ; SERIAL OUTPUT CHARACTER IN C
SEROUT: PUSH HL ; SERIAL OUTPUT CHARACTER IN C
@ -889,14 +953,19 @@ HEXCONV:AND 0FH ; CONVERT LOW NIBBLE OF A TO ASCII HEX
DAA
DAA
RET
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
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
CALCCRC: CALL COUTON ; TURN ON OUTPUT
;
;
@ -907,8 +976,8 @@ CALCCRC:CALL COUTON ; TURN ON OUTPUT
LD ( CRC ), HL ; START CRC
LD ( CRC ), HL ; START CRC
LD ( CRC + 2 ), HL ; CONDITION
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
LD B , 8 ; LOOP THROUGH
CRCLP2: PUSH BC ; 8 SECTORS
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
; IX POINTS TO DATA TO BE WRITTEN
; ON EXIT A NO STATUS IS RETURNED
; 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:
; 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:
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_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_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_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
; Message strings
;
;
@ -1092,7 +1166,8 @@ msgBank: .DB CR,LF,"BANK ",0
msgUnsupC: .DB CR , LF , "FLASH CHIP NOT SUPPORTED" , CR , LF , 0
msgUnsupC: .DB CR , LF , "FLASH CHIP NOT SUPPORTED" , CR , LF , 0
msgReboot: .DB CR , LF , "REBOOTING ..." , CR , LF , 0
msgReboot: .DB CR , LF , "REBOOTING ..." , CR , LF , 0
msgCopying: .DB CR , LF , "COPYING ..." , 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
msgCRC32: .DB CR , LF , CR , LF , "CRC32 : " , 0
msgFailWrt: .DB CR , LF , "FLASH WRITE FAILED" , CR , LF , 0
msgFailWrt: .DB CR , LF , "FLASH WRITE FAILED" , CR , LF , 0
msgFailure: .DB CR , LF , "TRANSMISSION 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 , "(U) Begin Update"
.DB CR , LF , "(X) Exit to Rom Loader"
.DB CR , LF , "(X) Exit to Rom Loader"
.DB CR , LF , "(D) Duplicate Flash #1 to #2"
.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 )
# IF ( XFUDBG )
.DB CR , LF , "(H) Select half speed"
.DB CR , LF , "(H) Select half speed"
.DB CR , LF , "(T) Test timeout"
.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
# ENDIF
.DB CR , LF , CR , LF , "Select : " , 0
.DB CR , LF , CR , LF , "Select : " , 0
msgSuccess: .DB CR , LF , CR , LF , "COMPLETED WITHOUT ERRORS " , CR , LF , 0
msgSuccess: .DB CR , LF , CR , LF , "COMPLETED WITHOUT ERRORS " , CR , LF , 0