⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vm51_debug.c

📁 c51 单片机模拟器C++文件格式元代纳一边以
💻 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 + -