NES 模拟器开发教程 02 - NES 文件结构

NES 模拟器开发教程 02 - NES 文件结构,第1张

现在几乎所有 ROM 都是 INES 文件格式,后缀名 .nes 。它还有个 2.0 版本,但是我目前发现迹仿几乎所有 ROM 都是 1.0 版本,为了简单起见我们只研究 1.0

INES 分为下列四个区域

Header 总共 16 字节,每个字节定义如下:

从 Header 中可以看出,我们只需要其中的 PRG,CHR,Mapper,Mirror,Trainer 等信息,所以解析也很简单

了解了 NES 文件结构之后姿碧纤,就可以开始卡慧凳带的模拟了,不过模拟卡带之前,下一章会讲解如何进行 NES 开发,以便加深对 NES 的理解

04 章的时候了解了 NES 文件结构,NES 文件本质上只是从卡带上 dump 下来的信息,所以首先需要实现卡带的模拟,把程序等数据加载进内存后,才能进行下一步 *** 作

Mapper 已经在前面的文章出现过很多次了,现在来详细了解一下

03 篇文章提到过,NES 总线上,PRG 的寻址范围为 0x8000 - 0xFFFF,CHR 寻址范围为 0x0000 - 0x2000,他们大小分别为 32K 和 8K,对于大型游戏这么点空间是远远不够的,显然任天堂在设计的时候也考虑到了这一点,所以采用 Mapper 来进行各种扩展

Mapper 并不位于主机中,而位于卡带上。每一张卡带都对应了一种 Mapper,在 NES 1.0 格式中,可以表示多达 256 种 Mapper

每种 Mapper 行为都不一样,比如有的 Mapper 增加了音频芯片提高音频性能,有的 Mapper 增加了寄存器扩展程序大小,有的还有中断计数的功能

比如 Mapper2,增加了 Bank 选择寄存器,以控制不同的 Bank 映射到 0x8000 - 0xFFFF,这样就扩充了游戏容量

了解 Mapper 作用之后,首先看看最简单的 Mapper - Mapper0,这个 Mapper 没有任何的扩容能力,所以它的 ROM 最大只有 32K + 8K = 40K

唯一需要注意的是:

了解了 Mapper 作用后,就可以开始定义 API 了

首先定义 ROMInfo 接口,表示从 NES 文件解析首罩的 Header 信息

另外还需要一个 Mapper 对象,用来表示不同的 Mapper。对于 CPU 来讲,只需要在意 Mapper 的读写能力,所以需要定义 write 和 read 接口

最后,Cartridge 当中只需要 Info 和 Mapper 两个实例就够了

在这里举个例子讲一下卖档 Cartridge 如何模拟(只列举核心逻辑,其他简单的逻辑就等你自己完成了)

一共需要两个类,中芹乱一个 Cartridge,一个 Mapper0

文件 cartridge.ts

文件 mapper0.ts


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12301647.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存