From b6d5516e8449c6ecb524b7edbf31b44c70421756 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 10:04:29 +0800 Subject: [PATCH 1/9] Minors Note to self CCF <> Clear Carry Flag LoL --- Source/HBIOS/cvdu.asm | 8 ++++---- Source/HBIOS/hbios.asm | 10 +++++----- Source/HBIOS/vga.asm | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 05f9cb34..2b30d6d1 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -58,7 +58,7 @@ CVDU_INIT1: PRTS("KB$") CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE CALL CVDU_VDARES - CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER +; CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER ; ADD OURSELVES TO VDA DISPATCH TABLE LD BC,CVDU_FNTBL ; BC := FUNCTION TABLE ADDRESS @@ -373,7 +373,7 @@ CVDU_LOADFONT: LD (CVDU_STACK),SP ; SAVE STACK LD HL,(CVDU_STACK) ; AND SHIFT IT LD DE,$2000 ; DOWN 4KB TO - CCF ; CREATE A + OR A ; CREATE A SBC HL,DE ; DECOMPRESSION BUFFER LD SP,HL ; HL POINTS TO BUFFER EX DE,HL ; START OF STACK BUFFER @@ -430,7 +430,7 @@ CVDU_XY2IDX: RET ; RETURN ; ;---------------------------------------------------------------------- -; WRITE VALUE IN A TO CURRENT VDU BUFFER POSTION, ADVANCE CURSOR +; WRITE VALUE IN A TO CURRENT VDU BUFFER POSITION, ADVANCE CURSOR ;---------------------------------------------------------------------- ; CVDU_PUTCHAR: @@ -442,7 +442,7 @@ CVDU_PUTCHAR: CALL CVDU_WRX ; DO IT ; PUT THE CHARACTER THERE - POP AF ; RECOVER CHARACTER VALLUE TO WRITE + POP AF ; RECOVER CHARACTER VALUE TO WRITE LD C,31 ; DATA REGISTER CALL CVDU_WR ; DO IT diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 6f19af58..e696311f 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2798,7 +2798,7 @@ SYS_VER: ; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK ; NOTE THAT IT GOES INTO EFFECT AS HBIOS FUNCTION IS EXITED ; HERE, WE JUST SET THE CURRENT BANK -; CALLER MUST EXTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! +; CALLER MUST ESTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! ; SYS_SETBNK: #IF (MEMMGR == MM_Z280) @@ -3191,8 +3191,8 @@ SYS_PEEK: PUSH IY DI #ELSE - LD A,I - DI + LD A,I ; SAVE THE INTERRUPT STATUS + DI ; COPY IFF2 TO P/V FLAG PUSH AF #ENDIF #ENDIF @@ -3204,8 +3204,8 @@ SYS_PEEK: .DB $FD,$ED,$6E ; LDCTL (C),IY POP IY #ELSE - POP AF - JP PO,$+4 + POP AF ; RECALL INITIAL INTERRUPT STATUS + JP PO,$+4 ; RETURN TO INITIAL STATE EI #ENDIF #ENDIF diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index e6e7f6a8..dea1aea8 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -528,7 +528,7 @@ VGA_LOADFONT: LD (VGA_STACK),SP ; SAVE STACK LD HL,(VGA_STACK) ; AND SHIFT IT LD DE,$2000 ; DOWN 4KB TO - CCF ; CREATE A + OR A ; CREATE A SBC HL,DE ; DECOMPRESSION BUFFER LD SP,HL ; HL POINTS TO BUFFER EX DE,HL ; START OF STACK BUFFER From 0f2d68e492a00279ffd5938d3ec5c2a84543d623 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 15:36:59 +0800 Subject: [PATCH 2/9] Update usrrom.asm xmodem receive loop optimizations --- Source/HBIOS/usrrom.asm | 1249 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 1198 insertions(+), 51 deletions(-) diff --git a/Source/HBIOS/usrrom.asm b/Source/HBIOS/usrrom.asm index c230e0f9..f53bd3ab 100644 --- a/Source/HBIOS/usrrom.asm +++ b/Source/HBIOS/usrrom.asm @@ -1,84 +1,1231 @@ +;***************************************************************************** +; ROMWBW XMODEM FLASH UPDATER ; -; USRROM TEMPLATE FOR A CUSTOM USER ROM +; PROVIDES THE CAPABILTY TO UPDATE ROMWBW FROM THE SBC BOOT LOADER USING +; AN XMODEM FILE TRANSFER. +; +; TO INSTALL, SAVE THIS FILE AS USRROM.ASM IN \RomWBW\Source\HBIOS +; AND REBUILD AND INSTALL THE NEW ROM VERSION. +; +; THE UPDATER CAN THEN BE ACCESSED USING THE "U" OPTION IN THE SBC BOOT LOADER. +; +; 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 (X) - 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 (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 +; 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" ; -CR .EQU 0DH -LF .EQU 0AH +HBX_BNKSEL .EQU $FE2B +; +#DEFINE HB_DI DI +#DEFINE HB_EI EI +; +XFUDBG .EQU 0 +; + .ORG USR_LOC ; - .ORG USR_LOC -; - LD HL,BOOTMSG ; INTRODUCTION - CALL PRTSTR +; 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 +; + 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 HL,$B7BF ; IS IT A 39SF040 + XOR A + SBC HL,BC + LD A,0 + JR Z,CHPFND ; YES IT IS ... +; + LD HL,$A401 ; IS IT A 29F040 + XOR A + SBC HL,BC + LD A,1 + JR Z,CHPFND ; YES IT IS ... +; + LD HL,$131F ; IS IT AN AT49F040 + XOR A + SBC HL,BC + LD A,2 + JR Z,CHPFND ; YES IT IS +; + LD HL,$A41F ; IS IT AN AT29C040 + XOR A + SBC HL,BC + LD A,3 + JR Z,CHPFND ; YES IT IS +; + LD HL,$E220 ; IS IT AN M29F040 + XOR A + SBC HL,BC + LD A,4 + JR Z,CHPFND ; YES IT IS +; + LD HL,$A4C2 ; IS IT AN MX29F040 + SBC HL,BC + LD A,5 +; + JP NZ,FAILBC ; SUPPORTED CHIP NOT FOUND +; +CHPFND: LD (ERATYP),A ; SAVE ERASE TYPE - CALL CIN ; DO STUFF + LD BC,$F8F0 ; GET CPU SPEED + RST 08 ; AND MULTIPLY + LD A,L ; BY 4 + ADD A,A ; TO CREATE + ADD A,A ; TIMEOUT DELAY + LD (TmoFct),A ; FACTOR +; +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 'U' ; BEGIN + JR Z,BEGUPD ; TRANSFER +; + CP 'V' ; CHECK FOR + JP Z,OPTIONV ; VERIFY TOGGLE +; + CP 'X' ; 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 512K FLASH +; + CP '2' ; CALCULATE + 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' ; DEBUG + JP Z,OPTIONF ; DUMP +; + CP 'E' ; ERASE + JP Z,OPTIONE ; CHIP #1 ; - ;LD A,00H ; RETURN TO ROM LOADER - ;LD HL,0000H - ;JP 0FFF9H - LD B,BF_SYSRESET ; SYSTEM RESTART + 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 + 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 +; +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 +; +MENU: CALL COUTON + LD HL,msgConsole ; DISPLAY + CALL PRTSTR0 ; CONSOLE + LD A,(CONDEV) ; DEVICE + ADD A,'0' + LD C,A + CALL CONOUT +; + LD HL,msgIODevice ; DISPLAY + CALL PRTSTR0 ; SERIAL + LD A,(SERDEV) ; DEVICE + ADD A,'0' + LD C,A + CALL CONOUT +; + 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 +; +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 ; -; PRINT A STRING AT ADDRESS SPECIFIED IN HL -; STRING MUST BE TERMINATED BY '$' -; USAGE: -; LD HL,MYSTR -; CALL PRTSTR -; ... -; MYSTR: .DB "HELLO$" + XOR A ; START AT + LD (MD_SECT),A ; SECTOR 0 ; -PRTSTR: LD A,(HL) + 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 +; +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 - CP '$' - RET Z - CALL COUT - JR PRTSTR + 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 ; -; OUTPUT CHARACTER IN A TO CONSOLE DEVICE +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 ; -COUT: PUSH AF +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 + 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 - LD B,01H - LD C,0 - LD E,A + 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 AF + POP DE + POP HL +CONOUT1:POP AF RET ; -; OUTPUT CHARACTER IN A TO CONSOLE DEVICE +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 ; -COUTE: PUSH AF +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 - CALL COUT + POP BC + POP DE + POP HL + RET +; +PRTHEXB:PUSH AF ; PRINT HEX BYTE IN A TO CONSOLE + PUSH DE + CALL HEXASC + LD C,D + CALL CONOUT + LD C,E + CALL CONOUT + POP DE 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 ; -; WAIT FOR A CHARACTER FROM THE CONSOLE DEVICE AND RETURN IT IN A +HEXCONV:AND 0FH ; CONVERT LOW NIBBLE OF A TO ASCII HEX + ADD A,90H + DAA + 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 + +OPTION1:LD HL,$0000 ; CRC32 STARTING + LD (MD_FBAS),HL ; BANK $00 SECTOR $00 + LD B,16 ; 16 BANKS (512K) + JR CALCCRC ; -CIN: PUSH BC - LD B,00H - LD C,00H - RST 08 +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 +; + LD HL,msgCalc + CALL PRTSTR0 +; + 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 +; + 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 ; -BOOTMSG:.DB CR,LF,CR,LF - .DB "No User ROM Installed." - .DB CR,LF,CR,LF - .DB "Press a key to return to Boot Loader.$" -; -SLACK .EQU (USR_END - $) - .FILL SLACK,00 - .ECHO "User ROM space remaining: " - .ECHO SLACK - .ECHO " bytes.\n" - .END - +;====================================================================== +; 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 +msgConsole: .DB CR,LF,CR,LF,"(C) Set Console Device : ",0 +msgIODevice: .DB CR,LF,"(S) Set Serial Device : ",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,"(X) Exit 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" +#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" + .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 +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 +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 +; +sector4k: .EQU $ ; 32 PACKETS GET ACCUMULATED HERE BEFORE FLASHING +; +SLACK .EQU (USR_END - $) + .FILL SLACK,$FF + .ECHO "User ROM space remaining: " + .ECHO SLACK + .ECHO " bytes.\n" + .END From bccbec90e7ad7f367b85cba048edb50e0dae24e6 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 18:53:13 +0800 Subject: [PATCH 3/9] Update cvdu.asm fixup --- Source/HBIOS/cvdu.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 2b30d6d1..558f61d0 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -58,7 +58,7 @@ CVDU_INIT1: PRTS("KB$") CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE CALL CVDU_VDARES -; CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER + CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER ; ADD OURSELVES TO VDA DISPATCH TABLE LD BC,CVDU_FNTBL ; BC := FUNCTION TABLE ADDRESS From 886621397e7effc46b0ab016c124b56e4496ccf2 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 18:58:50 +0800 Subject: [PATCH 4/9] Update hbios.asm Resync --- Source/HBIOS/hbios.asm | 202 ++++++++++++++++++++++++++++------------- 1 file changed, 139 insertions(+), 63 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e696311f..bd9bf181 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -115,12 +115,23 @@ MODCNT .SET MODCNT + 1 ; NO INTERRUPT HANDLING #DEFINE HB_DI ; #DEFINE HB_EI ; -#ENDIF -#IF ((INTMODE == 1) | (INTMODE == 2) | (INTMODE == 3)) -; MODE 1 OR 2 OR 3 INTERRUPT HANDLING +#ELSE + #IF (CPUFAM == CPU_Z280) + #IF (INTMODE == 3) +; Z280 MODE 3 INTERRUPT HANDLING (INTA & UART ENABLED) +#DEFINE HB_DI DI +#DEFINE HB_EI .DB $ED,$F7,$09 + #ELSE +; Z280 MODE 1/2 INTERRUPT HANDLING #DEFINE HB_DI DI #DEFINE HB_EI EI + #ENDIF + #ELSE +#DEFINE HB_DI DI +#DEFINE HB_EI EI + #ENDIF #ENDIF +; #IF (INTMODE > 3) .ECHO "*** ERROR: INVALID INTMODE SETTING!!!\n" !!! ; FORCE AN ASSEMBLY ERROR @@ -300,10 +311,7 @@ HBX_IDENT: ; ACCOMMODATE FREERTOS. HBX_BUF IS ONLY USED AS A BOUNCE BUFFER, SO IT'S ; USE WILL NEVER OVERLAP WITH BELOW. ; -; HBX_INVOKE IS NOT RE-ENTRANT! HB_INVBNK CAN BE USED GLOBALLY TO DETERMINE -; IF HBIOS IS ALREADY ACTIVE. HB_INVBNK WILL HAVE A VALUE != $FF WHEN HBIOS -; IS ACTIVE. ON RETURN, HB_INVBNK IS SET TO $FF TO INDICATE HBIOS IS NOT -; ACTIVE. +; WARNING: HBX_INVOKE IS *NOT* REENTRANT! ; HBX_INVOKE: @@ -500,10 +508,10 @@ HBX_BNKCPY: .DB $ED,$66 ; LDCTL HL,(C) POP BC EX (SP),HL - DI + HB_DI #ELSE LD A,I - DI + HB_DI PUSH AF #ENDIF LD (HBX_BC_SP),SP ; PUT STACK @@ -545,7 +553,7 @@ HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE #ELSE POP AF JP PO,$+4 - EI + HB_EI #ENDIF RET ; @@ -576,6 +584,48 @@ HBX_BC_ITER: ; ON INPUT A=TARGET BANK, IX=TARGET ADDRESS ; HBX_BNKCALL: +; +#IF (MEMMGR == MM_Z280) + JR HBX_BNKCALL2 + + CP BID_BIOS ; CALLING HBIOS? + JR NZ,HBX_BNKCALL2 ; NOPE, DO NORMAL PROCESSING + + ;PUSH AF + ;LD A,'[' + ;.DB $ED,$71 ; SC + ;.DW COUT ; SC PARAMETER + ;POP AF + + ; + ;LD A,(HB_CURBNK) ; GET CURRENT BANK + ;LD (HB_INVBNK),A ; SAVE INVOCATION BANK + ; + ;LD A,BID_BIOS ; HBIOS BANK + ;LD (HB_CURBNK),A ; SET AS CURRENT BANK + + LD (HBX_BNKCALL1+2),IX ; SETUP TARGET ADDRESS +HBX_BNKCALL1: + .DB $ED,$71 ; SC + .DW $FFFF ; SC PARAMETER (SET ABOVE) + + ;PUSH AF + ;LD A,']' + ;.DB $ED,$71 ; SC + ;.DW COUT ; SC PARAMETER + ;POP AF + + ;PUSH AF + ;LD A,(HB_INVBNK) + ;LD (HB_CURBNK),A + ;POP AF + + + + RET +#ENDIF + +HBX_BNKCALL2: LD (HBX_TGTBNK),A ; STUFF TARGET BANK TO CALL INTO CODE BELOW LD (HBX_TGTADR),IX ; STUFF ADDRESS TO CALL INTO CODE BELOW LD A,(HB_CURBNK) ; GET CURRENT BANK @@ -956,7 +1006,7 @@ HB_START: ; INITIALIZE MMU ; START BY SELECTING I/O PAGE $FF LD L,$FF ; MMU AND DMA PAGE I/O REG IS $FF - LD C,$08 ; REG C POINTS TO I/O PAGE REGISTER + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER .DB $ED,$6E ; LDCTL (C),HL ; ; INITIALIZE ALL OF THE SYSTEM PAGE DESCRIPTORS WITH BLOCK MOVE @@ -979,13 +1029,18 @@ HB_START: LD C,Z280_MMUMCR ; MMU MASTER CONTROL REGISTER LD HL,$BBFF ; ENABLE USER & SYSTEM TRANSLATE .DB $ED,$BF ; OUTW (C),HL -; +; + ; DISABLE MEMORY REFRESH CYCLES + LD A,$08 ; DISABLED + OUT (Z280_RRR),A ; SET REFRESH RATE REGISTER + ; RESTORE I/O PAGE TO $00 LD L,$00 ; NORMAL I/O REG IS $00 - LD C,$08 ; REG C POINTS TO I/O PAGE REGISTER + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER .DB $ED,$6E ; LDCTL (C),HL ; ; CONFIGURE Z280 INT/TRAP VECTOR TABLE POINTER REGISTER + ; WILL POINT TO ROM COPY FOR NOW, UPDATED TO RAM LATER ON LD C,Z280_VPR LD HL,Z280_IVT >> 8 ; TOP 16 BITS OF PHYSICAL ADR OF IVT .DB $ED,$6E ; LDCTL (C),HL @@ -2037,6 +2092,9 @@ HB_PCINITTBL: #IF (ACIAENABLE) .DW ACIA_PREINIT #ENDIF +#IF (Z2UENABLE) + .DW Z2U_PREINIT +#ENDIF #IF (PIO_4P | PIO_ZP) .DW PIO_PREINIT #ENDIF @@ -2080,6 +2138,9 @@ HB_INITTBL: #IF (ACIAENABLE) .DW ACIA_INIT #ENDIF +#IF (Z2UENABLE) + .DW Z2U_INIT +#ENDIF #IF (DSRTCENABLE) .DW DSRTC_INIT #ENDIF @@ -2798,7 +2859,7 @@ SYS_VER: ; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK ; NOTE THAT IT GOES INTO EFFECT AS HBIOS FUNCTION IS EXITED ; HERE, WE JUST SET THE CURRENT BANK -; CALLER MUST ESTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! +; CALLER MUST EXTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! ; SYS_SETBNK: #IF (MEMMGR == MM_Z280) @@ -3189,10 +3250,10 @@ SYS_PEEK: LD C,Z280_MSR .DB $FD,$ED,$66 ; LDCTL IY,(C) PUSH IY - DI + HB_DI #ELSE - LD A,I ; SAVE THE INTERRUPT STATUS - DI ; COPY IFF2 TO P/V FLAG + LD A,I + DI PUSH AF #ENDIF #ENDIF @@ -3204,9 +3265,9 @@ SYS_PEEK: .DB $FD,$ED,$6E ; LDCTL (C),IY POP IY #ELSE - POP AF ; RECALL INITIAL INTERRUPT STATUS - JP PO,$+4 ; RETURN TO INITIAL STATE - EI + POP AF + JP PO,$+4 + HB_EI #ENDIF #ENDIF XOR A @@ -3226,10 +3287,10 @@ SYS_POKE: LD C,Z280_MSR .DB $FD,$ED,$66 ; LDCTL IY,(C) PUSH IY - DI + HB_DI #ELSE LD A,I - DI + HB_DI PUSH AF #ENDIF #ENDIF @@ -3243,7 +3304,7 @@ SYS_POKE: #ELSE POP AF JP PO,$+4 - EI + HB_EI #ENDIF #ENDIF XOR A @@ -3495,63 +3556,65 @@ Z280_BADINTSTR .TEXT "\n\n*** Z280 BAD INT @$" #IF (MEMMGR == MM_Z280) ; Z280_PRIVINST: + ; SAVE HL AND MSR FOR POSSIBLE RETURN VIA RETIL EX (SP),HL ; GET MSR, SAVE HL LD (HB_MSRSAV),HL ; SAVE IT POP HL ; RECOVER HL, POP STACK EX (SP),HL ; GET ADR, SAVE HL - +; PUSH AF PUSH BC PUSH DE - +; .DB $ED,$96 ; LDUP A,(HL) - INC HL ; BUMP PAST PRIV INST ;CALL PC_LBKT ;CALL PRTHEXBYTE ;CALL PC_RBKT - +; ; HANDLE DI CP $F3 ; DI? JR NZ,Z280_PRIVINST2 - DI ; DO THE DI + HB_DI ; DO THE DI + INC HL ; BUMP PAST IT JR Z280_PRIVINSTX - +; Z280_PRIVINST2: ; HANDLE EI CP $FB ; EI? - JR NZ,Z280_PRIVINST_HALT - EI ; DO THE EI + JR NZ,Z280_PRIVINST3 + HB_EI ; DO THE EI + INC HL ; BUMP PAST IT JR Z280_PRIVINSTX - -Z280_PRIVINST_HALT: +; +Z280_PRIVINST3: ; SOMETHING ELSE, DIAGNOSE & HALT SYSTEM - - PUSH HL + LD DE,Z280_PRIVSTR + CALL WRITESTR + CALL PRTHEXWORDHL +; + ; DUMP 16 BYTES OF USER ADDRESS SPACE + CALL PC_SPACE CALL PC_LBKT - CALL PRTHEXBYTE + LD B,$10 +Z280_PRIVINST4: .DB $ED,$96 ; LDUP A,(HL) CALL PRTHEXBYTE INC HL - .DB $ED,$96 ; LDUP A,(HL) - CALL PRTHEXBYTE + DJNZ Z280_PRIVINST4 CALL PC_RBKT - POP HL - - CALL NEWLINE - LD DE,Z280_PRIVSTR - CALL WRITESTR - DEC HL - CALL PRTHEXWORDHL - +; + ; GO NO FURTHER DI HALT - -Z280_PRIVINSTX: +; +Z280_PRIVINSTX: + ; RESTORE REGISTERS POP DE POP BC POP AF - +; + ; RECOVER HL AND MSR, THEN RETURN VIA RETIL EX (SP),HL ; RECOVER HL, ADR TO STK PUSH HL ; SAVE HL LD HL,(HB_MSRSAV) ; GET SAVED MSR @@ -3560,7 +3623,7 @@ Z280_PRIVINSTX: ; HB_MSRSAV .DW 0 ; -Z280_PRIVSTR .TEXT "\n\n*** Privileged Instruction @$" +Z280_PRIVSTR .TEXT "\r\n\r\n*** Privileged Instruction @$" ; #ENDIF ; @@ -3737,7 +3800,7 @@ HB_TMPREF .DW 0 ; Z280 INTERRUPT VECTOR TABLE ;================================================================================================== ; -#IF (MEMMGR = MM_Z280) +#IF (MEMMGR == MM_Z280) ; .FILL $1000 - ($ & $FFF) ; MUST BE 4K ALIGNED! ; @@ -3834,19 +3897,17 @@ Z280_BNKSEL: LD C,Z280_IOPR ; I/O PAGE REGISTER TO C .DB $ED,$6E ; LDCTL (C),HL ; - ; POINT HL TO PORTION OF TABLE TO PROGRAM PDRS WITH - LD HL,Z280_PDRTBL ; POINT TO PDR TABLE - SLA A ; BANK ID TIMES TWO, RAM BIT TO C - JR NC,Z280_BNKSEL1 ; IF ROM, SKIP AHEAD - INC H ; HANDLE RAM OFFSET + ; POINT HL TO STARTING ENTRY TO PROGRAM + ; OPTIMIZED TO ASSUME HL IS PAGE ALIGNED! + LD H,Z280_PDRTBL >> 8 + SLA A + JR NC,Z280_BNKSEL1 + INC H Z280_BNKSEL1: RLCA RLCA RLCA - ADD A,L LD L,A - JR NC,Z280_BNKSEL2 ; NO CARRY, SKIP AHEAD - INC H ; HANDLE CARRY ; Z280_BNKSEL2: ; POINT TO FIRST PDR TO PROGRAM ($00=USER, $10=SYSTEM) @@ -3867,6 +3928,11 @@ Z280_BNKSEL2: POP BC RET ; +#IF (($ & $FF) != 0) + ; PAGE ALIGN THE TABLE + .FILL $100 - ($ & $FF) +#ENDIF +; #IF (($ % 2) == 1) ; BYTE ALIGN THE TABLE .DB 0 @@ -4172,7 +4238,7 @@ Z280_BNKSEL: PUSH DE PUSH BC LD L,$FF ; MMU PAGE I/O REG IS $FF - LD C,8 ; REG C POINTS TO I/O PAGE REGISTER + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER .DB $ED,$6E ; OP CODE FOR LDCTL (C),HL LD E,0 ; DE IS TEMPLATE BIT 7,A @@ -4236,7 +4302,7 @@ W_MMU1: W_MMU2: ;.DB $ED,$65 ; PCACHE LD L,0 ; RESTORE I/O PAGE REG TO 0 - LD C,8 + LD C,Z280_IOPR .DB $ED,$6E ; LDCTL (C),HL POP BC POP DE @@ -4453,6 +4519,15 @@ SIZ_ACIA .EQU $ - ORG_ACIA .ECHO " bytes.\n" #ENDIF ; +#IF (Z2UENABLE) +ORG_Z2U .EQU $ + #INCLUDE "z2u.asm" +SIZ_Z2U .EQU $ - ORG_Z2U + .ECHO "Z2U occupies " + .ECHO SIZ_Z2U + .ECHO " bytes.\n" +#ENDIF +; #IF (VGAENABLE) ORG_VGA .EQU $ #INCLUDE "vga.asm" @@ -5483,8 +5558,8 @@ PS_FLP_DSTR: .TEXT "SD$" ; PS_FLPSD ; CHARACTER DEVICE STRINGS ; PS_SDSTRREF: - .DW PS_SDUART, PS_SDASCI, PS_SDTERM - .DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA, PS_SDPIO,PS_SDUF,PS_SDDUART + .DW PS_SDUART, PS_SDASCI, PS_SDTERM, PS_SDPRPCON, PS_SDPPPCON + .DW PS_SDSIO, PS_SDACIA, PS_SDPIO, PS_SDUF, PS_SDDUART, PS_SDZ2U ; PS_SDUART .TEXT "UART$" PS_SDASCI .TEXT "ASCI$" @@ -5496,6 +5571,7 @@ PS_SDACIA .TEXT "ACIA$" PS_SDPIO .TEXT "PORT$" PS_SDUF .TEXT "UF$" PS_SDDUART .TEXT "DUART$" +PS_SDZ2U .TEXT "Z2U$" ; ; CHARACTER SUB TYPE STRINGS ; From 5c9fc2f61ff2fa789349f32337c7435d3ab446d7 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 19:07:36 +0800 Subject: [PATCH 5/9] Update usrrom.asm fixup --- Source/HBIOS/usrrom.asm | 1249 ++------------------------------------- 1 file changed, 49 insertions(+), 1200 deletions(-) diff --git a/Source/HBIOS/usrrom.asm b/Source/HBIOS/usrrom.asm index f53bd3ab..5d4ff8e7 100644 --- a/Source/HBIOS/usrrom.asm +++ b/Source/HBIOS/usrrom.asm @@ -1,1231 +1,80 @@ -;***************************************************************************** -; ROMWBW XMODEM FLASH UPDATER ; -; PROVIDES THE CAPABILTY TO UPDATE ROMWBW FROM THE SBC BOOT LOADER USING -; AN XMODEM FILE TRANSFER. -; -; TO INSTALL, SAVE THIS FILE AS USRROM.ASM IN \RomWBW\Source\HBIOS -; AND REBUILD AND INSTALL THE NEW ROM VERSION. -; -; THE UPDATER CAN THEN BE ACCESSED USING THE "U" OPTION IN THE SBC BOOT LOADER. -; -; 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 (X) - 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 (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 -; 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 -; -;***************************************************************************** +; USRROM TEMPLATE FOR A CUSTOM USER ROM ; #INCLUDE "std.asm" ; -HBX_BNKSEL .EQU $FE2B -; -#DEFINE HB_DI DI -#DEFINE HB_EI EI -; -XFUDBG .EQU 0 -; - .ORG USR_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 -; - 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 HL,$B7BF ; IS IT A 39SF040 - XOR A - SBC HL,BC - LD A,0 - JR Z,CHPFND ; YES IT IS ... -; - LD HL,$A401 ; IS IT A 29F040 - XOR A - SBC HL,BC - LD A,1 - JR Z,CHPFND ; YES IT IS ... -; - LD HL,$131F ; IS IT AN AT49F040 - XOR A - SBC HL,BC - LD A,2 - JR Z,CHPFND ; YES IT IS -; - LD HL,$A41F ; IS IT AN AT29C040 - XOR A - SBC HL,BC - LD A,3 - JR Z,CHPFND ; YES IT IS -; - LD HL,$E220 ; IS IT AN M29F040 - XOR A - SBC HL,BC - LD A,4 - JR Z,CHPFND ; YES IT IS -; - LD HL,$A4C2 ; IS IT AN MX29F040 - SBC HL,BC - LD A,5 -; - JP NZ,FAILBC ; SUPPORTED CHIP NOT FOUND -; -CHPFND: LD (ERATYP),A ; SAVE ERASE TYPE - - LD BC,$F8F0 ; GET CPU SPEED - RST 08 ; AND MULTIPLY - LD A,L ; BY 4 - ADD A,A ; TO CREATE - ADD A,A ; TIMEOUT DELAY - LD (TmoFct),A ; FACTOR -; -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 'U' ; BEGIN - JR Z,BEGUPD ; TRANSFER -; - CP 'V' ; CHECK FOR - JP Z,OPTIONV ; VERIFY TOGGLE -; - CP 'X' ; 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 512K FLASH -; - CP '2' ; CALCULATE - 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' ; 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 -; -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 -; -MENU: CALL COUTON - LD HL,msgConsole ; DISPLAY - CALL PRTSTR0 ; CONSOLE - LD A,(CONDEV) ; DEVICE - ADD A,'0' - LD C,A - CALL CONOUT -; - LD HL,msgIODevice ; DISPLAY - CALL PRTSTR0 ; SERIAL - LD A,(SERDEV) ; DEVICE - ADD A,'0' - LD C,A - CALL CONOUT -; - 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 -; -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 +CR .EQU 0DH +LF .EQU 0AH ; - 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 - 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 + .ORG USR_LOC +; + LD HL,BOOTMSG ; INTRODUCTION + CALL PRTSTR -CONCLR: JP MENULP ; BACK TO MENU + CALL CIN ; DO STUFF ; -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 + LD A,00H ; RETURN TO ROM LOADER + LD HL,0000H + JP 0FFF9H +; RET ; - 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 +; PRINT A STRING AT ADDRESS SPECIFIED IN HL +; STRING MUST BE TERMINATED BY '$' +; USAGE: +; LD HL,MYSTR +; CALL PRTSTR +; ... +; MYSTR: .DB "HELLO$" ; - 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 +PRTSTR: LD A,(HL) 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 + CP '$' + RET Z + CALL COUT + JR PRTSTR ; -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 +; OUTPUT CHARACTER IN A TO CONSOLE DEVICE ; -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 - PUSH DE +COUT: PUSH AF 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) + LD B,01H + LD C,0 + LD E,A 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 + 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 +; OUTPUT CHARACTER IN A TO CONSOLE DEVICE ; -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 +COUTE: PUSH AF LD A,E - POP BC - POP DE - POP HL - RET -; -PRTHEXB:PUSH AF ; PRINT HEX BYTE IN A TO CONSOLE - PUSH DE - CALL HEXASC - LD C,D - CALL CONOUT - LD C,E - CALL CONOUT - POP DE + CALL COUT 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 - -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,$0000 ; CRC32 STARTING - LD (MD_FBAS),HL ; BANK $00 SECTOR $00 - LD B,32 ; 32 BANKS (1024K) -; -CALCCRC:CALL COUTON ; TURN ON OUTPUT +; WAIT FOR A CHARACTER FROM THE CONSOLE DEVICE AND RETURN IT IN A ; - LD HL,msgCalc - CALL PRTSTR0 -; - 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 -; - 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 +CIN: PUSH BC + LD B,00H + LD C,00H + RST 08 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 -; -;====================================================================== -; 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 -msgConsole: .DB CR,LF,CR,LF,"(C) Set Console Device : ",0 -msgIODevice: .DB CR,LF,"(S) Set Serial Device : ",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,"(X) Exit 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" -#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" - .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 -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 -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 -; -sector4k: .EQU $ ; 32 PACKETS GET ACCUMULATED HERE BEFORE FLASHING -; -SLACK .EQU (USR_END - $) - .FILL SLACK,$FF - .ECHO "User ROM space remaining: " - .ECHO SLACK - .ECHO " bytes.\n" - .END +BOOTMSG:.DB "No User ROM Installed." + .DB CR,LF + .DB "Press a key to return to Boot Loader.$" +; +SLACK .EQU (USR_END - $) + .FILL SLACK,00 + .ECHO "User ROM space remaining: " + .ECHO SLACK + .ECHO " bytes.\n" + .END + From c3c3782f274f2a1b84d807a303d410f136cec76f Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 19:11:24 +0800 Subject: [PATCH 6/9] Update updater.asm Xmodem receive loop optmization --- Source/HBIOS/updater.asm | 56 +++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/Source/HBIOS/updater.asm b/Source/HBIOS/updater.asm index 1dea76ea..f53bd3ab 100644 --- a/Source/HBIOS/updater.asm +++ b/Source/HBIOS/updater.asm @@ -229,10 +229,7 @@ MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING LD HL,ERATYP ; RESET THE ERASE RES 7,(HL) ; SKIP FLAG ; - LD HL,msgCRLF - CALL PRTSTR0 CALL MENU ; DISPLAY MENU -; CALL GETINP ; GET SELECTION ; CP 'U' ; BEGIN @@ -328,9 +325,13 @@ NotPacketTimeout: 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 @@ -342,17 +343,16 @@ NotPacketTimeout: INC HL ; COMPLEMENT JR C,FAILTO ; - LD C,128 ; GET 128 MORE CHARACTERS FOR A FULL PACKET -GetRestOfPacket: + 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 - INC HL ; SAVE THE RECEIVED CHAR INTO THE... - LD (DE),A ; ...PACKET BUFFER AND... - INC DE ; ...POINT TO THE NEXT LOCATION + LD (HL),A ; SAVE THE RECEIVED CHAR INTO THE + LDI ; PACKET BUFFER AND FLASH SECTOR BUFFER +; + DEC C ; C GETS DECREMENTED TWICE EACH LOOP. ; - DEC C JP NZ,GetRestOfPacket ; CALL GetCharTmo1 ; GET CHARACTER @@ -379,9 +379,8 @@ csloop: ADD A,(HL) ; JUST ADD UP THE BYTES DEC A ; XMODEM PACKETS? AND %00011111 ; IF YES THEN WERE WE CP %00011111 ; HAVE ENOUGH TO - LD A,0 ; WRITE A FLASH SECTOR + 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 ; @@ -590,14 +589,15 @@ GETINP2:CALL CONIN GETINP3:RET ; PRTSTR0:LD A,(HL) ; PRINT MESSAGE POINTED TOP HL UNTIL 0 - or A ; CHECK IF GOT ZERO? + 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 ; -MENU: LD HL,msgConsole ; DISPLAY +MENU: CALL COUTON + LD HL,msgConsole ; DISPLAY CALL PRTSTR0 ; CONSOLE LD A,(CONDEV) ; DEVICE ADD A,'0' @@ -876,28 +876,27 @@ SERIN: PUSH HL ; SERIAL INPUT. WAIT FOR A CHARACTER ADD RETURN IT IN A POP HL RET ; -CONOUT: PUSH HL ; CONSOLE OUTPUT CHARACTER IN C - PUSH DE ; OUTPUT IS BLOCKED DURING THE - PUSH BC ; FILE TRANSFER WHEN THE - PUSH AF - LD A,(BLKCOUT) ; CONSOLE AND SERIAL LINE - OR A ; ARE THE SAME - JR Z,CONOUT1 +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 -CONOUT1:POP AF 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 E,C LD B,$02 LD HL,CONDEV LD C,(HL) @@ -910,7 +909,6 @@ CONST: PUSH HL ; CONSOLE STATUS. RETURN CHARACTERS AVAILABLE IN A CONIN: PUSH HL ; CONSOLE INPUT. WAIT FOR A CHARACTER ADD RETURN IT IN A PUSH DE PUSH BC - LD E,C LD B,$00 LD HL,CONDEV LD C,(HL) @@ -991,16 +989,16 @@ CRCLP2: PUSH BC ; 8 SECTORS 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 ; @@ -1170,7 +1168,7 @@ 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 -msgConsole: .DB CR,LF,"(C) Set Console Device : ",0 +msgConsole: .DB CR,LF,CR,LF,"(C) Set Console Device : ",0 msgIODevice: .DB CR,LF,"(S) Set Serial Device : ",0 msgWriteV: .DB CR,LF,"(V) Toggle Write Verify : ",0 msgBegin: .DB CR,LF,"(R) Reboot" From c2bd5aa5accf6ed593d09085a992c44205b9d9a9 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 19:30:38 +0800 Subject: [PATCH 7/9] Update hbios.asm Typo + explanation --- Source/HBIOS/hbios.asm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index bd9bf181..983c64ef 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2859,7 +2859,7 @@ SYS_VER: ; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK ; NOTE THAT IT GOES INTO EFFECT AS HBIOS FUNCTION IS EXITED ; HERE, WE JUST SET THE CURRENT BANK -; CALLER MUST EXTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! +; CALLER MUST ESTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! ; SYS_SETBNK: #IF (MEMMGR == MM_Z280) @@ -3252,8 +3252,8 @@ SYS_PEEK: PUSH IY HB_DI #ELSE - LD A,I - DI + LD A,I ; SAVE THE INTERRUPT STATUS + DI ; COPY IFF2 TO P/V FLAG PUSH AF #ENDIF #ENDIF @@ -3265,8 +3265,8 @@ SYS_PEEK: .DB $FD,$ED,$6E ; LDCTL (C),IY POP IY #ELSE - POP AF - JP PO,$+4 + POP AF ; RECALL INITIAL INTERRUPT STATUS + JP PO ; RETURN TO INITIAL STATE,$+4 HB_EI #ENDIF #ENDIF @@ -3289,8 +3289,8 @@ SYS_POKE: PUSH IY HB_DI #ELSE - LD A,I - HB_DI + LD A,I ; SAVE THE INTERRUPT STATUS + HB_DI ; COPY IFF2 TO P/V FLAG PUSH AF #ENDIF #ENDIF @@ -3302,8 +3302,8 @@ SYS_POKE: .DB $FD,$ED,$6E ; LDCTL (C),IY POP IY #ELSE - POP AF - JP PO,$+4 + POP AF ; RECALL INITIAL INTERRUPT STATUS + JP PO ; RETURN TO INITIAL STATE,$+4 HB_EI #ENDIF #ENDIF From 9e05028c052df84c877afd8fbf408b12c6ac46d7 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 19:34:23 +0800 Subject: [PATCH 8/9] Update usrrom.asm fixup --- Source/HBIOS/usrrom.asm | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Source/HBIOS/usrrom.asm b/Source/HBIOS/usrrom.asm index 5d4ff8e7..c230e0f9 100644 --- a/Source/HBIOS/usrrom.asm +++ b/Source/HBIOS/usrrom.asm @@ -13,9 +13,12 @@ LF .EQU 0AH CALL CIN ; DO STUFF ; - LD A,00H ; RETURN TO ROM LOADER - LD HL,0000H - JP 0FFF9H + ;LD A,00H ; RETURN TO ROM LOADER + ;LD HL,0000H + ;JP 0FFF9H + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL $FFF0 ; CALL HBIOS ; RET ; ; @@ -67,8 +70,9 @@ CIN: PUSH BC POP BC RET ; -BOOTMSG:.DB "No User ROM Installed." - .DB CR,LF +BOOTMSG:.DB CR,LF,CR,LF + .DB "No User ROM Installed." + .DB CR,LF,CR,LF .DB "Press a key to return to Boot Loader.$" ; SLACK .EQU (USR_END - $) From c6164ae2aba24b4d77fbcbc007953d52010fbc0c Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 28 Jan 2021 19:38:31 +0800 Subject: [PATCH 9/9] Update hbios.asm fixup --- Source/HBIOS/hbios.asm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 983c64ef..3f1623ec 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3266,7 +3266,7 @@ SYS_PEEK: POP IY #ELSE POP AF ; RECALL INITIAL INTERRUPT STATUS - JP PO ; RETURN TO INITIAL STATE,$+4 + JP PO,$+4 ; RETURN TO INITIAL STATE HB_EI #ENDIF #ENDIF @@ -3303,7 +3303,7 @@ SYS_POKE: POP IY #ELSE POP AF ; RECALL INITIAL INTERRUPT STATUS - JP PO ; RETURN TO INITIAL STATE,$+4 + JP PO,$+4 ; RETURN TO INITIAL STATE HB_EI #ENDIF #ENDIF