俺たちはファミコンロッキーに勝てるようになったか(連射組曲)


最近、連射力が30発/秒までしか上がらない、ハマらない…
それはハードのせいではない、ソフトに限界があったからだ


概要
以下の二つの機能を持つメガドライブ用のソフト「連射組曲」を作成した。
・ノーマル3ボタンパッド/ファイティングパッド6B/カブトガニ(XE-1AP)の読み取りを行える
・連射測定機能。通常モードではMAX30発/秒、TURBOモードではMAX60発/秒の測定が可能


メガドライブ用ROMイメージとソース
RensyaKumikyoku_r00.zip
ダウンロード後、展開したフォルダ内に、さらにoutフォルダがあります。その中の「rk_r00.bin」がROMイメージです。
エミュレーター、レトロフリーク、実機、お好きなもので動かしてください。
ヘボいですがソースも添付していますので、お好きなように改造したりもできます。
プログラムの再ビルドの際は、Readme.txtも参考にしてください。


使い方
使い方はなんとなくわかるかと思いますが、連射にこだわる方は「BEST」(単位:発/秒)の値をなるべく高められるよう、頑張って下さい。

※通常モードとTURBOモード
メガドライブ起動時、接続したパッドをABC同時押し状態で起動すると、TURBOモード(カブトガニ読み取りしない、0.5フレームジョイスティック読み)で起動します。
我々のような一般人、ファミコンロッキー以外には不要な機能かもしれません。

※なぜ画面がモザイクなのか?
一応、著作権的に配慮しました。自分で打った「連射」のドット絵はそのままです。
しかし元絵はいいドット絵ですよね!最小限のパーツなのに、本当に城壁にしか見えない!

以下、色々と能書きを記します。


発端
ファミコンやメガドライブのソフトを自作して実機で動かしてみたい…と以前から漠然と考えていましたが、題材がなかなか思いつきませんでした。
FPGAでジョイスティック変換器を作っているとき、「そうだ、ジョイスティックテストソフトがあると便利じゃないか」と思いつきました。
押したボタンや十字キーの方向を表示してくれるやつ。魂斗羅ザ・ハードコアなど、いくつかのゲームでは既にオプション画面についているものもあります。 どうせなら接続したジョイスティックも自動判別してくれて、カブトガニ(XE-1AP)にも対応しているといいなあ。
そして、連射測定機能!迷宮組曲についていたアレを再現してみよう!…というのがきっかけです。


開発ツール
メガドライブ用の開発ツールとしてSGDKを導入し、使ってみました。
サンプルソースも豊富についてきます。海外のツールなので説明は英語ですが、ネットで探せばNendo工房さんなど、日本語で書かれた有用な情報も見つかります。
使ってみた感じ、既存のAPIに手を入れる場合でもソースをコピーして置き換えれば良い、など、なかなか使い勝手はよさそうでした。
また、画像やフォントなどのリソースを、フォルダに配置しておけばコンパイルしてくれるのも便利だと思いました。
今回作成したジョイスティックテストソフトも、SGDKに添付のジョイスティック読み取りサンプルを徐々に改造してゆく形で実装しました。


メガドライブでファミコンロッキーの「ゲーム拳・必殺五十連打」の連射速度(50発/秒)を測定するには?
多くのテレビゲームでは、1フレーム(1/60秒間、NTSCの場合)に1回、ジョイスティックの情報(ボタンやデジタルスティックの押されている押されていない)を読み取りしています。 この仕組みをそのまま使って連射測定を行うとすると、30発/秒までの連射速度しか測定できないことになります。なぜなら、1組の「ボタンを押して、その後ですぐ離している」を検知できるのが、1秒間に30回までだからです。
もしこの21世紀の時代にファミコンロッキーが現れ、50発/秒の連射を行った場合、ソフトウェア側では1秒間に100回以上はジョイスティック情報を読み取る必要があります。


さっきからファミコンロッキーのことは一般常識みたいに話しているけど、もちろんご存知ですよね?
マンガ図書館Zへのリンクも張っておきます。なんと全巻無料で読める!

