スーファミミニにマルチタップをつないで動作させることが出来ました!
とはいえ当然そのまま動作させることはできません。
何種類か発売されているWii(スーファミミニ)と旧来スーファミコントローラを変換するアダプタでは、マルチタップを動作させるために必要な配線が足りていません。
Hyperkinアダプタの分解と解析
Hyperkin SNES TO SNES CLASSIC ADAPTER can't use SuperMultitap - honeylab's blog
マルチタップの読み込み方
Mechanism of SFC MultiTap
普通のゲームパッドの端子はコネクタに全部接続されてるわけではないんですね。
HyperkinアダプタがATMEGA8なのでこれに追加配線をすることで改造できそうな気もしますが、まずは専用コンバータを作ることにします。
その前に、ドライバが動かなければどうにもならないので、こちらを作ることから始めます。
スーファミミニのほうがどうやってコントローラを認識しているかですが、
honeylab.hatenablog.jp
上記の記事のようになっています。
具体的には、clovercon というi2c-joypad ドライバがその役割を果たしているため
そこを改造することになります。
もともと、Wiiタイプのコントローラは0x52をi2cアドレスとして固定しているため、
同じi2cバス上には二つ以上接続することはできません。
そのため、アドレスを変更しただけのWiiコントローラプロトコルを実装し、
複数のi2cアドレス要求に対して応答できるように改造します。
具体的な改造箇所は以下の通りです。
https://bitbucket.org/bakueikozo/clovercon-mod/diff/clovercon.c?diff2=0f4327db5c33&at=default
また、何らかの理由でi2cアドレスを変更できるよう、
もともとのcloverconのパラメータを流用して値を設定できるようにしてあります。
本当は別のパラメータを準備するべきなんでしょうが…
パラメータは以下のように設定します。
module_params=1,-1,2,-1,83,-1,84,-1,85,-1
(1,-1 ) :1st pad on i2c1 , with no GPIO
(2,-1) : 2nd pad on i2c2 with no GPIO
It is my extention :
(84,-1) : 3rd pad on i2c2 (fixed) with no GPIO with I2C ID is 83 = 0x53
(85,-1) : 4th pad on i2c2 (fixed) with no GPIO with I2C ID is 84 = 0x54
(86,-1) : 4th pad on i2c2 (fixed) with no GPIO with I2C ID is 85 = 0x55
ソースコードを見るとわかりますが、最大8個のコントローラを認識できるようにしてあります。
しかし、同じi2cバス上でこのような頻度でコントローラに問い合わせをしたときに
何らかの弊害が起きる可能性があります。
但し、ボンバーマンを4pでプレイしている限り、普通に動いているように見えました。
上記のパラメータでドライバをロードすると、以下のように認識されます。
あ、言い忘れてましたが、この改造のためには上記で改造したcloverconをミニスーファミにインストールする必要があります。
そのためにもまず、hakchi2のインストールは必須になります。
その中で、hakchi2に含まれるclovercon.hmodを入れ替えることになります。
きちんと認識されたようです。
さて、コンバータのほうはArduinoを使います。
配線はこのようになります。
Hyperkinのアダプタは、Select と 4 or 5 の配線がありません。
この辺の詳細な配線はそのうちきれいに作ったらまとめますが、
スケッチの肝としてはこの辺を参考にしています。
nuneno.cocolog-nifty.com
i2c応答部分はこの時のスケッチを流用しました。
honeylab.hatenablog.jp
このように作ることで、複数のi2c機器のようにふるまうことができます。
さて、実際に使用するにあたって、トラブル特定のしやすいRetroArchを使用します。
hakchi2のモジュールとしてインストールします。
インストール方法はこちら
Releases · ClusterM/retroarch-clover · GitHub
インストール出来たら --retroarch オプションを付加し、マルチタップ対応のROMを転送します。
retroarchでゲームを起動出来たら、1pコンのSelect+StartでINPUTメニューを開き、バインドを設定します。
ここでの肝は、USER2のDeviceTypeをMultitapにすることです。
たぶんなんですが、この設定によりエミュレータ(およびソフト)のほうに
Multitapから信号を読むような切り替えがされるんだと思います。
Input3以降、Controller3 以降を使ってボタンを設定していきます。
すると…
ボンバーマンが4人でプレイ可能になりました!!!
が、残念ながら4人も人が集められなかったので一人で動作確認です!寂しい!!