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,看来必须一同实现了?
中断:
待实现.
NES模拟器开发-CPU笔记的更多相关文章
- NES模拟器开发-PPU笔记
20151008 占坑,暂时没弄清楚PPU数据如何初始化,绘制顺序等.
- 准备开发一款开源NES模拟器
前几天无意见看到一些NES的开发资料,勾起了小时候暑假的无数美好回忆,做为一名码农,萌发了自己写一款模拟器的想法.一来可以加深自己对整个系统/游戏的理解,一来可以实现小时候的梦想:),希望可以坚持下来 ...
- WindowsPhone-GameBoy模拟器开发四--Gameboy显示系统分析
这次说一下GB的显示系统,先从一幅Gb的内存分布图说起,请看图: 图中红色框框起来的部分就是这篇文章关注的部分,这一部分的内存地址从8000-9Fff,共8KB,这一部分是从来存储背景和游戏“精灵”的 ...
- Xamrin开发安卓笔记(一)
http://www.cnblogs.com/minCS/p/4108133.html Xamrin开发安卓笔记(一) 安装篇 环境虽然搭建的不稳定,不过还是可以开发的,又加了两个环境变量不知道有 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- 《MFC游戏开发》笔记五 定时器和简单动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...
- 《Android系统开发》笔记
<Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内 ...
- Xamrin开发安卓笔记(二)
http://www.cnblogs.com/minCS/p/4112617.html Xamrin开发安卓笔记(二) 安装篇 Xamrin开发安卓笔记(一) 昨天调理一天AAPT.EXE 被推出 ...
- cmodel模拟器开发
cmodel模拟器开发 对于一个公司来说,产品的设计周期就是生命线,一般来说都会在设计功能级仿真的c-model后直接转向RTL设计. 在目前的技术下,做cycle-by-cycle的设计和直接RTL ...
随机推荐
- 跨域访问CORS
由于现代浏览器的同源策略,合理的跨域请求也变得至关重要. CORS(Cross-Origin Resource Sharing,跨域资源共享)定义了在必须访问跨域资源时,浏览器与服务器应该如何沟通.它 ...
- android 非activity如何得到布局文件 (java文件中获取布局文件)
Android中得到布局文件对象有两种方式第一种,在Activity所在类中this.getLayoutInflater().inflater(R.layout.布局文件名,null);第二种,在非A ...
- mysql 导出csv
SELECT order_id,product_name,qty FROM ordersINTO OUTFILE '/tmp/orders.csv'FIELDS TERMINATED BY ','EN ...
- webform--LinQ的相关操作
LinQ:LineQ to Sq类:集成化的数据访问类:与ado.net没区别:--------------------------------------------LinQ的创建:右键,添加新建项 ...
- JQuery笔记汇总
jQuery相关资料 官网: jQuery官网 在线API: jQuery在线API W3School:W3School-jQuery教程(中文版哦) 下载jQuery:jQuery各版本下载 jQu ...
- AIX 环境下减小系统page space空间
IBM AIX v5.3操作系统环境下减小系统page space空间详细步骤如下 1,创建一个临时的page space空间#mkps -a -n -s 20 rootvg 这里-a参数指定页面空间 ...
- Centos安装jdk
运行Java应用的时候,提示无法找到JAVA_HOME,查询java -version [jifeng@localhost bin]$ java -version java version " ...
- HBase学习
记录HBase的学习过程.之后会陆续添加内容. 阅读hbase的博客,理解hbase是什么.推荐博文: 1,HBase原理,基础架构,基础概念 2,HBase超详细介绍 --------------- ...
- DGV表头双行
try { if (e.RowIndex < 0) { RectangleF _rect = e.CellBounds; Pen _pen = new Pen(Color.Black); Pen ...
- C# 自定义特性
http://www.cnblogs.com/tekkaman/p/3983360.html#undefined https://msdn.microsoft.com/zh-cn/library/sw ...