3.2. 詳解 BRK 命令

3.2.1. オペランドのバイトサイズ表
3.2.2. BRK 命令ハンドラー概要
3.2.3. 命令実行の詳細
3.2.3.1. オペランド #$02, #$03: レジスター各種の保存または復帰
3.2.3.2. オペランド #$0B, ..., #$0D: フラグ制御
3.2.3.3. オペランド #$0E, ..., #$19: 音響制御
3.2.3.4. オペランド #$80, ..., #$93: オブジェクトのフィールドにアクセス
3.2.3.5. オペランド #$94: アイテムの特性を参照
3.2.3.6. オペランド #$95, #$96: ウィンドウ処理
3.2.3.7. オペランド #$97, ..., #$9D: 移動時メッセージ処理
3.2.3.8. オペランド #$9E, ..., #$A0: 戦闘時メッセージ処理
3.2.3.9. オペランド #$A1, ..., #$A3: 戦闘時メッセージ処理
3.2.3.10. オペランド #$A4, ..., #$A6: 戦闘時メッセージ処理
3.2.3.11. オペランド #$A7, ..., #$A9: 戦闘時メッセージ処理

汎用の 65816 逆アセンブラーで ROM イメージを逆アセンブルしてコードを解析すると、 各 BRK 命令は 1 バイトのオペランドを伴うコードとして出力される。 ところがこれをそのまま SFC 版ドラクエ 5 に適用することは具合が悪いのだ。 このプログラムは BRK 命令を独自の規則でカスタマイズしており、 65816 CPU が規定するオペランドの値によって、さらに余分なオペランドを取るというものだ。 よって、ゲームプログラムの解析者が最初に行うべきことは、 この BRK 命令の普通のオペランドと付加オペランドのバイト数との間の対応を知り、 それに基づいたカスタマイズ版 65816 逆アセンブラーを実装することだと思われる。 さもなければ、解析作業者は BRK 命令を含むテキストを手作業で修正することになるし、 そもそもどのように修正すればよいのか判断できないはずだ。 現に記者は SFC 版ドラクエ 5 特化版逆アセンブラーを実装するハメになった。

本節では SFC 版ドラクエ 5 のコードにおける BRK 命令の詳細について見ていく。 各 BRK オペランドに対応する付加オペランドのバイト数の表、 BRK 命令のハンドラーコードの振る舞いの要約、 そして各 BRK 呼び出しの意味をオペランド別に解説していくつもりだ。

3.2.1. オペランドのバイトサイズ表

BRK 命令の正規のオペランドと、実際にオペランドを構成するバイト長との対応表を次に示す。 この情報がなければ、専用逆アセンブラーを実装することはできない。 ここで列「オペランド」は BRK 命令の正規のオペランドの値を、 列「サイズ」は正規のオペランドを含んだ、実際にオペランドを構成するバイトのサイズを、 列「命令の意味」はその BRK 命令のプログラム上の意味をそれぞれ示す。

表 3.2 BRK オペランドのバイトサイズ表

