Haze氏ページのtoaplan2.cについての解説が興味深いので採り上げておきます。
Toaplan2ドライバ(GP9001 VDPを使うゲーム)、特にそのプライオリティシステムは常に不具合のあるままでした。2つ前のリリースで、私は数多く残るハックを取り除くため、ドライバを書き直そうと決めました。実は書き直し自体はかなり以前からやってましたが、デュアルVDPを使った新しいコードではバツグンとドギューン!がうまく動作せず提出を見送ってたのです。
問題は、古いコードが全てのレイヤーを複数の手順で描画していた(スプライト描画関数を各プライオリティに対して呼び出すなど)ため、スプライト間のプライオリティのような基本的なものが正常に動作しないというものでした。各ゲームが好き勝手な順序でレイヤーを描画していたので、それぞれに調整が必要になっていたからです。
コードの整理により、これまでVDPの場合分けをしていた箇所を一回の呼び出しで全てのグラフィックを正しい順序で描画するようにできました。ただ、これでは各VDPからの出力をインタリーブするハックが内蔵関数によっておかしくなるため、バツグンとドギューン!の表示不具合が出るのです。バツグンはこれまでも正しく動作したことはないのですが、新コードだと一部の面が完全にプレイできないほどにおかしくなります。
もともと私はこの問題を修正してから提出しようと考えていたため、しばらく放置していたのです。その後、誰か別な人がToaplan2ドライバの「修正」を試みようですが、提出されたものはハック以外の何物でもなく(何面が動いているかを調べ、各レイヤーのプライオリティをさらにハックするもの)、控えめに言っても最悪なものだったため、私自身のコードを提出し、代わりにバツグンとドギューン!を動作不可ステータスに格下げすることにしました。新しいコードはこのドライバの他のゲームについても大幅に整理されているので、これが正しい解決策への基礎になっていくだろうと考えていました。数バージョンの間ゲームがプレイできなくても、このステップは無駄ではないのです。
これらをひとつにまとめるためいろいろ試してみましたが、しばらくの間ドライバは動作しないままでした。その一方で私はVDPのレンダリングコードをさらに整理して、新しいC++デバイスを使うよう全てをコンバートしました。さらに、GP9001をデバイスとして独自ファイルに抽出したのに伴い、2つのVDP出力を混合するPALのようなものが基板上にあるに違いないと考え、プライオリティミキシングを再調査することにしたのです。
最大の問題点は、各VDPの出力内容が不明なことでした。そこで、各VDPの出力を別々の画面に出力したところ、予想通りVDP単体のミキシングはそれぞれ正しいことがはっきりしました。しかし、VDPの出力がプライオリティデータを混合したものか、それともだたの色データだけのかが不明だったので、その後の解析でもデュアルミキシングについては進展がみられず、ほとんどあきらめかけていたのです。
このときQuench氏が大変有用な情報を提供してくれました。彼は、バツグン基板の2つのVDP間にあるPALの等価回路を解析してくれたのです。これによりVDPがプライオリティ情報を外部に出力しておらず、ミキシングは完全にパレットインデックスを元に行われているのが判明しました。
私は彼の回路を直接実装してみました。理論的には動くはずだったものの、実際の出力はぐちゃぐちゃで、ピクセルの位置もばらばらでした。原因は不明でした。1週間ほど時間をおいて原因を探り、少し異なった方法で実装してみても結果は同じでした。
回路は直接動作はしなかったものの、ここである情報が得られたため、この段階で全てが失われたわけではありませんでした。これにより、どのビットがPALに入力されているかが完全にわかったのです。つまり、ミキシング順を決定するのに使われる可能性のあるビットがわかったということです。
次にドライバの再構成に伴って、Quench氏が解析したPALへの入力ビットと同じビットを使うという、私独自の解決法を思いつきました。最初の段階では黒いドットがランダムに残っていましたが、そこはもう一つのVDPを表示させるところだとすぐにわかり、コードを修正したところ正しく動作するようになり、ついにゲームを最初から最後までテストしても、これまで分かっていた問題点が全て解決しているのが確認されました。
このミキシングにはもう一つの利点があって、バツグンの1面でゴミグラフィックを隠すために使っていたタイルナンバーハックを削除できるのです。偶然にも背景の裏側に表示されるようにゴミのパレットインデックスが設定されているからです。
ドギューンはまだ問題があり新コードでは動作しませんが、少しテストを行えば単純なミキシングシステムを使ってるのはほぼ間違いないと思われます。
これにより、バツグンが初めてハック無しで描画され、全ての面で正しく表示されることになりました。コード自体にはまだ最適化の余地があります(デバッグ時にはできるだけ冗長にしておくのです)。
バツグンの次の段階は、V30コアの未実装命令と機能、V35+の機能(レジスタ、バンキングなど)を追加することになるでしょう。いまのところこの作業はAWJ氏さんがされていると思いますが、最近は進展がないようです。これがあれば、完全なサウンドエミュレーションが可能になります。
David Haywood's WIP - Getting Your Priorities Right