virtuanes是windows系统的FC模拟器,目前能找到的最新版本是0.97

发现运行《第二次机器人大战汉化版》时,内容显示乱码

在贴吧发现这个游戏汉化rom有两个版本:74版、194版,贴吧已经有修改好的模拟器可直接使用,这里出于好奇自己研究其原理:

virtuanes有个mapper的概念,部分游戏需要利用这个mapper实现超过40KB寻址

fc游戏rom文件头中这个mapper值:0~255,每个值对应一种映射规则

在:https://www.nesdev.org/wiki/INES_Mapper_194,看到194的规则是变种的MMC3(详情参考mapper004)规则:其实就是page0、page1使用CHR-RAM、其余用CHR-ROM

我的virtuanes源码来自:https://github.com/ivysnow/virtuanes

发现其原本的:NES/Mapper/Mapper194.cpp,确实没有实现内容,于是:

  1. 将Mapper004.h、Mapper004.cpp内容复制到Mapper194对应文件
  2. 替换类名:Mapper004→Mapper194
  3. 修改Mapper194::SetBank_PPU函数,其目的是对page0、page1特殊处理
void	Mapper194::SetBank_PPU()
{
	if( VROM_1K_SIZE ) {
		if( reg[0] & 0x80 ) {
			//SetVROM_8K_Bank( chr4, chr5, chr6, chr7,
			//		 chr01, chr01+1, chr23, chr23+1 );
			SetBank_PPUSUB( 4, chr01+0 );
			SetBank_PPUSUB( 5, chr01+1 );
			SetBank_PPUSUB( 6, chr23+0 );
			SetBank_PPUSUB( 7, chr23+1 );
			SetBank_PPUSUB( 0, chr4 );
			SetBank_PPUSUB( 1, chr5 );
			SetBank_PPUSUB( 2, chr6 );
			SetBank_PPUSUB( 3, chr7 );
		} else {
			//SetVROM_8K_Bank( chr01, chr01+1, chr23, chr23+1,
			//		 chr4, chr5, chr6, chr7 );
			SetBank_PPUSUB( 0, chr01+0 );
			SetBank_PPUSUB( 1, chr01+1 );
			SetBank_PPUSUB( 2, chr23+0 );
			SetBank_PPUSUB( 3, chr23+1 );
			SetBank_PPUSUB( 4, chr4 );
			SetBank_PPUSUB( 5, chr5 );
			SetBank_PPUSUB( 6, chr6 );
			SetBank_PPUSUB( 7, chr7 );
		}
	} else {
		if( reg[0] & 0x80 ) {
			SetCRAM_1K_Bank( 4, (chr01+0)&0x07 );
			SetCRAM_1K_Bank( 5, (chr01+1)&0x07 );
			SetCRAM_1K_Bank( 6, (chr23+0)&0x07 );
			SetCRAM_1K_Bank( 7, (chr23+1)&0x07 );
			SetCRAM_1K_Bank( 0, chr4&0x07 );
			SetCRAM_1K_Bank( 1, chr5&0x07 );
			SetCRAM_1K_Bank( 2, chr6&0x07 );
			SetCRAM_1K_Bank( 3, chr7&0x07 );
		} else {
			SetCRAM_1K_Bank( 0, (chr01+0)&0x07 );
			SetCRAM_1K_Bank( 1, (chr01+1)&0x07 );
			SetCRAM_1K_Bank( 2, (chr23+0)&0x07 );
			SetCRAM_1K_Bank( 3, (chr23+1)&0x07 );
			SetCRAM_1K_Bank( 4, chr4&0x07 );
			SetCRAM_1K_Bank( 5, chr5&0x07 );
			SetCRAM_1K_Bank( 6, chr6&0x07 );
			SetCRAM_1K_Bank( 7, chr7&0x07 );
		}
	}
}

void	Mapper194::SetBank_PPUSUB( int bank, int page )
{
	if( page == 0 || page == 1 ) {
		SetCRAM_1K_Bank( bank, page );
	} else {
		SetVROM_1K_Bank( bank, page );
	}
}

编译、并加载rom(注意,需要用贴吧的194汉化版本),果然能看到内容

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