オペランド サイズ 命令の意味
#$00 1 単に RTI する
#$01 1 調査中または不明
#$02 1 レジスター各種状態を保存または復帰
#$03
#$04 3 調査中または不明
#$05 4 (未使用)
#$06 1 調査中または不明
#$07 2 (未使用)
#$08 1 調査中または不明
#$09 2 調査中または不明
#$0A 3 構造体オブジェクトのフィールドにアクセス(未使用)
#$0B 3 フラグ制御
#$0C
#$0D
#$0E 1 調査中または不明
#$0F 2 音響制御
#$10
#$11
#$12
#$13
#$14
#$15
#$16
#$17
#$18
#$19
#$1A 1 調査中または不明
#$80 1 構造体オブジェクトのフィールドにアクセス
#$81 2
#$82 1
#$83 2
#$84 1
#$85 2
#$86 1
#$87 2
#$88 2
#$89 3
#$8A 2
#$8B 3
#$8C 2
#$8D 3
#$8E 2
#$8F 3
#$90 3
#$91 4
#$92 4
#$93 5
#$94 2 アイテムの特性を参照
#$95 2 ウィンドウ処理?
#$96 2
#$97 2 ID が [#$0000, #$0100) にある移動中メッセージを出力
#$98 ID が [#$0100, #$0200) にある移動中メッセージを出力
#$99 ID が [#$0200, #$0300) にある移動中メッセージを出力
#$9A ID が [#$0300, #$0400) にある移動中メッセージを出力
#$9B ID が [#$0400, #$0500) にある移動中メッセージを出力
#$9C ID が [#$0500, #$0600) にある移動中メッセージを出力
#$9D ID が [#$0600, #$0700) にある移動中メッセージを出力
#$9E 2 ID が [#$0000, #$0100) にある戦闘中メッセージを出力
#$9F ID が [#$0100, #$0200) にある戦闘中メッセージを出力
#$A0 ID が [#$0200, #$0300) にある戦闘中メッセージを出力
#$A1 2 ID が [#$0000, #$0100) にある戦闘中メッセージを出力
#$A2 ID が [#$0100, #$0200) にある戦闘中メッセージを出力
#$A3 ID が [#$0200, #$0300) にある戦闘中メッセージを出力
#$A4 2 ID が [#$0000, #$0100) にある戦闘中メッセージを出力
#$A5 ID が [#$0100, #$0200) にある戦闘中メッセージを出力
#$A6 ID が [#$0200, #$0300) にある戦闘中メッセージを出力
#$A7 2 ID が [#$0000, #$0100) にある戦闘中メッセージを出力
#$A8 ID が [#$0100, #$0200) にある戦闘中メッセージを出力
#$A9 ID が [#$0200, #$0300) にある戦闘中メッセージを出力
#$AA 1 調査中または不明
#$AB 2 調査中または不明
#$AC 2 調査中または不明
#$AD 1 単に RTI する
#$FF 1 単に RTI する

3.2.2. BRK 命令ハンドラー概要

TODO: BRK 命令ハンドラー $008F80 の要約。

ここから BRK 命令が「余分なオペランド」を有するものについては、 それらの 1 番目、2 番目……を arg1, arg2 のように呼ぶ。 また、A レジスターの上位バイトと下位バイトを AH, AL とそれぞれ呼ぶ(インデックスレジスターについても同様)。

3.2.3. 命令実行の詳細

本節では各正規オペランドについて、命令実行の意味なり挙動なりを解説する。

3.2.3.1. オペランド #$02, #$03: レジスター各種の保存または復帰

これらの命令実行の意図はゲームの内容とは関係がないので、興味のない読者は本節を飛ばして結構だ。

BRK #$02BRK #$03 は常に対で用いる。 これは BRK 命令の全オペランドに対して共通するコードを流用することで、 プログラマーがレジスター各種をスタックに保存するコードや、 スタックからレジスターに復帰するコードを書くのを省力化することができ、 さらにこれらの処理を表現するのに必要な ROM を数バイト節約できる。 前者の命令実行が状態を保存し、後者はその状態に復帰するものだ。 実際の例を借りて説明したい。

BRK #$02
JSR $8062
BRK #$03
RTL

このように両 BRK 命令をサンドイッチのように用いる必要がある。 今はたまたま JSR $8062 しかないが、 一般には具の部分に任意のコードがあってよい。 もっともサンドイッチの外に飛び出すような激しい分岐命令やジャンプ命令はないようにする。 そして上記コードは次の非実在コードと論理的に同値である(実際の実装のほうがやや丁寧に処理しているが)。

PHP
REP #$30
PHA
PHX
PHY
PHD
JSR $8062
PLB
PLD
PLY
PLX
PLA
PLP
...                 ; nv--dizc 各ビットを現在のそれで上書きする
RTL

3.2.3.2. オペランド #$0B, ..., #$0D: フラグ制御

