📄 simulator.cpp
字号:
}
else
{
printf("\n\n");
exit(0);
}
}
void run_setbreak(int argc,char *argv[])
{
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 != 1)
{
printf ("\n Unknown control identifier `%s'.\n", argv [1]);
return ;
}
breakstack.list_break();
}
void run_delbreak(int argc,char *argv[])
{
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 != 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[])
{
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;
int i;
for (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;
const struct TASM *p = const_asm;
for (i=0;i<asm_total;i++)
{
if (strcmp(argv[0],(*p).name) == 0)
break;
p ++;
}
if (i == asm_total)
return -1;
int value;
code = ((*p).code & (*p).x & (*p).y & (*p).z);
word regs[3], k;
regs[0] = ~(*p).x;
regs[1] = ~(*p).y;
regs[2] = ~(*p).z;
word num;
for (i=0;i<3;i++)
{
if (regs[i] != 0)
{
if (argc < i+2)
return -1;
k = (regs[i] & (*p).code);
if (regs[i] == k)
{
if ((value = get_regs_id(argv[i+1])) < 0) return -1;
while ((regs[i] & 1) == 0)
{
value = (value << 1);
regs[i] = (regs[i] >> 1);
}
code |= value;
}
else
{
num = regs[i];
while ((num & 1) == 0) num = (num >> 1);
if ((value = get_number(argv[i+1],num,1)) < 0) return -1;
while ((regs[i] & 1) == 0)
{
value = (value << 1);
regs[i] = (regs[i] >> 1);
}
code |= value;
}
}
else
{
if (argc != i+1)
return -1;
break ;
}
}
mem.write_mem(addr,code);
return 0;
}
void run_edit_asm(int argc,char *argv[])
{
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);
}
}
}
}
}
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[])
{
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 == 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_reset(int argc,char *argv[])
{
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;
if (argv != NULL)
run_regs(1,argv);
}
void run_load(int argc,char *argv[])
{
if (argc == 1)
{
t = mem.load_mem("code.cod");
run_reset(1,NULL);
}
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 == 1)
mem.save_mem("rom.dat");
else mem.save_mem(argv[1]);
}
void run_saveFormat(int argc,char *argv[])
{
int PC = reg.PC;
if(argc == 1)
mem.save_memFormat("romFormat.dat",PC);
else mem.save_memFormat(argv[1],PC);
}
void run_restart(int argc,char *argv[])
{
reg.PC = 0x0001;
run_continue(1,argv);
}
void run_set_reg(int argc,char *argv[])
{
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' && argv[1][1] <= '7' && argv[1][1] >= '0')
{
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 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -