有了前面的经验做为基础,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的游戏,反之则不行。

image

TKROM很好找,搜索NESCartDB,发现SD高达战记3和4就是符合条件的,并且价格也很便宜。

donor_cart

拆开卡带,看下卡的布局,下方两个芯片使我要改造的PRG和CHR。

上方是MMC3芯片和用于存档的WRAM和电池,改造时我们还需要把老旧的电池也一并换掉。

image

image

有了之前的经验,直接按照下面的图示改造就可以了。

image

Kazzo已经内置了mmc3的烧录脚本,改造完成直接烧录就可以了。

TKROM的合卡

MMC3的好游戏确实是很多,都想把它们烧录出来,所以还是希望这次能做成合卡。

image

但是按照之前改mmc1合卡的方法,发现都不可用了。如上图,m2信号无法触发74芯片的记数状态。

那么在TKROM上,M2信号到底是怎样的呢?我翻出了Arduino来破解这个问题。

Arduino-UNO

把m2接到Arduino的一个模拟口,然后简单写了几行程序来读取模拟口的数值。然后把卡带插入主机开机,把arduino通过usb与电脑连接,在电脑上查看串口中打出的数字。我发现当FC处于通电开机状态时,M2上的模拟信号的最高读数为700左右,一般保持在600多,而按下主机的reset键时,M2读数降到了10以下的个位数。这样的数据显然是无法触发74芯片的记数动作的。

所以,我想到了用ardiuno来读取m2数值,然后用它的数字口的高低电平切换来74芯片的记数,逻辑上,这样做肯定是行的通的,但唯一的问题就是只能一次性烧录。以后想换游戏就必须拆卡和拆焊了。不过这不重要,本来也没打算要反复烧录的。

digispark

现在套引入一个新东西,Digispark Attinyu85。这是一个精简的超小arduino实现。5v供电,有6个IO口,支持模拟和数字的输入和输出,我这次会用到其中的两个,一个接收和读取M2信号,另一个用来操纵74芯片,触发计数的操作。

digispark

上面是连线图。在焊接之前,需要先烧录游戏,把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键的按下的长短,短按是重置当前游戏,而长按才是切换到下一个游戏。

image

全部焊接完之后就是图上的效果。

最后贴上做好的贴纸。

sticker

TNROM的改造

TBD

以下是改造手册,用UltraEdit打开可以全屏不用翻页。
MMC3 - TKROM.txt
Attiny85 based MultiCart.txt
MMC3 - TNROM.txt

卡带的图片贴纸文件:

https://github.com/maximaas/Famicom-DIY/tree/master/sticker/multicart

- End -