ubuntu fceux成功运行吞食天地2中文版。

来源:互联网 发布:淘宝网秧歌服 编辑:程序博客网 时间:2024/04/30 03:58

最近看linux kernel的源码看到天天做梦梦到代码,于是周日想放松一下,玩会游戏,无奈360已坏,还是逃不过三红的魔爪。PS2实在太画面不能忍,于是倒怀恋起FC的游戏来,最想玩的当然是吞食天地2中文版阿。于是在ubuntu上装了个FCEUX,结果竟然玩不来这个经典的游戏。于是怒了,开始研究fceux源码,又打开台式机的xp分析virtualNes的源码。还查了很多相关资料,尤其是国外的一个NESDEV网站,资料比较全。于是一发不可收拾,周日竟然搞了一天,看了不少资料,发觉FC的体系还是蛮好玩的,那时的游戏程序员不容易阿,想想现在的程序员,活得太抽象了,太PM了。
星期天基本原理掌握后,星期一一下班冲回家开始debug代码,最后发觉是mapper的问题,网上流传的几个版本都是mapper4的,但是标准的mapper4的cart应该rom最大就512K,NESDEV上的wiki有相关资料,而virtualNes却认为它是640K,而吞食天地2中文版也是640K的,而且它是和mapper4一样都是基于mmc3这块board的,盗版商外星科技果然强大,竟然改版过。于是准备开始改动src/boards/mmc3.cpp,

刚刚想把
static void GENPWRAP(uint32 A, uint8 V)
{
 setprg8(A,V&0x3F)
}
改成
setprg8(A, V&0x4F);
来从512K,改到640K,具体原理以后有空再解释。

然后搜了一下0x4F,结果有惊人发现,哈哈!

// ---------------------------- Mapper 198 -------------------------------

static void M198PW(uint32 A, uint8 V)
{
  if(V>=0x50) // Tenchi o Kurau II - Shokatsu Koumei Den (J) (C).nes
    setprg8(A,V&0x4F);
  else
    setprg8(A,V);
}

void Mapper198_Init(CartInfo *info)
{
 GenMMC3_Init(info, 1024, 256, 8, info->battery);
 pwrap=M198PW;
 info->Power=M195Power;
 info->Close=M195Close;
 wramsize=4096;
 wramtw=(uint8*)FCEU_gmalloc(wramsize);
 SetupCartPRGMapping(0x10, wramtw, wramsize, 1);
 AddExState(wramtw, wramsize, 0, "WRAMTW");
}

红色字就是吞食天地2啊。原来是mapper198阿,fceux已经做了,那代码都不用改了,惊喜!!! 可惜当我发现的时候是星期二的早晨,哈哈,早上起来搞代码果然有效率阿。可惜时间不够了,只得上班去。
在公司的时候继续看无聊的java代码。
又下班了,一到家,吃完饭就开始hack rom,用vi -b filename, %!xxd, 将第7,8个字节0x4300改成0x63c0,就是0x04(mapper4)改成0xc6(mapper198), 然后%!xxd -r; wq;本以为应该搞定了。
结果一试,我靠Segement fault,结果又debug一下fceux,有些代码写错了,改了改,再试,结果图像出来了,感动啊,我下的那个版本还不错,战斗不闪,开始爽喽。。。。。。。记得选项里面要设置成PAL并重启生效。
下面附上修改后的fceux源码和修改后的rom,希望有爱的同学,可以在linux上面重温一把。安装方法见里面的INSTALL文件。
fceux: http://docs.google.com/leaf?id=0B1JTQiBNgozPZTkwNmJkMmUtNWNjZC00MjMxLTk0ZTUtOGNmMDBiZDdlZTk1&hl=en

rom: http://docs.google.com/leaf?id=0B1JTQiBNgozPMDQwNzA1OTctYmZhMS00YmVjLTgzN2MtYjhiMDU0NTc4MmMz&hl=en

接下来有空的话我会开发一个iphone的NES模拟器版本,在自己iphone上爽,希望大家到时支持。

 

 

 

 

 

 

原创粉丝点击