diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 4698655f..d9b94dda 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -8,7 +8,7 @@ ; THOMAS SCHERRER BASIC HAR.DWARE TEST ASSEMBLER SOURCES FROM THE Z80 INFO PAGE ; INCLUDING ORIGINAL SCHEMATIC CONCEPT ; HTTP://Z80.INFO/Z80SOURC.TXT -; CODE SAMPLES FROM BRUCE JONES PUBLIC DOMAIN ROM MONITOR FOR THE SBC-200C +; CODE SAMPLES FROM BRUCE JONES PUBLIC DOMAIN ROM MONITOR FOR THE SBC-200C ; HTTP://WWW.RETROTECHNOLOGY.COM/HERBS_STUFF/SD_BRUCE_CODE.ZIP ; INSPIRATION FROM JOEL OWENS "Z-80 SPACE-TIME PRODUCTIONS SINGLE BOARD COMPUTER" ; HTTP://WWW.JOELOWENS.ORG/Z80/Z80INDEX.HTML @@ -213,7 +213,7 @@ KLOP1: JP Z,SERIALCMDLOOP ; IF SO, ALL DONE CALL COUT ; OUTPUT KEY TO SCREEN JR KLOP1 ; LOOP -; +; ;__HXLOAD_____________________________________________________________________ ; ; LOAD INTEL HEX FORMAT FILE FROM THE SERIAL PORT, USER OPTION "H" @@ -224,7 +224,7 @@ KLOP1: ; 3) LOAD ADDRESS FIELD (FRAMES 3,4,5,6) ; 4) RECORD TYPE FIELD (FRAMES 7 AND 8) ; 5) DATA FIELD (FRAMES 9 TO 9+2*(RECORD LENGTH)-1 -; 6) CHECKSUM FIELD - SUM OF ALL BYTE VALUES FROM RECORD LENGTH TO AND +; 6) CHECKSUM FIELD - SUM OF ALL BYTE VALUES FROM RECORD LENGTH TO AND ; INCLUDING CHECKSUM FIELD = 0 ] ; ; EXAMPLE OF INTEL HEX FORMAT FILE @@ -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 + 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 + 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 - INC HL ; INCREMENT POINTER TO NEXT 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_______________________________________________________________________ @@ -355,7 +339,7 @@ DUMPMEM: GDATA: INC DE ; BUMP DE FOR LATER COMPARE - CALL NEWLINE ; + CALL NEWLINE ; BLKRD: CALL PHL ; PRINT START LOCATION CALL PC_COLON @@ -375,7 +359,7 @@ NXTONE: LD A,(HL) ; GET BYTE CALL PRTHEXBYTE ; DISPLAY IT CALL PC_SPACE ; -UPDH: +UPDH: INC HL ; POINT NEXT DEC C ; DEC LOC COUNT JR NZ,NXTONE ; IF LINE NOT DONE @@ -390,10 +374,10 @@ PCRLF0: LD A,(HL) ; O K. TO GET JR NZ,PDOT ; DOT: - LD A,2EH ; LOAD A DOT + LD A,2EH ; LOAD A DOT PDOT: CALL COUT ; PRINT IT - INC HL ; + INC HL ; LD A,D ; CP H ; JR NZ,UPDH1 ; @@ -440,7 +424,7 @@ MOVEMEM1: LD A,(HL) ; GET SOURCE VAUEE LD (DE),A ; WRITE TO TARGET LOC LD A,H ; CHECK MSB OF END ADR - CP B ; + CP B ; JR NZ,MOVEMEM1 ; NO MATCH, LOOP LD A,L ; CHECK LSB OF END ADR CP C ; @@ -475,7 +459,7 @@ FILLMEM1: LD A,C ; FILL VALUE TO A LD (HL),A ; WRITE FILL VALUE TO CUR ADR (HL) LD A,H ; CHECK MSB OF END ADR - CP D ; + CP D ; JR NZ,FILLMEM1 ; NO MATCH, LOOP LD A,L ; CHECK LSB OF END ADR CP E ; @@ -533,7 +517,7 @@ WORDPARM: ; ;__GETLN______________________________________________________________________ ; -; READ A LINE OF TEXT FROM THE SERIAL PORT, HANDLE , TERM ON +; READ A LINE OF TEXT FROM THE SERIAL PORT, HANDLE , TERM ON ; EXIT IF TOO MANY CHARS STORE RESULT IN HL. CHAR COUNT IN C. ;_____________________________________________________________________________ ; @@ -544,7 +528,7 @@ GETLNLOP: ; ENTRY LOOP CALL KIN ; GET A KEY CP CHR_CR ; IS ? - JR Z,GETLNDONE ; YES, EXIT + JR Z,GETLNDONE ; YES, EXIT CP CHR_BS ; IS ? JR Z,GETLNBS ; IF SO, HANDLE IT CP ' ' ; UNEXPECTED CONTROL CHAR? @@ -557,7 +541,7 @@ GETLNLOP: CALL COUT ; OUTPUT KEY TO SCREEN LD (HL),A ; STORE CHAR IN BUFFER INC HL ; INC POINTER - INC C ; INC CHAR COUNTER + INC C ; INC CHAR COUNTER JR GETLNLOP ; GET NEXT CHAR GETLNOVF: ; OVERFLOW @@ -692,37 +676,40 @@ NIBL: LD A,(HL) ; GET K B. DATA INC HL ; INC KB POINTER CP 40H ; TEST FOR ALPHA - JR NC,ALPH ; + JR NC,ALPH AND 0FH ; GET THE BITS - RET ; + RET ALPH: AND 0FH ; GET THE BITS ADD A,09H ; MAKE IT HEX A-F - RET ; + RET ; ;__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 + RLCA ; MOVE FIRST BYTE UPPER NIBBLE + RLCA ; + RLCA ; + RLCA ; + LD B,A ; SAVE ROTATED NIBBLE CALL NIBLS ; DO NEXT NIBBLE - ADD A,B ; COMBINE NIBBLES IN ACC - POP BC ; RESTORE BC - RET ; DONE + OR 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________________________________________________________________________ ; @@ -815,7 +802,7 @@ CST: POP DE POP BC RET -; +; #ELSE ; ;__COUT_______________________________________________________________________ @@ -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):" @@ -943,7 +932,7 @@ DSKY_ENTRY: ; ;__FRONT_PANEL_STARTUP________________________________________________________ ; -; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE +; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE ;_____________________________________________________________________________ ; CALL DSKY_INIT ; INIT 8255 @@ -975,7 +964,7 @@ FRONTPANELLOOP1: JR FRONTPANELLOOP ; LOOP EXIT: - RET + RET ; ;__DOBOOT_____________________________________________________________________ ; @@ -994,7 +983,7 @@ DOBOOT: ; POS 01234567 ;_____________________________________________________________________________ ; -DOPORTREAD: +DOPORTREAD: CALL GETPORT ; GET PORT INTO A PORTREADLOOP: LD C,A ; STORE PORT IN "C" @@ -1016,7 +1005,7 @@ PORTREADGETKEY: ; POS 01234567 ;_____________________________________________________________________________ ; -DOPORTWRITE: +DOPORTWRITE: CALL GETPORT ; GET PORT INTO A PORTWRITELOOP: LD L,A ; SAVE PORT NUM @@ -1077,11 +1066,11 @@ EXAMINELOOP: EXAMINEGETKEY: CALL KB_GET ; GET KEY FROM KB CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP - JR Z,EXAMINEFW ; + JR Z,EXAMINEFW ; JR EXAMINEGETKEY ; NO VALID KEY, LOOP EXAMINEFW: INC HL ; HL++ - JR EXAMINELOOP ; + JR EXAMINELOOP ; ; ;__DODEPOSIT__________________________________________________________________ ; @@ -1110,11 +1099,11 @@ DEPOSITLOOP: DEPOSITGETKEY: CALL KB_GET ; GET KEY FROM KB CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP - JR Z,DEPOSITFW ; + JR Z,DEPOSITFW ; JR DEPOSITGETKEY ; NO VALID KEY, LOOP DEPOSITFW: INC HL ; - JR DEPOSITLOOP ; + JR DEPOSITLOOP ; ; ;__GETADDR____________________________________________________________________ ; @@ -1142,9 +1131,9 @@ GETVALW: LD (DISPLAYBUF+6),A ; LD (DISPLAYBUF+7),A ; GETVALW1: - CALL ENCDISPLAY ; + CALL ENCDISPLAY ; GETVALWLOOP: - CALL KB_GET ; + CALL KB_GET ; CP $10 ; JP M,GETVALWNUM ; NUMBER PRESSED, STORE IT CP KY_EN ; [EN] PRESSED, DONE @@ -1155,9 +1144,9 @@ GETVALWNUM: LD C,A ; LD A,(DISPLAYBUF+5) ; SHIFT BYTES IN DISPLAY BUF TO THE LEFT LD (DISPLAYBUF+4),A ; - LD A,(DISPLAYBUF+6) ; + LD A,(DISPLAYBUF+6) ; LD (DISPLAYBUF+5),A ; - LD A,(DISPLAYBUF+7) ; + LD A,(DISPLAYBUF+7) ; LD (DISPLAYBUF+6),A ; LD A,C ; DISPLAY KEYSTROKE IN RIGHT MOST DISPLAY (0) LD (DISPLAYBUF+7),A ; @@ -1169,7 +1158,7 @@ GETVALWDONE: SLA A ; SLA A ; SLA A ; - LD C,A ; STORE IT IN "C" + LD C,A ; STORE IT IN "C" LD A,(DISPLAYBUF+7) ; GET DIGIT IN DISPLAY 7 AND $0F OR C ; ADD IN NIBBLE STORED IN C @@ -1180,7 +1169,7 @@ GETVALWDONE: SLA A ; SLA A ; SLA A ; - LD C,A ; STORE IT IN "C" + LD C,A ; STORE IT IN "C" LD A,(DISPLAYBUF+5) ; GET DIGIT IN DISPLAY 5 AND $0F OR C ; ADD IN NIBBLE STORED IN "C" @@ -1211,9 +1200,9 @@ GETVALUE: LD (DISPLAYBUF+6),A ; LD (DISPLAYBUF+7),A ; GETVALUE1: - CALL ENCDISPLAY ; + CALL ENCDISPLAY ; GETVALUELOOP: - CALL KB_GET ; + CALL KB_GET ; CP $10 ; JP M,GETVALUENUM ; NUMBER PRESSED, STORE IT CP KY_EN ; [EN] PRESSED, DONE @@ -1222,7 +1211,7 @@ GETVALUELOOP: GETVALUENUM: OR $80 ; SET DP LD C,A ; - LD A,(DISPLAYBUF+7) ; + LD A,(DISPLAYBUF+7) ; LD (DISPLAYBUF+6),A ; LD A,C ; LD (DISPLAYBUF+7),A ; @@ -1234,7 +1223,7 @@ GETVALUEDONE: RLCA ; RLCA ; RLCA ; - LD C,A ; + LD C,A ; LD A,(DISPLAYBUF+7) ; AND $0F OR C ; @@ -1265,7 +1254,7 @@ PUTVALUE: ;__KB_GET_____________________________________________________________________ ; ; GET A SINGLE KEY AND DECODE -; +; ;_____________________________________________________________________________ ; KB_GET: @@ -1280,7 +1269,7 @@ KB_GET: ; NOT A DIGIT OR [EN], BAIL OUT TO MAIN LOOP TO HANDLE IT LD SP,MON_STACK ; CLEAR STACK JP FRONTPANELLOOP1 ; RESTART AT MAIN LOOP -KB_GET1: +KB_GET1: POP HL ; RESTORE HL POP DE POP BC @@ -1353,19 +1342,19 @@ PORT .DB $13,$14,$15,$16,$10,$10,$00,$00 ; "Port 00" (ENCODED) GOTO .DB $1A,$14,$10,$10,$00,$00,$00,$00 ; "Go 0000" (ENCODED) ; ;_HEX_7_SEG_DECODE_TABLE______________________________________________________ -; +; ; SET BIT 7 TO DISPLAY W/ DECIMAL POINT ;_____________________________________________________________________________ ; SEGDECODE: ; POS $00 $01 $02 $03 $04 $05 $06 $07 - ; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' + ; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' .DB $7B, $30, $6D, $75, $36, $57, $5F, $70 -; +; ; POS $08 $09 $0A $0B $0C $0D $0E $0F ; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' .DB $7F, $77, $7E, $1F, $4B, $3D, $4F, $4E -; +; ; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' .DB $00, $04, $00, $6E, $1D, $0C, $0F, $7E, $3D, $0C, $5B