オペランドが #$0B から #$0D の間の値である BRK 命令の実行は、 アドレス $7E2190 からビット単位で直列配置されたフラグを管理する。 どの命令も「余分なオペランド」を二個取る。 arg1 はビットマスクを、 arg2 は対象フラグを含むバイトのアドレスの $7E2190 からのオフセット値をそれぞれ表現する。 ビット演算は BRK 命令の本来のオペランドによって固定されている。それを次の表に示す。

表 3.3 BRK #$0B-0D によるフラグ制御

オペランド フラグ制御
#$0B フラグの ON/OFF をテストする
#$0C フラグを ON にする
#$0D フラグを OFF にする

BRK 命令によるフラグ制御の実例を以下にいくつか挙げる。 フラグのテストは zero レジスターの状態で判定するので、たいてい BEQ または BNE 命令を伴う。 このコードから $7E21B3 のビット #$08 が主人公の妻を表すフラグであることが判明する。

02/F6D0:    009C        BRK #$9C            ; #$0556: [1003]ルドマン「わっはっは。[1000]やあ ゆかい ゆかい!
02/F6D2:    56
02/F6D3:    009C        BRK #$9C            ; #$056B: [1003]ルドマン「魔界の王を たおし[1000]世界に 平和を とりもどして[1000]くれるとはな。
02/F6D5:    6B
02/F6D6:    000B        BRK #$0B            ; test_bits $7E21B3 #$08: 妻がビアンカか
02/F6D8:    0823
02/F6DA:    D005        BNE $F6E1
02/F6DC:    009C        BRK #$9C            ; #$056D: [1003]ルドマン「さすが [1012]![1000]わしが フローラのムコと[1000]認めただけのことは あるわい。
02/F6DE:    6D
02/F6DF:    8003        BRA $F6E4
02/F6E1:    009C        BRK #$9C            ; #$056C: [1003]ルドマン「さすが [1012]と[1000]その子供たちじゃ。
02/F6E3:    6C

フラグを立てる処理を引用する。 物理的にはアドレス $7E21D2 にある 1 バイト値のビット #$10 を 1 にする。

06/B8D8:    009B        BRK #$9B            ; #$04FD: [1003]コリンズ「大切に つかえよ。
06/B8DA:    FD
06/B8DB:    000C        BRK #$0C            ; set_bits $7E21D2 #$10: コリンズからかぜのぼうしを入手した
06/B8DD:    1042
06/B8DF:    60          RTS

最後にフラグを立っていない状態にする処理も挙げておく。 これはビットマスク arg1 をそのまま AND することで実現することに注意を要する。 後続のシリーズのような対象となるビットの EOR ではない。

12/F185:    000D        BRK #$0D            ; mask_bits $7E21D4 #$7F: てんくうのかぶとを入手した
12/F187:    7F44
12/F189:    0097        BRK #$97            ; #$0013: [1006]
12/F18B:    13
12/F18C:    009B        BRK #$9B            ; #$0450: [1006][1016]は ふと 気が ついた。[1002][1006]なんと 持ち物が いっぱいだった![...]
12/F18E:    50

上のコードはテルパドールでてんくうのかぶとを息子にかぶせるイベントの例外的な処理だ。 この場合は諸般の事情で先に当該フラグを立ててしまったので、このようなキャンセルを実装している。 言い忘れたが BRK #$97BRK #$9B についてはこの後 3.2.3.7 オペランド #$97, ..., #$9D: 移動時メッセージ処理 で述べる。

3.2.3.3. オペランド #$0E, ..., #$19: 音響制御

オペランドが #$0E から #$19 の間の値である BRK 命令の実行は、 それぞれが何らかの音響制御を担当する。$24FF83 系処理。 音響制御 BRK 命令は「余分なオペランド」を一個または二個有しており、基本的には arg1 がサウンド ID だと思ってよい。 この値と実際に鳴る音楽または効果音との対応表を次に示す。

表 3.4 BRK #$0E-19 による arg1 と楽曲・効果音との対応表

arg1 楽曲または効果音
#$00 無音
#$01 王宮のトランペット
#$02 地平の彼方へ
#$03 空飛ぶじゅうたん
#$04 大海原へ
#$05 街角のメロディ
#$06 街は生きている
#$07 カジノ都市
#$08 淋しい村
#$09 洞窟に魔の影が
#$0A 死の塔
#$0B 高貴なるレクイエム
#$0C
#$0D 天空城
#$0E 暗黒の世界
#$0F 結婚ワルツ
#$10 間奏曲
#$11 愛の旋律
#$12 哀愁物語
#$13 さびれた村
#$14 はめつの予感
#$15 序曲のマーチ
#$16 不死身の敵に挑む
#$17 戦火を交えて
#$18 大魔王
#$19 スライムレースファンファーレ
#$1A スライム・レース
#$1B スライムレースはずれ
#$1C 仲間
#$1D 宿屋
#$1E 教会:治療
#$1F 勝利
#$20 教会:おいのり
#$21 レベル・アップ
#$22 重要品入手
#$23 呪いのモチーフ
#$24 何か見つけた
#$25 カジノ大当たり
#$26 カジノ中当たり
#$27 カジノ小当たり
#$28
#$29 はるかぜのフルート
#$2A はるかぜのフルート(長尺)
#$2B ようせいのホルン
#$2C ようせいのホルン(長尺)
#$2D 悪のモチーフ
#$2E 階段等を発見する音
#$2F バロンのつのぶえ(?)
#$30 ゴールドオーブ落下
#$31 マグマのつえ
#$32 台詞音
#$33 ピッ
#$34 バリア音
#$35 宝箱を開く音
#$36 回復音
#$37 逃走音
#$38 派手な打撃音
#$39 ボーッ
#$3A マホカンタ音
#$3B 短い効果音
#$3C
#$3D チャージ音
#$3E 地下室に妖精の村への階段が出現する音
#$3F 稲妻
#$40
#$41
#$42 赤ん坊
#$43 波の音
#$44 ワープ音
#$45 てんくうのベル音
#$46 ほうきで掃くような音

実例をいくつか次に挙げる。 BRK #$0F でサウンド #$23 すなわち呪いの効果音を演奏させる。 BRK #$98 については 3.2.3.7 オペランド #$97, ..., #$9D: 移動時メッセージ処理 で述べる。

25/8211:    000F        BRK #$0F            ; sound #$23: 呪いのモチーフ
25/8213:    23
25/8214:    0098        BRK #$98            ; #$01D0: [1006]まことに ざんねんですが[1000]ぼうけんのしょ[1004]は[1000]消えてしまいました。
25/8216:    D0

BRK #$12 はてんくうのベル専用の命令のようだ。連続実行することで雰囲気を出す。

00/CA33:    0012        BRK #$12            ; sound #$44: てんくうのベル音
00/CA35:    44
00/CA36:    0012        BRK #$12            ; sound #$44: てんくうのベル音
00/CA38:    44

これはゲーム序盤のパパス同伴戦闘終了時のやりとりだ。 BRK #$16 でサウンド #$36 すなわち HP 回復の効果音を演奏させる。

06/CF32:    0098        BRK #$98            ; message #$01E3: [1003]パパス「大丈夫か? [1012]。
06/CF34:    E3
06/CF35:    0098        BRK #$98            ; message #$01E6: [1006]パパスは ホイミを となえた![1000][1012]の キズが かいふくした!
06/CF37:    E6
06/CF38:    0016        BRK #$16            ; sound #$36 #$00: 回復音
06/CF3A:    3600
06/CF3C:    0098        BRK #$98            ; message #$01E5: [1003]パパス「では いくとしよう!
06/CF3E:    E5

3.2.3.4. オペランド #$80, ..., #$93: オブジェクトのフィールドにアクセス

BRK 命令のオペランドが #$80 から #$93 の間の値であれば、 これはサブルーチン $218AFC のラッパーとして振る舞う。 詳しくは 3.3 汎用データアクセスサブルーチン(仮) で議論するが、あるオブジェクトの特定の性質へアクセスするというものだ。 オペランドの値と「余分なオペランド」の値によって構造体のフィールドとアクセス方法が一意に決まり、 対象となるオブジェクトの指定は別途指定する。

BRK 命令実行時のオペランド、「余分なオペランド」、レジスターの値によって、 どのオブジェクトのどのフィールドをどのように処理するのかが一意に決定する。 これを詳細に述べるために、静的なデータ構造を順を追って説明したい。

まず BRK 命令に関係するオペランド、「余分なオペランド」、レジスターの状況を表にまとめる。 この表は、各正規オペランドに対して、BRK 命令実行がサブルーチン $218AFC 呼び出しのために必要な $38 等の値をどの要素からコピーするのかを示している。

表 3.5 BRK #$88-93 によるサブルーチン $218AFC 呼び出しのための変数設定表

オペランド $38 $3F $42 $43 $44
#$80 XL #$00 AL n/a n/a
#$81 XL arg1 AL n/a n/a
#$82 XL #$00 AL AH n/a
#$83 XL arg1 AL AH n/a
#$84 XL #$00 n/a n/a n/a
#$85 XL arg1 n/a n/a n/a
#$86 AL #$00 n/a n/a n/a
#$87 AL arg1 n/a n/a n/a
#$88 arg1 #$00 n/a n/a n/a
#$89 arg2 arg1 n/a n/a n/a
#$8A arg1 #$00 AL n/a n/a
#$8B arg2 arg1 AL n/a n/a
#$8C arg1 #$00 AL AH n/a
#$8D arg2 arg1 AL AH n/a
#$8E arg1 #$00 AL XL XH
#$8F arg2 arg1 AL XL XH
#$90 arg1 #$00 AL arg2 n/a
#$91 arg2 arg1 AL arg3 n/a
#$92 arg1 #$00 AL arg2 arg3
#$93 arg2 arg1 AL arg3 arg4

$38 等については 3.3.3.2 全機能に共通する呼び出し事前条件と事後条件 を参照。 また、一連のシステムについては 3.3 汎用データアクセスサブルーチン(仮) を参照して欲しい。

例えば $38#$0B ならば、 その BRK 命令は「指定の仲間キャラクターの MP をゼロにセットする」処理を実行する。 次の実例は、戦闘中にパルプンテを唱えた際のある事象のコードだ。 簡単に言うと、反復処理で BRK #$89 を実行することにより、戦闘中の仲間キャラクターの MP をゼロにするコードだ。 なお BRK #$A5 はメッセージ表示処理であり、これについては 3.2.3.10 オペランド #$A4, ..., #$A6: 戦闘時メッセージ処理 で述べる。

20/ECBE:    2026EF      JSR $EF26
20/ECC1:    ADF310      LDA $10F3
20/ECC4:    8542        STA $42
20/ECC6:    85F5        STA $F5
20/ECC8:    2033EF      JSR $EF33           ; 味方メンバーのある状態を確認
20/ECCB:    F00A        BEQ $ECD7
20/ECCD:    0089        BRK #$89            ; 仲間キャラクターの MP をゼロにセット
20/ECCF:    800B                            ; arg1, arg2 = #$80, #$0B
20/ECD1:    00A5        BRK #$A5            ; #$0117: [F7]の MPが なくなった![F2]
20/ECD3:    17
20/ECD4:    20D69D      JSR $9DD6
20/ECD7:    EEF310      INC $10F3
20/ECDA:    ADF310      LDA $10F3
20/ECDD:    CDF410      CMP $10F4
20/ECE0:    90DF        BCC $ECC1
20/ECE2:    60          RTS

3.2.3.5. オペランド #$94: アイテムの特性を参照

BRK 命令のオペランドが #$94 であれば、 この命令実行は指定したアイテムに関する何らかの性質を参照することを意味する。 正規のオペランドとは別に 1 バイトの「余分なオペランド」を呼び出し元から取り、どの特性を参照するのかを決定する。 次に余分なオペランドの値 arg1 と、対応する命令実行が参照する特性との対応表を示す (実際に参照するデータの列についてはアイテムのデータ構造については 3.15 アイテム解析 を参照)。

表 3.6 BRK #$94

arg1 実際に参照するデータ 参照する特性
#$00 $23B231,X & #$07 アイテムの種別
#$01 $23B669,X を含む複数配列 アイテムを装備できるか
#$02 $23B159,X & #$03 アイテムの値段
#$03 $23B4B9,X アイテムによるパラメーターの増加分
#$04 $23B159,X & #$20 アイテムを使うとなくなるものかどうか
#$05 $23B159,X & #$10 アイテムを捨てることができるかどうか
#$06 $23B159,X & #$08 アイテムを店屋で売れるかどうか
#$07 $23B159,X & #$04 不明または未使用
#$08 $23B159,X & #$80 移動中「つかう」コマンドの最初のメッセージを省略する
#$09 $23B159,X & #$40 移動中「つかう」コマンドで「だれに」の入力を求める
#$0A $23B231,X & #$80 戦闘中「つかう」コマンドで専用の処理があるかどうか
#$0B $23B231,X & #$20 戦闘中「つかう」の対象が敵側である
#$0C $23B231,X & #$08 アイテムが呪われているかどうか
#$0D $23B231,X & #$40 戦闘中「つかう」の対象を選択する
#$0E $23B231,X & #$10 戦闘中「つかう」の対象が複数である
#$0F $23B3E1,X & #$3F 戦闘中「つかう」ときのメッセージ配列 $2781D0,X の添字
#$10 $23B3E1,X & #$80 インパスで種別を鑑定するかどうか
#$11 $23B3E1,X & #$40 インパスで装備可能な者を鑑定するかどうか
#$12 $23B309,X & #$80 インパスで消耗品かどうかを鑑定するかどうか
#$13 $23B309,X & #$40 インパスで売却できるかどうかを鑑定するかどうか
#$14 $23B309,X & #$3F インパスで「~のようだ」系の文言を述べるかどうか

実例として、ある BRK #$94 の呼び出しを次に示す。 「余分なオペランド」として #$06 を指定することによって、 アイテムが店屋で売れるかどうかを示すビットの値を carry ビットに得る。 なお BRK #$9B については 3.2.3.7 オペランド #$97, ..., #$9D: 移動時メッセージ処理 で述べる。

11/8463:    0094        BRK #$94            ; #$06: アイテム::鑑定::売却可フラグ
11/8465:    06
11/8466:    9005        BCC $846D
11/8468:    009B        BRK #$9B            ; message #$0460: [1006]店屋に 売ろうとしても これには[1000]ねだんは つけられないだろう。
11/846A:    60
11/846B:    800A        BRA $8477
11/846D:    AD530B      LDA $0B53           ; アイテム ID
11/8470:    225BDF06    JSR $06DF5B         ; アイテムの売値を計算
11/8474:    009B        BRK #$9B            ; message #$045F: [1006]もし 店屋に 売れば[1000][1004]ゴールドに なるだろう。
11/8476:    5F

3.2.3.6. オペランド #$95, #$96: ウィンドウ処理

BRK 命令のオペランドの値が #$95 または #$96 のいずれかであれば、 この命令はウィンドウ処理を実行する。大抵の場合は何らかのウィンドウ(群)を画面上に新たに描画する。 値 arg1 が表すのは基本的にはウィンドウ ID であり、 例外的に値 #$FF の場合には、メッセージウィンドウの終了を指示する命令を実行するようだ。

ウィンドウ処理全般については 3.8 ウィンドウ を参照。

3.2.3.7. オペランド #$97, ..., #$9D: 移動時メッセージ処理

BRK 命令のオペランドが #$97 から #$9D までのいずれかの値であれば、 この命令はサブルーチン $248157 による移動時のメッセージ表示処理を実行する。 画面下のウィンドウ内にテキストを描画したりする。 この命令はさらに 1 バイトの値を呼び出し元から参照し、これを表示するメッセージの ID の値の下位 1 のバイトとして扱う。 上位の 1 バイトは BRK 命令のオペランドによって決まる。 #$97 ならば上位バイトは #$00 となり、 #$98 ならば #$01 となり、以下同様となる。

実例として、ある BRK #$97 の呼び出しを次に示す。 参考までにメッセージテキストを逆アセンブリコードの右側にコメントしておく。

06/CE0D:    0097        BRK #$97            ; message #$00B6: よくぞもどられた![1000][1011]どの。
06/CE0F:    B6
06/CE10:    0097        BRK #$97            ; message #$00B7: おお 神よ![1000]この者[1005]に 尊き ご加護の[1000]あらんことを! アーメン!
06/CE12:    B7

移動中メッセージ処理については 3.6 移動モードメッセージ解析 を参照。

3.2.3.8. オペランド #$9E, ..., #$A0: 戦闘時メッセージ処理

BRK 命令のオペランドが #$9E から #$A7 までのいずれかの値であれば、 この命令はサブルーチン $2485E0 による戦闘時のメッセージ表示処理を実行する。 移動時メッセージ表示の BRK 命令実行と同様に、余分なオペランドを 1 バイト取り、 同様の規則でメッセージ ID の 2 バイト値を決定する。

実例として、ある BRK #$9E の呼び出しを次に示す。

25/89F5:    009E        BRK #$9E            ; message #$0000: 
25/89F7:    00
25/89F8:    009E        BRK #$9E            ; message #$00B6: しかし [EE][FA]は[FF]これいじょう ものを もてない。
25/89FA:    B6
25/89FB:    009E        BRK #$9E            ; message #$00B7: もちものを すてますか?
25/89FD:    B7

戦闘中メッセージ処理については 3.5 戦闘モードメッセージ解析 を参照。

3.2.3.9. オペランド #$A1, ..., #$A3: 戦闘時メッセージ処理

こちらも戦闘時メッセージ処理だが、サブルーチン $2485D4 を用いる。 実例として、ある BRK #$A1 の呼び出しを次に示す。

26/8452:    9005        BCC $8459
26/8454:    00A1        BRK #$A1            ; message #$0008: [F7]は こちらが みがまえるまえに[FF]おそいかかってきた!
26/8456:    08
26/8457:    8003        BRA $845C
26/8459:    00A1        BRK #$A1            ; message #$0009: [F7]は[FF]いきなり おそいかかってきた!
26/845B:    09

3.2.3.10. オペランド #$A4, ..., #$A6: 戦闘時メッセージ処理

こちらも戦闘時メッセージ処理だが、サブルーチン $2485D8 を用いる。 実例として、ある BRK #$A4 の呼び出しを次に示す。

20/F4D4:    ADF610      LDA $10F6
20/F4D7:    3005        BMI $F4DE
20/F4D9:    00A4        BRK #$A4            ; message #$0078: ひかりのかべが じゅもんを はねかえした!
20/F4DB:    78
20/F4DC:    8003        BRA $F4E1
20/F4DE:    00A4        BRK #$A4            ; message #$0077: じゅもんは ひかりのかべに はじかれた!
20/F4E0:    77

3.2.3.11. オペランド #$A7, ..., #$A9: 戦闘時メッセージ処理

こちらも戦闘時メッセージ処理だが、サブルーチン $2485DC を用いる。 実例として、ある BRK #$A7BRK #$A8 の呼び出しを次に示す。

20/F59E:    CD1310      CMP $1013
20/F5A1:    F005        BEQ $F5A8
20/F5A3:    00A7        BRK #$A7            ; message #$00A1: [F7]を やっつけた!
20/F5A5:    A1
20/F5A6:    8003        BRA $F5AB
20/F5A8:    00A8        BRK #$A8            ; message #$0135: [F7]は まけてしまった!
20/F5AA:    35