上に戻る
6.nesasmでプログラム改造 後編
概要
 ロックマン2のフラッシュマンから手に入る武器を作り、それについて、大体の方針を解説します。実用編とでも言ったところでしょうか。あくまで私がこういう風にアセンブラを使うといいのではないか、という提案に過ぎません。私自身使いこなしているわけではないので、慣れたら私よりずっと良い使い方が可能になるでしょう。
まずコード
 今回は最初から完成品です。ここの[6-10]からお持ち下さい
 アセンブルするとこれまでの改造に加え、フラッシュマンの武器が改造されています。色々見て行きましょう。
ソースのフォルダ分け
 前のページでは、一つのフォルダにまとめて入れておくとトラブルを起こしづらいと書いたのですが、ソースファイルが増えてくると管理しづらいので、メインのソースファイルを除くソースファイルは、フォルダに入れておくと良いです。
コメント:
ここで言うメインのソースとは、nesasmに引数として渡すasmファイルのことです。
メインのソースの位置にnesが作られるため、メインのソースのみ外側に置いておくようにするのが私の好みです。
バッチを少し使いこなせば、全部のasmをフォルダに入れてアセンブル後、nesだけ外に引っ張りだすなんてことも可能です。
 この際に、include時に指定するファイル名に、フォルダ名を付加しなければならなくなる点に注意が必要です。そして、重要な点ですが、この指定時のファイルパスは、バッチファイルのあるフォルダからの相対パス指定することです。
コメント:
例えば、srcフォルダの中のasmから、その隣に置いてあるasmをincludeする場合でも、include "src/(ソース名).asm"と書かなければなりません。
バッチファイルのフォルダといいましたが、正確には、カレントディレクトリからの相対パスで指定することになるようです。
尚、includeするパスは、環境変数を弄れば増やせるようです。興味がある方はUsage.txtを御覧ください。私は興味が無いので見ません。
src/mylib.asm
 マクロを多くまとめたファイルです。私は、マクロは大抵全部大文字で書くようにしています。なので、他のソースに全部大文字のものが現れたら、ここから探すといいかもしれません。各種処理に便利なように、色々と定義しています。が、このファイルはこれまでに私が使ってきたマクロ群から妥当なものを選び、突貫でまとめ直したのでどっかしら間違っているかもしれません。マクロは使ってみるまで間違いに気づきません。
 ともあれ、このように良く使うマクロを集めて作っておくと、その後の製作に活かせるかもしれません。といいながら、私は、今回、初めてまとめたのですが……
src/misc.asm
 これまでのいろいろな改造をこのファイルに押し込んでしまいました。これでメインのasmファイルがかなりすっきりしました。こうやってファイルごとに整理できるのが大事です。改造の規模を大きくしても、破綻しづらくなります。
コメント:
しかし、個人的には、分ければ分けるほどわかりやすくなるとは思いません。このmisc.asmの様に、「その他」的なファイルを作っておいて、その中で肥大するようなら分割する、というやり方が好みです。
src/label.asm
 変数とルーチンを、ごく一部ですがラベルとして定義しています。解析しながら分かったものを少しずつ書き足していくと良いでしょう。
src/pool_1F.asm
 ROM後方の空き容量をここで管理します。今回のプログラムでは、一つのファイルをincludeしているだけですが、容量が続く限り色々なデータをここに追加可能です。
コメント:
ちなみにプールというのは、空き容量を集め、あとで再分配して利用する……といった意味で利用しているのですが、それをプールというのはあまり適切な言葉の選択ではありません。しかし、私が慣習として使い続けてきてしまったのでこうなっています。癖を直すのは難しいです。
 今回は空き容量としてROM後方の物を利用しましたが、各バンクの後ろの方はしばしば未使用領域がありがちなので、そういったものをうまく管理して利用するようにすると、さらに色々なコードを追加できるでしょう。
