一、何为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
微信扫一扫
支付宝扫一扫