Last Update 08/06/22

オブジェクトの動作等を記述するためによく使われるサブルーチンです。
改造時のメモを見ながら書いているので、細かい処理内容が抜けていたり間違っている可能性 もあります。
オブジェクトX,オブジェクトYという表記は、 それぞれX,Yレジスタにインデックスが格納されているオブジェクトのことを指します。


ここからBANK1Cのサブルーチン
jsr $84FCオブジェクトXのグラフィックの向きを変えずにX,Y方向へ移動する。
オブジェクトXの方向にX,Y方向速度だけ移動させる。 ここで、このサブルーチン呼び出しの前後でオブジェクトXのDisplay Flagsの値は変わらない。
jsr $850BオブジェクトXのグラフィックのみロックマンのほうを向く。
オブジェクトXのグラフィックがロックマンの方)を向くようにDisplay flagsのbit5の値がセットされる。 ここで、このサブルーチン呼び出しの前後でオブジェクトXの方向($420,x)の値は変わらない。
jsr $851AオブジェクトXが向いている方向に(グラフィックの向きを変えずに)ブロックにめり込まないようにX方向速度だけ移動する。
基本的にはサブルーチン$EA3Fと同じ。 ただし、このサブルーチン呼び出しの前後でオブジェクトXのDisplay Flagsの値は変わらない。
jsr $8541オブジェクトXが向いている方向にグラフィックの向きを変えずにX方向速度だけ移動する。
基本的にはサブルーチン$EA65と同じ。 ただし、このサブルーチン呼び出しの前後でオブジェクトXのDisplay Flagsの値は変わらない。

jsr $8526オブジェクトXのグラフィックを左向きにする。
オブジェクトXのDisplay Flagsのbit5を0にする。
jsr $852FオブジェクトXの方向を左右反転する。
オブジェクトXの方向(右向き01,左向き02)を反転させる。
jsr $8538オブジェクトXの方向を上下反転する。
オブジェクトXの方向(下向き04,上向き08)を反転させる。

jsr $854D放物線を描くようにオブジェクトXのX,Y方向速度をセットする。
Yレジスタに値(00または01)をセットして呼び出す。 オブジェクトXが放物線を描き、概ねロックマンのいるX座標に着地するようにX,Y方向速度をセットする(あまり正確な値はセットされない)。 ここで、Y方向速度は符号付き整数であり、Yレジスタの値が00で小ジャンプ、01で大ジャンプとなる。
jsr $8550放物線を描くようにオブジェクトXのX,Y方向速度をセットする。
AレジスタにX方向距離、Yレジスタに値(00または01)をセットして呼び出す。 他はサブルーチン$854Dと同じ。
jsr $8592放物線を描くようにオブジェクトXのX,Y方向速度をセットする。
$01にX方向距離、Yレジスタに値(00〜03)をセットして呼び出す。 オブジェクトXが放物線を描き、X方向距離が$01離れた位置に着地するようにX,Y方向速度をセットする(上記のサブルーチンよりも正確)。 ここで、Y方向速度は符号付き整数であり、Yレジスタの値でジャンプの高さが決まる(01>03>00>02の順に高い)。


ここからBNAK1E-1Fのサブルーチン
jsr $E8DEオブジェクトXのグラフィックを右向きにし、右に移動する。
オブジェクトXのDisplay Flagsのbit5を1にし、X座標にX方向速度を加算する。
jsr $E8E6オブジェクトXを右に移動する。
オブジェクトXのX座標にX方向速度を加算する。
jsr $E904オブジェクトXのグラフィックを左向きにし、左に移動する。
オブジェクトXのDisplay Flagsのbit5を0にし、X座標からX方向速度を減算する。
jsr $E90CオブジェクトXを左に移動する。
オブジェクトXのX座標からX方向速度を減算する。

jsr $E979オブジェクトXを下に移動する。
オブジェクトXのY座標にY方向速度を減算する。
このサブルーチンでは、Y方向速度は符号付き整数として扱われる(負の値が下方向)。
jsr $E94AオブジェクトXを上に移動する。
オブジェクトXのY座標からY方向速度を減算する。
このサブルーチンでは、Y方向速度は符号付き整数として扱われる(正の値が上方向)。
jsr $E968オブジェクトXをY方向速度だけ移動させる(速度に重力加算有り)。
オブジェクトXをY方向速度だけ移動させる。
このサブルーチンでは、Y方向速度は符号付き整数として扱われる(正の値が上方向)。
また、速度から重力値が減算される。

jsr $E92AオブジェクトXを下に移動する。
オブジェクトXのY座標からY方向速度を加算する。
jsr $E999オブジェクトXを上に移動する。
オブジェクトXのY座標からY方向速度を減算する。
(実際のプログラムコードはサブルーチン$E94Aと全く同じもの)

jsr $EA1EオブジェクトXのY方向速度をFF.00にセットする。
オブジェクトXのY方向速度(low,high)に00,FFをセットする。
jsr $EA29オブジェクトXのY方向速度を01.00にセットする。
オブジェクトXのY方向速度(low,high)に00,01をセットする。
jsr $EA34オブジェクトXのY方向速度をFF.C0にセットする。
オブジェクトXのY方向速度(low,high)にC0,FFをセットする。

jsr $E7B7オブジェクトXをブロックにめり込まないようにY方向速度だけ移動させる(速度に重力加算有り)。
Yレジスタに適切な値をセットして呼び出す(実際に使用している箇所を参照してみて下さい)。
オブジェクトXをY方向速度だけブロックにめり込まないように移動させる。
このサブルーチンでは、Y方向速度は符号付き整数として扱われる(正の値が上方向)。 また、速度から重力値が減算される。
ブロックと接触した場合、キャリーフラグがセットされる。
jsr $EA3FオブジェクトXが向いている方向にブロックにめり込まないようにX方向速度だけ移動する。
Yレジスタに適切な値をセットして呼び出す(実際に使用している箇所を参照してみて下さい)。
オブジェクトXの方向(右向き01,左向き02)にX方向速度だけブロックにめり込まないように移動させる。
また、オブジェクトXの方向が右ならば、Display Flagsのbit5を1、左ならば0にする。
ブロックと接触した場合、キャリーフラグがセットされる。
jsr $EA52オブジェクトXが向いている方向にブロックにめり込まないようにY方向速度だけ移動する。
Yレジスタに適切な値をセットして呼び出す(実際に使用している箇所を参照してみて下さい)。
オブジェクトXの方向(下向き04,上向き08)にY方向速度だけブロックにめり込まないように移動させる。
ブロックと接触した場合、キャリーフラグがセットされる。

jsr $EA65オブジェクトXが向いている方向にX方向速度だけ移動する。
オブジェクトXの方向(右向き01,左向き02)にX方向速度だけ移動させる。 また、オブジェクトXの方向が右ならば、Display Flagsのbit5を1、左ならば0にする。
jsr $EA86オブジェクトXが向いている方向にY方向速度だけ移動する。
オブジェクトXの方向(下向き04,上向き08)にY方向速度だけ移動させる。

jsr $EA98オブジェクトXのアニメーション番号をセットする。
Aレジスタにアニメーション番号をセットして呼び出す。
指定した値をオブジェクトXのアニメーション番号にセットし、 アニメーションフレーム・アニメーションタイマーを0クリアする。
jsr $EAA4オブジェクトYのアニメーション番号をセット・X→Yに座標をコピーする。
Aレジスタにアニメーション番号をセットして呼び出す。
指定した値をオブジェクトYのアニメーション番号にセットし、 アニメーションフレーム・アニメーションタイマーを0クリアする。
また、オブジェクトXの座標(low,high)をオブジェクトYの座標にコピーし、オブジェクトYの以下のパラメータを0クリアする。
X座標(fraction)
Y座標(fraction)
Flash Counter
変数A〜H
jsr $EAE9オブジェクトYのアニメーション番号をセットする。
Aレジスタにアニメーション番号をセットして呼び出す。
指定した値をオブジェクトYのアニメーション番号にセットし、 アニメーションフレーム・アニメーションタイマーを0クリアする。
jsr $EAF5オブジェクトYのアニメーション番号をセット・(Xの座標+相対座標)をYの座標にセットする。
Aレジスタにアニメーション番号、$10に相対座標番号をセットして呼び出す。
指定した値をオブジェクトYのアニメーション番号にセットし、 アニメーションフレーム・アニメーションタイマーを0クリアする。
また、オブジェクトXの座標(low,high)に相対座標を加えた座標をオブジェクトYの座標にセットする。
相対座標は符号付整数として扱われ、値は以下のテーブルで定義されている。
$3EB72-3EBCB (5A) = 相対座標番号 : 相対X座標(low)
$3EBCC-3EC25 (5A) = 相対座標番号 : 相対Y座標(low)
さらにオブジェクトYの以下のパラメータを0クリアする。
X座標(fraction)
Y座標(fraction)
Flash Counter
変数A〜H

jsr $EC16オブジェクトXの方向をロックマンの方を向くようにセットする。
オブジェクトXとロックマンのX座標を比較し、 オブジェクトXの方が左にいれば01(右)、そうでなければ02(左)がオブジェクトXの方向にセットされる。
jsr $EC30オブジェクトXの方向(左右)をグラフィックに反映する。
オブジェクトXの方向が右ならば、Display Flagsのbit5を1、左ならば0にする。
jsr $EC4AオブジェクトXの方向を左右反転させる(グラフィック含む)。
オブジェクトXの方向の下位2bitを反転させる。 また、Display Flagsのbit5も反転させる。

jsr $EC5B曲を再生する。
Aレジスタにトラック番号をセットして呼び出す。
そのトラック番号の曲が再生される。$F0を指定すると曲を停止する。
jsr $EC5D効果音を再生する。
Aレジスタにトラック番号をセットして呼び出す。
そのトラック番号の効果音が再生される。

jsr $EC76ロックマンとオブジェクトXのY座標を比較する。
AレジスタにロックマンとオブジェクトXのY方向距離が格納される。
ロックマンのY座標 ≧ オブジェクトXのY座標
ならば、キャリーフラグがセットされる。
jsr $EC94ロックマンとオブジェクトXのX座標を比較する。
AレジスタにロックマンとオブジェクトXのX方向距離が格納される。
ロックマンのX座標 ≧ オブジェクトXのX座標
ならば、キャリーフラグがセットされる。

jsr $ECC2オブジェクトXからのロックマンの方角を取得する。
オブジェクトXから見たロックマンの方角がAレジスタに格納される。 格納される値は時計回りで、
00 北
01 北北東
02 北東
…
0F 北北西
の16通り。
jsr $ECC4オブジェクトXからのオブジェクトYの方角を取得する。
オブジェクトXから見たオブジェクトYの方角がAレジスタに格納される。 格納される値は上記を参照。
jsr $F470方角からオブジェクトXの方向・速度をセットする。
Aレジスタに速さ指定、Yレジスタに方角($00〜0F、上記を参照)をセットして呼び出す。
指定した方角に進むようにオブジェクトXの方向・速度がセットされる。 Aレジスタに指定する値は以下の10通り。値の右側の数値は目安の速さ(16進数)。
00 -> 00.40  08 -> 02.00
10 -> 04.00  18 -> 01.99
20 -> 01.00  28 -> 03.00
30 -> 05.00  38 -> 00.80
40 -> 02.80  48 -> 08.00
上記のサブルーチンと組み合わせて使うことでホーミングする弾などを実現できる。

jsr $EF87オブジェクトXとロックマンの接触判定を行う。
オブジェクトXとロックマンが接触しているかを判定する。 接触していた場合、キャリーフラグがクリアされる。
jsr $EFF8オブジェクトXと武器の接触判定を行う。
オブジェクトXとインデックス$01〜03のオブジェクト(ロックバスターや各種特殊武器)が接触しているかを判定する。 接触していた場合、キャリーフラグがクリアされ、Yレジスタと$10に接触したオブジェクトのインデックスが格納される。

jsr $F15Fオブジェクトメモリ領域を確保する(Xレジスタ)。
Xレジスタに空いているオブジェクトメモリ領域のインデックスが格納される($08〜17)。 確保できなかった場合はキャリーフラグがセットされる。 このサブルーチン呼び出し後はキャリーフラグのチェックを忘れずに。
jsr $F16Fオブジェクトメモリ領域を確保する(Yレジスタ)。
Yレジスタに空いているオブジェクトメモリ領域のインデックスが格納される($08〜17)。 確保できなかった場合はキャリーフラグがセットされる。 このサブルーチン呼び出し後はキャリーフラグのチェックを忘れずに。

jsr $F207割り算 $00 / $01 を行う。
1byteの値同士の割り算 $00 / $01 を行う。商は$02、余りは$03に格納される。
jsr $F22D割り算 $00-01 / $02-03 を行う。
2bytesの値同士の割り算 $00-01 / $02-03 を行う(リトルエンディアン)。 ここで、$00,$02は整数部、$01,$03は小数部である。 商は$04-05に格納される。ここで、$05は整数部、$04は小数部である。 このサブルーチンでは、演算結果が$100(=256)以上となる場合、正常な結果が返らないことに注意。

jsr $F297アイテム回収フラグをセットする。
オブジェクトXに対して回収フラグをセットする。 回収フラグがセットされた設置型オブジェクトは出現しなくなる。

jsr $F2C4インデックスXのオブジェクトを消去する。
オブジェクトXをオブジェクトメモリから消去する。
jsr $F2FEインデックスYのオブジェクトを消去する。
オブジェクトYをオブジェクトメモリから消去する。

jsr $FF3Dプログラムバンクを連番で切り替える。
Aレジスタにバンク番号をセットして呼び出す。
$8000-9FFFにバンク[Aレジスタの値]、$A000-BFFFにバンク[Aレジスタの値 + 1]をマップする。
jsr $FF43プログラムバンクを切り替える。
$F5に$8000-9FFF、$F6に$A000-BFFFにマップしたいバンク番号をセットして呼び出す。
片方のみ切り替えたい場合は、切り替える方のバンク番号のみをセットすればよい。