TaterLi's LazyBlog

自言自语,不喜绕路,科学上网,远离天国.

@TaterLi5月前

09/12
16:02
技术控

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

首先看这篇文章时候你应该已经了解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

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