|
|
|
@ -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 <A> |
|
|
|
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 <E> |
|
|
|
CALL HEXINS ; FIRST TWO CHARACTERS IS THE RECORD LENGTH FIELD <D> |
|
|
|
LD D,A ; LOAD RECORD LENGTH COUNT INTO D |
|
|
|
CALL HEXINS ; GET NEXT TWO CHARACTERS, MEMORY LOAD ADDRESS <H> |
|
|
|
CALL HXCHKSUM ; UPDATE HEX CHECK SUM |
|
|
|
LD H,A ; PUT VALUE IN H REGISTER |
|
|
|
CALL HEXINS ; GET NEXT TWO CHARACTERS, MEMORY LOAD ADDRESS <L> |
|
|
|
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):" |
|
|
|
|