Making「SBFZ」その3

Home PC-6001mkII Program etc

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

Making「SBFZ」 Top


2010/09/20:ボスその1
 道中がそこそこ出来たら、やはり次はボスだろう。というわけで、ボスの表示に移る。

 とりあえず原作のボス関連部分でまだ調べてなかった部分を解析していく...なんか自機ショットとボスの当り判定を2回行っているように見える。なんでわざわざ?

 2つの辺り判定処理を読み比べてみる。1つ目はボスによって多少値が異なるが、2つ目はあまり条件がないようだ。あと、1つ目ではCE12Hを1減らしている。もしかして、1つ目がボスにダメージのある判定で、2つ目がボスにダメージのない判定では?

 ...とすると、CE12Hの値はボスの耐久力か。他でCE12Hを使っている部分を見ても特に違和感はなさそうだったので、耐久力という事にしておこう。

 ボス移動ルーチンらしきものも2つある...。内容は余り変わらないけど両方ともどこかしらで使っている模様。大きな違いは移動速度の調整があるか否か、という事は速度調整のないほうが5面専用のものか、多分。

 といった過程を経て、ボスの表示と移動部分をmkII側に追加する。さあどうだ?

画像

 やっぱり1面ボスだけでもグラフィックデータを作成しよう。...さあどうだ?

画像

 上から降りてくるはずの1面ボスが、左上から斜めに降りてくる。これはこれで面白いけど、まあでも直さなきゃ。

 キャラクタ描画では処理時間短縮のために1行単位のスキップ判定を加えていたのだが、この処理が間違っていたらしい。もう一つ、X,Y座標をアドレスに変換するルーチンでY座標がマイナスの場合を考えてなかったので修正する。

画像

 ようやくまともに表示するようになった。

2010/09/25:背景
 さて、一旦ボスから離れて背景に移ろう。

 2面から5面までの背景をまだ作ってなかったので、背景グラフィックの移植を行う。MZ-700版のバイナリデータとキャラクタコード表、mkIIのカラーコード表を見ながら、SemiEditでちまちまと描画していく。

画像

 2面や3面は同じキャラクタが続いた部分が多いので割と楽だったが、4面はなかなかホネが折れた。

画像

 途中休憩を入れつつ、ようやく背景グラフィックを描きあげた。
 このセーブデータから40x15の部分を2箇所切り取って結合すると、SBFZの背景データになる。

2010/10/22〜24:ボスその2
 HSPプログラムの作成やらなんやらがあって、何も進まないまま4週間が過ぎようとしていた。やばい、そろそろ何かしなきゃ、というわけで、原作のマシン語解析を進める。

 ...9000-966F辺りがなんとも謎エリアだ。なんとなくだけど、BGMの処理なのではないか?とすると、ここは全面的に作り直す事になるのでまあいいか、解析しなくても。

 解析も少し飽きてきたので、2面から4面の基地のグラフィックを描く。あわせて、ボスの攻撃ルーチンを追加し、2面以降のボスのダミーグラフィックを作成する。

画像

 ボスの見た目は置いておいて、とりあえず4面ボスまではボスの攻撃もうまく行っているようだ。ただボスをやっつけるとそこで止まってしまう。この部分はまた後日だな。


2010/10/25:比較
 今更ながらではあるが、MZ-700エミュレータで原作を実行してみる。

 MZ700WIN For Win32とMZ-NEW MONITORなるものをダウンロードしセットアップ後実行してみる。...「** MZ700WIN **」とだけ出たが、なにをどうするかわからない。

 メニューを調べていくと、Monitor ROMの選択が出来るようだ。「MZ-700(J) / MZ-700 NEW-MONITOR」を選ぶと、プロンプトらしきものが出てきた。え〜と、SBFZのイメージを開いて「L」で実行すれば良いのかな?
 拡張子は良くわからないので「.MZT」にしてファイルオープn...エミュが突然終了した。もう一つの拡張子「.M12」でもダメっぽい。

 MZ700WINのページにMZ-700用プログラムもあったので「Eugea」をダウンロードして実行。これは出来るな。操作は間違っていないらしい。

 仕方がないので、強引な手段に出る。バイナリエディタで「Eugea」のヘッダ部分256バイトを持ってきて「SBFZ」のヘッダと思わしき部分と差し替える。その後、FAQの文章を参考にアドレスやサイズを書き換える。

画像

 ...まあ、なんとかなるものだ。

 せっかくなので、まだ途中だけど比較画面をば。

1面道中:mkII版

画像

1面道中:MZ-700版

画像

1面ボス:mkII版

画像

1面ボス:MZ-700版

画像

 多少色合いが違う部分があるが、おいおい直していく事にしよう。

2010/10/30〜31:BGMその1
 さて、いいかげんBGM処理に手をつけないと。

 ここは原作の処理がほぼ使えないので少々気が重い。ただ、昔にBGMっぽい処理を「QWERTY」で書いた(BASICだけど)ので、これを応用してみる事にする。

 PLAY文で音を鳴らした場合、音の終了フラグは3音それぞれ独立して検出できる(FD1BHのbit0〜2がチャンネルA〜Cに対応している)。この仕様を利用して、以下のようにPLAY文の終わりかけの時に次のPLAY文を実行するようにする。
  • チャンネルAは普通に音を鳴らす。
  • チャンネルBはチャンネルAよりも少し短い長さの休符を鳴らす。
  • チャンネルBの終了フラグを定期的に監視する。前回終了しておらず(1)、かつ今回終了した(0)場合に次のPLAY文を実行する。
 PLAY文をマシン語から実行するには、「"C","E","G"」といったPLAY文の文字列の開始アドレスをHLレジスタにセット後 CALL 01EB3H、とBernieさんに教えてもらった。よし、ちゃんと3重和音も鳴るぞ。

 次に、データフォーマットを考える。原作を見ると、どうやら同じ場所を繰り返す部分と初回のみ鳴らす部分があるようだ。これを考慮して、BGMのステータスを付加する。とりあえず、次に続く場合(01H)と前に戻る場合(00H)の2通りを用意する。
  • BGM01データ, 01H
  • BGM02データ, 01H
  • BGM03データ, 00H, BGM02データのポインタ
 これで、BGM01 → BGM02 → BGM03 → BGM02 → BGM03 → ... の流れにする算段だ。

 個々のBGMデータは長さを固定にしておく。こうすると、チャンネルBの長さも固定でいいので処理が楽になる。あとはこれをPLAY文の書式にしてPLAY実行、と。

 あ、チャンネルAとチャンネルBでテンポを合わせないといけないな。もう少し処理を考える必要がありそうだ。


その2 Making「SBFZ」 その4