NES模拟器准备工作

最近浏览了github,找到了比较有意思的一些开源项目,也想着使用C++写一个红白机的模拟器。说干就干吧,在这里记录一下相应的准备工作。

一些基本概念

首先是一些术语的含义,如下表所示。

其次,一些需要注意的地方:

  1. CPU和PPU分别拥有16位(64KB)的地址空间;
  2. RAM和ROM位于同一个16位地址空间内,CPU和PPU通过指定地址读取相应数据,(和计算机中的虚拟内存层次存储结构不太一样);
  3. RAM的地址空间为13位(0x0000~0x1FFF, 8KB),但实际上只有11位(0x0000~0x07FF, 2KB)是真实用到的,所以会有CPU地址空间分布中的"RAM镜像的概念",其实就是把原来13位中的高2位抹去,归根结底就是为了省钱,同时把地址空间给覆盖满;
  4. PPU中的镜像:PPU的地址空间中,任何超过0x4000的地址,也都被抹去高位,使得实际上寻址范围在0x0000~0x3FFFF,可见,镜像在NES中是广泛应用的;

CPU地址空间分布

nes的CPU地址空间分布如下表所示,这对于后续编写CPU读取数据的函数,是至关重要的。

起始地址 字节大小 具体类型
0x0000 0x800 RAM
0x0800 0x800 RAM映像
0x1000 0x800 RAM映像
0x1800 0x800 RAM映像
0x2000 0x8 Register
0x2008 0x1FF8 PPU Register
0x4000 0x20 Register
0x4020 0x1FDF 扩展ROM
0x6000 0x2000 SRAM(用电池供电的额外RAM,卡带提供)
0x8000 0x4000 PRG-ROM
0xC000 0x4000 PRG-ROM

PPU的渲染模式

nes图形种有一个palette的概念,具体是什么不用细讲,我们只需要知道,每个像素点需要4bits的信息来告知是哪一个palette即可,用以显示对应的颜色。PPU使用Name Table和Pattern Table以及Attribute Table来指示颜色信息,如图所示(写的很乱...估计除了自己,也没人看得懂了)。简单来说,游戏的每一帧有32\times30=960个Tile,所谓Tile,就是8\times8个像素点构成的一个小方块。然后,程序通过几个Table来指定小方块的颜色(也就是降低精度来节省空间了)。
Tile有960个,而单个NameTable刚好也是960Bytes构成,和Tile一一对应。Pattren Tables总共有8KBytes的空间,分为4KBytes+4KBytes,分别给Background和Sprite使用。4KBytes以16Bytes为单位,划分为256个单位。而Nametable中的每个Bytes刚好作为Pattern Tables中单位的索引。单位用以指示Palette偏移的低2位,高两位由Attribute Table指示。后面也懒得写了。。。如果到这里能读懂的话,图也就能看懂了,看图吧。。。

PPU.jpg

NES文件格式

查阅了相关的资料,nes文件的文件格式如下,供后面参考。

字节范围 字节数 具体内容
0~3 4 字符串"NES^Z" (^Z表示EOF)
4 1 16KB ROM的数目
5 1 8KB VROM的数量
6 1 D0:1=垂直镜像,0=水平镜像,即游戏的板式为横斑还是竖版(D0表示该字节的LSB,下面类推)
D1:1=有电池记忆,SRAM地址0x6000-0x7FFF
D2:1=在0x7000-0x71FF有一个512字节的Trainer
D3:1=4屏幕VRAM布局
D4-D7:ROM Mapper的低4位
7 1 D0-D3:保留,必须是0(准备作为副Mapper号)
D4-D7:ROM Mapper的高4位
8~F 8 保留,必须是0
16~ 16KB \times M ROM段升序排列,若存在trainer,则其512字节摆在ROM之前
~EOF 8KB \times N VROM段, 升序排列

工作流程

  1. 读取nes文件,将对应的ROM,VROM等数据读取至内存中(可以直接用vector来存储),以及mapper的建立;
  2. 实际运行游戏之前,先要进行reset,将CPU和PPU中的寄存器、标志位等部件恢复至默认值;

未完待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354