SGDKのジョイスティック読み取りサンプルを確認してみても、やはりジョイスティック読み取りは、1フレームごとに発生するVBlank割り込みの都度、行われる作りになっていました。 となると、別途、定期的に1フレーム以上の頻度で呼び出される仕組みを使用しなければなりません。
まっ、そこは天下のメガドライブ、きっとタイマー割り込みだとか何かいい仕組みがあるだろう、と思いこんでいたのです、が・・・
なんと!メガドライブにはタイマー割り込みが無い!?ガーン!!

この事実が判って連射測定機能はあきらめようかな?と思ったのですが、メガドライブにはVBlank割り込み以外にも、HInterruptという「スキャンラインを指定本数走査するごとに発生させられる割り込み」(こんな日本語訳でいいんだろうか?)がありました。

そこで、HInterruptのVDP_setHIntCounter(n)のnの値を操作できるテスト用のメガドライブソフトを作成し、nの値を変えて動作させつつ、ジョイスティックポートの読み取りの周期をロジアナで確認してみました。
結果、VDP_setHIntCounter(46)程度で、VBlank割り込み+HInterruptを組み合わせて毎秒大体120回(1/2フレームに1回)のボタン読み取りを行えそうでした。

本ソフトウェアでは、この方式でジョイスティック読み取りを行うことを「TURBOモード」と呼んでいます。


通常のVBlank読みだと16ms(ミリ秒)くらい=1フレームおきに読み取りが行われるが、それを2倍の頻度で読み取りさせた状態。
ネッ、読み取り周期が半分の8.3msくらいになっていますね?・・・ってこのグラフをポイッと見せられてわかるものだろうか。


カブトガニ(XE-1AP)の読み取り方法
X68000 LIBRARYさんにおいてあるANALOG.LZHに則って読み取りルーチンを書きました。
しかも本ソフトウェアのソースを読んだ方にはモロバレですが、Cで・・・。
せっかく68000アセンブリのソースがあるんだから、本当はインラインアセンブラとかで書くとカッコよかったですよね。自信がある人は改造してみてくれよな!
ほぼ同じハードウェアであるサイバースティックをMSXのマシン語で読み取る記事は、こちらにもあります。


予想FAQ『レトフリや〇〇エミュレーターで30発/秒以上連射しているのに測定できないぞ!?なんでだ!?』
あなたファミコンロッキーですか?!
エミュレーターがユーザージョイスティック読み取りをどのくらいの周期でやっているか、分からないんですよね・・・。
TURBOモードは実機でのみ、お楽しみください。
あと忘れてましたが、PALの本体でどういう挙動になるかわからないや!動作は日本版のメガドライブ実機限定でお願いします。


(参考)当時の連射速度測定方法
かつて日本のガキンチョの間では、連射力が高いこと=人間的ステージが高いとされる時期がありました。
数年間くらいかな?結構短期間だった気がするけど。
当時、私の知っていた連射力測定方法は以下のような感じでした。

1.ファミコン「迷宮組曲」のタイトル画面
迷宮組曲のタイトル画面には連射測定機能が付いています。
画面最上部に表示される数値は、「過去10秒間のボタンを押した回数」(1秒分のボタン押し回数を格納するリングバッファ×10要素分の合計)です。
10秒分の押した回数なので、ここに表示された数値を10で割ると、その人の連射力が分かります。
噂によると、同時期に発売されたジョイカードマークIIとの兼ね合いで、わざと1割増しの連射数が表示されるようになっているとかいないとか・・・?

なお、海外版の迷宮組曲には連射機能が無いようです。
ええー、じゃあこの連射組曲のギャグは、国内限定かよぉ・・・とわかったのが開発が進んでだいぶ経った時だったので、そのまま開発を続けました。

2.シュウォッチ
シューティングウォッチの略。コントローラーの右半分+液晶が付いたような形で、時計と連射測定機能が一緒になっています。
これ、当時欲しかったなあ・・・。写真の初代シュウォッチは再販の時に買い、スーファミを模したスーパーのほうは、ハードオフのジャンク箱で見つけて買いました。


なに?スウォッチ?いえ、シュウォッチです。



参考にさせて頂いたサイト、情報
SGDK
Nendo工房
X68000 LIBRARYのAJOY.X


(2018/09/24)



トップへ戻る