根据在“PROM的存储机制”一节的内容,以及二进制的原理,我们知道128K是2的17次方。所以128KB的并行存储芯片需要17个地址pin,即A0-A16。

同时,512KB的芯片要多出两个地址pin为A17和A18,这两个pin的四种状态组合(00,01,10,11)各自对应着128KB的存储空间。所以,我们可以在制作卡带时只将A0-16交给卡带来控制(对于卡带来说可见的空间永远是128KB),而我们通过人为的控制A17-18的状态组合,就可以将卡带的可见内容在四个128KB空间区域之间循环切换。从而制作出一张四合一卡带。

人为介入的控制最简单的是加装拨码开关,但需要改造卡带外壳,并且使用体验很差。还有一个是通过菜单选择的方式,这是制作游戏数量很多的大型合卡的最理想方式,但必须编写菜单并通过rom hack植入游戏ROM,还要修改mapper,属于高级玩法,我没有这个技术能力。 我只想做一个四合一卡带,所以RESET切换就是最好的方式了。要做到这一点就需要利用FC主机CPU上的M2端口,也就是对应卡带上的第32pin。

image

如图,卡带32pin有根引线连接到了一个焊盘,所以我们稍后可以不用把飞线焊到金手指上。

电路制作(基于SLROM)

M2口的功能可以参考6502CPU的相关文档,总之我是不懂的,但我们只需要知道M2承载了一个时钟信号,本质上是一个电压从正到负不断变化的方波信号。当FC的reset按钮被按下时M2上的这个信号就关闭了,而reset按钮复位之后这个信号也同时恢复。 除了M2,我们还需要一个计数器IC,型号是74HC393AP。

image

这是一个4位脉冲计数器,可以从0-15循环计数,并且在一个IC中封装了两组相同的计数器(我们只需要用到其中一组)。其工作方式为:CP端从高电平转为低电平(high-to-low)时计数器+1,当MR端为高电平时计数器清零。我们知道了M2的特性,所以只要将M2与CP联系到一起,就能够让计数器随着reset按钮来进行计数了。

计数器输出端从高位到低位分别为Q3,Q2,Q1,Q0。输出端针脚高电平为1,低电平为0,所以按照二进制就有以下的16种状态组合(到达最后一个状态计数器溢出,开始重新计数):
0,0,0,0
0,0,0,1
0,0,1,0
0,0,1,1
0,1,0,0
0,1,0,1
0,1,1,0
0,1,1,1
1,0,0,0
1,0,0,1
1,0,1,0
1,0,1,1
1,1,0,0
1,1,0,1
1,1,1,0
1,1,1,1

可以看到其中Q1和Q0状态不断循环,同时没有重复状态。那么,我们将上面说到的A17和A18分别接到Q1和Q0就实现了四个128KB区域的切换了。

下面是日本人的文章(http://bakutendo.blog87.fc2.com/blog-entry-275.html])给出的电路接法:

image

我按照这种接法的结果是失败的,计数器根本不产生任何变化。查阅了很多资料也没有找到确切的原因和可行的办法。后台我发现用万用表测量M2的电压值结果是2.6v左右,随后我在面包板上用单片机模拟了这个电路,用一个稳定的5V输入代替M2,这才发现这个电路可以正常运作了。但总之这种接法是没法用在FC上了。

幸好最后还是让我试出了一个成功的接法,如下:

image

经过后来的尝试我发现这个reset切换的电路接法并不适用于所有的PCB,现在要制作的是基于MMC1的HVC-SLROM的合卡,这种接法是有效的。

image

image

烧录游戏

我用了一块小电路板,本来计划让走线简洁些,但实际效果并不好,做了一个插头的目的是为了方便烧录,这个接下来说。

我们要烧录4个128KB容量的游戏:

  • 最终任务日版(打了英文补丁)
  • S.C.A.T(最终任务美版)
  • RAF World
  • Journey to Silius(RAF World美版)

由于A17和A18并没有接到卡带上,所以我们就没办法一次性用烧录器烧所有rom。原本想和FC主机一样在Kazzo上通过reset来切换存储空间,但是发现这样做烧录软件会提示卡带没插好,查了kazzo的文档发现烧录器的M2口是低电平的,目的是在烧录时避免意外的bank切换(又是我不懂的)。

这样我就想到了用一个拨码开关来手动切换,这也是为什么我在卡带上做了一个4针插头(线序是A17/A18/GND/+5v),烧录时把插头拔下接到拨码开关上就可以手动控制了。

image

先烧录第一个游戏,由于烧录脚本通常会先执行擦除操作再开始写入,而不论拨码开关在什么位置,一旦执行擦除,所有已经烧录进去的游戏就都消失了。所以在烧录第二个游戏之前需要先修改烧录脚本,打开anago/flashdevice.nut,找到对应的flash芯片的配置,把erase_require修改为false,这样烧录程序会跳过擦除直接写入,接下来一次完成余下3个ROM的 写入。

最后,拔掉拨码开关,将插头插回卡带就可以上机试一下了。下面是一段做好的卡带reset进行切换的演示。

以下是改造手册,用UltraEdit打开可以全屏不用翻页。

MMC1 - SLROM - MultiCart.txt

- End -