📄 simulator.cpp
字号:
}
int len;
if (argc < 2)
{
printf ("\n Not enough arguments.\n");
return;
}
if ((len = strlen(argv[1])) > 4)
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
int value = get_number(argv[1],16);
if (value == -1)
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
word addr = (word)value;
breakstack.binsert(addr);
}
void run_infobreak(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
if (argc != 1)
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
breakstack.list_break();
}
void run_delbreak(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;
}
int len = strlen(argv[1]);
int index = 0;
char ch;
for (int i=0;i<len;i++)
{
ch = argv[1][i];
if (ch <= '9' && ch >= '0')
{
index *= 10;
index += (ch-'0') & 0xF;
}
else
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
}
breakstack.delbp(index);
}
void run_regs(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
if (argc != 1)
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
printf("\n");
reg.list_regs();
}
void goto_pos(int pos)
{
HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD scrn;
CONSOLE_SCREEN_BUFFER_INFO sbinf;
GetConsoleScreenBufferInfo(hstdout,&sbinf);
if (pos == 0)
pos = 0;
else pos += sbinf.dwCursorPosition.X;
if (pos < 0 || pos >= SCRN_X)
return ;
scrn.X = pos;
scrn.Y = sbinf.dwCursorPosition.Y;
SetConsoleCursorPosition(hstdout,scrn);
}
void mem_save(word addr,char buffer[])
{
IR = 0;
for (int i=0;i<16;i++)
{
IR <<= 1;
if (buffer[i] == '1')
IR |= 0x1;
}
mem.write_mem(addr,IR);
}
void run_edit_mem(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
word addr = 0;
int len, value;
if (argc != 1)
{
len = strlen(argv[1]);
if (len > 4)
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
value = get_number(argv[1],16);
if (value == -1)
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
}
else value = reg.PC;
addr = (word)value;
if (mem.can_vst(addr) != 0)
{
printf("\n Can not read memory %04x\n",addr);
return ;
}
char ch;
char buffer[17];
buffer[16] = '\0';
IR = mem.read_mem(addr);
for (int i=0;i<16;i++)
{
if ((IR & 0x8000) != 0)
{
buffer[i] = '1';
}
else buffer[i] = '0';
IR <<= 1;
}
printf("\n [%04x] %s",addr,buffer);
goto_pos(-16);
int cur = 0;
while (true)
{
ch = getch();
if (ch == -32)
{
ch = getch();
switch (ch)
{
case 75:
if (cur == 0)
break;
cur --;
goto_pos(-1);
break;
case 77:
if (cur == 15)
break;
cur ++;
goto_pos(1);
break;
}
}
else if (ch == '0')
{
printf("%c",'0');
buffer[cur] = '0';
if (cur == 15)
goto_pos(-1);
else cur ++;
}
else if (ch == '1')
{
printf("%c",'1');
buffer[cur] = '1';
if (cur == 15)
goto_pos(-1);
else cur ++;
}
else if (ch == 13)
{
mem_save(addr,buffer);
addr ++;
if (mem.can_vst(addr) != 0)
return ;
IR = mem.read_mem(addr);
for (int i=0;i<16;i++)
{
if ((IR & 0x8000) != 0)
buffer[i] = '1';
else buffer[i] = '0';
IR <<= 1;
}
cur = 0;
printf("\n [%04x] %s",addr,buffer);
goto_pos(-16);
}
else if (ch == 'm' || ch == 7)
return ;
}
}
int save_asm(word addr,char buffer[])
{
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 -1;
word code = 0;
word temp = 0xFFFF;
for (unsigned int i=0;i<sizeof(IDList)/sizeof(AsmID);i++)
{
if (strcmp(IDList[i].name,argv[0]) == 0)
{
temp = IDList[i].id;
break ;
}
}
if (temp == 0xFFFF)
{
if (strcmp("ADDIU",argv[0]) == 0)
{
if (argc == 3)
temp = 9;
else if (argc == 4)
temp = 8;
else return -1;
}
else if (strcmp("ADDSP",argv[0]) == 0)
{
if (argc == 3)
temp = 0;
else if (argc == 2)
temp = 12;
else return -1;
}
else return -1;
}
int value;
code = temp;
switch (temp)
{
case 0: //5 r3 i8
case 4:
case 5:
case 9:
case 10:
case 11:
case 13:
case 14:
case 18:
case 26:
if (argc != 3)
return -1;
if ((value = get_regs_id(argv[1])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_number(argv[2],8)) < 0) return value;
code <<= 8;
code |= (word)value;
break;
case 1: //5 i11
if (argc != 2)
return -1;
if ((value = get_number(argv[1],11)) < 0) return value;
code <<= 11;
code |= (word)value;
break;
case 6: //5 r3 r3 i3 c2
if (argc != 4)
return -1;
if ((value = get_regs_id(argv[1])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_regs_id(argv[2])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_number(argv[3],3)) < 0) return value;
code <<= 3;
code |= (word)value;
code <<= 2;
if (strcmp("SLL",argv[0]) == 0)
code |= 0;
else if (strcmp("SRL",argv[0]) == 0)
code |= 2;
else if (strcmp("SRA",argv[0]) == 0)
code |= 3;
else return -1;
break;
case 8: //5 r3 r3 c1 i4
if (argc != 4)
return -1;
if ((value = get_regs_id(argv[1])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_regs_id(argv[2])) < 0) return value;
code <<= 3;
code |= (word)value;
code <<= 1;
if ((value = get_number(argv[3],4)) < 0) return value;
code <<= 4;
code |= (word)value;
break;
case 12: //5 c3 i8 ; 5 c3 r3 c2 r3
if (argv[0][0] != 'M')
{
if (argc != 2)
return -1;
code <<= 3;
switch (argv[0][3])
{
case 'Q': break;
case 'E': code |= 1; break;
case 'R': code |= 2; break;
case 'S': code |= 3; break;
}
if ((value = get_number(argv[1],8)) < 0) return value;
code <<= 8;
code |= (word)value;
}
else
{
if (argc != 3)
return -1;
code <<= 3;
code |= 7;
if ((value = get_regs_id(argv[1])) < 0) return value;
code <<= 3;
code |= (word)value;
code <<= 2;
if ((value = get_regs_id(argv[2])) < 0) return value;
code <<= 3;
code |= (word)value;
}
break;
case 19: //5 r3 r3 i5
case 27:
if (argc != 4)
return -1;
if ((value = get_regs_id(argv[1])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_regs_id(argv[2])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_number(argv[3],5)) < 0) return value;
code <<= 5;
code |= (word)value;
break;
case 28: //5 r3 r3 r3 c2
if (argc != 4)
return -1;
if ((value = get_regs_id(argv[1])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_regs_id(argv[2])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_regs_id(argv[3])) < 0) return value;
code <<= 3;
code |= (word)value;
code <<= 2;
switch (argv[0][0])
{
case 'A': code |= 1; break;
case 'S': code |= 3; break;
}
break;
case 29: //5 c3 c3 c5 ; 5 r3 c3 c5 ; 5 r3 r3 c5
if (argc == 1 && strcmp("JR",argv[0]) == 0)
{
code <<= 11;
code |= 32;
}
else if (argc == 2)
{
if ((value = get_regs_id(argv[1])) < 0) return value;
code <<= 3;
code |= (word)value;
if (strcmp("JR",argv[0]) == 0)
code <<= 8;
else
{
code <<= 8;
if (strcmp (argv[0],"JALR") == 0)
code |= 192;
else if (strcmp(argv[0],"MFHI") == 0)
code |= 16;
else if (strcmp(argv[0],"MFLO") == 0)
code |= 18;
else if (strcmp(argv[0],"MFPC") == 0)
code |= 64;
else return -1;
}
}
else if (argc == 3)
{
if ((value = get_regs_id(argv[1])) < 0) return value;
code <<= 3;
code |= (word)value;
if ((value = get_regs_id(argv[2])) < 0) return value;
code <<= 3;
code |= (word)value;
code <<= 5;
switch (strlen(argv[0]))
{
case 2:
if (strcmp(argv[0],"OR") != 0)
return -1;
code |= 13; break;
case 3:
switch (argv[0][0])
{
case 'S': code |= 2; break;
case 'C': code |= 10; break;
case 'N':
if (argv[0][1] == 'E')
code |= 11;
else code |= 15;
break;
case 'A': code |= 12; break;
case 'X': code |= 14; break;
case 'D': code |= 26; break;
}
break;
case 4:
if (strcmp("SLTU",argv[0]) == 0)
code |= 3;
else if (strcmp("SLLV",argv[0]) == 0)
code |= 4;
else if (strcmp("SRLV",argv[0]) == 0)
code |= 6;
else if (strcmp("SRAV",argv[0]) == 0)
code |= 7;
else if (strcmp("MFHI",argv[0]) == 0)
code |= 16;
else if (strcmp("MFLO",argv[0]) == 0)
code |= 18;
else if (strcmp("MULT",argv[0]) == 0)
code |= 24;
else if (strcmp("DIVU",argv[0]) == 0)
code |= 27;
break;
case 5: code |= 25; break;
}
}
else return -1;
break;
}
mem.write_mem(addr,code);
return 0;
}
void run_edit_asm(int argc,char *argv[])
{
if (argc == 2 && strcmp(argv[1],"--help") == 0)
{
printf("\n usage:\n");
printf(" help\n");
return ;
}
int len;
char ch;
word addr = 0;
if (argc == 1)
addr = reg.PC;
else
{
len = strlen(argv[1]);
if (len > 4)
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
for (int i=0;i<len;i++)
{
addr <<=4;
ch = argv[1][i];
if (ch <= '9' && ch >= '0')
addr |= (ch-'0');
else if (ch <= 'F' && ch >= 'A')
addr |= (ch-'A'+10);
else if (ch <= 'f' && ch >= 'a')
addr |= (ch-'a'+10);
else
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
}
}
if (mem.can_vst(addr) != 0)
{
printf("\n Can not read memory %04x\n",addr);
return ;
}
len = 0;
int cur = 0;
char buffer[65];
buffer[len] = buffer[64] = '\0';
printf("\n [%04x] ",addr);
while (true)
{
ch = getch();
if (ch == 8)
{
if (cur != 0)
{
if (cur == len)
{
buffer[--len] = '\0';
cur --;
goto_pos(-1);
printf(" ");
goto_pos(-1);
}
else
{
memcpy(&buffer[cur-1],&buffer[cur],len-cur);
buffer[--len] = '\0';
printf("\b%s ",&buffer[--cur]);
goto_pos(cur-len-1);
}
}
}
else if (ch == -32)
{
ch = getch();
switch (ch)
{
case 75:
if (cur != 0)
{
cur --;
goto_pos(-1);
}
break;
case 77:
if (cur != len)
{
goto_pos(1);
cur ++;
}
break;
case 83:
if (cur != len)
{
len --;
memcpy(&buffer[cur],&buffer[cur+1],len-cur);
buffer[len] = '\0';
printf("%s ",&buffer[cur]);
goto_pos(cur-len-1);
}
break;
}
}
else if (ch == 13)
{
if (len == 0)
return ;
if (save_asm(addr,buffer) == 0)
{
addr ++;
if (mem.can_vst(addr) != 0)
return ;
}
cur = len = 0;
buffer[len] = '\0';
printf("\n [%04x] %s",addr,buffer);
}
else if ((ch <= '9' && ch >= '0') || ch == '-' || (ch <= 'Z' && ch >= 'A') || ch == ' ' || (ch <= 'z' && ch >= 'a'))
{
if (len != 64)
{
if (ch <= 'z' && ch >= 'a')
ch -= 32;
if (cur == len)
{
buffer[cur++] = ch;
buffer[++len] = '\0';
printf("%c",ch);
}
else
{
len ++;
memcpy(&buffer[cur+1],&buffer[cur],len-cur);
buffer[cur] = ch;
printf("%s",&buffer[cur++]);
goto_pos(cur-len);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -