个人项目XNES已经开始动手编码了,目前的进度大概是cpu的模拟完成了大概10~20%左右.简单记录一下CPU模拟过程当中遇到的问题和思考.git
cpu模拟实际就是模拟cpu处理opcode的过程,经过每条指令,来计算CPU的pc,寄存器,栈来实现软件对硬件的模拟.github
主要有A,X,Y,C,Z,I,D,B,V,N这么几个状态/标志寄存器,我看到其余几款模拟器和一个调试器中有在中间插入一个U(Unused)寄存器?难道只为了状态补齐?目前从资料中还未发现为何要在中间插入个U,目前个人作法是在最后补了一个Reserved(内存对齐).数组
2015-09-15:编码
/********************************* status register 7 6 5 4 3 2 1 0 N V B D I Z C *********************************/
最终仍是插入了一个U.调试
6502是个8位cpu,理论来讲因该只有不超过58种指令,目前我记录到的是57种(在头文件def.h中定义).cpu有13种寻址方式,不一样的指令和寻址方式二者组合就有不少种操做码(00-FF,定义在__ops数组中).目前完成了大约10条指令的模拟.code
由于是从零开始实现,所以一个良好的调试器是必备的,不然第一条指令是写对了仍是写错了都没法知道,只能盲写.对比了几个调试器发现FCEUX不错,主要是它能够停在入口点(FFFC),从第一条指令开始单步.强烈推荐.调试的过程当中发现前几条指令我都模拟正确了,运行了大概10条指令后程序就进入了一个循环(LDA->BPL),调试器运行到这里循环点运行能过去,我猜想是过程当中触发了某个中断,下一步就是模拟中断的实现.blog
2015-09-15:内存
继续往下走了,有没有触发中断不肯定,LDA指令读的是0x2002地址,查了一下这个地址是ppu的状态地址,看来那几条指令是在等ppu状态同步.暂时手工往内存里写点状态字让程序往下执行.原本计划模拟完cpu在处理ppu,看来必须一同实现了?get
待实现.同步