Making「SBFZ」その1

Home PC-6001mkII Program etc

 このページでは、元ソースの解析から移植開始までの過程を書いています。

Making「SBFZ」 Top


2010/07/04:きっかけその1
 きっかけはTwitterだったと思う。

 「tiny XEVIOUS for 700の制作昔話」という商品に「SPACE BLUSTER FZ」のバイナリイメージが入っているとの事だった。
 メインの「tiny XEVIOUS for 700」の制作話にも少し興味があったので、思いきってダウンロード購入してみた。「SPACE BLUSTER FZ」の資料を見ると想像以上のボリュームで、几帳面な人だなと思った。

 でもmkIIでやるには実質2MHzの動作、つまりこれの倍の速さで動かす必要があるんだよな...。

2010/07/0x:きっかけその2
 「SPACE BLUSTER FZ」で検索してみると、本人のページが出てきた。

 これによると、一枚の仮想画面に地形や敵等を書き込んだ後、実画面に転送しているようだ。mkIIだと画面を複数使用できるので、裏画面=仮想画面にして画面切り替えをするとかなり速度が稼げそうだ。

 このほか、表示時のクリッピング処理もあまり効率的ではないらしい。この辺りを最適化すると、表示に関しては2倍かそれ以上の速度が出せないだろうか?

 ...ちょっとだけ試してみようかな?

2010/07/10:逆汗
 まずは、「tiny XEVIOUS for 700の制作昔話」についてきたバイナリイメージを解析してみるか、とZ80の表を片手に逆アセンブルを試みる。

 ...数10バイトほど逆アセンブルをしてようやく気づいた。このペースではZ80ソースにするだけで半年はかかってしまう。というわけで、フリーの逆アセンブラの中から「hoja」を使ってみる。
 手ではあんなに時間がかかった逆アセンブルがあれよといううちに全て終わった。ただ、当然ながらデータとおぼしき部分も強引に逆アセンブルされている。

 ここからは資料と見比べながら地味に解析するしかないんだろうな。

2010/07/11:っぽい絵
 動作速度も重要だが、それよりもオリジナルの40x25画面がmkIIの40x20画面に収まるかが心配だ。

 とりあえず、資料にあったイメージと見比べながらSemiEditで作ってみる。

画像

 上下の表示が詰まった感じにはなるが、まあなんとかなるような気がする。

2010/07/12〜16:マッチング
 逆アセンブルしたソースの解析を行う。

 「tiny XEVIOUS for 700の制作昔話」についてきた SPACE BLUSTER FZ のPDFファイル資料には、当時作成したと思われる手書きのZ80ソースが記載されている。まずはこれとのマッチングをとるのが早道だろう。

 手書きソースとバイナリからの逆アセンブルとの対応を、地道に1つずつ調べていく。

 ようやく一通りのマッチングが完了したが、一部処理やデータ部分の意味、謎の命令(CALL 001BH やJP 0018H等)、ワーク領域の使い方など、まだ不明点も多い。

 これから、個々の処理について解析を行う事にする。先は長いなあ...。

2010/07/17〜25:タイトル
 ソースの個々の処理を順に見ていく。

 順番で言うとさまざまな初期設定なのだが、初期設定する値の意味もまだよくわからないのでそこはすっ飛ばして目に見える部分、タイトル画面の表示処理を見る。

 表示といっても、あらかじめ作成している絵を転送しているだけのようだ。転送元のデータは...8800Hからか。これを参考に少し描いてみるか、と解析をそっちのけにしてタイトルの絵を描いていく。

 MZ-700とmkIIのVRAM構造は、どこか似ている部分がある。
  キャラクタ部分とキャラクタ以外の部分で領域が分かれている事、
  キャラクタ以外部分のデータの7ビット目によってキャラクタマップが変わる事、
  4ビットを境に、文字色と背景色の情報が分かれる事。

 一方で異なる部分も多い。
  キャラクタ部分とそれ以外の領域の順序が逆な事、
  VRAMアドレスが異なる事、
  色部分の背景色と文字色のビット位置が逆な事、
  色番号に対応した色が異なる事。

 などと苦戦しているうちに、ようやく一枚絵が出来上がった。

画像

 ここから、タイトル画面の表示に必要そうな部分を解析していく。

 さて、まずは見た目だ。タイトル表示のルーチンを作成する。はじめから二画面切り替えを前提とした作り(描画先アドレスの上位バイトを可変にする)にし、転送ルーチンを入れる。ここまではあっさり成功した。

 次に、夕日の煌き処理を入れる、とここで問題発生。色部分を変えるだけなのだが、意図したものと全然違う色が出てくる。

 少しして原因がわかった。mkIIは0000H-7FFFまではVRAMとBASIC ROMが同居しているのだが、初期状態では読み込み:BASIC ROM, 書き込み:VRAMとなっているんだった。このため、原作にあるような1キャラだけ描いてLDIRで伸ばしていく方法では失敗することになる。

 読み込み先をVRAMに切り替える方法もあるが、ここは愚直にループで書き込んでいくことにする。という事でタイトルだけ完成!

画像

 まだ解析はほとんど出来てないけど、なんか満足だ。

2010/07/27〜08/09:解析
 一つ一つの処理を地味に読んでいき、処理の繋がりやワーク領域を理解していく。

 どれくらい地味かというと、メモで残していた履歴には処理名しか書いていないくらい地味だ。せっかくなので、この間に読んだ処理を小さく並べておこう。

 星名表示、自機の弾移動、敵,敵弾ブランクサーチ、敵4移動、敵1移動、敵2移動、敵3移動、敵5移動、敵落下、方向設定、敵弾発射、表示基地アドレス設定、ラウンドクリア、1面要塞移動、2面要塞移動、3面要塞移動、4面要塞移動、5面要塞移動、1〜4面の親玉スタート、1〜4面親玉セット、5面親玉セット、敵移動メイン、敵出現パターン、敵キャラデータ、要塞表示、自機移動、自機の弾発射、敵1〜5表示、敵表示メイン、敵スタート メイン、敵スタート分岐 (敵スタート メイン)、敵1,2スタート、敵3,4スタート、敵5スタート、1面2面要塞色変更、3面4面5面要塞色変更、判定、敵弾と自機判定、自機と敵、基地撃破マーク表示(MTR)、基地撃破マーククリア(CLM)、自機の弾と基地判定、基地キャラデータ、基地座標、基地座標設定、初期設定3、1面要塞攻撃、乱数(BOSS2攻撃)、BGMデータ、敵弾移動

 これより前に読んでいた部分を含めても、8割位は読んだだろうか?

 まだ一部わからない部分もあるが、ここからmkII版への実装をぼちぼちと行う事にする。


Making「SBFZ」 その2