NES ROM SRAM扩容教程:Mapper 4实例

需积分: 50 6 下载量 103 浏览量 更新于2024-07-19 收藏 1.37MB DOCX 举报
"本文档是一个关于如何为FC游戏ROM进行SRAM扩容的教程,以Mapper 4为例。作者FlameCyclone使用了FCEUX 2.2.3、Hxd 1.7.7.0和6502_Simulator等工具,针对《双截龙2(J).nes》这款不使用SRAM的游戏进行了扩容操作。教程详细介绍了NES文件格式,包括文件头的各个字段含义,以及如何修改这些字段以增加ROM的PROM和VROM数量。" 在NES文件格式中,文件头的前四个字节"NES^Z"用于识别文件类型,接着的第4字节表示16KB ROM的数量,第5字节表示8KB VROM的数量。第6字节的D1位设置为1表示游戏具有SRAM功能,D0位表示图像镜像方向,D2位表示是否存在512字节的trainer。第7字节的D4-D7位表示ROM Mapper的高4位,其余位必须为0。从第8字节到第F字节都是保留的,应置为0。16-16KxM字节是ROM段,如果有trainer,则位于ROM段之前,最后是8KxN字节的VROM段。 教程中提到的《双截龙2(J).nes》原ROM有0x08个PROM和0x10个VROM。为了扩容,我们需要将第0x04字节改为0x10,表示有16个PROM,同时设置第0x06字节的D1位为1,表明游戏支持SRAM。对于Mapper 4,由于ROM在加载时会将最后16KB加载到内存的C000-FFFF地址,所以需要在最后的16KB PROM之前插入8个16KB的PROM,总共0x20000字节的0xFF填充数据。 扩容完成后,使用FCEUX模拟器打开游戏,可以正常运行。为了实现SRAM的切换,需要了解并修改游戏的RESET中断,找到其在ROM中的地址$FF65,并在调试器中设置执行断点。Mapper 4的Bank切换通过写入$8000地址来实现,具体是通过D0-D2位来选择不同大小的VROM或ROM映射到PPU的不同地址。 这个教程不仅展示了如何扩容NES ROM的SRAM,还涉及到了NES文件格式、ROM映射、中断处理和Mapper操作,对于理解FC游戏的内部工作原理和修改有很高的参考价值。

存在4种类型的sram(sram1,sram2,sram3,sram4),其中sram1和sram2属于SPSRAM类型,sram3和sram4属于DPSRAM类型,每种类型的sram对应3个mux值(4,8,16),每个mux值对应一个word_depth列表和一个io列表。 具体如下: SPSRAM_sram1_word_depth_list_4.append(list(range(32, 1025, 16)) + list(range(1056, 8193, 16))) SPSRAM_sram1_word_depth_list_8.append(list(range(64, 2048, 32)) + list(range(2112, 16385, 32))) SPSRAM_sram1_word_depth_list_16.append(list(range(4096, 4097, 1)) + list(range(4224, 32769, 64))) SPSRAM_sram1_io_list_4.append(list(range(16, 145, 1))) SPSRAM_sram1_io_list_8.append(list(range(8, 73, 1))) SPSRAM_sram1_io_list_16.append(list(range(4, 40, 1))) SPSRAM_sram2_word_depth_list_4.append(list(range(32, 1025, 16))) SPSRAM_sram2_word_depth_list_8.append(list(range(64, 2048, 32))) SPSRAM_sram2_word_depth_list_16.append(list(range(4096, 4097, 1))) SPSRAM_sram2_io_list_4.append(list(range(16, 45, 1))) SPSRAM_sram2_io_list_8.append(list(range(8, 83, 1))) SPSRAM_sram2_io_list_16.append(list(range(4, 45, 1))) DPSRAM_sram3_word_depth_list_4.append(list(range(32, 756, 16))) DPSRAM_sram3_word_depth_list_8.append(list(range(64, 8754, 32))) DPSRAM_sram3_word_depth_list_16.append(list(range(4096, 3543, 1))) DPSRAM_sram3_io_list_4.append(list(range(16, 145, 1))) DPSRAM_sram3_io_list_8.append(list(range(8, 73, 1))) DPSRAM_sram3_io_list_16.append(list(range(4, 40, 1))) DPSRAM_sram4_word_depth_list_4.append(list(range(32, 1046, 16))) DPSRAM_sram4_word_depth_list_8.append(list(range(64, 2087, 32))) DPSRAM_sram4_word_depth_list_16.append(list(range(4096, 4046, 1))) DPSRAM_sram4_io_list_4.append(list(range(16, 87, 1))) DPSRAM_sram4_io_list_8.append(list(range(8, 35, 1))) DPSRAM_sram4_io_list_16.append(list(range(4, 27, 1))) 建立一个函数,当用户输入sram类型时,函数返回每个sram的每个mux对应word_depth_list最大值和io_list最大值。 示例: 当用户输入SPSRAM时,函数返回sram1和sram2中每个mux对应的word_depth_list最大值和io_list的最大值。

2023-03-08 上传