有了前面的经验做为基础,MMC3的改造就变得非常简单了。
和MMC1类似,MMC3也对应几种不同的PCB,而根据我喜欢的几个游戏,我这次会改造TKROM和TNROM的板子。
TKROM是PRG ROM + CHR ROM的配置。代表游戏是:
- Mother1 (Earthboud)
- 火炮(Gun-Dec)
- 霹雳神兵(Heavy Barrel)
- 拉迪亚战记(Radia Senki)
- 忍者龙剑传 1/2/3(汉化)
- 特救指令(汉化)
TNROM是PRG RPM + CHR RAM的配置。代表游戏是:
- 吞食天地1(汉化)
- 吞食天地2(英文)
- 半数英雄(汉化)
接下来选择要牺牲的卡带,然后开始进入改造过程。
TKROM的改造
MMC3最常见的是TLROM,但并不适合改造,因为MMC3的游戏很多是需要存档的。而TKROM是带有电池记忆的,这样就可以通吃TLROM的游戏,反之则不行。
TKROM很好找,搜索NESCartDB,发现SD高达战记3和4就是符合条件的,并且价格也很便宜。
拆开卡带,看下卡的布局,下方两个芯片使我要改造的PRG和CHR。
上方是MMC3芯片和用于存档的WRAM和电池,改造时我们还需要把老旧的电池也一并换掉。
有了之前的经验,直接按照下面的图示改造就可以了。
Kazzo已经内置了mmc3的烧录脚本,改造完成直接烧录就可以了。
TKROM的合卡
MMC3的好游戏确实是很多,都想把它们烧录出来,所以还是希望这次能做成合卡。
但是按照之前改mmc1合卡的方法,发现都不可用了。如上图,m2信号无法触发74芯片的记数状态。
那么在TKROM上,M2信号到底是怎样的呢?我翻出了Arduino来破解这个问题。
把m2接到Arduino的一个模拟口,然后简单写了几行程序来读取模拟口的数值。然后把卡带插入主机开机,把arduino通过usb与电脑连接,在电脑上查看串口中打出的数字。我发现当FC处于通电开机状态时,M2上的模拟信号的最高读数为700左右,一般保持在600多,而按下主机的reset键时,M2读数降到了10以下的个位数。这样的数据显然是无法触发74芯片的记数动作的。
所以,我想到了用ardiuno来读取m2数值,然后用它的数字口的高低电平切换来74芯片的记数,逻辑上,这样做肯定是行的通的,但唯一的问题就是只能一次性烧录。以后想换游戏就必须拆卡和拆焊了。不过这不重要,本来也没打算要反复烧录的。
现在套引入一个新东西,Digispark Attinyu85。这是一个精简的超小arduino实现。5v供电,有6个IO口,支持模拟和数字的输入和输出,我这次会用到其中的两个,一个接收和读取M2信号,另一个用来操纵74芯片,触发计数的操作。
上面是连线图。在焊接之前,需要先烧录游戏,把PRG的A18脚先焊到VCC,烧录一次;然后把A18焊到GND,再烧录一次。记着要把烧录脚本的erase设置成false,然后就可以继续下一步了。
为了使Attinyu85正确工作还需要编写一段控制程序,并且烧录到Attinyu85中,以下是代码:
至于Attinyu85怎么烧录在这里就不介绍了,可以参考(Digispalk的教程)[https://digistump.com/wiki/digispark/tutorials/connecting]和网上的一些文章。下面是代码:
NesResetDetector.ino
#include "Arduino.h"
#define LED 1 //P1
#define M2_PIN 1 //P2
#define S0 3 //P3
int m2Reading = 0;
long resetTime = -1;
void setup() {
pinMode(S0, OUTPUT);
digitalWrite(S0, LOW);
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
}
void loop() {
m2Reading = analogRead(M2_PIN); //Read P2
if (m2Reading > 100 && resetTime != -1) {
resetTime = -1;
}
if (m2Reading < 100) {
if (resetTime == -1)
resetTime = millis();
else if (resetTime >=0 ) {
long resetDuration = millis() - resetTime;
if (resetDuration > 500) {
digitalWrite(S0, HIGH);
delay(1);
digitalWrite(S0, LOW);
digitalWrite(LED, !digitalRead(LED));
resetTime = -2;
}
}
}
}
这段代码会根据M2的数值来判断是否需要切换游戏,并且还会侦测reset键的按下的长短,短按是重置当前游戏,而长按才是切换到下一个游戏。
全部焊接完之后就是图上的效果。
最后贴上做好的贴纸。
TNROM的改造
TBD
以下是改造手册,用UltraEdit打开可以全屏不用翻页。
MMC3 - TKROM.txt
Attiny85 based MultiCart.txt
MMC3 - TNROM.txt
卡带的图片贴纸文件:
https://github.com/maximaas/Famicom-DIY/tree/master/sticker/multicart