From c60c8394b332cb3a889e537f7660ce829dd45a4c Mon Sep 17 00:00:00 2001 From: Phillip Stevens Date: Sat, 30 Nov 2019 20:53:49 +1100 Subject: [PATCH] hbios - dbgmon hxload --- Source/HBIOS/dbgmon.asm | 113 ++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 62 deletions(-) diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 4698655f..2d748e72 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -239,63 +239,47 @@ KLOP1: ; HXLOAD: CALL NEWLINE ; SHOW READY -HXLOAD0: - CALL KIN ; GET THE FIRST CHARACTER, EXPECTING A ':' -HXLOAD1: - CP 03Ah ; IS IT COLON ':'? START OF LINE OF INTEL HEX FILE - JR NZ,HXLOADERR ; IF NOT, MUST BE ERROR, ABORT ROUTINE - LD E,0 ; FIRST TWO CHARACTERS IS THE RECORD LENGTH FIELD - CALL HEXINS ; GET US TWO CHARACTERS INTO BC, CONVERT IT TO A BYTE - CALL HXCHKSUM ; UPDATE HEX CHECK SUM +HXLOADLINE: + CALL CIN ; GET THE FIRST CHARACTER, EXPECTING A ':' + CP ':' ; IS IT COLON ':'? WAIT FOR START OF NEXT LINE OF INTEL HEX FILE + JR NZ,HXLOADLINE ; IF NOT, GO BACK TO WAIT + LD E,0 ; RESET THE CHECKSUM BYTE + CALL HEXINS ; FIRST TWO CHARACTERS IS THE RECORD LENGTH FIELD LD D,A ; LOAD RECORD LENGTH COUNT INTO D CALL HEXINS ; GET NEXT TWO CHARACTERS, MEMORY LOAD ADDRESS - CALL HXCHKSUM ; UPDATE HEX CHECK SUM LD H,A ; PUT VALUE IN H REGISTER CALL HEXINS ; GET NEXT TWO CHARACTERS, MEMORY LOAD ADDRESS - CALL HXCHKSUM ; UPDATE HEX CHECK SUM LD L,A ; PUT VALUE IN L REGISTER CALL HEXINS ; GET NEXT TWO CHARACTERS, RECORD FIELD TYPE - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - CP 001h ; RECORD FIELD TYPE 00 IS DATA, 01 IS END OF FILE - JR NZ,HXLOAD2 ; MUST BE THE END OF THAT FILE + DEC A ; RECORD FIELD TYPE 01 IS END OF FILE + JR Z,HXLOADEXIT ; MUST BE THE END OF THAT FILE + INC A ; RECORD FIELD TYPE 00 IS DATA + JR NZ,HXLOADTYPERR ; RECORD TYPE IS INCORRECT, ERROR OUT +HXLOADDATA: CALL HEXINS ; GET NEXT TWO CHARACTERS, ASSEMBLE INTO BYTE - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD A,E ; RECALL THE CHECKSUM BYTE - AND A ; IS IT ZERO? - JR Z,HXLOADEXIT ; MUST BE O K., GO BACK FOR SOME MORE, ELSE - JR HXLOADERR ; CHECKSUMS DON'T ADD UP, ERROR OUT -HXLOAD2: - LD A,D ; RETRIEVE LINE CHARACTER COUNTER - AND A ; ARE WE DONE WITH THIS LINE? - JR Z,HXLOAD3 ; GET TWO MORE ASCII CHARACTERS, BUILD A BYTE AND CHECKSUM - CALL HEXINS ; GET NEXT TWO CHARS, CONVERT TO BYTE IN A, CHECKSUM IT - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD (HL),A ; CHECKSUM OK, MOVE CONVERTED BYTE IN A TO MEMORY LOCATION + LD (HL),A ; MOVE CONVERTED BYTE IN A TO MEMORY LOCATION INC HL ; INCREMENT POINTER TO NEXT MEMORY LOCATION DEC D ; DECREMENT LINE CHARACTER COUNTER - JR HXLOAD2 ; AND KEEP LOADING INTO MEMORY UNTIL LINE IS COMPLETE -HXLOAD3: - CALL HEXINS ; GET TWO CHARS, BUILD BYTE AND CHECKSUM - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD A,E ; CHECK THE CHECKSUM VALUE - AND A ; IS IT ZERO? - JR Z,HXLOADAGAIN ; IF THE CHECKSUM IS STILL OK, CONTINUE ON, ELSE -HXLOADERR: + JR NZ,HXLOADDATA ; AND KEEP LOADING INTO MEMORY UNTIL LINE IS COMPLETE + CALL HEXINS ; GET NEXT TWO CHARACTERS, ASSEMBLE INTO CHECKSUM BYTE + LD A,E ; RECALL THE CHECKSUM BYTE + OR A ; IT SHOULD BE ZERO + JR Z,HXLOADLINE ; ZERO, SO WE HAVE NO ERROR, GO GET ANOTHER LINE +HXLOADCHKERR: LD HL,TXT_CKSUMERR ; GET "CHECKSUM ERROR" MESSAGE CALL PRTSTR ; PRINT MESSAGE FROM (HL) AND TERMINATE THE LOAD - JR HXLOADEXIT ; RETURN TO PROMPT -HXCHKSUM: - LD C,A ; BUILD THE CHECKSUM - LD A,E ; - SUB C ; THE CHECKSUM SHOULD ALWAYS .EQUAL ZERO WHEN CHECKED - LD E,A ; SAVE THE CHECKSUM BACK WHERE IT CAME FROM - LD A,C ; RETRIEVE THE BYTE AND GO BACK - RET ; BACK TO CALLER -HXLOADAGAIN: - CALL KIN ; CATCH THE TRAILING CARRIAGE RETURN - JR HXLOAD0 ; LOAD ANOTHER LINE OF DATA + JP SERIALCMDLOOP ; RETURN TO PROMPT +HXLOADTYPERR: + LD HL,TXT_RECORDERR ; GET "RECORD TYPE ERROR" MESSAGE + CALL PRTSTR ; PRINT MESSAGE FROM (HL) AND TERMINATE THE LOAD + JP SERIALCMDLOOP ; RETURN TO PROMPT HXLOADEXIT: - CALL KIN ; CATCH ANY STRAY TRAILING CHARACTERS + CALL HEXINS ; GET LAST TWO CHARACTERS, ASSEMBLE INTO CHECKSUM BYTE + LD A,E ; RECALL THE CHECKSUM BYTE + OR A ; IT SHOULD BE ZERO + JR NZ,HXLOADCHKERR ; CHECKUM IS INCORRECT, ERROR OUT + LD HL,TXT_LOADED ; GET "LOADED" MESSAGE + CALL PRTSTR ; PRINT MESSAGE FROM (HL) JP SERIALCMDLOOP ; RETURN TO PROMPT ; ;__POUT_______________________________________________________________________ @@ -702,27 +686,30 @@ ALPH: ; ;__HEXINS_____________________________________________________________________ ; -; GET ONE BYTE OF HEX DATA FROM SERIAL PORT, RETURN IN A +; GET ONE BYTE OF HEX DATA FROM SERIAL PORT, CHECKSUM IN E, RETURN IN A ;_____________________________________________________________________________ ; HEXINS: - PUSH BC ; SAVE BC REGS - CALL NIBLS ; DO A NIBBLE - RLC A ; MOVE FIRST BYTE UPPER NIBBLE - RLC A ; - RLC A ; - RLC A ; - LD B,A ; SAVE ROTATED BYTE - CALL NIBLS ; DO NEXT NIBBLE - ADD A,B ; COMBINE NIBBLES IN ACC - POP BC ; RESTORE BC - RET ; DONE + CALL NIBLS ; DO A NIBBLE + RLCA ; MOVE FIRST BYTE UPPER NIBBLE + RLCA ; + RLCA ; + RLCA ; + LD B,A ; SAVE ROTATED NIBBLE + CALL NIBLS ; DO NEXT NIBBLE + OR A,B ; COMBINE NIBBLES IN ACC TO BYTE + LD B,A ; SAVE BYTE + ADD A,E ; ADD TO CHECKSUM + LD E,A ; SAVE CHECKSUM + LD A,B ; RECOVER BYTE + RET ; DONE NIBLS: - CALL KIN ; GET K B. DATA - CP 40H ; TEST FOR ALPHA - JR NC,ALPH ; - AND 0FH ; GET THE BITS - RET ; + CALL CIN ; GET K B. DATA + SUB '0' + CP 10 ; TEST FOR ALPHA + RET C ; IF A<10 JUST RETURN + SUB 7 ; ELSE SUBTRACT 'A'-'0' (17) AND ADD 10 + RET ; ;__PHL________________________________________________________________________ ; @@ -907,6 +894,8 @@ TXT_READY .TEXT "\r\nMonitor Ready$" TXT_COMMAND .TEXT "\r\nUnknown Command$" TXT_ERR .TEXT "\r\nSyntax Error$" TXT_CKSUMERR .TEXT "\r\nChecksum Error$" +TXT_RECORDERR .TEXT "\r\nRecord Type Error$" +TXT_LOADED .TEXT "\r\nLoaded$" TXT_BADNUM .TEXT " *Invalid Hex Byte Value*$" TXT_MINIHELP .TEXT " (H for Help)$" TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):"