一、何为NES机?
NES全称为Nintendo Entertainment System,是任天堂在1983年发布的一款游戏机。它是首个将游戏从家庭电脑院子里转移到客厅的游戏平台,也可以称之为家用电脑。它的操作系统拥有冗余性,并使用了所谓的ROM卡制式。
二、ROM的定义
ROM是只读存储器(Read Only Memory)的缩写,指的是一组与操作系统紧密相关的硬件存储和映射。它的特点是不同于RAM,ROM的内容一旦写入则不可更改,是非易失性的存储器。
三、NES ROM概述
对于NES游戏机,ROM主要包含两部分,一部分是游戏ROM,另外一部分是NES的内置软件(系统ROM)。这两部分ROM位于不同的地址空间,且大小也不一样。游戏ROM的大小通常是从16KB到步进2倍递增(32KB, 64KB, 128KB等),而系统ROM大约为40KB左右。
; NES ROM(游戏ROM)的地址空间 $0000-$7FFF: 游戏ROM, 可变大小 $8000-$FFFF: 系统地址空间
四、NES ROM格式
NES游戏ROM格式通常为iNES文件格式,该格式又被称为NES 8-bit ROM格式。iNES文件包含了一些NES游戏的许多信息,比如游戏的作者、版本号、游戏的映射方式等等。
; iNES文件格式 字节 含义 ------------------------------ 0-3 常数 $4E $45 $53 $1A (“NES”后加一个 DOS 结束符) 4 大小为16KB的PRG ROM 块数(代码) 5 大小为8KB的CHR ROM 块数 (图形) 6 bit 0 1-垂直镜像(水平卷轴) 0-水平镜像(垂直卷轴) bit 1 1-有SRAM 0-无SRAM bit 2 1-有512字节的Trainer 0-无Trainer bit 3-15 保留 7 bit 0 1-开启512字节的Trainer 0-不开启Trainer bit 1-3 保留 bit 4-7 Mapper编号 8 块大小3,保留
五、Mapper
Mapper指的是一种将ROM缓存在主存中的软件手段,由于NES的ROM是只读存储器,所以在存储器空间不够的时候就需要使用Mapper技术实现ROM在主内存中的动态缓存。搭配相应的硬件可以实现挂载大容量存储以及实现一些硬件加速。
六、NES模拟器
PC上通常使用NES模拟器模拟来运行NES游戏。模拟器负责将游戏ROM加载到内存中,同时模拟NES的硬件器件。如果模拟器错误地实现了NES硬件,在运行某些ROMs时会出现不正常的问题。
; 一段简单的NES模拟器核心 class NESMachine { public: NESMachine() { // 初始化CPU, PPU, APU等硬件 cpu.reset(); ppu.reset(); apu.reset(); rom.reset(); // 导入ROM文件到内存中 // 初始化Mapper rom.loadFromFile("mario.rom"); int mapper_number = rom.getMapperNumber(); mapper.reset(new Mapper_000(mapper_number); } void runOneFrame() { // 运行CPU指令 cpu.runOneFrame(); // 更新PPU ppu.runOneFrame(); // 更新APU apu.runOneFrame(); } private: CPU cpu; PPU ppu; APU apu; ROM rom; unique_ptr mapper; }
七、总结
在NES游戏中,ROM是不可变的,它对游戏机性能产生了很大的影响。ROM的格式和Mapper的实现直接影响了游戏的性能,模拟器也必须实现正确的映像方式,才能准确模拟出NES游戏的运行。
原创文章,作者:MWNI,如若转载,请注明出处:https://www.506064.com/n/136454.html