MCPU模拟器(和ATTiny85端口)

2020-09-06 22:17:51

Mcpu-emu:MCPU的仿真器MCPU是一个简洁的最小8位CPU(由Tim Boescke在2001年设计的CPU,[email protected])-请参阅其opencores项目文件和GitHub repo。它适合CPLD上的32个宏单元,可以在64字节的RAM上运行。作为最小CPU,它仅支持4条8位指令,由2位操作码和6位地址/立即字段组成。它有两个寄存器-一个8位累加器和6位程序计数器。MCPU支持在程序和数据之间共享64字节的RAM。指令集是:助记操作码DESCRIPTION NOR 00AAAAAA ACC=ACC NOR mem[aaaaa]add 01AAAAAA ACC=ACC+mem[aaaaa],UPDATE Carry STA 10AAAAAA mem[aaaaaa]=ACC JCC 11AAAAAA PC=aaaaa if Carry=0,Clear Carry。仿真器tyfinf struct mcpu_state{uint8_t accu:8;uint8_t进位:1;uint8_t pc:6;uint8_t memory[MEM_SIZE];}mcpu_state;然后仿真循环根据操作码的前两位分派给指令处理程序。我决定用位字段结构表示CPU的状态://ACC=ACC Nor mem[aaaaa]void Nor(mcpu_state*state,uint8_t opcode){state->accu=(state->accu|state->memory[opcode])^0xFF;}//ACC=ACC+mem[aaaaa],update carry void add(mcpu_state*state,uint8_t opcode){uint8_t opcode。State->进位=result>>8;state->accu=result;}//mem[aaaaa]=ACC void sta(mcpu_state*state,uint8_t操作码){uint8_t Immediate=opcode&0x3f;state->memory[Immediate]=state->accu;}//pc=aaaaa如果进位=0,则清除进位void jcc(mcpu_state*state,uint8_t opcode。否则IF(STATE->进位==0){STATE->PC=IMMEDIATE;}STATE->CARY=0;}可以用小型反汇编程序任选地打印出当前执行的指令:void反汇编(mcpu_state*state,char*str){uint8_t opcode=state->memory[state->pc];uint8_t Immediate=opcode&0x3f;switch(opcode>6){case Match_NOR:print intf(str,CASE MATCH_ADD:SPRINTF(str,“添加$%2X[%2X]”,IMMEDIATE,STATE->MEMORY[IMMEDIATE]);Break;CASE MATCH_STA:SPRINTF(str,“STA$%2X”,Immediate);Break;CASE MATCH_JCC:SPRINTF(STR,“JCC$%2X”,Immediate);Break;}}获取一些测试程序TFoC-A Minimal Computer文章附带两个代码示例,代码格式为十六进制转储3E 45 7F C2 C4 FA 00 00 00 FF01我使用以下bash脚本将其转换为二进制文件(更易于由C仿真器使用)。然后使用反汇编程序消除\r\n转换留下的双空格,最后使用xxd执行“反向十六进制转储”:#/!bin/bash cat$1|tr‘\r\n’|sed-e‘s/[[:Blank:]]\+//g’|xxd-r-p>$2,并对输出进行一点调整,生成以下代码0:3E或$3E;ACC=0(从地址3E)1:45添加$5;acc+=250(从地址5)2:7F添加$3F;acc+=1(从地址3F)3:C2 JCC$2;如果发生进位,则跳至第2行4:C4 JCC$4;死循环,跳至自身5:FA-;文字250...3E:FF-;文字255 3F:1-;文字1请注意,没有立即值,只能使用内存中已有的内容,因此文字1、250和255需要存在于RAM中的某个位置。单步执行程序显示它的行为符合预期:NOR$3E[FF]A:00 C:0 PC:01 Add$05[FA]A:FA C:0 PC:02 Add$3F[01]A:FB C:0 PC:03 JCC$02 A:FB C:0 PC:02 Add$3F[01]A:FC C:0 PC:03 JCC$02 A:FC C:0 PC:02 Add$3F[01]A:FD C:0 PC:03 JCC。FE C:0 PC:03 JCC$02 A:Fe C:0 PC:02 Add$3F[01]A:FF C:0 PC:03 JCC$02 A:FF C:0 PC:02 Add$3F[01]A:00 C:1 PC:03 JCC$02 A:00 C:0 PC:04 JCC$04 A:00 C:0 PC:04 JCC$04 A:00 C:0 PC:04。[JCC$04在无限循环中重复]添加一个简单的无限循环检测似乎是一件很有用的事情-如果JCC指令跳转到它自己的地址,就无法摆脱这种状态,因为它不会更改进位标志。第二个例子-打印出适合8位数(最多251个)的质数要复杂得多。如前所述,还需要添加特殊的OUTPUT操作码才能查看结果。移植到土豆微控制器上,欣赏近20年前发布的最小芯片仿真器的最佳方式是什么?在我家里最小的CPU-ATTiny85芯片上移植和运行它,它有512字节的RAM,以Digispark USB开发b的形式以16 MHz的速度运行