コメント:
今回利用した部分は、常時割り当てられているROMの部分を利用しているので、何処からでも利用できます。こういう部分の空き領域はとても貴重なので、極力無駄遣いしないほうが良いです。処理を呼び出したいバンクの後方の空き領域などを先に使い、そういった物が無かったり使い果たしたりしてしまったら、常時割り当てられている部分を使うと良いでしょう。
Wep_Flashから始まる3つのファイル
 これらが今回のテーマのフラッシュマンの武器の改造のメインです。うまくやれば一つのファイルに収めることも可能なのですが、とりあえずこうなっています。具体的にソースコードを一箇所ずつ解説したりはしませんが、大体の方針を説明します。
 Wep_Flash.asmで大体の武器の設定を行います。BANKORG_Dとdbを利用し、いろいろな場所のデータをちょこちょこと書き換えます。書き換えるデータはそれなりに多岐にわたっており、アニメーション・スプライト定義や、処理アドレスの指定を含みます。処理アドレスの指定、とは以下のとおりです。

    BANKORG_D $1EDCB5+6
    db LOW (Wep_Flash_Fire)
    BANKORG_D $1EDCC1+6
    db HIGH(Wep_Flash_Fire)
 ここでは、武器を射出するときの処理アドレスを指定しています。LOWHIGHディレクティブを用い、Wep_Flash_Fireのアドレスの上位下位を取り出し、dbで書き出しています。
コメント:
正しくWep_Flash_Fireのアドレスの上位3ビットが指定されていないと、この辺りを読みだした処理の後でこけます。
 同様にして、いくつかのルーチンのアドレスを指定しています。そして、Wep_Flash_Fire等の実体は、Wep_Flash_p1F.asmにあります。
 Wep_Flash_p1F.asmは、今言ったとおり各種処理の実体があり、pool_1F.asmにおいてincludeされます。よって、ROMの後方の空き容量にアセンブルされる事になります。具体的にそのプログラムの内容には触れませんが、このような手法で、処理アドレスを空き容量の場所に「向け」、その場所にコードをガリガリと書いていけば相当好き放題に処理を書き足すことが可能です。ここまで都合良くいくソフトばかりとは限らないのですが……
 ちなみに、Wep_Flash_Dmg.asmは、雑魚に対するダメージのテーブルです。元々「フラッシュストッパー」という武器は特殊な効果で、雑魚・ボスに対してダメージのテーブルを持っていないため、自作して利用する事になります。この際、雑魚のテーブルを作るコードは長くなって見通しが悪いので別のファイルに切り出してあります。
もう一つの実践例
 Rockman 2 XWという改造をご存知でしょうか知らないでしょうね。私が以前作ったロックマン2の武器だけの改造です。その改造にはソースファイルが付属しているので、もしよろしければそちらも参照してみてはいかがでしょうか。私の今の方針ともまた違うやり方で作られていますが、アセンブラを改造に使った時のソースなんてあまりないとおもいますので、サンプルのコードは多いほどいいでしょう、たぶん。
 なお今回作ったフラッシュマンの武器の改造は、XWのソースを大きく流用して作っています。こういうことがやりやすいのもアセンブラを使う利点です。
オチ
 結局のところ、実際にアセンブルしながら体得するのが一番の近道だと思います。私のコードをアセンブルが出来たなら、今回のコードやXWのソースを改変して練習するのが良いと思います。
 もしアセンブル自体が上手く行かないようなら、出力されたout.txtをみて解決を試みるといいでしょう。nesが出力されるけど上手く動かないようなら、出力されたnesバイナリを覗きこむなりして問題を解決していきましょう。1回目でうまくいくことなんてそうそうありません。慣れです。Usage.txtを覗きこんでも面白い機能が見つかるかもしれません。list機能なんかはデバッグに大助かりでしょう。
 私はnesの改造全般に通じているわけではないので事情はわからないのですが、こういう風に改造にアセンブラを使った改造のasmソースファイルは、それほどサンプルとして存在していないと思うので、一つの改造スタイルとして参考になれば、と思います。(……ありふれたものだったらどうしようか(汗))
(247)2013年5月25日 プレさ兵衛
inserted by FC2 system