mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1497 lines
36 KiB
1497 lines
36 KiB
;*****************************************************************************
|
|
; ROMWBW XMODEM FLASH UPDATER
|
|
;
|
|
; 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 'X'.
|
|
;
|
|
; OPTION (C) AND (S) - CONSOLE AND SERIAL DEVICE
|
|
;
|
|
; BY DEFAULT THE UPDATER IS SET TO USE THE CURRENT CONSOLE DEVICE FOR
|
|
; DISPLAY OUTPUT AND FILES TRANSFER. IF YOU USE A DIFFERENT SERIAL DEVICE FOR
|
|
; THE FILE TRANSFER, PROGRESS INFORMATION WILL BE DISPLAYED.
|
|
;
|
|
; OPTION (V) - WRITE VERIFY
|
|
;
|
|
; BY DEFAULT EACH FLASH SECTOR WILL BE VERIFIED AFTER BEING WRITTEN. SLIGHT
|
|
; PERFORMANCE IMPROVEMENTS CAN BE GAINED IF TURNED OFF AND COULD BE USED IF
|
|
; YOU ARE EXPERIENCING RELIABLE TRANSFERS AND FLASHING.
|
|
;
|
|
; OPTION (R) - REBOOT
|
|
; EXECUTE A COLD REBOOT. THIS SHOULD BE DONE AFTER A SUCCESSFUL UPDATE. IF
|
|
; YOU PERFORM A COLD REBOOT AFTER A FAILED UPDATE THEN IT IS LIKELY THAT
|
|
; YOUR SYSTEM WILL BE UNUSABLE AND REMOVING AND REPROGRAMMING THE FLASH
|
|
; WILL BE REQUIRED.
|
|
;
|
|
; OPTION (U) - BEGIN UPDATE
|
|
; WILL BEGIN THE UPDATE PROCESS. THE UPDATER WILL EXPECT TO START RECEIVING
|
|
; AN XMODEM FILE ON THE SERIAL DEVICE UNIT.
|
|
;
|
|
; XMODEM SENDS THE FILE IN PACKETS OF 128 BYTES. THE UPDATER WILL CACHE 32
|
|
; PACKETS WHICH IS 1 FLASH SECTOR AND THEN WRITE THAT SECTOR TO THE
|
|
; FLASH DEVICE.
|
|
;
|
|
; IF USING SEPARATE CONSOLE, BANK AND SECTOR PROGESS INFORMATION WILL SHOWN
|
|
;
|
|
; BANK 00 S00 S01 S02 S03 S04 S05 S06 S06 S07
|
|
; BANK 01 S00 S01 S02 S03 S04 S05 S06 S06 S07
|
|
; BANK 02 S00 S01 S02 S03 S04 S05 S06 S06 S07 etc
|
|
;
|
|
; THE XMODEM FILE TRANSFER PROTOCOL DOES NOT PROVIDE ANY FILENAME OR SIZE
|
|
; INFORMATION FOR THE TRANSFER SO THE UPDATER DOES NOT PERFORM ANY CHECKS
|
|
; ON THE FILE SUITABILITY.
|
|
;
|
|
; THE UPDATER EXPECTS THE FILE SIZE TO BE A MULTIPLE OF 4 KILOBYTES AND
|
|
; WILL WRITE ALL DATA RECEIVED TO THE FLASH DEVICE. A SYSTEM UPDATE
|
|
; FILE (128KB .IMG) OR COMPLETE ROM CAN BE RECEIVED AND WRITTEN (512KB OR
|
|
; 1024KB .ROM)
|
|
;
|
|
; 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 (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.
|
|
;
|
|
; 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 (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 23/7/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM
|
|
; b1ackmai1er ON RETROBREWCOMPUTERS.ORG
|
|
;
|
|
;
|
|
; NOTES:
|
|
; TESTED WITH TERATERM XMODEM.
|
|
; 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
|
|
;
|
|
; TERATERM:
|
|
;
|
|
; MACROS CAN BE USED TO AUTOMATE SENDING ROM UPDATES OR ROMS IMAGES.
|
|
; TRANSMISSION STARTUP IS MORE RELIABLE WHEN THE CHECKSUM OPTION (1) IS SPECIFIED
|
|
;
|
|
; EXAMPLE MACRO FILE TO SEND *.UPD FILE, SELECT CHECKSUM MODE AND DISPLAY CRC32
|
|
;
|
|
; ;XMODEM send, checksum, display CRC32
|
|
; xmodemsend '\\DESKTOP-FI43VI2\Users\Phillip\Documents\GitHub\RomWBW\Binary\SBC_std_cust.upd' 1
|
|
; crc32file crc '\\DESKTOP-FI43VI2\Users\Phillip\Documents\GitHub\RomWBW\Binary\SBC_std_cust.rom'
|
|
; sprintf '0x%08X' crc
|
|
; messagebox inputstr 'CRC32'
|
|
;
|
|
; MAXIMUM SERIAL SPEED LIMITATIONS:
|
|
;
|
|
; SBC-V2 UART NO FLOW CONTROL 2MHZ | 9600
|
|
; SBC-V2 UART NO FLOW CONTROL 4MHZ | 19200
|
|
; SBC-V2 UART NO FLOW CONTROL 5MHZ | 19200
|
|
; SBC-V2 UART NO FLOW CONTROL 8MHZ | 38400
|
|
; SBC-V2 UART NO FLOW CONTROL 10MHZ | 38400
|
|
; SBC-V2 USB-FIFO 2MHZ+ | N/A
|
|
; SBC-MK4 ASCI NO FLOW CONTROL 18.432MHZ | 9600
|
|
; SBC-MK4 ASCI WITH FLOW CONTROL 18.432MHZ | 38400
|
|
;
|
|
; ACKNOWLEDGEMENTS:
|
|
;
|
|
; XR - Xmodem Receive for Z80 CP/M 2.2 using CON:
|
|
; Copyright 2017 Mats Engstrom, SmallRoomLabs
|
|
; Licensed under the MIT license
|
|
; https://github.com/SmallRoomLabs/xmodem80/blob/master/XR.Z80
|
|
;
|
|
; md.asm - ROMWBW memory disk driver
|
|
; https://github.com/wwarthen/RomWBW/blob/master/Source/HBIOS/md.asm
|
|
;
|
|
; CRC32 - J.G. HARSTON - mdfs.net/Info/Comp/Comms/CRC32.htm
|
|
;
|
|
;*****************************************************************************
|
|
;
|
|
#INCLUDE "std.asm"
|
|
;
|
|
HBX_BNKSEL .EQU $FE2B
|
|
;
|
|
#DEFINE HB_DI DI
|
|
#DEFINE HB_EI EI
|
|
;
|
|
XFUDBG .EQU 0
|
|
;
|
|
.ORG UPD_LOC
|
|
;
|
|
; ASCII codes
|
|
;
|
|
LF: .EQU 'J'-40h ; ^J LF
|
|
CR: .EQU 'M'-40h ; ^M CR/ENTER
|
|
SOH: .EQU 'A'-40h ; ^A CTRL-A
|
|
EOT: .EQU 'D'-40h ; ^D = End of Transmission
|
|
ACK: .EQU 'F'-40h ; ^F = Positive Acknowledgement
|
|
NAK: .EQU 'U'-40h ; ^U = Negative Acknowledgement
|
|
CAN: .EQU 'X'-40h ; ^X = Cancel
|
|
BSPC: .EQU 'H'-40h ; ^H = Backspace
|
|
;
|
|
; Start of code
|
|
;
|
|
LD (oldSP),SP ; SETUP STACK BELOW HBIOS
|
|
LD SP,HBX_LOC-MD_CSIZ ; ALLOW FOR RELOCATABLE CODE AREA
|
|
;
|
|
LD HL,MD_FSTART ; COPY FLASH
|
|
LD DE,HBX_LOC-MD_CSIZ ; ROUTINES TO
|
|
LD BC,MD_CSIZ ; HIGH MEMORY
|
|
LDIR
|
|
;
|
|
LD BC,$F8F2 ; LOOKUP
|
|
RST 08 ; CURRENT
|
|
LD B,$FA ; CONSOLE
|
|
LD HL,$112 ; DEVICE
|
|
RST 08 ; TO USE AS
|
|
LD A,E ; DEFAULT
|
|
LD (CONDEV),A
|
|
;
|
|
LD BC,$F8F2 ; LOOKUP
|
|
RST 08 ; CURRENT
|
|
LD B,$FA ; SERIAL
|
|
LD HL,$110 ; DEVICE
|
|
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
|
|
;
|
|
RESTART:
|
|
LD DE,$0000 ; SET UP START
|
|
LD (MD_FBAS),DE ; BANK AND SECTOR
|
|
;
|
|
LD HL,MD_FIDEN ; IDENTIFY CHIP
|
|
CALL MD_FNCALL ; AT THIS BANK/SECTOR
|
|
;
|
|
LD A,0-1 ; SEARCH DEVICE
|
|
LD HL,DEVICES ; TABLE FOR
|
|
NXTDEV: LD D,(HL) ; VALID DEVICE
|
|
INC HL ;
|
|
LD E,(HL)
|
|
INC HL
|
|
INC A
|
|
CP +((LSTDEV-DEVICES)/2)
|
|
JP Z,FAILBC ; SUPPORTED CHIP NOT FOUND
|
|
OR A
|
|
EX DE,HL
|
|
SBC HL,BC
|
|
EX DE,HL
|
|
JR NZ,NXTDEV
|
|
;
|
|
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
|
|
|
|
LD HL,ERATYP ; RESET THE ERASE
|
|
RES 7,(HL) ; SKIP FLAG
|
|
;
|
|
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
|
|
;
|
|
CP 'V' ; CHECK FOR
|
|
JP Z,OPTIONV ; VERIFY TOGGLE
|
|
;
|
|
CP 'Q' ; CHECK FOR
|
|
JP Z,FAILUX ; USER EXIT
|
|
;
|
|
CP 'R' ; CHECK FOR
|
|
JP Z,REBOOT ; COLD REBOOT REQUEST
|
|
;
|
|
CP 'C' ; CHECK FOR
|
|
JP Z,OPTIONC ; CONSOLE CHANGE
|
|
;
|
|
CP 'S' ; CHECK FOR
|
|
JP Z,OPTIONS ; SERIAL CHANGE
|
|
;
|
|
CP 'D' ; DUPLICATE
|
|
JP Z,OPTIOND ; FLASH
|
|
;
|
|
CP '1' ; CALCULATE
|
|
JP Z,OPTION1 ; CRC FLASH #1
|
|
;
|
|
CP '2' ; CALCULATE
|
|
JP Z,OPTION2 ; CRC FLASH #2
|
|
;
|
|
CP '2' ; CALCULATE
|
|
JP Z,OPTION3 ; CRC 1024K FLASH
|
|
;
|
|
#IF (XFUDBG)
|
|
CP 'T' ; TEST TIMEOUT
|
|
JP Z,OPTIONT ; LOOP
|
|
;
|
|
CP 'H' ; HALF
|
|
JP Z,OPTIONH ; SPEED SWITCH
|
|
;
|
|
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
|
|
;
|
|
BEGUPD: CALL SERST ; EMPTY SERIAL BUFFER
|
|
OR A ; SO WE HAVE A CLEAN
|
|
JR Z,SERCLR ; START ON TRANSFER
|
|
CALL SERIN
|
|
JR BEGUPD
|
|
;
|
|
SERCLR: LD HL,msgInstr ; PROVIDE
|
|
CALL PRTSTR0 ; INSTRUCTION
|
|
;
|
|
LD A,(SERDEV) ; IF CONSOLE AND SERIAL
|
|
LD HL,CONDEV ; DEVICE ARE THE SAME,
|
|
SUB (HL) ; BLOCK ALL TEXT
|
|
LD (BLKCOUT),A ; OUTPUT DURING TRANSFER
|
|
;
|
|
LD A,1 ; THE FIRST PACKET IS NUMBER 1
|
|
LD (pktNo),A
|
|
LD A,255-1 ; ALSO STORE THE 1-COMPLEMENT OF IT
|
|
LD (pktNo1c),A
|
|
;
|
|
LD DE,sector4k ; POINT TO START OF SECTOR TO WRITE
|
|
;
|
|
GetNewPacket:
|
|
LD HL,retrycnt ; WE RETRY 20 TIMES BEFORE GIVING UP
|
|
LD (HL),20
|
|
;
|
|
NPloop: LD B,6 ; 6 SECONDS OF TIMEOUT BEFORE EACH NEW BLOCK
|
|
CALL GetCharTmo
|
|
JP NC,NotPacketTimeout
|
|
;
|
|
DEC (HL) ; REACHED MAX NUMBER OF RETRIES?
|
|
JP Z,FAILRT ; YES, PRINT MESSAGE AND EXIT
|
|
;
|
|
LD C,NAK ; SEND A NAK TO THE UPLOADER
|
|
CALL SEROUT
|
|
JR NPloop
|
|
;
|
|
NotPacketTimeout:
|
|
CP EOT ; DID UPLOADER SAY WE'RE FINISHED?
|
|
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?
|
|
JR NZ,NPloop ; NO, GO BACK AND TRY AGAIN
|
|
;
|
|
#IF (XFUDBG)
|
|
LD HL,packet ; SAVE THE RECEIVED CHAR INTO THE...
|
|
LD (HL),A ; ...PACKET BUFFER AND...
|
|
INC HL ; ...POINT TO THE NEXT LOCATION
|
|
#ELSE
|
|
LD HL,packet+1 ; SKIP SAVING
|
|
#ENDIF
|
|
;
|
|
CALL GetCharTmo1 ; GET CHARACTER
|
|
LD (HL),A ; SHOULD BE PACKET NUMBER
|
|
INC HL
|
|
JR C,FAILTO
|
|
;
|
|
CALL GetCharTmo1 ; GET CHARACTER
|
|
LD (HL),A ; SHOULD BE PACKET NUMBER
|
|
INC HL ; COMPLEMENT
|
|
JR C,FAILTO
|
|
;
|
|
LD C,0 ; GET 128 MORE CHARACTERS FOR A FULL PACKET
|
|
GetRestOfPacket: ; C=0=256 TO ALLOW FOR DOUBLE DECREMENT
|
|
CALL GetCharTmo1 ; GET CHARACTER
|
|
JR C,FAILTO
|
|
;
|
|
LD (HL),A ; SAVE THE RECEIVED CHAR INTO THE
|
|
LDI ; PACKET BUFFER AND FLASH SECTOR BUFFER
|
|
;
|
|
DEC C ; C GETS DECREMENTED TWICE EACH LOOP.
|
|
;
|
|
JP NZ,GetRestOfPacket
|
|
;
|
|
CALL GetCharTmo1 ; GET CHARACTER
|
|
LD (HL),A ; SHOULD BE CHECKSUM
|
|
JR C,FAILTO
|
|
;
|
|
LD HL,packet+3 ; CALCULATE CHECKSUM FROM 128 BYTES OF DATA
|
|
LD B,128
|
|
XOR A
|
|
csloop: ADD A,(HL) ; JUST ADD UP THE BYTES
|
|
INC HL
|
|
DJNZ csloop
|
|
;
|
|
XOR (HL) ; HL POINTS TO THE RECEIVED CHECKSUM SO
|
|
JR NZ,FAILCS ; BY XORING IT TO OUR SUM WE CHECK FOR EQUALITY
|
|
;
|
|
LD HL,(pktNo) ; CHECK
|
|
LD BC,(packet+1) ; AGREEMENT
|
|
; XOR A ; PACKET
|
|
SBC HL,BC ; NUMBERS
|
|
JR NZ,FAILPN
|
|
;
|
|
LD A,C ; HAVE WE RECEIVED A BLOCK OF 32
|
|
DEC A ; XMODEM PACKETS?
|
|
AND %00011111 ; IF YES THEN WERE WE
|
|
CP %00011111 ; HAVE ENOUGH TO
|
|
LD A,H ; WRITE A FLASH SECTOR
|
|
CALL Z,WSEC ; ASSUME FLASH SUCCESSFUL
|
|
OR A ; EXIT IF WE GOT A
|
|
JR NZ,FAILWF ; WRITE VERIFICATION ERROR
|
|
;
|
|
LD HL,pktNo ; UPDATE THE PACKET COUNTERS
|
|
INC (HL)
|
|
INC HL
|
|
DEC (HL)
|
|
;
|
|
LD C,ACK ; TELL UPLOADER THAT WE'RE HAPPY WITH WITH
|
|
CALL SEROUT ; PACKET AND GO BACK AND FETCH SOME MORE
|
|
;
|
|
JP GetNewPacket
|
|
;
|
|
FAILTO: LD HL,msgTimout ; TIMEOUT WAITING
|
|
JR ERRRX ; FOR CHARACTER
|
|
;
|
|
COUTON: LD A,$FF ; TURN ON
|
|
LD (BLKCOUT),A ; OUTPUT
|
|
RET
|
|
;
|
|
Done: LD C,ACK ; TELL UPLOADER
|
|
CALL SEROUT ; WE'RE DONE
|
|
Done1: LD HL,msgSuccess ; BACK TO
|
|
JR MSGRS ; MENU
|
|
;
|
|
FAILWF: LD HL,msgFailWrt ; FLASH
|
|
JR MSGRS ; VERIFY FAIL
|
|
;
|
|
FAILRT: LD HL,msgRetry ; RETRY
|
|
JR ERRRX ; TIMEOUT FAIL
|
|
;
|
|
FAILCS: LD HL,msgChkSum ; CHECKSUM
|
|
JR ERRRX ; ERROR
|
|
;
|
|
FAILPN: LD HL,msgPacErr ; PACKET
|
|
JR ERRRX ; NUMBER ERROR
|
|
;
|
|
FAILCN: LD HL,msgCancel ; TRANSMISSION
|
|
JR ERRRX ; FAILURE
|
|
;
|
|
FAILUX: LD HL,msgUserEx ; USER
|
|
JR Die ; EXIT
|
|
;
|
|
FAILBC: LD HL,msgUnsupC ; UNSUPPORTED
|
|
JR Die ; FLASH CHIP
|
|
;
|
|
ERRRX: CALL COUTON ; TURN ON OUTPUT
|
|
CALL PRTSTR0 ; DISPLAY TRANSMISSION
|
|
LD HL,msgFailure ; RECEIPT ERROR
|
|
CALL PRTSTR0
|
|
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: 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
|
|
LD SP,(oldSP)
|
|
CALL $FFF0 ; CALL HBIOS
|
|
RET
|
|
|
|
WSEC: CALL DISPROG ; DISPLAY PROGRESS
|
|
;
|
|
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
|
|
;
|
|
LD A,(WRTVER) ; VERIFY
|
|
OR A ; WRITE IF
|
|
JR Z,NOVER ; OPTION SET
|
|
;
|
|
LD IX,sector4k ; VERIFY
|
|
LD HL,MD_FVERI ; WRITE
|
|
CALL MD_FNCALL
|
|
LD (VERRES),A ; SAVE STATUS
|
|
;
|
|
NOVER: LD DE,sector4k ; POINT BACK TO START OF 4K BUFFER
|
|
;
|
|
LD HL,MD_FBAS
|
|
LD A,(HL) ; DID WE JUST
|
|
SUB $70 ; DO LAST
|
|
JR NZ,NXTS2 ; SECTOR
|
|
;
|
|
LD (HL),A ; RESET SECTOR TO 0
|
|
INC HL
|
|
INC (HL) ; NEXT BANK
|
|
;
|
|
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
|
|
LD (HL),A ; SO WE JUST INCREASE HIGH BYTE
|
|
;
|
|
NXTS3: LD A,(VERRES) ; EXIT WITH STATUS
|
|
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 B SECONDS FOR A CHARACTER TO BECOME AVAILABLE AND
|
|
; RETURNS IT IN A WITHOUT ECHO AND CARRY CLEAR. IF TIMEOUT THEN CARRY
|
|
; IT SET.
|
|
;
|
|
; 4MHZ 20 SECONDS TmoFct = 16
|
|
; 10MHZ 20 SECONDS TmoFct = 39
|
|
;
|
|
GetCharTmo1:
|
|
LD B,1 ; WAIT 1 SECOND FOR SERIAL INPUT
|
|
GetCharTmo:
|
|
CALL SERST ; IF THERE IS A
|
|
OR A ; CHARACTER AVAILABLE
|
|
JR NZ,GotChrX ; EXIT NOW OTHERWISE POLL
|
|
GCtmoa: PUSH BC
|
|
LD BC,255 ; C=CONSTANT (255) FOR INNER TIMING LOOP
|
|
TmoFct: .EQU $-1 ; B=SPEED FACTOR WHICH GETS UPDATED AT START
|
|
GCtmob: PUSH BC
|
|
LD B,C
|
|
GCtmoc: PUSH BC
|
|
CALL SERST
|
|
OR A ; A CHAR AVAILABLE?
|
|
JR NZ,GotChar ; YES, GET OUT OF LOOP
|
|
POP BC
|
|
DJNZ GCtmoc
|
|
POP BC
|
|
DJNZ GCtmob
|
|
POP BC
|
|
DJNZ GetCharTmo
|
|
SCF ; SET CARRY SIGNALS TIMEOUT
|
|
RET
|
|
;
|
|
GotChar:POP BC
|
|
POP BC
|
|
POP BC
|
|
GotChrX:CALL SERIN
|
|
OR A ; CLEAR CARRY SIGNALS SUCCESS
|
|
RET
|
|
;
|
|
GETINP: CALL CONIN ; GET A CHARACTER
|
|
LD C,A ; RETURN SEQUENCE
|
|
CALL CONOUT ; CONVERT TO UPPERCASE
|
|
LD C,BSPC ; RETURN CHARACTER IN A
|
|
CALL CONOUT
|
|
LD B,A
|
|
CP BSPC
|
|
JR Z,GETINP
|
|
GETINP2:CALL CONIN
|
|
CP BSPC
|
|
JR Z,GETINP
|
|
CP CR
|
|
JR NZ,GETINP2
|
|
LD A,B
|
|
LD C,A
|
|
CALL CONOUT
|
|
CP 'a' ; BELOW 'A'?
|
|
JR C,GETINP3 ; IF SO, NOTHING TO DO
|
|
CP 'z'+1 ; ABOVE 'Z'?
|
|
JR NC,GETINP3 ; IF SO, NOTHING TO DO
|
|
AND ~$20 ; CONVERT CHARACTER TO LOWER
|
|
GETINP3:RET
|
|
;
|
|
MENU: CALL COUTON
|
|
LD HL,msgConsole ; DISPLAY
|
|
CALL PRTSTR0 ; CONSOLE
|
|
LD A,(CONDEV) ; DEVICE
|
|
PUSH AF
|
|
ADD A,'0'
|
|
LD C,A
|
|
CALL CONOUT
|
|
LD C,' '
|
|
CALL CONOUT
|
|
POP AF
|
|
CALL DISPBAUD
|
|
;
|
|
LD HL,msgIODevice ; DISPLAY
|
|
CALL PRTSTR0 ; SERIAL
|
|
LD A,(SERDEV) ; DEVICE
|
|
PUSH AF
|
|
ADD A,'0'
|
|
LD C,A
|
|
CALL CONOUT
|
|
LD C,' '
|
|
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
|
|
LD A,(WRTVER) ; OPTION
|
|
OR A
|
|
LD HL,msgYES
|
|
JR NZ,MENU1
|
|
LD HL,msgNO
|
|
MENU1: CALL PRTSTR0
|
|
;
|
|
LD HL,msgBegin ; DISPLAY OTHER
|
|
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
|
|
RST 08 ; DEVICE
|
|
LD A,C ; TYPE
|
|
POP BC
|
|
OR A ; EXIT IF
|
|
RET NZ ; NOT SERIAL
|
|
;
|
|
LD C,B ; GET
|
|
LD B,$05 ; DEVICE
|
|
RST 08 ; INFO
|
|
XOR A
|
|
LD A,D
|
|
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 A,(ERATYP) ; CHECK IF WE
|
|
OR A ; NEED TO DO
|
|
JR Z,NOERA1 ; A CHIP ERASE
|
|
;
|
|
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
|
|
;
|
|
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 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
|
|
;
|
|
NOERA2: 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
|
|
;
|
|
OPTIONG:LD HL,msgChangeNow ; CHANGE
|
|
CALL PRTSTR0 ; SERIAL
|
|
LD A,(RECSPD) ; DEVICE
|
|
PUSH AF ; BAUD RATE
|
|
CALL DECBAUD ; TO RECOMMENDED
|
|
LD HL,msgPressKey
|
|
CALL PRTSTR0
|
|
POP AF
|
|
CALL CHGSPD
|
|
CALL GETINP
|
|
JP MENULP
|
|
;
|
|
OPTIONL:LD HL,msgChangeNow ; CHANGE
|
|
CALL PRTSTR0 ; SERIAL
|
|
LD A,(ORISPD) ; DEVICE
|
|
PUSH AF ; BAUD RATE
|
|
CALL DECBAUD ; TO ORIGINAL
|
|
LD HL,msgPressKey
|
|
CALL PRTSTR0
|
|
POP AF
|
|
CALL CHGSPD
|
|
CALL GETINP
|
|
JP MENULP
|
|
;
|
|
CHGSPD: PUSH AF
|
|
LD B,$05 ; GET SERIAL DEVICE
|
|
LD A,(SERDEV) ; CHARACTERISTICS
|
|
LD C,A
|
|
RST 08
|
|
LD A,D ; MASK OUT EXISTING
|
|
AND %11100000 ; REPLACE WITH RATE
|
|
LD D,A
|
|
POP AF
|
|
OR D
|
|
LD D,A
|
|
;
|
|
LD B,$04 ; SET NEW
|
|
LD A,(SERDEV) ; SPEED
|
|
LD C,A
|
|
RST 08
|
|
RET
|
|
;
|
|
OPTIONV:LD A,(WRTVER) ; TOGGLE
|
|
CPL ; VERIFY
|
|
LD (WRTVER),A ; FLAG
|
|
JP MENULP ; BACK TO MENU
|
|
;
|
|
OPTIONC:LD HL,msgEnterUnit ; GET
|
|
CALL PRTSTR0 ; CONSOLE
|
|
CALL GETINP ; UNIT NUMBER
|
|
CP '0'
|
|
JR C,CONCLR
|
|
CP '9' + 1
|
|
JR NC,CONCLR
|
|
SUB '0'
|
|
LD (CONDEV),A
|
|
CLRCON: CALL CONST ; EMPTY CONSOLE BUFFER
|
|
OR A ; SO WE DON'T HAVE ANY
|
|
JR Z,CONCLR ; FALSE ENTRIES
|
|
CALL CONIN
|
|
JR CLRCON
|
|
|
|
CONCLR: JP MENULP ; BACK TO MENU
|
|
;
|
|
OPTIONS:LD HL,msgEnterUnit ; GET
|
|
CALL PRTSTR0 ; CONSOLE
|
|
CALL GETINP ; UNIT
|
|
CP '0'
|
|
JR C,CONCLR
|
|
CP '9' + 1
|
|
JR NC,CONCLR
|
|
SUB '0' ; NUMBER
|
|
LD (SERDEV),A
|
|
;
|
|
JP MENULP ; BACK TO MENU
|
|
;
|
|
#IF (XFUDBG)
|
|
OPTIONT:LD HL,msgCRLF ; TEST DELAY 32S, 16S, 8S, 4S, 2S, 1S
|
|
CALL PRTSTR0
|
|
LD B,32 ; START DELAY IS 32 SECONDS
|
|
TSTDLY: PUSH BC
|
|
LD C,'>' ; DISPLAY START
|
|
CALL CONOUT ; INDICATOR
|
|
LD A,B
|
|
CALL PRTHEXB
|
|
CALL GetCharTmo ; DELAY B SECONDS
|
|
LD C,'<' ; DISPLAY STOP
|
|
CALL CONOUT ; INDICATOR
|
|
POP BC
|
|
SRL B ; NEXT DELAY IS HALF PREVIOUS
|
|
JR NZ,TSTDLY ; RETURN TO MENU
|
|
JP MENULP ; WHEN DELAY GETS TO 1 SECOND
|
|
;
|
|
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
|
|
;
|
|
OPTIONF:LD HL,msgCRLF ; DISPLAY
|
|
CALL PRTSTR0 ; BANK
|
|
LD C,'b' ; SECTOR
|
|
CALL CONOUT ; TIMEOUT
|
|
LD A,(MD_BANK) ; CHIP
|
|
CALL PRTHEXB
|
|
LD C,'s'
|
|
CALL CONOUT
|
|
LD A,(MD_SECT)
|
|
CALL PRTHEXB
|
|
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
|
|
LD HL,packet ; DISPLAY
|
|
LD B,3 ; LAST
|
|
DMPBUF2:LD A,(HL) ; NUMBERS
|
|
CALL PRTHEXB
|
|
LD C,' '
|
|
CALL CONOUT
|
|
INC HL
|
|
DJNZ DMPBUF2
|
|
LD HL,msgCRLF
|
|
CALL PRTSTR0
|
|
LD B,128 ; DISPLAY
|
|
LD HL,packet+3 ; LAST
|
|
DMPBUF: LD A,(HL) ; PACKET
|
|
CALL PRTHEXB ; CONTENTS
|
|
LD C,' '
|
|
CALL CONOUT
|
|
LD A,B
|
|
SUB 2
|
|
AND %00001111
|
|
CP %00001111
|
|
JR NZ,DMPBUF1
|
|
PUSH HL
|
|
LD HL,msgCRLF
|
|
CALL PRTSTR0
|
|
POP 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
|
|
;
|
|
;======================================================================
|
|
; CONSOLE AND SERIAL I/O ROUTINES
|
|
;======================================================================
|
|
;
|
|
SEROUT: PUSH HL ; SERIAL OUTPUT CHARACTER IN C
|
|
PUSH DE
|
|
PUSH BC
|
|
LD E,C
|
|
LD B,$01
|
|
LD HL,SERDEV
|
|
LD C,(HL)
|
|
RST 08
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
;
|
|
SERST: PUSH HL ; SERIAL STATUS. RETURN CHARACTERS AVAILABLE IN A
|
|
PUSH DE
|
|
PUSH BC
|
|
LD B,$02
|
|
LD HL,SERDEV
|
|
LD C,(HL)
|
|
RST 08
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
;
|
|
SERIN: PUSH HL ; SERIAL INPUT. WAIT FOR A CHARACTER ADD RETURN IT IN A
|
|
PUSH DE
|
|
PUSH BC
|
|
LD B,$00
|
|
LD HL,SERDEV
|
|
LD C,(HL)
|
|
RST 08
|
|
LD A,E
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
;
|
|
CONOUT: PUSH AF ; OUTPUT IS BLOCKED DURING THE
|
|
LD A,(BLKCOUT) ; FILE TRANSFER WHEN THE
|
|
OR A ; CONSOLE AND SERIAL LINE
|
|
JR Z,CONOUT1 ; ARE THE SAME
|
|
PUSH HL ; CONSOLE OUTPUT CHARACTER IN C
|
|
PUSH DE
|
|
PUSH BC
|
|
LD E,C
|
|
LD B,$01
|
|
LD HL,CONDEV
|
|
LD C,(HL)
|
|
RST 08
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
CONOUT1:POP AF
|
|
RET
|
|
;
|
|
CONST: PUSH HL ; CONSOLE STATUS. RETURN CHARACTERS AVAILABLE IN A
|
|
PUSH DE
|
|
PUSH BC
|
|
LD B,$02
|
|
LD HL,CONDEV
|
|
LD C,(HL)
|
|
RST 08
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
;
|
|
CONIN: PUSH HL ; CONSOLE INPUT. WAIT FOR A CHARACTER ADD RETURN IT IN A
|
|
PUSH DE
|
|
PUSH BC
|
|
LD B,$00
|
|
LD HL,CONDEV
|
|
LD C,(HL)
|
|
RST 08
|
|
LD A,E
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
;
|
|
;======================================================================
|
|
; TEXT OUTPUT ROUTINES
|
|
;======================================================================
|
|
;
|
|
PRTHEXB:PUSH AF ; PRINT HEX BYTE IN A TO CONSOLE
|
|
PUSH BC
|
|
PUSH DE
|
|
CALL HEXASC
|
|
LD C,D
|
|
CALL CONOUT
|
|
LD C,E
|
|
CALL CONOUT
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
RET
|
|
|
|
HEXASC: LD D,A
|
|
CALL HEXCONV
|
|
LD E,A
|
|
LD A,D
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
CALL HEXCONV
|
|
LD D,A
|
|
RET
|
|
;
|
|
HEXCONV:AND 0FH ; CONVERT LOW NIBBLE OF A TO ASCII HEX
|
|
ADD A,90H
|
|
DAA
|
|
ADC A,40H
|
|
DAA
|
|
RET
|
|
;
|
|
; 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,$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)
|
|
;
|
|
CALCCRC:CALL COUTON ; TURN ON OUTPUT
|
|
;
|
|
LD HL,msgCalc
|
|
CALL PRTSTR0
|
|
;
|
|
LD HL,$FFFF ; SET THE
|
|
LD (CRC),HL ; START CRC
|
|
LD (CRC+2),HL ; CONDITION
|
|
;
|
|
CRCLP1: PUSH BC ; LOOP THROUGH ALL BANKS
|
|
LD B,8 ; LOOP THROUGH
|
|
CRCLP2: PUSH BC ; 8 SECTORS
|
|
;
|
|
PUSH BC
|
|
CALL DISPROG ; DISPLAY PROGRESS
|
|
;
|
|
LD IX,sector4k ; READ
|
|
LD HL,MD_FREAD ; A SECTOR
|
|
CALL MD_FNCALL
|
|
CALL CRC32 ; CALCULATE CRC
|
|
POP BC
|
|
;
|
|
LD A,(MD_SECT) ; POINT
|
|
ADD A,$10 ; TO NEXT
|
|
LD (MD_SECT),A ; SECTOR
|
|
;
|
|
POP BC ; NEXT
|
|
DJNZ CRCLP2 ; SECTOR
|
|
;
|
|
XOR A ; RESET SECTOR
|
|
LD (MD_SECT),A ; START
|
|
;
|
|
LD HL,MD_BANK ; POINT TO
|
|
INC (HL) ; NEXT BANK
|
|
;
|
|
POP BC ; NEXT
|
|
DJNZ CRCLP1 ; BANK
|
|
;
|
|
LD HL,msgCRC32 ; DISPLAY
|
|
CALL PRTSTR0 ; RESULT
|
|
LD HL,CRC+3
|
|
LD B,4
|
|
DISPCRC:LD A,$FF
|
|
XOR (HL)
|
|
CALL PRTHEXB
|
|
DEC HL
|
|
DJNZ DISPCRC
|
|
;
|
|
JP MENULP
|
|
;
|
|
CRC32: LD IX,sector4k ; CALCULATE
|
|
LD BC,4096 ; CRC32 OF
|
|
LD DE,(CRC) ; EACH SECTOR
|
|
LD HL,(CRC+2)
|
|
BYTELP: PUSH BC
|
|
LD A,(IX)
|
|
XOR E
|
|
LD B,8
|
|
ROTLP: SRL H
|
|
RR L
|
|
RR D
|
|
RRA
|
|
JP NC,CLEAR
|
|
LD E,A
|
|
LD A,H
|
|
XOR $ED
|
|
LD H,A
|
|
LD A,L
|
|
XOR $B8
|
|
LD L,A
|
|
LD A,D
|
|
XOR $83
|
|
LD D,A
|
|
LD A,E
|
|
XOR $20
|
|
CLEAR: DEC B
|
|
JP NZ,ROTLP
|
|
LD E,A
|
|
INC IX
|
|
POP BC
|
|
DEC BC
|
|
LD A,B
|
|
OR C
|
|
JP NZ,BYTELP
|
|
LD (CRC),DE
|
|
LD (CRC+2),HL
|
|
RET
|
|
;
|
|
; 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
|
|
;
|
|
; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS.
|
|
; ON EXIT B CONTAINS BANK SELECT BYTE
|
|
; C CONTAINS HIGH BYTE OF SECTOR ADDRESS
|
|
;======================================================================
|
|
;
|
|
;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
|
|
;
|
|
; 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
|
|
;
|
|
MD_FSTART: .EQU $ ; FLASH ROUTINES WHICH GET RELOCATED TO HIGH MEMORY
|
|
;
|
|
;======================================================================
|
|
; COMMON FUNCTION CALL FOR:
|
|
;
|
|
; MD_FIDEN_R - IDENTIFY 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 BC CONTAINS THE CHIP ID BYTES.
|
|
; A NO STATUS IS RETURNED
|
|
;
|
|
; MD_FERAS_R - ERASE FLASH SECTOR
|
|
; 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 NZ=FAIL
|
|
;
|
|
; MD_FREAD_R - READ FLASH SECTOR
|
|
; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED
|
|
; HL POINTS TO THE ROUTINE TO BE RELOCATED AND CALLED
|
|
; IX POINTS TO WHERE TO SAVE DATA
|
|
; ON EXIT A NO STATUS IS RETURNED
|
|
;
|
|
; MD_VERI_R - VERIFY FLASH SECTOR
|
|
; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED
|
|
; HL POINTS TO THE ROUTINE TO BE RELOCATED AND CALLED
|
|
; IX POINTS TO DATA TO COMPARE.
|
|
; ON EXIT A RETURNS STATUS 0=SUCCESS NZ=FAIL
|
|
;
|
|
; MD_FWRIT_R - WRITE FLASH SECTOR
|
|
; ON ENTRY MD_FBAS HAS BEEN SET WITH BANK AND SECTOR BEING ACCESSED
|
|
; HL POINTS TO THE ROUTINE TO BE RELOCATED AND CALLED
|
|
; 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:
|
|
; 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:
|
|
LD DE,$0000 ; PRESET DE TO SAVE SPACE
|
|
LD BC,(MD_FBAS) ; PUT BANK AND SECTOR DATA IN BC
|
|
;
|
|
LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK
|
|
;
|
|
HB_DI
|
|
CALL MD_FJPHL
|
|
HB_EI
|
|
;
|
|
LD A,C ; RETURN WITH STATUS IN A
|
|
RET
|
|
;
|
|
MD_FJPHL:
|
|
JP (HL)
|
|
;
|
|
#INCLUDE "flashlib.inc"
|
|
;
|
|
MD_FEND .EQU $
|
|
MD_CSIZ .EQU MD_FEND-MD_FSTART ; HOW MUCH SPACE WE NEED FOR RELOCATABLE CODE
|
|
;
|
|
MD_FIDEN .EQU HBX_LOC-MD_CSIZ+MD_FIDEN_R-MD_FSTART ; CALL ADDRESS FOR IDENTIFY FLASH CHIP
|
|
MD_FERAS .EQU HBX_LOC-MD_CSIZ+MD_FERAS_R-MD_FSTART ; CALL ADDRESS FOR ERASE FLASH SECTOR
|
|
MD_FREAD .EQU HBX_LOC-MD_CSIZ+MD_FREAD_R-MD_FSTART ; CALL ADDRESS FOR READ FLASH SECTOR
|
|
MD_FVERI .EQU HBX_LOC-MD_CSIZ+MD_FVERI_R-MD_FSTART ; CALL ADDRESS FOR VERIFY FLASH SECTOR
|
|
MD_FWRIT .EQU HBX_LOC-MD_CSIZ+MD_FWRIT_R-MD_FSTART ; CALL ADDRESS FOR WRITE FLASH SECTOR
|
|
MD_FERAC .EQU HBX_LOC-MD_CSIZ+MD_FERAC_R-MD_FSTART ; CALL ADDRESS FOR ERASE FLASH CHIP
|
|
;
|
|
; 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
|
|
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
|
|
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 #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"
|
|
.DB CR,LF,"(F) Dump Debug Data"
|
|
.DB CR,LF,"(E) Erase Flash chip #1"
|
|
.DB CR,LF,"(Z) Erase Flash chip #2"
|
|
|
|
#ENDIF
|
|
.DB CR,LF,CR,LF,"Select : ",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
|
|
msgNO: .DB "NO",0
|
|
msgPacErr: .DB CR,LF,"PACKET COUNT MISMATCH ERROR",CR,LF,0
|
|
msgChkSum .DB CR,LF,"CHECKSUM ERROR",CR,LF,0
|
|
msgRetry .DB CR,LF,"ERROR, RETRY COUNT EXCEEDED",CR,LF,0
|
|
msgTimout .DB CR,LF,"ERROR, RECEIVE TIMEOUT",CR,LF,0
|
|
;
|
|
; Variables
|
|
;
|
|
CONDEV: .DB $00 ; HBIOS CONSOLE DEVICE NUMBER
|
|
SERDEV: .DB $00 ; HBIOS SERIAL DEVICE NUMBER USED FOR XMODEM TRANSFER
|
|
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
|
|
pktNo: .DB 0 ; Current packet Number
|
|
pktNo1c: .DB 0 ; Current packet Number 1-complemented
|
|
MD_FBAS .DW $FFFF ; CURRENT BANK AND SECTOR
|
|
MD_SECT .EQU MD_FBAS ; BANK BYTE
|
|
MD_BANK .EQU MD_FBAS+1 ; SECTOR BYTE
|
|
CRC .DW $FFFF ; CRC32
|
|
.DW $FFFF
|
|
;
|
|
packet: .DB 0 ; SOH
|
|
.DB 0 ; PacketN
|
|
.DB 0 ; -PacketNo,
|
|
.FILL 128,0 ; data*128,
|
|
.DB 0 ; chksum
|
|
;
|
|
;======================================================================
|
|
; SUPPORTED DEVICES AND ID CODES
|
|
;======================================================================
|
|
;
|
|
DEVICES:
|
|
.DW $BFB7 ; 39SF040 0
|
|
.DW $01A4 ; 29F040 1
|
|
.DW $1F13 ; AT49F040 2
|
|
.DW $1FA4 ; AT29C040 3
|
|
.DW $20E2 ; M29F040 4
|
|
.DW $C2A4 ; MX29F040 5
|
|
.DW $37A4 ; A29010B 6
|
|
.DW $3786 ; A29040B 7
|
|
LSTDEV: .EQU $
|
|
;
|
|
;======================================================================
|
|
; BAUD RATE TABLE
|
|
;======================================================================
|
|
;
|
|
BAUDTBL:.DB "75$" ; 0 0
|
|
.DB "150$" ; 1 1
|
|
.DB "225$" ; 2 16
|
|
.DB "300$" ; 3 2
|
|
.DB "450$" ; 4 17
|
|
.DB "600$" ; 5 3
|
|
.DB "900$" ; 6 18
|
|
.DB "1200$" ; 7 4
|
|
.DB "1800$" ; 8 19
|
|
.DB "2400$" ; 9 5
|
|
.DB "3600$" ; 10 20
|
|
.DB "4800$" ; 11 6
|
|
.DB "7200$" ; 12 21
|
|
.DB "9600$" ; 13 7
|
|
.DB "14400$" ; 14 22
|
|
.DB "19200$" ; 15 8
|
|
.DB "28800$" ; 16 23
|
|
.DB "38400$" ; 17 9
|
|
.DB "57600$" ; 18 24
|
|
.DB "76800$" ; 19 10
|
|
.DB "115200$" ; 20 25
|
|
.DB "153600$" ; 21 11
|
|
.DB "230400$" ; 22 26
|
|
.DB "307200$" ; 23 12
|
|
.DB "460800$" ; 24 27
|
|
.DB "614400$" ; 25 13
|
|
.DB "921600$" ; 26 28
|
|
.DB "1228800$" ; 27 14
|
|
.DB "1843200$" ; 28 29
|
|
.DB "2457600$" ; 29 15
|
|
.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 - $)
|
|
.FILL SLACK,$FF
|
|
.ECHO "ROM Updater space remaining: "
|
|
.ECHO SLACK
|
|
.ECHO " bytes.\n"
|
|
.END
|
|
|