📄 vm51_debug.c
字号:
/*
Name: emu51_debug
Copyright: rockins
Author: rockins
Date: 06-08-05 21:49
Description: this module implements debug feature for emu51
*/
#include "vm51.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int VM51_output_reg(void)
{
printf("==============SFR(80H ~ FFH)===========\n\n");
printf("PC = %04X\n",PC);
printf("ACC = %02X\n",ACC);
printf("PSW = %02X\n",PSW);
printf("B = %02X\n",B);
printf("SP = %02X\n",SP);
printf("DPL = %02X\n",DPL);
printf("DPH = %02X\n",DPH);
printf("IE = %02X\n",IE);
printf("IP = %02X\n",IP);
printf("P0 = %02X\n",P0);
printf("P1 = %02X\n",P1);
printf("P2 = %02X\n",P2);
printf("P3 = %02X\n",P3);
printf("PCON = %02X\n",PCON);
printf("SCON = %02X\n",SCON);
printf("SBUF = %02X\n",SBUF);
printf("TCON = %02X\n",TCON);
printf("TMOD = %02X\n",TMOD);
printf("TL0 = %02X\n",TL0);
printf("TH0 = %02X\n",TH0);
printf("TL1 = %02X\n",TL1);
printf("TH1 = %02X\n",TH1);
}
int VM51_output_mem(void)
{
int i;
printf("==============RAM(00H ~ 7FH)===========\n");
for (i=0x00;i<0x80;i++)
{
if (i%16==0)
printf("\n%04xH :",i);
printf("%02x ",RAM[i]);
}
printf("\n\n");
}
int VM51_debug(void)
{
char dbg_str[MAX_LINE];
char dbg_cmd;
char *p;
int n;
U8 addr;
U8 val;
char *help = "commands:\n"
"H,h -print this help message\n"
"Q,q -quit debug mode\n"
"N,n -next instruction\n"
"R,r -print registers(80H ~ FFH)\n"
"M,m -print memory(00H ~ 7FH)\n"
"S,s -inspect both reg and mem\n"
"ACC=00 -(e.g)set ACC to 00H,ACC must be uppercase\n"
"(32)=FF -(e.g)set memory (32H) to 00H,other is analogy\n";
printf("[DEBUG]$ ");
fgets(dbg_str,MAX_LINE,stdin);
while(TRUE){
dbg_str[strlen(dbg_str)-1]='\0'; // trim the boring new-line character
n = strlen(dbg_str);
//main debug command,single charater command
if (n==1){
dbg_cmd = tolower(dbg_str[0]);
switch (dbg_cmd){
case 'q': // quit debug mode
debug = OFF;
return;
case 'n': // next instrucion
return;
case 'r': // inspect registers
VM51_output_reg();
break;
case 'm': // inspect memory
VM51_output_mem();
break;
case 's': // inspect both
VM51_output_reg();
VM51_output_mem();
break;
case 'h': // print this help message
printf("%s",help);
break;
default:
fprintf(stderr,"invalid command format,please check...\n");
fprintf(stderr,"%s",help);
break;
}
}else if(n>1){
//set register value or memory content
if (!isxdigit(dbg_str[n-2]) || !isxdigit(dbg_str[n-1]) || dbg_str[n-3]!='='){ // first check legacy
fprintf(stderr,"invalid command format,please check...\n");
fprintf(stderr,"%s",help);
goto label;
}
if ((p=strstr(dbg_str,"ACC=")) && (n==6)){ // strictly syntax:p must being and n must be 6,and so on
p += 4;
val = strtol(p,(char **)NULL,16);
ACC = (U8)val;
}else if ((p=strstr(dbg_str,"B=")) && (n==4)){
p += 2;
val = strtol(p,(char **)NULL,16);
B = (U8)val;
}else if ((p=strstr(dbg_str,"PSW=")) && (n==6)){
p += 4;
val = strtol(p,(char **)NULL,16);
PSW = (U8)val;
}else if ((p=strstr(dbg_str,"SP=")) && (n==5)){
p += 3;
val = strtol(p,(char **)NULL,16);
SP = (U8)val;
}else if ((p=strstr(dbg_str,"DPL=")) && (n==6)){
p += 4;
val = strtol(p,(char **)NULL,16);
DPL = (U8)val;
}else if ((p=strstr(dbg_str,"DPH=")) && (n==6)){
p += 4;
val = strtol(p,(char **)NULL,16);
DPH = (U8)val;
}else if ((p=strstr(dbg_str,"IE=")) && (n==5)){
p += 3;
val = strtol(p,(char **)NULL,16);
DPH = (U8)val;
}else if ((p=strstr(dbg_str,"IP=")) && (n==5)){
p += 3;
val = strtol(p,(char **)NULL,16);
IP = (U8)val;
}else if ((p=strstr(dbg_str,"P0=")) && (n==5)){
p += 3;
val = strtol(p,(char **)NULL,16);
P0 = (U8)val;
}else if ((p=strstr(dbg_str,"P1=")) && (n==5)){
p += 3;
val = strtol(p,(char **)NULL,16);
P1 = (U8)val;
}else if ((p=strstr(dbg_str,"P2=")) && (n==5)){
p += 3;
val = strtol(p,(char **)NULL,16);
P2 = (U8)val;
}else if ((p=strstr(dbg_str,"P3=")) && (n==5)){
p += 3;
val = strtol(p,(char **)NULL,16);
P3 = (U8)val;
}else if ((p=strstr(dbg_str,"PCON=")) && (n==7)){
p += 5;
val = strtol(p,(char **)NULL,16);
PCON = (U8)val;
}else if ((p=strstr(dbg_str,"SCON=")) && (n==7)){
p += 5;
val = strtol(p,(char **)NULL,16);
SCON = (U8)val;
}else if ((p=strstr(dbg_str,"SBUF=")) && (n==7)){
p += 5;
val = strtol(p,(char **)NULL,16);
SBUF = (U8)val;
}else if ((p=strstr(dbg_str,"TCON=")) && (n==7)){
p += 5;
val = strtol(p,(char **)NULL,16);
TCON = (U8)val;
}else if ((p=strstr(dbg_str,"TMOD=")) && (n==7)){
p += 5;
val = strtol(p,(char **)NULL,16);
TMOD = (U8)val;
}else if ((p=strstr(dbg_str,"TL0=")) && (n==6)){
p += 4;
val = strtol(p,(char **)NULL,16);
TL0 = (U8)val;
}else if ((p=strstr(dbg_str,"TL1=")) && (n==6)){
p += 4;
val = strtol(p,(char **)NULL,16);
TL1 = (U8)val;
}else if ((p=strstr(dbg_str,"TH0=")) && (n==6)){
p += 4;
val = strtol(p,(char **)NULL,16);
TH0 = (U8)val;
}else if ((p=strstr(dbg_str,"TH1=")) && (n==6)){
p += 4;
val = strtol(p,(char **)NULL,16);
TH1 = (U8)val;
}else if ((p = strtok(dbg_str,"()=")) && (strlen(p)==2)\
&& isxdigit(p[0]) && isxdigit(p[1])){ //set memory value
addr = strtol(p,(char **)NULL,16); // get addr
p = strtok(NULL,"()="); // get val
if (p && (strlen(p)==2) && isxdigit(p[0]) && isxdigit(p[1])){
val = strtol(p,(char **)NULL,16);
RAM[addr] = val; // set
}else{
fprintf(stderr,"invalid input,please check...\n");
}
}else{ // in fact,it won't reach here,but for robust^_^
fprintf(stderr,"invalid debug command,please check your input...\n");
}
}
label: printf("[DEBUG]$ ");
fgets(dbg_str,MAX_LINE,stdin);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -