突然ですが、友人から「変形や合体するユニットに関する質問と解析の依頼が来ているので代わりに解析して解説記事を書いて欲しい」という話がありましたので、今回はその内容を取り上げてみます。
まずは変形ユニットから。友人の資料の記述方式に従って解説します。MAP上でユニットの変形設定を制御しているのは以下のサブルーチン(A057~A099)です。
00A057 BD 65 18 LDA $1865,X ユニットID取得
00A05A 29 FF 01 AND #$01FF 絞り込み:最大値を01FFとする
00A05D 64 2A STZ $2A M=7E002Aをゼロにする
00A05F 85 2C STA $2C AをM=7E002Cに書き込み
00A061 85 2E STA $2E AをM=7E002Eに書き込み
00A063 A0 07 00 LDY #$0007 ユニット定義の7番目(=変形設定)を取得
00A066 22 72 B3 80 JSL $80B372 $00B372 サブルーチン00B372を呼び出し
00A06A E2 20 SEP #$20 8bit化
00A06C 29 7F AND #$7F 絞り込み:最大値を7Fとする
00A06E F0 26 BEQ $26 $00A096 YESならばジャンプ
00A070 C9 08 CMP #$08 変形パターンチェック:08?
00A072 F0 26 BEQ $26 $00A09A YESならばジャンプ
00A074 C9 09 CMP #$09 変形パターンチェック:09?
00A076 F0 28 BEQ $28 $00A0A0 YESならばジャンプ
00A078 C9 28 CMP #$28 変形パターンチェック:28?
00A07A F0 1E BEQ $1E $00A09A YESならばジャンプ
00A07C C9 29 CMP #$29 変形パターンチェック:29?
00A07E F0 20 BEQ $20 $00A0A0 YESならばジャンプ
00A080 C9 30 CMP #$30 変形パターンチェック:30?
00A082 F0 16 BEQ $16 $00A09A YESならばジャンプ
00A084 C9 31 CMP #$31 変形パターンチェック:31?
00A086 F0 18 BEQ $18 $00A0A0 YESならばジャンプ
00A088 29 78 AND #$78 絞り込み:最大値を78とする
00A08A C9 18 CMP #$18 変形パターンチェック:18?
00A08C F0 21 BEQ $21 $00A0AF YESならばジャンプ
00A08E C9 20 CMP #$20 変形パターンチェック:20?
00A090 F0 1B BEQ $1B $00A0AD YESならばジャンプ
00A092 C9 38 CMP #$38 変形パターンチェック:38?
00A094 F0 15 BEQ $15 $00A0AB YESならばジャンプ
00A096 C2 20 REP #$20 16bit化
00A098 38 SEC Cフラグをセット
00A099 6B RTL サブルーチンの終了
次に、複数の機体による合体・分離ユニット。MAP上でユニットの変形設定を制御しているのは以下のサブルーチン(A223~A05F)です。
00A223 BD 65 18 LDA $1865,X ユニットID取得
00A226 29 FF 01 AND #$01FF 絞り込み:最大値を01FFとする
00A229 64 2A STZ $2A M=7E002Aをゼロにする
00A22B 85 2C STA $2C AをM=7E002Cに書き込み
00A22D 85 2E STA $2E AをM=7E002Eに書き込み
00A22F A0 07 00 LDY #$0007 ユニット定義の7番目(=変形設定)を取得
00A232 22 72 B3 80 JSL $80B372 $00B372 サブルーチン00B372を呼び出し
00A236 E2 20 SEP #$20 8bit化
00A238 29 7F AND #$7F 絞り込み:最大値を7Fとする
00A23A C9 10 CMP #$10 変形パターンチェック:10?
00A23C F0 22 BEQ $22 $00A260 YESならばジャンプ
00A23E C9 5A CMP #$5A 変形パターンチェック:5A?
00A240 F0 29 BEQ $29 $00A26B YESならばジャンプ
00A242 C9 2D CMP #$2D 変形パターンチェック:2D?
00A244 F0 25 BEQ $25 $00A26B YESならばジャンプ
00A246 C9 2E CMP #$2E 変形パターンチェック:2E?
00A248 F0 21 BEQ $21 $00A26B YESならばジャンプ
00A24A C9 2F CMP #$2F 変形パターンチェック:2F?
00A24C F0 1D BEQ $1D $00A26B YESならばジャンプ
00A24E C9 34 CMP #$34 変形パターンチェック:34?
00A250 F0 2A BEQ $2A $00A27C YESならばジャンプ
00A252 29 78 AND #$78 絞り込み:最大値を78とする
00A254 C9 40 CMP #$40 変形パターンチェック:40?
00A256 F0 33 BEQ $33 $00A28B YESならばジャンプ
00A258 C9 50 CMP #$50 変形パターンチェック:50?
00A25A F0 3E BEQ $3E $00A29A YESならばジャンプ
00A25C C2 20 REP #$20 16bit化
00A25E 38 SEC Cフラグをセット
00A25F 6B RTL サブルーチンの終了
質問と依頼の主旨は「特定の機体をMAP上で変形や合体禁止にできるようにして欲しい」という事らしいので、これらのサブルーチンにアクセスするサブルーチンの呼び出し先(つまり「22 57 A0 80」や「22 23 A2 80」)の指定アドレスを書き換えて「機体IDを取得する追加サブルーチン」を記述した空き領域に移動、そこで機体IDの結果それぞれのアドレスにジャンプなりサブルーチンを呼び出す命令なりを作ればいいわけです。この解説でサブルーチンの組み立ては理解できたと思うのですが、分からないと色々と申し訳ないので以下にサンプルを記述します。
例.1)変形制限ユニットの設定。
前提として01FF00以下の空き領域に機体ID取得サブルーチンを組み立てるものとする。
「00CFEB~00CFE」と「039563~039566」の「22 57 A0 80」を「22 00 FF 81」に変更し、01FF00以下に追加サブルーチンを記述。今回は「Zガンダム(0112)」と「ウェイブライダー(0113)」がMAP上で変形できないように設定。記述内容は以下の通り。
01FF00 BD 65 18 LDA $1865,X ユニットID取得
01FF03 29 FF 01 AND #$01FF 絞り込み:最大値を01FFとする
01FF06 C9 12 01 CMP #$0112 ユニットIDチェック:Zガンダム(0112)?
01FF09 F0 09 BEQ $09 $01FF14 YESならばジャンプ
01FF0B C9 13 01 CMP #$0113 ユニットIDチェック:ウェイブライダー(0113)?
01FF0E F0 04 BEQ $04 $01FF14 YESならばジャンプ
01FF10 5C 5D A0 80 JML $80A05D $00A05D(サブルーチンの続き)にジャンプ
01FF14 C2 20 REP #$20 16bit化
01FF16 38 SEC Cフラグをクリア
01FF17 6B RTL サブルーチンの終了
以上のような処理で、変形させたくない(「変形」コマンドを表示させない)機体があれば同じようにIDを記述していけばいいという方式です。
例.2)分離制限ユニットの設定。
前提として01FF80以下の空き領域に機体ID取得サブルーチンを組み立てるものとする。
「00D06D~00D070」と「02A4AE~02A4B1」と「03957B~03957E」の「22 23 A2 80」を「22 80 FF 81」に変更し、01FF80以下に追加サブルーチンを記述。今回は「コンバトラーV(0030)」と「ザンボット3(003E)」と「ダンクーガ(0043)」がMAP上で変形できないように設定。記述内容は以下の通り。
01FF80 BD 65 18 LDA $1865,X ユニットID取得
01FF83 29 FF 01 AND #$01FF 絞り込み:最大値を01FFとする
01FF86 C9 32 00 CMP #$0032 ユニットIDチェック:コンバトラーV(0032)?
01FF89 F0 0E BEQ $0E $01FF99 YESならばジャンプ
01FF8B C9 3E 00 CMP #$003E ユニットIDチェック:ザンボット3(003E)?
01FF8E F0 09 BEQ $09 $01FF99 YESならばジャンプ
01FF90 C9 43 00 CMP #$0043 ユニットIDチェック:ダンクーガ(0043)?
01FF93 F0 04 BEQ $04 $01FF99 YESならばジャンプ
01FF95 5C 29 A2 80 JML $80A229 $00A229(サブルーチンの続き)にジャンプ
01FF99 C2 20 REP #$20 16bit化
01FF9B 38 SEC Cフラグをセット
01FF9C 6B RTL サブルーチンの終了
以上のような処理で、分離させたくない(「分離」コマンドを表示させない)機体があれば同じようにIDを記述していけばいいという方式です。
今回は割愛しましたが、これに更なる分岐条件としてイベントフラグの判定を組み込めば、ダンクーガのように特定のイベントフラグ成立後に分離や変形が可能になったり、逆に分離や変形を不能にする事も可能なので、需要と機会があればその辺りの解説もしたいところです。
これらを参考に解析の腕を磨き、依頼者の方にはいつか必ず面白いハックロムを公開していただけると私としてもありがたい限りです。
コメント
コメントを投稿