ReFIGHT でいろいろしている技術的な事を書いておきます。
○640x200x4色で動作
MELT DOWNからそうですが、元の88版は 640x200x8色の内の2プレーンしか使っていません(移動するキャラクタのみ)。
そのため、P6SRでも同じように640x200x4色にして動作させています。
○直接アクセスモードを使用
P6SRでビットアクセスモードは便利なんですが、一度のアクセスが4ビット単位になるため、2倍の時間がかかります。
VRAMアドレスの算出がやっかいなのですが、VRAMに直接アクセスする事で高速に描画するようにしています。
○アドレス変換テーブル
88のReFIGHTのプログラムでは、キャラクタ描画の際は座標で指定するのではなく、VRAMアドレスで指定されています。
これを座標指定にするのは、元プログラムの修正量が多すぎます。
そのため、88のVRAMアドレス→座標に変換するのですが、80で割る、などの計算が入って時間を取られます。さらに、その座標をP6SRのVRAMアドレスに変換するのであまり嬉しくない状況です。
今回、88のVRAMアドレス→P6SRのVRAMアドレスの変換のテーブルを作りました。
まともに作るとメモリが足りないので2段階でテーブル引きをしています。
○データ圧縮
今回、データ圧縮に lsza を使っています。
https://github.com/emmanuel-marty/lzsa/releases/
Z80用の展開プログラムも別の方が公開されています。
https://github.com/uniabis/z80depacker/
この中の unlzsa2_fast.asm をそのまま使っていますが、使っているアセンブラでエラーが出ないように修正しています。
他の88ゲーム(Immediate)で使っていたのが大きな理由の一つです。
(Immediateを移植しようとして断念したのはナイショ)
○タイトルとゲームフレームの変換
ゲーム時のフレームやタイトル画面は、別のツールで書かれているようです。
拡張子が.drw で何のツールか不明なのですが、展開ルーチンがメインプログラムに埋め込まれています。
MELT DOWNのときは、そのプログラムにパッチを当てて、P6上で動作させていました。
ReFIGHTでも同じようにしていたのですが、それだとディスクロードと展開がかなり遅くて、うーん、という感じでした。
結局、展開プログラムを読み込んでZ80のエミュレートをするWindows上プログラムを作りました。
その後、P6用に減色などの変換をした後に、lsza で圧縮しています。
○タイトル画面の背景
88版では「ReFIGHT」のタイトル画面の表示の際、「ReFIGHT」の背景の緑色が右にスクロールしています。これは3プレーンの内、Gプレーンのみを右に1ドット単位でシフトしています。
似たような様の事をP6SRの「ReFIGHT」のタイトル画面表示でやらせていますが、プレーン毎の操作はできず、扱うデータ量も大量なので、以下のようにして誤魔化しています。
・「ReFIGHT」の文字に赤色を使用しない(黒色、白色、水色のみ)
・8ドット単位で、赤色が使われていない部分のみをシフト対象にする
・右シフトは、8ドット単位で完結させる(画面全体が右シフトしないが、それっぽく動くのでヨシとする)。
88版の作者のRONJIさんが、P6SR上で動く所が見たいとのことです。
どなたか、可能なら動画をアップ頂けると助かります。
とりあえず静止画を貼っておきます。

