サイバースティックでアフターバーナーを遊びたい(3)
まとめ





今回、NiseKabutoを作って感じたこと、得られた知見などについていろいろ書いてみました。

対応ゲーム機について
当初は本当にメガドライブ向け専用で、アナログモードだけ動作する「偽物のカブトガニ」を作っていました。
しかし、いざそれが完成して動かしてみると、

「おお、いい感じだ…こうなるとやっぱ、もっと本物っぽいアフターバーナー、つまりサターン版も動かしてみるべきじゃね?」

と思ってしまいました。そしてサターン版もなんとなく動くようになると、

「たしかPCエンジン版は、こっそりアナログスティックに対応していたはず?」

などとなり、結局最後には、

「家庭用でまあまあ入手しやすい範囲で、すべてのアフターバーナーに対応しよう!」

となってしまいました。


アフターバーナーじゃないじゃん…でも操縦桿で遊ぶ感動!!


入力側のアナログ/デジタルモード切替に追従する
当初は「とりあえずアナログモードだけで動けばいっかなー」などと思っていました。
しかしメガCDのアフターバーナーIII、PCエンジンのフォゴットンワールズを遊ぼうとして気づいたのですが、メガCDとCD-ROM2のブート画面は、アナログスティックの読み取りに対応しておらず、結果、次の画面に進めないのです。(STARTボタン/RUNボタン押下がわからない)

解決策として、やはり本物のサイバースティック/カブトガニのように、アナログ/デジタル切り替えスイッチにより、デジタルモードにも切り替えられるようにしなければならないと思いました。
しかしそれには、入力ポートにつなげられたサイバースティック/カブトガニがどちらのモードで動作しているか?を判別できなければなりません。オフィシャルのドライバではどうやって処理してるんだろ?と思ったら、なんと自動認識していない!?マジかよ…

というわけで、入力側ジョイスティックのモード判定処理は「とりあえずアナログモードとして読んでみて、タイムアウトしたらデジタルモードとして読み直す」というものを何とかでっち上げてみました。
しかしこれだと、デジタルモード読み出し時は、常に判定タイムアウトの時間がかかってしまうことになります。
サイバースティック/カブトガニに、現在のモードを教えてくれる機能があれば良かったのに…

電池切れのサターンで、立ち上げ時に出てくる日付入力画面、あれもマルコンのアナログスティックでは「次画面に進む」ボタンにカーソルを合わせられません。サターンモードで、SELETボタン+スティックで十字キー操作が行えるのは、この場面で使うことを想定しています。


応答速度の問題
メガドライブのアナログスティック出力は、あまり苦労なく実装できました。
サイバースティックのドライバ関連の資料が判りにくいという問題はありましたが…きっと資料の書き方の問題というより、これらは元の資料からの抜粋だからでしょう。


サイバースティック/カブトガニ読み取り(最速モード)時のロジアナ波形。
色の濃い縦線が100us=100マイクロ秒毎に引かれている。

この波形を見ると、大体のH/Lの変化が10us単位で発生している(Ackはちょっと例外)ことがわかると思います。
10us単位でピンのH/Lを変えるのは、mbedなら楽勝で行えます。
しかし、この楽勝ムードは、PCエンジンのデジタルパッドの実装で覆されたのでした…


PCエンジン用ホリコマンダーでRUNボタンを押したときの波形。
波形の始まりが400usから始まっているのは無視して、波形全体の幅を見てください。
6〜70usで読み取り処理が完了しているのがわかるでしょうか。


タイムスケールを10倍にしたもの

PCエンジンのデジタルパッド読み取り処理は、

(1)PCエンジン側がSTROBEをH->Lにする。読み取り開始。
(2)以降、PCエンジン側が変化させてくるDSELに合わせ、1Y〜4YのピンのH/Lを変えてゆく

という流れで行われています。
上図はRUNボタンを押したときの波形ですが、RUNボタンを押したときには「出力ピン4Yの信号をDSELと同じようにH/L変化させる」を行うと、PCエンジンにはRUNボタンが押されていると認識されるわけです。

ここで問題になってくるのが、STROBEの変化をmbedが認識し、1Y〜4Y出力ピンのH/Lを変化させるまでに要する時間です。
mbedに接続されたピン(ここで言うSTROBE)のH/L変化を知るには、以下の二通りの方法があります。

これはmbedによらず、一般的なマイコンでも同様です。
さて、これらの方法でピン変化を検知し、実際に出力ピンが変化するまでの時間を測ってみると、
という結果となりました。
ピン変化割り込みを使っている場合、PCエンジンのはじめのDSEL=Hの期間が終わってからやっと、出力ピンを変化できるわけです。これでは間に合いません!かといって、ずっとwhile()ループで出力ピンを見張っていれば良いかというと…これもだめです。今回は入力側ジョイスティックの読み取りも、ユーザに遅延を感じさせない間隔で行わなければなりません。

これにははまりました…結局、インチキくさい方法で回避していますので、興味のある方はソースを見てください。ただし実際のジョイスティックとは厳密には異なる実装ですので、動かないゲームもあるかもしれません。

この辺りから、
「FPGAつーのを使うとナノセカンドオーダーでピンを変化できるらしいじゃん?やっぱmbedは無理なんじゃ…」という考えが頭をもたげてきましたが、とりあえず続行することにしました。

良い子の諸君!世の中にはあきらかに上流工程(仕様検討、機器選定、設計)のミスなのに、実装段階でソフトウェア的にその尻拭いをしなければならない事も多いぞ!

筋さえ通りゃ金次第でなんでもやってのける命知らず、
不可能を可能にし、巨大な悪を粉砕する、
俺たち、特攻野郎ITド○タ!


ファミコン対応について
ゲームに合わせて3段階のスピード変化
さっすが烈火!ジョイスティック読み取り処理も気合が入ってるう!でもトチることあり。


メガドライブのデジタルモードには対応できません
サンダーフォース(テクノソフト製ゲーム全部?)の脅威の変則読み取り処理について。
あきらめました。
セガマニアなのでガッカリ…ぜひFPGAなどでリベンジしたい。
いちおう、2ミリ秒間隔でデジタルパッドの出力情報を書き換え、マスターシステムでも動作するようにしてあります。


武者アレスタのアナログモードには対応していません
出力データに少しでも問題があると、アナログモード読み取りが行われなくなってしまうようです。
あきらめました。


サターンのコナミアンティークスには対応していません
Webで調べた読み取りタイミングと違うじゃん!?ムリムリ。
あきらめました。


(2013/07/27)



トップへ戻る