Last Update 08/09/26
◇メモリマップ
; スレッド関係
21-24 スレッドの状態(00 -> 未使用, 01 -> 休止中, 02 -> 実行中, 04 -> 実行可能, 08 -> 新規登録)
25-28 スレッドのスリープカウンタ
29-2C 新規スレッドのThread handler(low) / スレッドのスタックポインタ
2D-30 新規スレッドのThread handler(high)
31-32 新規スレッドのThread handlerを展開
33 Current thread (現在のスレッドのスロット番号)
34-37 8000-9FFFにマップするバンク
38-3B A000-BFFFにマップするバンク
3C-3F
; スレッド番号
00 メイン(使用スロット0)
01 パターンテーブル書き込みキュー監視(使用スロット3)
02 チャージ中のパレットアニメ(使用スロット1)
; パッド入力関係
40 Keys held on pad 1 1Pパッド入力(押しっぱなし)
41 Keys held on pad 2 2Pパッド入力(押しっぱなし)
42 Keys pressed on pad 1 1Pパッド入力(押した瞬間)
43 Keys pressed on pad 2 2Pパッド入力(押した瞬間)
44 40の値を全bit反転(42の値作成のため)
45 41の値を全bit反転(43の値作成のため)
01 右
02 左
04 下
08 上
10 スタート
20 セレクト
40 B
80 A
46 Palette changed(パレットの更新するなら0以外の値を入れる)
47 VRAM書き込みフラグ(0以外でVBlank中に$780~Drawing bufferのデータを元に書き込み。Drawing bufferのデータの総バイト数)
48 パレットの明るさ?(パレット更新の際,色の値からこの値を引いたものが書き込まれる)
49 パレットの明るさ?(jsr $CA71で使用)
4A New PRG bank 8000-9FFF
4B New PRG bank A000-BFFF
4C Last MMC3 command
4D チップ属性チェックX座標(low)
4E チップ属性チェックY座標(low)
4F チップ属性チェックX座標(high)
50 チップ属性チェックY座標(high)
51 Curent level
00 ブリザードマンステージ
01 ウインドマンステージ
02 プラントマンステージ
03 フレイムマンステージ
04 ヤマトマンステージ
05 トマホークマンステージ
06 ナイトマンステージ
07 ケンタウロスマンステージ
08-0B エックスステージ1-4
0C-0F ワイリーステージ1-4
52-53 マップデータ読み出しベースアドレス?
54-55 マップデータ読み出しアドレス?
56 Scroll X
57 Scroll X(high)
58
59
5A
5B
5C-5D 縦/横スクロール用VRAM書き込み開始アドレス
5E-5F アトリビュート用VRAM書き込み開始アドレス
60 VRAM書き込みフラグ($7B0から読み込み, 値が#$68ならばVRAMアドレスインクリメント値+32)
61
62-63 16x16チップデータ読み出しベースアドレス?
64-65 16x16チップデータ読み出しアドレス?
66-67 32x32チップデータ読み出しベースアドレス?
68-69 32x32チップデータ読み出しアドレス?
6A
6B
6C
6D 画面スクロール速度?
6E マップデータ読み出しバンク?(8000-9FFFにマップ)
6F マップデータ読み出しバンク?(A000-BFFFにマップ)
70 一番最近のスクロール方向?(01 -> 右, 02 -> 左)
71 エリア内移動可能なスクロール方向(+01 -> 右, +02 -> 左)
72 スクロール時のパレット変更番号
73 スクロール時のパターンテーブル書き込み番号
74-75 設置オブジェクトの部屋番号テーブルの先頭アドレス
76-77 設置オブジェクトの部屋番号テーブルの先頭アドレス(オリジナル)
78-79 設置オブジェクトのX座標テーブルの先頭アドレス
7A-7B 設置オブジェクトのX座標テーブルの先頭アドレス(オリジナル)
7C-7D 設置オブジェクトのY座標テーブルの先頭アドレス
7E-7F 設置オブジェクトのObjectIDテーブルの先頭アドレス
80 この値の16x16チップがDestroyed blocksに登録される
81-82 パターンテーブル書き込みデータ展開用
83-84 パターンテーブル書き込み用のグラフィックソースアドレス
85-86 パターンテーブル書き込みアドレス
87 書き込む8x8パターンの残数
88 書き込んだ8x8パターンの個数
89 パターンテーブルに書き込んだバイト数
8A グラフィックソースバンク
8B
8C Next OAM table offset
8D tmp
8E
8F Current sprite
90 Enemy Handler処理ルーチン突入時にスタックポインタを退避
91
92-93
94 ロックマンの状態
00 -> 静止
01 -> すり足
02 -> 歩行
03 -> スライディング
04 -> はしご
05 -> はしご(頂上)
06 -> ジェットロックマンで飛行
07 -> ジャンプ
95 スライディングカウンター(ロックマン用の汎用カウンタ?)
96 ロックマンのダメージ計算フラグ(1フレームの間に同時に複数の敵からダメージを受けるのを防ぐため?)
97
98 ショットポーズフラグ(ショット中は#$18。他は0)
99 ロックマンの進行方向(左右, パッド入力中に立つ)
9A Aボタンチェック(Aボタンを押し始めたフレームならば#$80)
9B Current Rush Adaptor (01 -> ジェット, 02 -> パワー)
9C ジェットアダプターのゲージ量
9D 0ならジェットアダプターの残量回復を許可
9E チャージカウンター
9F ロックマンのX座標(low)?
A0-A1 ロックマンのX方向速度?
A2 ロックマンの無敵カウンター
A3
A4
A5 パワーロックマンのゲージ量
A6
A7
A8 ロックマンの画面左端侵入制限?(この値(X座標(low))より左に侵入できなくなる)
A9
AA-AB スクロール関係データ読み出しポインタ?
AC スクロールデータ読み出し時に利用
AD
AE 現在のロックマンのパレット変更番号
AF
B0-BF Sound queue
C0-D8 サウンドドライバ関係
D9 Sound queue Write pointer
DA tmp
DB Sound queue Read pointer
DC 再生したいトラックを書き込む
DF-E0? 擬似乱数
E3-E6 パレットアニメーションの更新フレーム間隔?
E7-EA パレットアニメーションのパレット番号?
; オブジェクト移動サブルーチン$E4D5関係 (符号付整数)
EB オブジェクトのX方向速度(low) / 画面スクロール時のX方向速度(high)
EC オブジェクトのY方向速度(low) / 画面スクロール時のX方向速度(screen)
ED オブジェクトのX方向速度(high) / 画面スクロール時のY方向速度(high)
EE オブジェクトのY方向速度(high) / 画面スクロール時のY方向速度(screen)
F0 メインループ脱出フラグ(01でステージクリア時,02で死んだとき,03でゲームオーバー)
F1 ネームテーブル書き込みアドレス(high)に加算(多分00, 04, 08, 0C)
F2 VBL flag (1フレームで行う各スレッドの処理がすべて完了した時0となり, NMIでの画面更新が行われる.)
F3 Synchronous frame counter
F4 Split effect enabled(ラスタースクロール使用なら1,使用しないなら0)
F5
F6
F7 Scroll X
F8
F9 Scroll Y
FA Current nametable(00 -> $2000~, 01 -> $2800~)
FB ミラーリング方向(00 -> 垂直, 01 -> 水平)
FC Display Setting 1($2000に書き込む)
FD Display Setting 2($2001に書き込む) ?
FE
FF
100-1FF スタック
200-2FF OAM table
0 Y座標-1
1 パターンインデックス
2 アトリビュート
VHP000CC
||| ||
||| ++-カラーパレット上位2ビット
||+------BGとの優先順位、0:SPR優先、1:BG優先
|+-------左右反転フラグ、1:反転
+--------上下反転フラグ、1:反転
3 X座標
300-33F Attribute table
340-35F Destroyed blocks (1bitで破壊された16x16チップ番号を表す)
360-37F パレット
380-39F オリジナルパレット
; オブジェクトメモリ関係(スロット$16はObjectID:80の処理専用?)
3A0-3B6 ObjectID
3B7-3CD Display Flags
bit7 -> 上下反転
bit6 -> 左右反転
bit5 -> 背景に隠れる
bit1 -> 不可視(アニメーションもストップ)
bit0 -> 不可視(アニメーションは進む)
3CE-3E4 方向 (01=右,02=左: 16方向の場合, 時計周りで00 = 北, 01 = 北北東, 02 = 北東,…)
3E5-3FB HP(00で1を表すため実際より1小さい値を入れる)
3FC-412 設置オブジェクトのインデックス(設置オブジェクトでない場合FF)
413-429 Enemy Handler(high)
42A-440 Enemy Handler(low)
441-457 PRG Bank
458-46E Sprite Bank
46F-485 X座標(high)
486-49C X座標(low)
49D-4B3 X座標(fraction)
4B4-4CA Y座標(high)
4CB-4E1 Y座標(low)
4E2-4F8 Y座標(fraction)
4F9-50F アニメーションデータのサイズ?
510-526 アニメーションデータ読み出しポインタ?
527-53D アニメーションデータのアドレス(high)
53E-554 アニメーションデータのアドレス(low)
555-56B アニメーションタイマー
56C-582 オブジェクトの受けるダメージ
bit7-4 6で2ダメージを受ける
bit3-0 このフレームで受けるダメージ
583-599 属性?
bit7-4 -> ロックマン/武器との接触時の動作番号
番号 ロックマンと接触 武器と接触
00 何もなし
01 ダメージ ダメージ
02 ブロック 武器を弾く
03 ダメージ
04 ダメージ
05 ブロック 何もなし
06 ダメージ 武器を弾く
07 何もなし
08 ダメージ&ブロック 武器を弾く
09 ブロック ダメージ
0A 何もなし ダメージ
0B ダメージ ダメージ
0C ダメージ ×(アドレスがおかしい)
0D ダメージ 何もなし
0E ダメージ ダメージ
0F ダメージ ダメージ
bit3-0 -> 接触時のダメージ量
59A-5B0 当たり判定番号(00~68)
5B1-5C7 Y方向速度(low)?変数A?
5C8-5DE Y方向速度(high)?変数B?
5DF-5F5 Y方向速度(low)?変数C?
5F6-60C Y方向速度(high)?変数D?
60D-623 Y方向速度(low)?変数E?
624-63A Y方向速度(high)?変数F?
63D ボス番号?
642 0以外でボスゲージ表示($3EDの値を表示)
649 Next enemy in level
64A Previous enemy in level
64B
64E ステージ開始時のパターンテーブル書き込み番号
64F 一番最近のスクロール時のパターンテーブル書き込み番号
650-65F? アイテム回収フラグ
672 Current split position
676 Current split effect number
677 Next split effect number
67C
67D 0でなければデモプレイ用の入力がパッド入力($40,$42)に入る
67E デモプレイ入力用カウンタ
67F デモプレイ入力読み出しポインタ
680 一番最近のパターンテーブル先読みを行った部屋番号
681
682 ネームテーブル書き込みデータ番号の保持?(パワーピストン戦での使用を確認)
683
684 中間復帰時の部屋番号
685 中間復帰時のパターンテーブル書き込み番号
686 中間復帰時のパレット変更番号
687 スクロール時のパレット変更番号($72と同じ?)
688-691 Weapon energy
688 ロックバスター
689 ヤマトピア
68A ウインドストーム
68B ブリザードアタック
68C フレイムブラスト
68D プラントバリア
68E ナイトクラッシュ
68F シルバートマホーク
690 ケンタウロスフラッシュ
691 ビート
692-695 ステージクリア・プレートフラグ
692 - bit2 Bプレート
bit1 トマホークマン
bit0 ブリザードマン
693 - bit2 Eプレート
bit1 ヤマトマン
bit0 ウインドマン
694 - bit2 Tプレート
bit1 ケンタウロスマン
bit0 フレイムマン
695 - bit2 Aプレート
bit1 ナイトマン
bit0 プラントマン
696
697 スクロール元部屋番号
698
699 Current weapon
69C Vertical screen offset
69D Horizonal screen offset
69E 一番最近のスクロール時のパレット変更番号
69F 01でネームテーブル書き込み時に効果音を鳴らす
6A0
6A5 ビートプレート取得ボスを倒せば#$04
6A6 ネームテーブル書き込み時に出す効果音番号
6A7 Xスクロール値 (NMIで計算)
6A8 X Scroll(high) (NMIで$57の値をコピー)
6A9 ステージ選択画面のボス顔塗りつぶし用のカウンタに使用
6AB チャージカウンター上限
6AD
6AE Yレジスタの値退避?
700-77F サウンドドライバ関係
780-7D8 Drawing Buffer?
; フォーマット
byte0 -> bit7 = 1ならばVRAMインクリメント値=+32
bit6-0 -> 書き込むデータのバイト数
byte1 -> VRAM書き込みアドレス(high)
byte2 -> VRAM書き込みアドレス(low)
byte3- -> 書き込む値(byte0のbit6-0で指定した数だけ書き込む)
そしてbyte0に戻る
※データの総バイト数は$47で指定
7B0-7D8 Drawing Buffer?
;マップ描画用
;5C-5D 縦/横スクロール用VRAM書き込み開始アドレス
;5E-5F アトリビュート用VRAM書き込み開始アドレス
;60 VRAM書き込みフラグ($7B0から読み込み, 値が#$68ならばVRAMアドレスインクリメント値+32)
; $7B0~には単に書き込むデータをそのまま羅列
7D9-7EF OAM tableへのスプライトデータ展開順
7E8-7EF パターンテーブル先読み関係
7F0-7F7 パターンテーブル書き込みキュー
7F8 パターンテーブル書き込みデータ読み込みポインタ
7F9 パターンテーブル書き込みデータ書き込みポインタ
◇サブルーチン
; Xレジスタで指定した番号のスレッドを作成
jsr $C5C7
; スレッド番号
; 00 メイン(使用スロット0)
; 01 パターンテーブル書き込みキュー監視(使用スロット3)
; 02 チャージ中のパレットアニメ(使用スロット1)
; 03
; 04 フレイムマンステージのパレットアニメ(使用スロット2)
; 05
; 06
; 07
; 08
; 09
; 0A Mr.Xステージ1のパレットアニメ(使用スロット02)
; 現在のスレッドを終了しスレッド監視ループに入る
jsr $C5E6
; Yレジスタで指定したスロットのスレッドを終了する
jsr $C5F0
; Aレジスタで指定したフレーム数だけスレッドを休止
jsr $C5F6
; 1フレームだけスレッドを休止
jsr $C62B
; Aレジスタで指定したトラックをサウンドキューに登録
jsr $C8B2
; ネームテーブルのタイルを0クリア
jsr $C9BF
; Aレジスタの値でパレット指定?パレット変更ルーチン
jsr $C9EF
; パレットのフェードアウト($48を利用)
jsr $CA3D
; 4色分パレットを#$10だけ暗くする($380~の値から$360~に格納)(Xレジスタの値=一番右の暗くするパレット)
jsr $CA59
; 4色分パレットを$49の値だけ暗くする($380~の値から$360~に格納)(Xレジスタの値=一番右の暗くするパレット)
jsr $CA71
; パレットのフェードイン($48を利用)
jsr $CA89
; Aレジスタの値をパターンテーブル書き込みキューに登録(BG・スプライト非表示時はキューに登録せずに書き込み)
jsr $CAA4
; Aレジスタの値をパターンテーブル書き込みキューに登録
jsr $CAAA
; パラメータ毎に処理内容が変わる?
jsr $CB28
; パラメータは
; jsr $CB28
; .db $00
; のようにサブルーチン呼び出し命令の後の1byteで指定する
; --- パラメータ ---
; 00 … Aレジスタで指定した番号に応じてネームテーブル書き込み?
; 01 … オープニングデモの処理
; 40 … 設置オブジェクト生成ルーチン
; 41 … Yレジスタで指定した番号のオブジェクトを生成
; 42 … Yレジスタで指定したステージの設置オブジェクト生成関係のアドレスをセット
; オブジェクトメモリ内のオブジェクトを全消去するため、ステージ以外のシーンでは単にオブジェクト消去ルーチンとしても使われる?
; 44 … オブジェクトのスプライトパターン先読み
; 46 … スクロール時のオブジェクトのスプライトパターン先読み
; 47 … Mr.Xステージ2よりも前ならば取得している武器残量を満タンにする(ライフエネルギー除く)
; 4A … 武器取得画面処理
; 4B … 取得している武器残量を満タンにする(ライフエネルギー除く)
; 4C … パスワード画面を描画
; Aレジスタで指定したバンクに$8000-9FFFを切り替える(切り替え前の$8000-9FFF,$A000-BFFFのバンク番号がスタックに格納される)
jsr $CB91
; Yレジスタで指定したバンク番号にバンク切り替え(連番)
jsr $CBC0
; Aレジスタで指定したバンクに$A000-BFFFを切り替える
jsr $CBDA
; スタックに格納した値のバンクに$8000-9FFF,$A000-BFFFを切り替える(jsr $CB91とセット?)
jsr $CBE9
; $04,$05,$06,$07の値をスタックに退避
jsr $CC20
; スタックに退避させていた値を$04,$05,$06,$07に書き戻す(jsr $CC20とセット?)
jsr $CC3A
; $00-01 / $02-03 の商を$04-05に格納?($05 -> 整数部, $04 -> 小数部)
jsr $CC70
; アイテム回収フラグ, Destroyed blocksを0クリア ///
jsr $CE44
; ロックマン・スクロールオブジェクト以外を消去
jsr $D6F5
; $00=相対X座標, $01=相対Y座標, $11=00 で呼び出し? ///
; チップ属性チェックルーチン? $11にチップ属性, $13に16x16チップ番号が入る? ///
jsr $D9D1
; 00 背景 01 ブロック 02 オイル 03 はしご(頂点)
; 04 はしご(途中) 05 氷 06 前景 07 触れると背景に隠れるブロック
; 08 水中 09 オイルの床 0A 0B パワーロックマンで破壊可能
; 0C 風 0D フレイムブラストで破壊可能 0E 送風機の下 0F トゲ
; 10 11 13
; 15 17
; 19 1B
; 1D 落下ブロック
; $80 = 16x16チップ番号で呼び出し? 対象チップをDestroyed blocksに登録
jsr $DB98
; Current move(Aレジスタで指定)を更新・ショットフラグ($98)からロックマンのアニメーション番号をセット
jsr $E101
; OAM tableにオブジェクトのグラフィックを展開(Next OAM tableを初期化して開始)(展開の際にスプライトのアニメーション処理が行われる)
jsr $E1E1
; OAM tableにオブジェクトのグラフィックを展開 (Next OAM tableを初期化しない場合)(展開の際にスプライトのアニメーション処理が行われる)
jsr $E1E5
; xを消滅させて次のオブジェクトの処理へ移る
jmp $E45A
; xのEnemy Handlerをこの次の命令のアドレスにセットし次のオブジェクトの処理へ移る
jsr $E46C (アドレスをスタックに積むためにjmpでなくjsrを使用する)
; 次のオブジェクトの処理に移る
jsr $E47B
; $08-09で表されるアドレスにジャンプ
jsr $E486
; xの座標が画面内に存在するかチェック。存在するならキャリークリア
jsr $E489
; Yレジスタで指定した値(00~08)でテーブルの値からxのX,Y座標(low)をセット
jsr $E4AB
; オブジェクトを移動する(EB,ECの値が最初に0クリアされる以外は下と同じ)
jsr $E4CF
; $8Fで指定されたオブジェクトを移動する(EB,ED -> X方向速度(low, high), EC,EE -> Y方向速度(low, high))
jsr $E4D5
; Xレジスタで指定したオブジェクトを移動する(EB,ED -> X方向速度(low, high), EC,EE -> Y方向速度(low, high))
jsr $E4D7
; xのアニメーションをYレジスタで指定した番号にセット
jsr $E526
; xのアニメーションをYレジスタで指定した番号にセット(アニメーションデータ読み出しポインタに変更なし)
jsr $E561
; 設置オブジェクトメモリ領域取得。Xレジスタにインデックスが入る。取得できない(or既にそのオブジェクトが存在する)ならばキャリー1
jsr $E594
; 設置オブジェクト以外でのオブジェクトメモリ領域取得
jsr $E59F
; Yレジスタで指定したObjectIDのオブジェクトを生成
jsr $E5AF
; xとロックマンとのX座標を比較。ロックマンのX座標 < xのX座標 ならば $11 = 0C, そうでなければ$11 = 04 (16方向データでの左右を返す)
jsr $E5BA
; xの方向(16方向データ)に合わせてグラフィックの向き(上下・左右反転)をセット
jsr $E5E3
; xの初期パラメータをセットする(6bytes)
jsr $EBD5 (アドレスをスタックに積むためにjmpでなくjsrを使用する)
初期パラメータ
byte0 -> アニメーションデータ番号
byte1 -> パレット番号(00で変更なし)
byte2 -> パターンテーブル書き込みデータ番号
byte3 -> 当たり判定番号
byte4 -> HP
byte5 -> 属性
; xと他のオブジェクトとの接触判定?Yレジスタに接触しているオブジェクトのインデックス, 接触していなければC=0
jsr $ECC8
; xの変数E,FをY方向速度(low,high)とみなしてYレジスタで指定した加速度を加算した後$EC,$EEにセット
jsr $EE9E
Yレジスタで指定する加速度
00 -> 00.10 01 -> 00.08 02 -> 00.40 03 -> 00.2A
04 -> 00.1A 05 -> 00.80 06 -> 01.00 07 -> 00.20
08 -> 0C.00 09 -> 00.30
; xの変数E,FをY方向速度(low,high)とみなしてYレジスタで指定した加速度を減算した後$EC,$EEにセット
jsr $EECD
Yレジスタで指定する加速度は上を参照