6502模拟器开发实践[基础知识]

/ 1评 / 2

首先看这篇文章时候你应该已经了解6502是什么,知道单片机内部都有些什么构成,知道汇编是什么玩意...
好了,6502是好久前专门玩NES的CPU,据说不到2MHz的主频.如今找个100MHz的M3都未必模拟得动,当然1GHz的x86当然不在话下.指令集不同,同样主频效能也不一样.
基础分两部分说,模拟NES的所需最小最小资源,还有NES分别怎么构成.
NES全套分别由PPU,APU,CPU主要构成,当然大多数游戏还有魔改的Mapper.大概图是这样的.
 

为什么现在拿单片机模拟那么累,因为我们要做的不只是CPU的事情,比如PPU负责渲染颜色,他运行主频是CPU的三倍,PPU就是实现我们动画,还有人物走动显示的关键,NES 显示的对象有 Background 和 Sprite 两种.顾名思义,background 就是背景,而 sprite 则是前景中活跃的所谓精灵,如超级马里奥的马里奥水管工就是一个 sprite.下面会对它们进一步的介绍。,具体PPU能做哪些功能,做模拟器就不用了解那么多了,只要知道解释指令即可.另外说一下,PPU支持的颜色真是有限啊.

就这么点颜色,在当年还是做出了了不起的游戏.当然限制分辨率256*240.PPU自己带着4K的内存.
APU是处理声音的,实际上有好几条声道.可能这么描述好理解一点点.有矩阵,三角波和噪音生成器.还有DMC.当年这样可是了不得了.
除了这些之外,因为魔改的需要,还出现了Mapper,Mapper最多有255个,功能非常多,但是常见就几十个,这个要在移植中慢慢体现.
那么现在再来看模拟NES得最小资源要多少,首先要个真正的6502里面,ROM和RAM都可以寻址.实际上,ROM对于我们是个文件,要可以寻址,两个办法,复制到片内Flash,复制到片内或者片外RAM,比较环保做法还是复制到片内Flash,就可以完成寻址.
另外各种RAM加起来估计也有几十KB,还算节能.
除了知道硬件要模拟得部分,还要知道一个游戏他自己的构成.下面是超级马里奥的一个文件.

前三个字符叫NES,第四个字符是0x1A,就是Ctrl-Z,这就是NES的标记.
接下来的0x02标记16K ROM的大小,0x01标记8K VROM的大小,首先VROM可以为0,但是一般不会为0,除非一个没图形的游戏(好像也没有这样的吧).
第六个元素是0x01,第七个元素0x00,其中第六位有多个含义,D0写1代表垂直镜像,写0代表水平镜像,这ROM是垂直镜像,D1代表有电池RAM,D2代表有512字节的trainer,D3代表4屏幕VRAM布局,D4-D7代表Mapper号低4位.第7位的D4-D7代表Mapper号的剩下高4位.
所有头信息完成后,剩下就是内容和代码.第16字节开始到ROM结束,然后紧接着VROM直到文件结尾.
ROM起始地址表达为:file + 16
VROM起始地址表达为:file + 16 +  rom个数 * 16K
另外为了解码音频,音频字节所需的RAM也是需要算在里面的,其中wave的缓冲区.如果要考虑到图像拉伸,还有不少东西.还要考虑到输入事件.接着就主程序不断run6502就行.这具体是CPU的实现.
其他基础知识还可以继续看:http://nesdev.com/nestech_cn.txt

  1. monk0519说道:

    赞一个

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注