VM技术(一)NES模拟器&VM综述

本文深入探讨了iNES文件格式,这是NES游戏的标准格式。详细解释了iNES文件的结构,包括如何解析.nes游戏文件,以及每个字节的含义。此外,文章还提到了使用虚拟化技术来重新构建和运行这些经典游戏的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游戏和女朋友谁重要?当然是游戏(手动狗头),游戏是每一个时代的记忆,从最早的LED点阵上的游戏发展到LED屏,同时游戏也不断的推动着计算机的发展,现在,时代已经过去,游戏机除了在古董市场,已经无从获得,但是我们可以通过VM技术去重新构建一个借助虚拟化技术可玩的设备,追逐旧梦。 本系列将结合前面的Python VM系列虚拟机将知识融会贯通,总结一下伟大的虚拟化技术。

起步——认识iNES文件格式

要入手一个模拟器,首先得从如何解析.nes的游戏文件开始。
iNES 文件(拓展名 .nes,大小写均可)是 NES 游戏分发的事实标准。该文件标准的最初是由 Marat Fayzullin 为其模拟器 iNES 而开发的文件格式。

01234567
NES^ZPRGCHRMAP/SWMAP/0(always)
4E45531A1020E140
  1. 第 0 ~ 3 个字节指定了文件的格式
    0 = 0x4E (N)
    1 = 0x45 (E)
    2 = 0x53 (S)
    3 = 0x1A (^Z)

  2. 第4个字节指定了 PRG(程序) ROM 块的个数,PRG ROM 块每个大小为 16KB

  3. 第5个字节指定了 CHR(图块) ROM 块的个数,CHR ROM 块每个大小为 8 KB

  4. 第6个字节为指定卡带属性的字节。各个比特位的含义如下:

    • 0 -> Mirror Type ( 1 为水平, 0 为垂直)
    • 1 -> 是否存在 battery-backed RAM ( 1 则为存在,映射到 $6000-$7FFF)
    • 2 -> 是否存在 trainer (同上,映射到 $7000-$71FF)
    • 3 -> 是否存在 VRAM
    • 4-7 -> Mapper Type 的低四位
  5. 第 7 个字节还是指定卡带属性的字节。各个比特位的含义如下:

    • 0 -> 卡带是否含有 VS-System
    • 1-3 -> 保留,但必须全为 0
    • 4-7 -> Mapper Type 的高四位
  6. 第 8 个字节指定了 RAM 块的个数,每块为 8KB,如果为 0 ,则假设只有一个 RAM 块。

  7. 第 9 个字节指定了视频制式,如果其第 0 个比特值为 0,则为 PAL,否则为 NTSC 制式。

  8. 第 10-15 字节为保留区域,必须为 0 通过010editor打开下载[2]的ROM文件可以看到

C++中我们可以定义一个读取文件头的结构体

const NESMagicMumber = 0x1a53454e //"NES^Z"
typedef struct _NesHeader{
	uint32_t MagicNumber;// NES Magic Number,must be 0x1a53454e
	char     PRGNum;		// PRG-ROM banks number
	char     CHRNum;		// CHR-ROM banks number
	char     Ctrl1;			// Control
	char     Ctrl2;			// Control too
	char     RAMNum;		// RAM number (8KB each)
	char[7]  _null;			// Empty bytes. Not used at this tume but MUST BE ALL ZEROS or games will not work.
}NesHeader

参考资料:

  1. TinyVM https://github.com/jakogut/tinyvm
  2. ROM http://romhustler.net/roms/nes/all
  3. SFC ROM http://romhustler.net/roms/snes/all
  4. iNES http://wiki.nesdev.com/w/index.php/INES
  5. nes fromat http://nesdev.com/neshdr20.txt

转载于:https://my.oschina.net/VenusV/blog/3081591

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值