📄 simulator.cpp
字号:
}
}
}
void view_bincode(word code)
{
word j = 0x8000;
for (int i=0;i<16;i++)
{
if ((j & code) != 0)
printf("1");
else printf("0");
j >>= 1;
}
printf(" <%04x>",code);
}
void run_view_bincode(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
int steps = 10;
int value;
if (argc == 1)
PC = reg.PC;
else if (argc >= 2)
{
value = get_number(argv[1],16);
if (value == -1)
{
if (strcmp(argv[1],"sp") == 0 || strcmp(argv[1],"SP") == 0)
value = reg.SP;
else
{
printf ("\n Unknown control identifier `%s'.\n", argv[1]);
return ;
}
}
PC = (word)value;
}
if (argc > 2)
{
value = get_number(argv[2],16);
if (value == -1)
{
printf ("\n Unknown control identifier `%s'.\n", argv[1]);
return ;
}
if (steps < value)
steps = value;
}
for (int i=0;i<steps && mem.can_vst(PC) == 0;i++)
{
printf("\n [%04x] ",PC);
IR = mem.read_mem(PC++);
view_bincode(IR);
}
}
void run_uasm(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
if (argc == 1)
{
PC = reg.PC;
for (int i=0;i<10 && mem.can_vst(PC) == 0;i++)
{
printf("\n [%04x] ",PC);
IR = mem.read_mem(PC++);
pc_decode(IR);
}
return ;
}
int steps = 10;
int value = get_number(argv[1],16);
if (value == -1)
{
printf ("\n Unknown control identifier `%s'.\n", argv[1]);
return ;
}
PC = value;
if (argc == 3)
{
value = get_number(argv[2],16);
if (value == -1)
{
printf ("\n Unknown control identifier `%s'.\n", argv[2]);
return ;
}
if (steps < value)
steps = value;
}
for (int i=0;i<steps && mem.can_vst(PC) == 0;i++)
{
printf("\n [%04x] ",PC);
IR = mem.read_mem(PC++);
pc_decode(IR);
}
}
void run_load(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
if (argc == 1)
t = mem.load_mem("rom.dat");
else
{
if ((t = mem.load_mem(argv[1])) != 0 )
printf("\n Can not load file %s...\n",argv[1]);
}
}
void run_save(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
if (argc == 1)
mem.save_mem("rom.dat");
else mem.save_mem(argv[1]);
}
void run_restart(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
reg.PC = 0x0001;
run_continue(1,argv);
}
void run_reset(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
reg.PC = 0x0001;
reg.SP = 0xDFFF;
for (int i=0;i<8;i++)
reg.regh[i] = 0x0000;
reg.T = 0;
reg.HI = reg.LO = 0;
run_regs(1,argv);
}
void run_set_reg(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
if (argc < 3)
{
printf ("\n Not enough arguments.\n");
return;
}
if (strlen(argv[1]) != 2)
{
printf ("\n Unknown control identifier `%s'.\n",argv[1]);
return ;
}
if (argv[1][0] == 'r')
argv[1][0] = 'R';
if (strlen(argv[2]) > 4)
{
printf ("\n Unknown control identifier `%s'.\n",argv[2]);
return ;
}
word *regis = NULL;
int value;
if (argv[1][0] == 'R')
{
for (int i=0;i<8;i++)
{
if (strcmp(RegsList[i].name,argv[1]) == 0)
{
regis = ®.regh[i];
break;
}
}
}
else
{
if (strcmp("SP",argv[1]) == 0 || strcmp("sp",argv[1]) == 0)
regis = ®.SP;
}
if (regis == NULL)
{
printf ("\n Unknown control identifier `%s'.\n",argv[1]);
return ;
}
value = get_number(argv[2],16);
if (value == -1)
{
printf ("\n Unknown control identifier `%s'.\n",argv[2]);
return ;
}
*regis = (word)value;
run_regs(1,argv);
}
void run_goto(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
int value = get_number(argv[1],16);
if (value == -1)
return ;
word addr = (word)value;
if (mem.can_vst(addr) != 0)
return ;
reg.PC = addr;
run_regs(1,argv);
}
void run_compile(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
if (argc < 2)
{
printf ("\n Not enough arguments.\n");
return;
}
FILE *handle = fopen(argv[1],"rb");
if (handle == NULL)
{
printf("\n Can not find %s...\n",argv[1]);
return ;
}
fclose(handle);
printf("\n");
char com[1024] = "dc.exe ";
memcpy(&com[7],argv[1],strlen(argv[1])+1);
system(com);
}
void run_help(int argc,char *argv[]);
typedef void (* Tconsole_func) (int , char *[]);
struct Tcommand
{
Tconsole_func func;
char *func_name;
char *func_description;
};
Tcommand commands [] = {
{run_continue,"c",""},
{run_step,"s",""},
{run_quit,"q",""},
{run_setbreak,"b",""},
{run_infobreak,"lb",""},
{run_delbreak,"db",""},
{run_regs,"r",""},
{run_view_bincode,"v",""},
{run_edit_mem,"em",""},
{run_edit_asm,"ea",""},
{run_uasm,"u",""},
{run_set_reg,"sr",""},
{run_reset,"reset",""},
{run_restart,"restart",""},
{run_goto,"goto",""},
{run_load,"load",""},
{run_save,"save",""},
{run_compile,"compile",""},
{run_help,"help",""}
};
void run_help (int argc, char * argv [])
{
printf ("\n List of commands:\n");
for (unsigned int i=0; i<sizeof(commands)/sizeof(Tcommand);i++)
{
printf (" %s", commands[i].func_name);
for (int j = strlen (commands[i].func_name);j<5;j++) printf (" ");
printf (": %s\n", commands[i].func_description);
}
}
struct Tconsole
{
HANDLE hstdout;
COORD scrn;
CONSOLE_SCREEN_BUFFER_INFO sbinf;
int curcom;
int totalcom;
int sizecom;
char **comlist;
Tconsole()
{
sizecom = 4;
curcom = totalcom = 0;
comlist = (char **)malloc(sizeof(char *)*sizecom);
hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
WORD attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE;
SetConsoleTextAttribute(hstdout,attr);
clearscrn();
}
void clearscrn()
{
int size;
scrn.X = SCRN_X;
scrn.Y = SCRN_Y;
SetConsoleScreenBufferSize(hstdout,scrn);
GetConsoleScreenBufferInfo(hstdout,&sbinf);
size = SCRN_X*SCRN_Y;
scrn.X = scrn.Y = 0;
FillConsoleOutputAttribute(hstdout,sbinf.wAttributes,size,scrn,NULL);
FillConsoleOutputCharacter(hstdout,' ',size,scrn,NULL);
gotoxy(0,0);
}
void gotoxy(int xpos,int ypos)
{
scrn.X = xpos;
scrn.Y = ypos;
SetConsoleCursorPosition(hstdout,scrn);
}
void gotoxy_cur(int next)
{
if (next == 0)
return ;
GetConsoleScreenBufferInfo(hstdout,&sbinf);
int pos = sbinf.dwCursorPosition.Y*SCRN_X+sbinf.dwCursorPosition.X+next;
if (next > 0)
{
if (pos > SCRN_X*SCRN_Y)
return ;
}
else
{
if (pos < 0)
return ;
}
scrn.X = pos%SCRN_X;
scrn.Y = pos/SCRN_X;
SetConsoleCursorPosition(hstdout,scrn);
}
void addcom(char *str)
{
comlist[totalcom] = (char *)malloc(sizeof(char)*(strlen(str)+1));
memcpy(comlist[totalcom++],str,strlen(str)+1);
if (totalcom == sizecom)
{
sizecom <<= 1;
char **temp = (char **)malloc(sizeof(char *)*sizecom);
for (int i=0;i<totalcom;i++)
temp[i] = comlist[i];
free(comlist);
comlist = temp;
}
curcom = totalcom;
}
char *getcom(int next)
{
if (totalcom == 0)
return NULL;
switch (next)
{
case 0:
if (curcom == 0)
return NULL;
else return comlist[--curcom];
case 1:
if (curcom == totalcom-1)
return NULL;
else return comlist[++curcom];
case 2:
return comlist[totalcom-1];
default:
return NULL;
}
}
void work();
void parse_and_run(char [], int );
};
void Tconsole::parse_and_run(char buffer[], int len)
{
char *argv[64];
int argc = 0;
int in_command = 0;
for (int i=0;buffer[i] != '\0';i++)
{
if (buffer[i] != ' ')
{
if (in_command == 0)
argv[argc++] = &buffer[i];
in_command = 1;
}
else
{
buffer[i] = '\0';
in_command = 0;
}
}
if (argc == 0)
return ;
for (unsigned int i=0;i<sizeof(commands)/sizeof(Tcommand);i++)
{
if (strcmp(commands[i].func_name,argv[0]) == 0)
{
commands[i].func(argc,argv);
return ;
}
}
if (argc == 1)
{
int value = get_number_10(argv[0],16);
if (value != -1)
{
printf("\n ");
pc_decode((word)value);
return ;
}
else
{
printf ("\n Unknown control identifier `%s'.\n",argv[0]);
return ;
}
}
printf("\n ->Unknown command. Use ``help'' to list commands.\n");
}
void Tconsole::work()
{
char *com;
int cur = 0;
int len = 0;
char ch;
char buffer[LimitConsoleBuffer+1];
buffer[len] = '\0';
printf(">>");
while (true)
{
ch = getch();
if (ch == 8)
{
if (cur != 0)
{
if (cur == len)
{
cur --;
buffer[--len] = '\0';
gotoxy_cur(-1);
printf(" ");
gotoxy_cur(-1);
}
else
{
memcpy(&buffer[cur-1],&buffer[cur],len-cur);
buffer[--len] = '\0';
printf("\b%s ",&buffer[--cur]);
gotoxy_cur(cur-len-1);
}
}
}
else if (ch == -32)
{
ch = getch();
switch (ch)
{
case 75: //left
if (cur != 0)
{
cur --;
gotoxy_cur(-1);
}
break;
case 77: //right
if (cur != len)
{
cur ++;
gotoxy_cur(1);
}
break;
case 72: //up
if (curcom != 0)
{
for(int i=0;i<len;i++)
buffer[i] = ' ';
gotoxy_cur(-cur);
printf("%s",buffer);
gotoxy_cur(-len);
com = getcom(0);
cur = len = strlen(com);
memcpy(buffer,com,len+1);
printf("%s",buffer);
}
break;
case 80: //down
if (totalcom != 0 && curcom < totalcom-1)
{
for(int i=0;i<len;i++)
buffer[i] = ' ';
gotoxy_cur(-cur);
printf("%s",buffer);
gotoxy_cur(-len);
com = getcom(1);
cur = len = strlen(com);
memcpy(buffer,com,len+1);
printf("%s",buffer);
}
break;
case 71: //home
gotoxy_cur(-cur);
cur = 0;
break;
case 79: //end
gotoxy_cur(len-cur);
cur = len;
break;
case 83: //delete
if (cur != len)
{
len--;
memcpy(&buffer[cur],&buffer[cur+1],len-cur);
buffer[len] = '\0';
printf("%s ",&buffer[cur]);
gotoxy_cur(cur-len-1);
}
break;
}
}
else if (ch == 13)
{
if (len != 0)
{
addcom(buffer);
parse_and_run(buffer,len);
}
else if (totalcom != 0)
{
com = getcom(2);
len = strlen(com);
memcpy(buffer,com,len+1);
parse_and_run(buffer,len);
}
printf("\n>>");
cur = len = 0;
buffer[len] = '\0';
}
else if (ch == 27)
{
for (int i=0;i<len;i++)
buffer[i] = ' ';
gotoxy_cur(-cur);
printf("%s",buffer);
gotoxy_cur(-len);
cur = len = 0;
buffer[len] = '\0';
}
else
{
if ((ch <= 'z' && ch >= 'a') || (ch <= 'Z' && ch >= 'A') || (ch <= '9' && ch >= '0') || ch == ' ' || ch == '-' || ch == '.')
{
if (cur == len)
{
if (len != LimitConsoleBuffer)
{
cur ++;
buffer[len++] = ch;
buffer[len] = '\0';
printf("%c",ch);
}
}
else
{
if (len == LimitConsoleBuffer)
{
memcpy(&buffer[cur+1],&buffer[cur],len-cur-1);
buffer[cur] = ch;
printf("%s",&buffer[cur++]);
gotoxy_cur(cur-len);
}
else
{
memcpy(&buffer[cur+1],&buffer[cur],len-cur);
buffer[++len] = '\0';
buffer[cur] = ch;
printf("%s",&buffer[cur++]);
gotoxy_cur(cur-len);
}
}
}
}
}
}
int main ()
{
init();
Tconsole console;
console.work();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -