#$02
, #$03
: レジスター各種の保存または復帰
#$0B
, ..., #$0D
: フラグ制御
#$0E
, ..., #$19
: 音響制御
#$80
, ..., #$93
: オブジェクトのフィールドにアクセス
#$94
: アイテムの特性を参照
#$95
, #$96
: ウィンドウ処理
#$97
, ..., #$9D
: 移動時メッセージ処理
#$9E
, ..., #$A0
: 戦闘時メッセージ処理
#$A1
, ..., #$A3
: 戦闘時メッセージ処理
#$A4
, ..., #$A6
: 戦闘時メッセージ処理
#$A7
, ..., #$A9
: 戦闘時メッセージ処理
汎用の 65816 逆アセンブラーで ROM イメージを逆アセンブルしてコードを解析すると、 各 BRK 命令は 1 バイトのオペランドを伴うコードとして出力される。 ところがこれをそのまま SFC 版ドラクエ 5 に適用することは具合が悪いのだ。 このプログラムは BRK 命令を独自の規則でカスタマイズしており、 65816 CPU が規定するオペランドの値によって、さらに余分なオペランドを取るというものだ。 よって、ゲームプログラムの解析者が最初に行うべきことは、 この BRK 命令の普通のオペランドと付加オペランドのバイト数との間の対応を知り、 それに基づいたカスタマイズ版 65816 逆アセンブラーを実装することだと思われる。 さもなければ、解析作業者は BRK 命令を含むテキストを手作業で修正することになるし、 そもそもどのように修正すればよいのか判断できないはずだ。 現に記者は SFC 版ドラクエ 5 特化版逆アセンブラーを実装するハメになった。
本節では SFC 版ドラクエ 5 のコードにおける BRK 命令の詳細について見ていく。 各 BRK オペランドに対応する付加オペランドのバイト数の表、 BRK 命令のハンドラーコードの振る舞いの要約、 そして各 BRK 呼び出しの意味をオペランド別に解説していくつもりだ。
BRK 命令の正規のオペランドと、実際にオペランドを構成するバイト長との対応表を次に示す。 この情報がなければ、専用逆アセンブラーを実装することはできない。 ここで列「オペランド」は BRK 命令の正規のオペランドの値を、 列「サイズ」は正規のオペランドを含んだ、実際にオペランドを構成するバイトのサイズを、 列「命令の意味」はその BRK 命令のプログラム上の意味をそれぞれ示す。
表 3.4 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 する |
TODO: BRK 命令ハンドラー $008F80
の要約。
ここから BRK 命令が「余分なオペランド」を有するものについては、
それらの 1 番目、2 番目……を arg1
, arg2
のように呼ぶ。
また、A レジスターの上位バイトと下位バイトを AH, AL とそれぞれ呼ぶ(インデックスレジスターについても同様)。
本節では各正規オペランドについて、命令実行の意味なり挙動なりを解説する。
これらの命令実行の意図はゲームの内容とは関係がないので、興味のない読者は本節を飛ばして結構だ。
BRK #$02
と BRK #$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
オペランドが #$0B
から #$0D
の間の値である BRK 命令の実行は、
アドレス $7E2190
からビット単位で直列配置されたフラグを管理する。
どの命令も「余分なオペランド」を二個取る。
arg1
はビットマスクを、
arg2
は対象フラグを含むバイトのアドレスの
$7E2190
からのオフセット値をそれぞれ表現する。
ビット演算は BRK 命令の本来のオペランドによって固定されている。それを次の表に示す。
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 #$97
と BRK #$9B
についてはこの後 3.2.3.7 オペランド #$97
, ..., #$9D
: 移動時メッセージ処理 で述べる。
オペランドが #$0E
から #$19
の間の値である BRK 命令の実行は、
それぞれが何らかの音響制御を担当する。$24FF83
系処理。
音響制御 BRK 命令は「余分なオペランド」を一個または二個有しており、基本的には
arg1
がサウンド ID だと思ってよい。
この値と実際に鳴る音楽または効果音との対応表を次に示す。
表 3.6 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
BRK 命令のオペランドが #$80
から #$93
の間の値であれば、
これはサブルーチン $218AFC
のラッパーとして振る舞う。
詳しくは 3.3 汎用データアクセスサブルーチン(仮) で議論するが、あるオブジェクトの特定の性質へアクセスするというものだ。
オペランドの値と「余分なオペランド」の値によって構造体のフィールドとアクセス方法が一意に決まり、
対象となるオブジェクトの指定は別途指定する。
BRK 命令実行時のオペランド、「余分なオペランド」、レジスターの値によって、 どのオブジェクトのどのフィールドをどのように処理するのかが一意に決定する。 これを詳細に述べるために、静的なデータ構造を順を追って説明したい。
まず BRK 命令に関係するオペランド、「余分なオペランド」、レジスターの状況を表にまとめる。
この表は、各正規オペランドに対して、BRK 命令実行がサブルーチン $218AFC
呼び出しのために必要な
$38
等の値をどの要素からコピーするのかを示している。
表 3.7 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
BRK 命令のオペランドが #$94
であれば、
この命令実行は指定したアイテムに関する何らかの性質を参照することを意味する。
正規のオペランドとは別に 1 バイトの「余分なオペランド」を呼び出し元から取り、どの特性を参照するのかを決定する。
次に余分なオペランドの値 arg1
と、対応する命令実行が参照する特性との対応表を示す
(実際に参照するデータの列についてはアイテムのデータ構造については 3.13 アイテム を参照)。
表 3.8 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
BRK 命令のオペランドの値が #$95
または #$96
のいずれかであれば、
この命令はウィンドウ処理を実行する。大抵の場合は何らかのウィンドウ(群)を画面上に新たに描画する。
値 arg1
が表すのは基本的にはウィンドウ ID であり、
例外的に値 #$FF
の場合には、メッセージウィンドウの終了を指示する命令を実行するようだ。
ウィンドウ処理全般については 3.8 ウィンドウ を参照。
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.2 移動モードテキスト解析 を参照。
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.6.1 戦闘モードテキスト解析 を参照。
こちらも戦闘時メッセージ処理だが、サブルーチン $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
こちらも戦闘時メッセージ処理だが、サブルーチン $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
こちらも戦闘時メッセージ処理だが、サブルーチン $2485DC
を用いる。
実例として、ある BRK #$A7
と BRK #$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