SSパッド->X68変換器を作ってみる(その2)

本日はメガドラ3ボタンのコードを吐くモードを実装した。
実装して、3ボタンパッドの使えるMIXの名作シューティングDiveONで試してたのだけど、ジョイスティックドライバでSEGAモードの検出までは上手くいったものの、本番のゲームで誤動作してる臭い。
一時停止がかかったまま戻ってこない。


これはちょっとMDパッドの仕様を調べてもらえればわかるが、パッドにHを出したときに左右キーのところで必ずLLが帰ってくる仕様になっている。
このLLというのは、ようするにATARI仕様でいうRUNボタンに相当するわけで、DiveOnでセガモードにもかかわらずRUNボタンのセンスが行われているから、変換タイミングが遅れると必ず一時停止がかかってしまう..ということらしい。


メガドラパッドは、複数のボタン信号を1ビット出力で切り替えて読む方式。
中身は単に74HC157の2in1セレクタが一個載っているだけでショボイ単純明快な回路....ということは、1チップマイコンでなんとかついて行ける速度より桁の違う速度で動作するということであるのです。


X68からMDパッドに1ビットの出力を出せば、おそらく1μsec以内に入力は確定するので、それに間に合うようなコードをPICマイコンに実装しなければダメなわけですが、これはちょっと無理な話。


PICの内蔵クロックは4Mhz、クロックサイクルは4クロックで1サイクル。
ピン変化割り込み(H->L/L->Hと変化があったら割り込みがかかる)で割り込みが入ってから、ポートにデータを出すまでに割り込みルーチン内の命令が5サイクル。
さらに割り込みがかかったときのcallで2サイクル。
よって最短で7サイクルかかり、"(1sec/(4Mhz/4clock))x7cycle = 7μsec"は必要。


X68側では出力ポートに信号だしてからnop1回か2回入れる程度だし、しかも10Mhzなので2.5倍速である。だから多分マイコン側で用意する前のデータを取り込んでると思われる。
SEGAモードの検出のところは上手くいってるが、大体パッド検出のようなところでは、誤検出のないようにメインよりもウェイト多めに入れてるに決まってるので、なんとか検出に通ったということじゃないかと思う。


大失敗である。
ハテサテ、どうしようか。


つかもともとDiveOnは2ボタンのゲームだから無理してセガモード動かす必要はないのだけどねー。
チェルノブはもってないぞー。