zoukankan      html  css  js  c++  java
  • NES模拟器开发-CPU笔记

      我的项目XNES已经开始动手编码了,目前的进度大概是cpu的模拟完成了大概10~20%左右.简单记录一下CPU模拟过程中遇到的问题和思考.

    原理:

      cpu模拟实际就是模拟cpu处理opcode的过程,通过每条指令,来计算CPU的pc,寄存器,栈来实现软件对硬件的模拟.

    寄存器:

      主要有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条指令的模拟.

    调试:

      因为是从零开始实现,因此一个良好的调试器是必备的,否则第一条指令是写对了还是写错了都无法知道,只能盲写.对比了几个调试器发现FCEUX不错,主要是它可以停在入口点(FFFC),从第一条指令开始单步.强烈推荐.调试的过程中发现前几条指令我都模拟正确了,运行了大概10条指令后程序就进入了一个循环(LDA->BPL),调试器运行到这里循环点运行能过去,我猜测是过程中触发了某个中断,下一步就是模拟中断的实现.

    2015-09-15:

      继续往下走了,有没有触发中断不确定,LDA指令读的是0x2002地址,查了一下这个地址是ppu的状态地址,看来那几条指令是在等ppu状态同步.暂时手工往内存里写点状态字让程序往下执行.本来计划模拟完cpu在处理ppu,看来必须一同实现了?

    中断:

      待实现.

  • 相关阅读:
    【手绘漫画】图解LeetCode之x 的平方根(LeetCode 69题)
    tcp 发送长度9 实际组包49
    tcp 发送报文长度和响应报文长度
    http 响应报文
    中台翻车纪实:一年叫停,员工转岗被裁,资源全浪费
    再也不怕女朋友问我二分查找了!【手绘漫画】图解二分查找(修订版)(LeetCode 704题)
    我的Hexo-Github博客搭建笔记
    J
    怎样使用npm打包公布nodejs程序包
    JQuery Jcrop—JQuery Jcrop 图像裁剪工具学习
  • 原文地址:https://www.cnblogs.com/Red_angelX/p/4806332.html
Copyright © 2011-2022 走看看