MMC5是支持物理容量最大的mapper芯片,PRG和CHR分别最大支持1MByte(8mbit),这样和起来就是2Mbyte(8mbit)。不过可惜的是,FC时代容量最大的MMC5游戏金属荣光(Metal Slade Glory),也只是512KB+512KB(8mbit)的配置。所以除了制作合卡之外,没有1MB芯片的用处。

不过FC/NES时至今日仍然有着庞大的粉丝群体,其中一部分技术高人不断地琢磨着hack和改造游戏,从而诞生了千奇百怪的hack游戏版本。

其中一款比较优秀的就是”Zelda - Legend of Link”,这个版本基于元祖塞尔达改造,强化了画面、音乐,加入全新的道具和流程,变成了一个几乎全新的游戏。链接如下:
http://acmlm.kafuka.org/board/thread.php?id=7308
https://www.romhacking.net/hacks/2136/

Legend of Link基于MMC5,容量到达了FC的极限:1MB PRG + 1MB CHR。

游戏中保留了塞尔达系列传统的3个存盘档位,要使这个三个存档都能正常工作还需要WRAM具备32KB的容量。纵观MMC5芯片的卡带PCB,只有EWROM天然符合这个条件。ETROM则可以替换WRAM芯片来升级到32KB,我打算等学会了芯片存档之后再研究这个。所以先就手头有的EWROM卡带开始改造。

image

image

image

用到EWROM的游戏只有三个:“元朝秘史”、“三国志II”、“武将风云录”。第一个已经属于珍稀卡带了,三国志2的现存数量也已经很少很少,好在武将风云录还比较好找,被我收了好几盘。

ROM转接板

接下来就是找到合适的1MB容量的存储芯片,网上能找到的各类FC改造中用的比较多的是M27C801,这是EPROM芯片,需要进行紫外线擦除,所以不具备制成反复可烧录卡带的条件,并且我目前手头上也没有可以烧录EPROM的设备。所以最理想的方式还是使用Flash rom芯片,但32pin的Flash rom最大只支持512KB的容量,再往上的我也没有研究过是否有DIP封装的36pin或者40pin芯片,即使有的话卡带PCB也很难容纳。所以最优的方案就是使用TSOP封装40pin的Flash芯片(我买来的是AM29F080B)加TSOP to DIP的转接板的形式来解决。

转接板已经有很多人做出来了,但是我并没有发现有人分享过电路图,虽然我可以根据经验画一个图出来,但是个别针脚不是很确定。幸运的是我在网上找到了一篇同样是制作Legend of Link的文章,作者也设计了一个转接板。于是我通过邮件联系到他,他也很爽快地给我分享了转接板的电路图。但是这个转接板的设计是不兼容kazzo烧录的,所以我在它的基础之上做了一些修改,然后打样做出了自己的转接板。

image

板子的电路图可以从这里下载:FlashAdapter(eagle格式),下面是焊好了AM29F080B芯片的样子:

image

这个转接板是适用于MMC5的针脚布局,如果需要在改造非MMC5的卡带上使用则需要调整一下设计,或者进行飞线处理。

改造和飞线

image

为了应对PRG和CHR上CE针脚的差异,转接板上设计了一个跳线。作为PRG使用时,WE和CE焊盘分别焊接到金手指的14pin和44pin。作为CHR使用时,WE连接到金手指的47pin,并且把CE和CHR的焊接连在一起。按照下图的方法进行飞线即可。

image

image

如上图所示,和ETROM类似,卡带金手指的14/44/47pin不需要直接焊到金手指触点上,在PCB上都可以找到对应这三个触点的焊盘。

转接板和卡带PCB的焊接需要用到排针,先把排针焊到卡带上对应的ROM位置,然后再把转接板也焊在排针上。

image

image

下面是芯片和飞线全部焊完之后的样子,同时也换上了新的电池座和电池。

image

image

卡带背面排针多出的部分可以不用剪掉,卡带外壳内部的空间刚好是可以容纳下的。

image

烧录

Kazzo的烧录脚本需要修改一下。首先是开头的”size_max”参数,需要修改为”8 * mega”,代表1MB大小。接着,这个脚本的ppu_transfer()函数实际有两个,第二个原本是被注释掉的,但是在这里需要启用第二个,而注释掉第一个。完整的脚本可以在文末下载。

board <- {
	mappernum = 5,
	cpu_rom = {
		size_base = 4 * mega, size_max = 8 * mega,
		banksize = 0x2000
	},
	cpu_ram = {
		size_base = 0x2000, size_max = 0x8000,
		banksize = 0x2000
	},
	ppu_rom = {
		size_base = 4 * mega, size_max = 8 * mega,
		banksize = 0x0800
	},
	ppu_ramfind = true, vram_mirrorfind = false
};
/*
changing charcter bank size method which is tricky.
this method can program A10-A0 device only
memory bank configuration for 0x80000-0xfffff
ppu address|rom address    |page|task
$0000-$0fff|0x80000-0x80fff|0x00|write 0x02aa, 0x0555
$1000-$1fff|n * 0x1000     |n   |write area
*/
function ppu_transfer(d, start, end, ppu_banksize)
{
	local i;
	for(i = start; (i < end) && (i < 0x100); i += 2){
		cpu_write(d, 0x5125, i);
		cpu_write(d, 0x5127, i | 1);
		ppu_program(d, 0x1000, ppu_banksize * 2);
	}
	ppu_banksize *= 2;
	cpu_write(d, 0x5101, 1);
	ppu_command(d, 0x02aa, 0x0000, ppu_banksize);
	ppu_command(d, 0x0555, 0x0000, ppu_banksize);
	cpu_write(d, 0x5123, 0);
	for(i; i < end; i += 2){
		cpu_write(d, 0x5127, i >> 1);
		ppu_program(d, 0x1000, ppu_banksize);
	}
}

烧录完成,上机测试一下:

image

image

测试成功,三个存档位置都可以正常保存,不会死机。

改造手册,用UltraEdit打开可以全屏不用翻页:MMC5 - EWROM.txt

烧录脚本:
https://github.com/maximaas/Famicom-DIY/blob/master/repro/kazzo_scripts/mmc5_8mb.af

- End -