ここは?
65C816プログラミングの説明が非常に丁寧なので、
そして板のほうで重複はまずいと言われたので、
こちらは講座ではなく資料集でも作ってみようと思います。
目次
ASM命令表
資料リンク
-
サイト
サイト名 備考 SMWCのRAM表 番号順なので、解析の時はこちらが便利です。 SMWCのAdvanced Documentation 数々の資料へのリンク。高度な改造のお供 SNES wiki ハードウェア全般の資料 カスタムASM(アーカイブ) 初心者のためのASM講座 すずめ愛好会(アーカイブ) 墓場 65c816とカスタムスプライトの最大規模の講座 改造ドンキーの館 - SNES技術資料
65C816 プログラミング リファレンスErsanio's ASM Tutorial
Assembly for Super Mario World (v1.1)英語だがSMWに特化した説明である。 Ersanio's ASM Tutorial
Assembly for the SNES (v2.3)
- 文書
- グラフィック関連(Internet Archive)
- PPUレジスタ関連
- SFCプログラミング全般
弄りがいのあるRAMの表
やっぱ日本語がいいよね!
他に良く使うものがあったらどんどん追加してください。
SNESGT等、「メモリビューア」という機能のついたエミュがあります。
これによりゲーム中の各RAMの値をリアルタイムで参照できます。
また、キーボードでRAMに値を代入することが出来ます。
いろいろ代入して何が起こるか、
何の処理のときにどこの値が変わるか、研究すると面白いです。
自由に使用できるRAM
$ |
長 さ |
意味 | 備考 |
0000 | 16 | Scratch RAM |
その名の通り弄りまくっておkな所 計算や、スタックの代用としてよく使われる。 |
06A0 | 96 | 空きRAM |
自由に使える(ただし〜Fは除く) どうやら〜Fはゴールぱーおわ時に使われているようです。 Lunar Magic1.70ではLMが追加する拡張機能に使われていて空きRAMとして使えないようです |
C005 | 8 | 便利な値 | 順に80,40,20,10,08,04,02,01が入っている。 |
システム系
$ |
長 さ |
意味 | 備考 |
0013 | 1 | フレームカウンター1 | 毎フレーム1増える |
0014 | 1 | フレームカウンター2 | 毎フレーム1増えるが、ロック時には止まる |
0015 | 1 | コントローラー入力データ1 | 図1参照↓ |
0016 | 1 |
コントローラー入力データ1 (1フレームだけ) |
図1参照↓ |
0017 | 1 | コントローラー入力データ2 | 図1参照↓ |
0018 | 1 |
コントローラー入力データ21 (1フレームだけ) |
図1参照↓ |
0100 | 1 | ゲームモード | 図9参照↓ |
13BF | 1 | level(メッセージ用) |
メッセージ表示時に、どの面のを表示するか これ弄れば他の面のメッセージ出せます |
13CE | 1 | 中間ゲートを通ったか | 0=通ってない 1=通った |
1426 | 1 | メッセージトリガー |
01…メッセージ1を表示。02…同2。03…でっていう初登場。 04…でかいスイッチ押したときに出るメッセージ。 そのあとOWに戻るとスイッチがばら撒かれる (実際は押してないことになってる。) |
1697 | 1 | 敵を連続で踏んだ回数 |
ここの値に応じて加算されるスコアが変動する。 07以上の時に敵を踏むと1UPする。 着地するとリセットされるが、金網などにつかまっても、 水に入っても、バルーンをとってもリセットされない。 |
1F2E | 1 | 通ったゴールの総数 |
OW系
$ |
長 さ |
意味 | 備考 |
0DFB | 1 | OW アニメーション用RAM | OW状態の時、値が増加していき、0Bの後00に戻る。LEVELに入ると止まる。 |
13C1 | 1 | OW 16x16タイルマップ |
現在マリオが載っている16x16タイルの番号 入る値は ![]() |
13D4 | 1 | OWビューモード |
全体マップでSTARTを押すとなるアレの状態 00:通常/01:ビューモード/02:ビューモードからマリオの位置へ戻る |
13D9 | 1 | OWでのマリオの状態 |
03でOW上のマリオが正面を向いている状態 04で歩いてる状態 06でマリオとルイージが交代することを確認 |
1DEA | 1 | OWページ | ステージクリア後に動かしたいイベント($FFで無し) |
1EA2 | 96 | OWマップタイルの設定 | 図8参照↓ |
1F02 | 15 | OWページ | イベントフラグ |
1F11 | 1 | OWページ マリオ | 要するにOWでカメラがどこを映すか。 |
1F12 | 1 | OWページ ルイージ | 上記のルイージ分 |
1F17 | 2 | OW マリオX座標 | 座標設定と1F11が合わないと、 |
1F19 | 2 | OW マリオY座標 | マリオは画面外を移動することになります。 |
1F1B | 2 | OW ルイージX座標 | 上記参考 |
1F1D | 2 | OW ルイージY座標 | 同じく |
ステージ系
$ |
長 さ |
意味 | 備考 |
0064 | 1 | Sprite Layer | ![]() |
0085 | 1 | 水中面フラグ | 00で通常、01でステージ全体が水中面となる |
0086 | 1 | 滑りやすさ |
00で通常。01~7Fで少し滑りやすくなる。 80以上で滑りやすくなる。オリジナルの氷属性面 |
0DAE | 1 | 明るさ | 0からFまで。演出にどうぞ。 |
0DDA | 1 | Music | ![]() たぶんスターの音楽を直したりする時に使われる |
141C | 1 | 秘密ゴールフラグ | 00で通常、01で秘密ゴール扱いになる |
1425 | 1 | ボーナスゲームフラグ | 01以上の時にワープするとボーナスゲームに移動する。 |
1493 | 1 | ゴールさせる |
FF代入でゴール。音は自分でいじる必要あり。 そのままだと連続で処理して疑似フリーズするので 分岐処理などで1回だけ行わせる必要あり |
186B | 1 | 10コインブロックタイマー | 01で10コインブロックがただのブロックになる |
1890 | 1 |
ボーナスゲームの 残り1うpキノコ数 |
|
1925 | 1 | マップモード | ![]() |
1DFB | 1 | Music |
0DDAの変更できる版![]() |
1DFC | 1 | 効果音 | 効果音一覧の番号代入で鳴る |
1F27 | 4 | でかいスイッチを押したか | 緑,黄色,青,赤の順。00 OFF/01 ON |
スクロール系
$ |
長 さ |
意味 | 備考 |
001A | 2 | 現フレームのレイヤー1の位置(x) |
要するに現フレームでのカメラの位置。 こっちを書き換えても$1462に上書きされる。 1Aはドット単位、1Bはページ単位。レイヤー位置は全て16bit |
001C | 2 | 現フレームのレイヤー1の位置(y) | 強制スクロールさせたければ$1462~の方を弄る |
001E | 2 | 現フレームのレイヤー2の位置(x) | |
0020 | 2 | 現フレームのレイヤー2の位置(y) | |
0022 | 2 | レイヤー3の位置(x) | |
0024 | 2 | レイヤー3の位置(y) | 水面の高さとか弄れます。通常は0040 |
0055 | 2 | レイヤー1の描画モードの指定(縦) | が0の時はどの値を入れても反応しない。これを応用すると・・・? |
1411 | 1 | 水平スクロール |
0 スクロールしない/1 する レイヤー1を操作する時はこれを0にしないと カメラはマリオに合わせて動いてしまう |
1412 | 1 | 垂直スクロール | 0 スクロールしない/1 する |
1462 | 2 | 次フレームのレイヤー1の位置(x) |
次フレームでのカメラの位置、適当に代入すると崩れるっぽい マリオの位置と同様に$1462はドット単位、$1463はページ単位 |
1464 | 2 | 次フレームのレイヤー1の位置(y) | 強制スクロール等で操作する時は$1411や$1412も忘れずに |
1466 | 2 | 次フレームのレイヤー2の位置(x) | |
1468 | 2 | 次フレームのレイヤー2の位置(y) | |
17BC | 1 |
レイヤー1位置(y)の 現フレームと前フレームとの差 |
カメラが下へスクロールしたら正数、上だと負数 |
17BD | 1 |
レイヤー1位置(x)の 現フレームと前フレームとの差 |
カメラが右へスクロールしたら正数、左だと負数 |
17BE | 1 |
レイヤー2位置(y)の 現フレームと前フレームとの差 |
下へ動かすと負数、上へ動かすと正数 |
17BF | 1 |
レイヤー2位置(x)の 現フレームと前フレームとの差 |
右へ動かすと負数、左へ動かすと正数 グルグルやパックンフラワーなどを レイヤー2と共に動かしたい時に使えそう |
マリオ状態系
$ |
長 さ |
意味 | 備考 |
0019 | 1 | パワーアップ状態 | 0チビ/1デカ/2マント/3ファイア |
0071 | 1 | マリオの動き | 図4参照↓ |
0072 | 1 | ジャンプ状態フラグ |
ジャンプ上昇中・マント飛行中0B、ジャンプ下降中24、 飛行可能ジャンプ・飛行最初の上昇0C |
0073 | 1 | しゃがみフラグ | 04でしゃがみ、グラフィックは立っていても当たり判定は小さくなる |
0074 | 1 | 登りフラグ | つた1F、金網9F |
0075 | 1 | 水中フラグ | 01で水中(泳いでいる) |
0076 | 1 | マリオの向き | 00で左、01で右 |
0077 | 1 | ブロックされている方向 | 図5参照↓ |
0078 | 1 | マリオを透明にする | 7Fで完全に透明 図2参照↓ |
007B | 1 | マリオの横方向速度 |
右が正 01〜7F=右(数が大きいほど速い) 80〜FF=左(数が小さいほど速い) |
007D | 1 | マリオの縦方向速度 |
下が正 01〜7F=下(数が大きいほど速い) 80〜FF=上(数が小さいほど速い) |
007E | 2 | マリオイメージの画面上の位置(x) | 表示位置が変わるだけで当たり判定などは変わらず |
0080 | 2 | マリオイメージの画面上の位置(y) | 同上 |
0094 | 2 | マリオの位置(x) | 94が一の位、ドット単位で10で1ブロック分、95がページ単位 |
0096 | 2 | マリオの位置(y) |
96が一の位、上とおなじく10で1ブロック分、97がページ単位 (チビマリオのときは1ブロック分上がy座標となるので注意が必要) |
0D82 | 1 | マリオとルイージのスーツの色 | C8で通常F0でファイア89で凍った《色だけ》 |
13DA | 1 | マリオの位置(x)(小数点以下) | $7Bの値を16倍してここに足し、繰り上がった分を$94に足す |
13DC | 1 | マリオの位置(y)(小数点以下) | $7Dの値を16倍してここに足し、繰り上がった分を$96に足す |
13DF | 1 | マントイメージ | |
13E0 | 1 | イメージ、要はマリオのポーズ | 図7参照↓ |
13E3 | 1 | 壁走りフラグ | 00通常、04左の壁、07右の壁 |
13E4 | 1 | ダッシュフラグ | Y押しながら移動で増加、70で最高速の⊂二( ^ω^)⊃ |
13E5 | 1 |
歩行アニメーション 速度テーブルのためのオフセット |
00で通常。壁にくっついているときは03、氷上では68 etc. |
13ED | 1 | 坂すべりフラグ | 00で通常、それ以外は坂すべり中、グラフィックは13E0と同じになる |
13F9 | 1 | レイヤー優先度フラグ |
00:FGより手前、01:FGより奥、02:FGより奥かつスプライトより手前 03:FGより手前かつスプライトより奥 |
140D | 1 | スピンジャンプフラグ | 01でスピン、00でNOTスピン |
1471 | 1 | スプライト足場フラグ | 01にすると空中でもジャンプ出来ます |
148F | 1 | 物持ちフラグ | 00で何も持っていない、01で何か持っている |
1490 | 1 | スタータイマー | 4フレーム毎に減って00で切れる |
1496 | 1 | マリオ汎用アニメタイマー? |
歩き、走り時00で次イメージになる。死亡時のタイマー。 きのこ、ダメージのにょきにょきタイマー |
1497 | 1 | マリオ無敵タイマー | ダメージを受けた後の点滅 |
149F | 1 | マント飛行タイマー |
マントマリオで猛ダッシュからジャンプした瞬間に代入、減少開始 00で飛行に移るが、00を常時代入していると飛行不可 |
14A2 | 1 | マントイメージタイマー | 00で次イメージ |
14A4 | 1 | マント飛行タイマー | 重力を受けない時間 |
14A6 | 1 | マリオが回転するタイマー | 毎フレーム減って00で切れる |
14AD | 1 | 青Pタイマー | 4フレーム毎に減って00で切れる |
14AE | 1 | 銀Pタイマー | 4フレーム毎に減って00で切れる |
14AF | 1 | ON/OFFスイッチフラグ | 00:ON/01:OFF |
1887 | 1 | 地面を揺らすタイマー | 毎フレーム減(ry |
1891 | 1 | Pバルーンタイマー | 4フレーム毎に減(ry |
18BD | 1 | マリオ硬直タイマー | 毎フレーム減(ry |
18BE | 1 | ロープ捕まりフラグ |
0でロープに掴まっていない。1で掴まっている。 1になっているとコース全体がツタのように掴めるようになる。 もう一度ロープに掴まるかルーム移動すると治る。 |
画面上系
$ |
長 さ |
意味 | 備考 |
0DC2 | 1 | ストックアイテム |
0無し/1キノコ/2ファイア/3スター/ 4マント/51UPキノコ/C2でっていう |
0EF9 | 54 | ステータスバータイルマップ | 図3参照↓ |
0F30 | 1 | タイムを1減らす為のタイマー | 00でタイムが1減る |
0F31 | 3 | タイム | 00から0F。順に百,十,一の位 |
0F34 | 3 | スコア | 0F36,5,4の順に16進数(×10) |
0F48 | 1 | ボーナススター | |
0DBE | 1 | キャラの残り人数 | 16進数で表される RAMの数+1が実際の機数 0機=FF |
0DBF | 1 | キャラのコイン数 | |
13CC | 1 | 獲得コイン数 |
毎フレーム減って00になるまでコインが1枚増える 100枚で1upの処理も行ってくれる |
1420 | 1 | ドラゴンコイン数 |
1upカウンター 1枚取るごとに01から増加していき05で1up |
1422 | 1 | ドラゴンコイン数 |
画面上のDCの枚数 01は1枚で増加していき05で5枚 |
2106 | 1 | モザイク |
bit0〜3:適用するBG(1〜4)bit4〜7:大きさ レイヤー4はSMWでは使えません |
7F837B | 2 | VRAM手続きインデックス | これ自体は手続きに関係なく、あくまで手続き側で使う物のようです |
7F837D | 5118 | VRAM手続き |
ここに書くとVRAMを更新してくれます。構文は VRAMアドレス(ビッグエディアン,2byte)、 書きこむサイズ-1(ビッグエディアン,2byte)、 データ(Nbyte)、終了コード(FF) |
ヨッシー系
$ |
長 さ |
意味 | 備考 |
0EF8 | 1 | でっていう初登場フラグ | 00なら未登場、ヨッシーの挨拶有り。 |
141E | 1 | でっていうの状態フラグ | 01でマリオがファイアを出せる、02で翼あり |
187A | 1 | でっていうに乗っているかのフラグ | 00:乗っていない/1or2:乗っている |
18E7 | 1 | でっていうの状態フラグ2 | 01で地面着地時に煙がでる |
その他
$ |
長 さ |
意味 | 備考 |
13D4 | 1 | ポーズフラグ | 00ならポーズしてない 01ならポーズ中 |
1401 | 1 | LRスクロールタイマー | LかRを押していると1フレームごとに1増加、10で画面がスクロール |
1746 | 1 | ファイアーボールY速度(1) | $01=1ドット 2発目は |
1750 | 1 | ファイアーボールX速度(1) | $01=1ドット 2発目はF |
1DF5 | 1 | 汎用タイマー | オープニング待機時間の他様々に使われる |
スプライトテーブル
$ (!) |
長 さ |
意味 | 備考 |
C2,x | 12 | 雑多的なことに使える。 | |
9E,x | 12 | スプライト番号 | Lunar Magic/スプライトリスト一覧表を参考 |
AA,x | 12 | 垂直スピード |
右が正 01〜7F=右(数が大きいほど速い) 80〜FF=左(数が小さいほど速い) |
B6,x | 12 | 水平スピード |
下が正 01〜7F=下(数が大きいほど速い) 80〜FF=上(数が小さいほど速い) |
D8,x | 12 | y座標(ドット単位) | 10で1ブロック分 |
E4,x | 12 | x座標(ドット単位) | 10で1ブロック分 |
14C8,x | 12 | スプライトの状態 | 図6参照↓ |
14D4,x | 12 | y座標(ページ単位) | |
14E0,x | 12 | x座標(ページ単位) | |
14EC,x | 12 | y座標(小数点以下) | $AA,xの値を16倍してここに足し、繰り上がった分を$D8,xに足す |
14F8,x | 12 | x座標(小数点以下) | $B6,xの値を16倍してここに足し、繰り上がった分を$E4,xに足す |
1504,x | 12 | 雑多的なことに使える。 | |
1510,x | 12 | 雑多的なことに使える。スプライト出現時にリセットされない。 | |
151C,x | 12 | 雑多的なことに使える。 | |
1528,x | 12 | ファイアボールカウンター |
cfgエディタで「Takes 5 fireball to kill」にチェックを入れていると ファイアボールを当てる度に1増え、5になると死ぬ リフトの場合、ここの値に応じてマリオを移動させる物がある。 |
1534,x | 12 | 雑多的なことに使える。 | |
1540,x | 12 | 00になるまで毎フレーム1ずつ減る。 | |
154C,x | 12 | 00になるまで毎フレーム1ずつ減る。マリオ・マントと反応しなくなる。 | |
1558,x | 12 | 00になるまで毎フレーム1ずつ減る。 | |
1564,x | 12 | 00になるまで毎フレーム1ずつ減る。他のスプライトと反応しなくなる。 | |
1570,x | 12 | 雑多的なことに使える。各スプライトのフレーム番号に使われやすい。 | |
157C,x | 12 | スプライトの向き | 00…右向き、01…左向き |
1588,x | 12 | ブロックされている方向 | マリオの方と同じ。 図5参照↓ |
1594,x | 12 | 雑多的なことに使われる。 | |
15A0,x | 12 | x座標画面内フラグ | x座標が画面内にあるなら0 |
15AC,x | 12 | 00になるまで毎フレーム1ずつ減る。 | |
15B8,x | 12 | 坂道フラグ |
00で水平な地面にいる。00から離れているほど急な坂にいる (左登り04~FC右登り) |
15D0,x | 12 | ヨッシー喰われフラグ |
ヨッシーに喰われてるなら1。 1になっていると他のスプライトと反応しなくなる。 |
15DC,x | 12 | オブジェクトすり抜けフラグ |
01以上でオブジェクトをすり抜けるようになる。 オバケ屋敷の移動する穴はここに値を入れて上のスプライトを落とす。 |
15EA,x | 12 | グラフィック描画に関するインデックス | |
15F6,x | 12 | パレット番号。雑多的なことにも使える。 | |
1602,x | 12 | グラフィック番号に使われることが多い | |
160E,x | 12 |
雑多的なことに使える。 ヨッシーの場合、喰ってるスプライトの番号になる。 |
|
161A,x | 12 | インデックスinLevel | $FFでスプライトが画面外に行くともう出てこない |
1626,x | 12 | 敵を倒した回数 |
マリオが踏むと$1697+ここの値の分のスコアが加算される。 07以上だと1UPする |
1632,x | 12 | 金網表裏フラグ |
00でマリオが金網の表に、 01でマリオが金網の裏にいないと反応しない。 02以上でマリオと完全に反応しなくなる。 |
163E,x | 12 | 00になるまで毎フレーム1ずつ減る。 | |
164A,x | 12 | 水中・溶岩フラグ | 01=水中、80=溶岩(81で落下スピードも水中と同様になる) |
1656,x | 12 | Tweaker1設定 | |
1662,x | 12 | Tweaker2設定 | |
166E,x | 12 | Tweaker3設定 | |
167A,x | 12 | Tweaker4設定 | |
1686,x | 12 | Tweaker5設定 | |
186C,x | 12 | y座標画面内フラグ | y座標が画面内にあるなら0 |
187B,x | 12 | マリオ跳ね返しフラグ | 01以上の時に踏むとブルを踏んだかのように跳ね返される。 |
190F,x | 12 | Tweaker6設定 | |
1938~ | 128 |
スプライト 読み込み可or不可フラグ |
00以外で消滅すると復活しなくなる。 |
1FD6,x | 12 | 雑多的なことに使える。 | |
1FE2,x | 12 |
00になるまで毎フレーム1ずつ減る。 ブロックによるはね飛ばしが効かなくなる。 |
|
7FAB9E,x | 12 | カスタムスプライト番号 | カスタムスプライトの場合はこちらが使われる。 |
7FAB10,x | 12 | 特別な情報etc | 特別な情報が2の場合は2bit目が0に、3の場合は1になる。 |
OAMdate
$ |
長 さ |
意味 | 備考 |
0200 | 200 | accessing OAM |
4*n+1は常に$F0だけれどもスプライトから書けば ちゃんと動作します |
0400 | 20 | OAM Size table | ↓に記述 |
0420 | 80 | OAM Size table | $0400の簡易版 |
$0200〜について、
スーパーファミコンでは128個のスプライトが使えます。
こう言われる所以はSpriteTileが128個分置けるようになっているからです。(16x16も8x8も同じ1tileと数える)
と言うより1tile=sprite1個
spriteでは1tileにつき4bytes使うので(128*4=)bytes分消費します。
$0400〜について、
SMWではSpriteTileSizeが8x8か16x16なので、適するspriteに動作するように値を設定すると16x16になります。
$0400の値(%) | 16x16になるsprite番号 |
00000010 | 1 |
00001010 | 1,2 |
10101010 | 1,2,3,4 |
$0401の値(%) | 16x16になるsprite番号 |
00000010 | 5 |
00001000 | 6 |
$0400 | $0401 | 16x16になるsprite番号 |
00000010 | 00000010 | 1,5 |
00001010 | 00000010 | 1,2,5 |
00000000 | 10000000 | 8 |
$0400 | $0401 | 16x16になるsprite | X座標+$0100されるsprite |
00000011 | 00000000 | 1 | 1 |
00001010 | 00000001 | 1,2 | 5 |
00001110 | 00000001 | 1,2 | 2,5 |
ブロックツール系
$ |
長 さ |
意味 | 備考 |
X | スプライトインデックス | spUD,LRで使用。触れたスプライトのが入るっぽい | |
Y | 16xページ番号 | タイル番号の0x100の位の数値 | |
03 | 1 | 16xタイル番号 | 一時的にこれが入るっぽい |
1693 | 1 | マリオが乗っているブロックの効果番号 下位 | 上位番号はYレジスタに代入される |
185F | 1 | スプライトが触れているブロックの効果番号 下位 | スプライトのRAMではないので注意 |
18D7 | 1 | スプライトが触れているブロックの効果番号 上位 | スプライトのRAMではないので注意 |
図1
($15,$17)
図2
($78)
図3
($0EF9)
0F08,0F23の部分は、左右反転されてしまうっぽい。
どう入れればどう出るのかは下の対応表の通り。

この方法だと残念ながら文字色がまちまちです。
それが嫌なら、Cにある「Level NAME」を使いましょう。
こちらは、ステータスバーより上の一列でいろいろできます。
その場合、$7FFFE0-$7FFFEFが今回の$0EF9にあたるものとなります。(変化させるためには$7FFFDFに01を入れておく)
図4 ($71)
00 | 何もしない |
01 | 点滅 |
02 | キノコを取った時のモリモリ |
03 | マント取得時の消滅(動けない) |
04 | フラワー取得時の点滅(動けない) |
05 | 横向きの土管に入る |
06 | 縦向きの土管に入る |
07 | 土管砲台から発射される |
08 | でっていう羽取った時みたいに空中ボーナスへ行く |
09 | 死ぬ(音楽・グラフィック変更なし) |
0A | 城の入り口の動き |
0B | マリオが停止 |
0C | 城を破壊するときの動き |
0D | マリオが停止して扉に入る |
0E-FF | ブラックアウト・CPUが停止 |
図5
($77)
下記の状態になるとそれぞれのbitが立ちます。1で触れている、0で触れていない
bit0 | マリオが右側の壁に |
bit1 | マリオが左側の壁に |
bit2 | マリオが地面に |
bit3 | マリオが上の壁(天井)に |
図6
($14C8,x)
00 | 消滅 |
01 | INIT中 |
02 | 甲羅、スターなどで吹き飛ばされた状態 |
03 | 踏みつぶされた状態 |
04 | スピンなどでつぶされた(煙になった)状態 |
05 | 溶岩に浸かった状態 |
06 | ゴール時のコインになった状態。パレットなどは手動で。 |
07 | ヨッシーに喰われている状態 |
08 | 通常 |
09 | マリオに投げられたor持てる状態 |
0A | 蹴られて滑っている状態 |
0B | マリオに持たれている状態 |
0C | ゴールテープを切ったときにアイテム化した状態 |
図7
($13E0)
00 | 立ち | 20 | でっていうに乗っている | |
01 | 歩き、歩幅は短い | 21 | 金網で回転中、裏側寄り | |
02 | 歩き、歩幅は広い | 22 | 金網につかまっている、マリオは裏側 | |
03 | 立ち止まって上を見ている | 23 | 金網を叩こうとしている、マリオは裏側 | |
04 | ⊂二( ^ω^)⊃、足は閉じている | 24 | 落下している | |
05 | ⊂二( ^ω^)⊃、歩幅は短い | 25 | あっちを見る、足は閉じている | |
06 | ⊂二( ^ω^)⊃、歩幅は広い | 26 | ゴール時の決めポーズ | |
07 | 物を持って立ち | 27 | でっていうを叩こうと手を振りかざしている | |
08 | 物を持って歩く、歩幅は短い | 28 | でっていうを叩く | |
09 | 物を持って歩く、歩幅は広い | 29 | でっていうに乗ってしゃがみ | |
0A | 物を持って上を見る | 2A | マント飛行、重心は後ろ、マント以外は欠けまくり | |
0B | ジャンプしている | 2B | マント飛行、重心は真ん中 | |
0C | ⊂二( ^ω^)⊃ジャンプ | 2C | マント飛行、重心はやや前、マント以外はマントが欠ける | |
0D | 急ブレーキ | 2D | マント飛行、重心は前、マント以外はマリオが欠ける | |
0E | 物を蹴っている | 2E | マント飛行、急降下直前、マント以外は欠けまくり | |
0F | 地震で静止している、( ゚д゚ ) | 2F | マント飛行、急降下中、マント以外はマントが欠ける | |
10 | 三角ブロックで斜めになっている | 30 | 爆風で黒こげ | |
11 | 壁を走っている、足は閉じている | 31 | 爆風で黒こげ、瞬き | |
12 | 壁を走っている、歩幅は短い | 32 | 真横を向いて覗き込んでいる、チビだと立ち | |
13 | 壁を走っている、歩幅は広い | 33 | 向こう側の上を見ている | |
14 | でっていうに乗ってゴール時の決めポーズ | 34 | あっちを見ている | |
15 | ツタや金網に捕まっている | 35 | ハンマーを振りかざす、チビだと01、02と同じ | |
16 | 泳ぎ、手は前に突き出して足は揃っている | 36 | ハンマーを振る最中、手は真上に | |
17 | 物を持って泳ぎ、足は揃っている | 37 | ハンマーを振り切った | |
18 | 泳ぎ、手は左右、開脚している | 38 | あっちを見てしゃがんでいる | |
19 | 物を持って泳ぎ、開脚している | 39 | 足は肩幅程度に開いてあっち見る、どう見ても立ちション | |
1A | 泳ぎ、手は左右、やや開脚している | 3A | 37と同じ | |
1B | 物を持って泳ぎ、やや開脚している | 3B | 37と同じだが、チビだと頭からスーパー状態の頭が生える | |
1C | 坂すべり | 3C | しゃがんでいる | |
1D | 物を持ってしゃがみ | 3D | 頭はスーパー、体はチビ | |
1E | 金網を叩こうとしている、マリオは手前側 | 3E | やられた | |
1F | 金網で回転中、手前側寄り | 3F | ファイアボールを撃っている | |
40、41 | マリオが消滅する | |||
42 | バルーンを取った状態、スーパーでも見た目だけチビになる | |||
43 | バルーンを取った状態、チビでも見た目だけ大きくなる | |||
44 | スーパーでのスピン時の後ろ。グラはスーパーの0Fと一緒 | |||
45 | スーパーでのスピン時の正面。グラはスーパーの25と一緒 | |||
46〜 | 他と同じだったりバグったりする、非推奨 |
チビの時にE0に2A〜2Fを代入するとマリオが消えてしまいます。
また、3D以降のポーズはパワーアップ状態にかかわらず、同じものです。
また、チビでキノコを取った時のにょきにょきの際、46が使われているようです。
込み入った話になるので簡単に言いますが、46はスーパーの00とデータ上まったく同じものです。
チビ時のポーズはCにあるList of Mario's Posesの方が正確ですが、英語です。
図8
($1EA2)1F01まで。
OWエディタの「マップタイルの設定」のマップ番号の0から順番に最後まで。
bit0 | 右に移動可 |
bit1 | 左に移動可 |
bit2 | 下に移動可 |
bit3 | 上に移動可 |
bit4 | セーブメッセージ表示 |
bit5 | クリア後は入れない |
bit6 | 中間フラグ |
bit7 | クリア済み |
ご覧のとおり「マップタイルの初期設定」と似てます。
「1F02:イベントフラグ」と組み合わせて使用するとよいでしょう。
なお「裏ワールドになるマップ」として設定したステージのbit7がON(+0x80)になると裏ワールドになります。本家では1EEB。
ステージ中でこの辺をいじるとOWに戻ったときに裏ワールド(あるいは元通り)に!なんてこともできます。
図9
($0100)
01 | Nintendo Presentsロゴ |
07 | タイトルデモ |
08 | プレイデータ選択 |
09 | イレースデータ |
0A | プレイヤー人数選択 |
0B | LEVEL中に入れるとOWに戻る |
0C | OW開始時のブラックアウト (*1) |
0D | OW開始時のブラックアウト |
0E | OW |
0F | OW中に入れると現在いるLEVELに入る |
11 | MARIO START |
13 | LeveL開始時のブラックアウト |
14 | LEVEL |
17 | TIME UP!,GAME OVER.etc |
1B | コクッパ撃破後のデモ |
29 | THE END |
(*1)0Cは一部エミュで不具合が起こる場合があるので、条件分岐などは0Dの方を使うことをオススメします。
サブルーチンアドレス表
JSLで↓のアドレスにジャンプさせることによって、そのアドレスに相当する効果が起こります。
スプライトに関するルーチンはこちら
アドレス (SNES) |
効果 | 備考 | 推奨タイミング |
$0086DF | Execute Ptr | 呼び出す直前のAの値に対応してJMLする | いつでも |
$00BEB0 | ブロックを生成 | 呼び出す前に$9C等に任意の値を入れておくこと | メイン |
$00CFC3 | 呼び出している間マリオが歩くアニメーションをする | これを利用して空中にいる間呼び出すと... | メインルーチン |
$00F388 | 1UPエフェクト | 分岐で1回だけ呼び出せば良い | メイン |
$00F5B7 | マリオがダメージを受ける | 毎フレーム処理危険 | メイン |
$00F606 | マリオ即死する | 同上 | メイン |
$00FA10 | 画面内のスプライト全消去 | マリオ以外全部消えます | メイン |
$01AA33 | 呼び出している間マリオ上昇していく | 横移動可 | メイン |
$01ACF9 | 乱数を取得 | 結果は$148D,Eにストアされる | メイン |
$02A9DE | 空きスプライト枠を探すルーチン | スプライト生成時 | |
$02D214 | 呼び出している間Pバルーン取得時と同じ効果 | マリオのイメージは変わらず横移動も不可 | メイン |
$03DFCC | カミナリが鳴る | メイン | |
$05B160 | OWに戻る | メイン |
謎のメモ
VRAM($0000〜$7FFF)
$0000〜 | GFX:FG1 |
$0800〜 | GFX:FG2 |
$1000〜 | GFX:BG1 |
$1800〜 | GFX:FG3 |
$2000〜 | BG1タイルマップ |
$3000〜 | BG2タイルマップ |
$4000〜 | GFX28 |
$4400〜 | GFX29 |
$4800〜 | GFX2A |
$4C00〜 | GFX2B |
$5000〜 | BG3タイルマップ |
$6000〜 | GFX:SP1 |
$6800〜 | GFX:SP2 |
$7000〜 | GFX:SP3 |
$7800〜 | GFX:SP4 |
BG1のタイルマップ更新は、RAM:$1BE5に従った位置に行われるようだ。
BE5をLowByte、$1BE4をHighByte兼スイッチとして。
LM1.7+ での変更点
$2000〜 | GFX:BG2 |
$2800〜 | GFX:BG3 |
$3000〜 | BG1タイルマップ(半サイズ) |
$3800〜 | BG2タイルマップ(半サイズ) |
MODE7使用時
$0000〜 | GFX:layer1 |
$4000〜 | GFX28 |
$4400〜 | GFX29 |
$4800〜 | GFX2A |
$4C00〜 | GFX2B |
$5000〜 | BG3タイルマップ |
$6000〜 | GFX:SP1 |
$6800〜 | GFX:SP2 |
$7000〜 | GFX:SP3 |
$7800〜 | GFX:SP4 |
http://www.smwcentral.net/?p=thread&id=34112 のパッチを使えば
上記のVRAM構成をlevel毎に変更することができるようだ
つまり、レイヤー3を犠牲にして更なるExGFXをぶちこむとか
例:ステータスバー以外のレイヤー3を犠牲にしてBG4,5を追加
$0000〜 | GFX:FG1 |
$0800〜 | GFX:FG2 |
$1000〜 | GFX:BG1 |
$1800〜 | GFX:FG3 |
$2000〜 | GFX:BG2 |
$2800〜 | GFX:BG3 |
$3000〜 | GFX:BG4 |
$3800〜 | GFX:BG5 |
$4000〜 | GFX28 |
$4400〜 | GFX29 |
$4800〜 | BG1タイルマップ(半サイズ) |
$5000〜 | BG3タイルマップ(半サイズ) |
$5800〜 | BG2タイルマップ(半サイズ) |
$6000〜 | GFX:SP1 |
$6800〜 | GFX:SP2 |
$7000〜 | GFX:SP3 |
$7800〜 | GFX:SP4 |
対オブジェクト判定
赤いドットは基準点
緑は各判定位置
基本的に上のドットが天井、下のドットが床判定…となっている
水中低下処理を行う場合waterの判定も取る
足場レイヤー2を使う場合判定を2回取る
JSL $019138(またはJSL $01802A)実行後は特定のメモリに触れたブロックの効果番号が返ってくる。
Addr | 値の意味 |
$1860 | 横判定が触れたブロックの効果番号LowByte |
$1862 | 横判定が触れたブロックの効果番号HighByte |
$185F | 縦判定が触れたブロックの効果番号LowByte |
$18D7 | 縦判定が触れたブロックの効果番号HighByte |
移動方向への方向の判定のみ取得している。なので速度が正の場合右・下。負の場合左・上になる。
横方向の判定はX速度がゼロの場合判定を取得しないので注意。
小技
ある処理を2フレームに1回行う
フレームカウンタが偶数のときのみ行う…とすればいいので
LDA $14 AND #%00000001 BNE NEXT (ここに望みの処理) NEXT:
2つの数字(2進法で考える)に対しAND演算をすると、
1と1→1
1と0→0
0と1→0
0と0→0
1桁目同士、2桁目同士…でそれぞれ上のような結果が返ってきます。
11011101と10010011をAND演算すると、10010001となります。
片方の値が未知の(0か1かわからない)ときはどうなるでしょうか。
?と0→0
?と1→?
ということは、8桁の数同士で考えると、
????????と00000001→0000000?
となります。
つまり、「ある数に00000001をANDする」ということは、
1の位をそのままに、他の位は全て0にするという効果を持ちます。
$14はフレームカウンターで、毎フレーム1増加されます。
2進法で考えると、その1の位は0→1→0→1→...と交互に変わります。
と00000001をANDした数というのは、
00000000と00000001と交互に変わるのです。
ここでBNE(もし0でなかったら、ラベルへ飛ぶ)を設置すれば、
2フレームに1回その間の処理を飛ばす、ということになるのですね。
余談でしょうが、AND計算する値を00000011とすれば4フレームに1回
00000111とすれば8フレームに1回の処理にできます。
2フレームに1回の場合は、以下の方法でも可能です。
LDA $14 LSR : BCS NEXT ; キャリーフラグが立っていれば処理を飛ばす (ここに望みの処理) NEXT:
論理右シフトを行うと値が半分になり、最下位ビットはキャリーフラグに書き込まれます。
つまり$14を右シフトすると2フレームに1回キャリーフラグが切り替わる事になり、
BCSを設置すれば2フレームに1回その間の処理を飛ばすことになります。
外部から特定のスプライトをいじる
自作のスプライトなら自分で操作しやすいですが、
そうでないのをいじるにはこうすればいいようです。
LevelASMでもコマンドスプライトでもブロックでもいいはず。
例えばマグナムキラーの速度を2倍にしようと思ったら…
LDY #!SprSize-1 LOOP: LDA !9E,y CMP #$9F ;いじりたいスプライト番号。マグナムキラーなら9F BNE NEXT SEC ;ここからNEXTの前までに処理を書く。 LDA !E4,y ;ただし弄るスプライト関連のメモリの,xは,yにして。 SBC #$01 ;スプライト関連のメモリについては鬼畜王マリオの方のページへ。 STA !E4,y ;ここでは、画面上の全マグナムキラーのx座標を毎フレーム-1。 LDA !14E0,y SBC #$00 STA !14E0,y NEXT: DEY BPL LOOP
以下、こういった外部からの操作の資料
●キラー
$C2,xが進行方向を決めます。
00,01,02,03,04,05,06,07がそれぞれ
右,左,上,下,右上,右下,左下,左上
●ボム兵
xを00から01にすると爆発します。
これだけでは音は鳴らないので、外部から音を鳴らしましょう。
xは、ボム兵の各モードで使われるタイマーですが、
毎フレーム1減ってゆき、00になるとモードが変わるようです。
爆発のときは、00になると爆発が終わります。
つまり、「ボム兵の爆風」を置きたいならば、
「yに01を、yに40程度の数値を入力したボム兵」を
ジェネレートし、効果音を鳴らせばいいわけです。
これで狙われたスクイッターが再現できますね!
このようにスプライトテーブルには雑多的に使われるものがありますが、
各スプライトにおけるテーブルの役割とかを
メモリビューアで調べると楽しいことができそうです。
この方法で外部操作することで、異常に機敏なブルとか、
ものすごいペースでパイポ投げるジュゲムとかが作れる気がします。
OWワープ
$ |
長 さ |
意味 | 備考 |
1DEA | 1 | OWページ | ステージクリア後に動かしたいイベント($FFで無し) |
1F02 | 15 | OWページ | イベントフラグ |
1F11 | 1 | OWページ マリオ | 要するにOWでカメラがどこを映すか。 |
1F12 | 1 | OWページ ルイージ | 上記のルイージ分 |
1F17 | 2 | OW マリオX座標 | 座標設定と1F11が合わないと、 |
1F19 | 2 | OW マリオY座標 | マリオは画面外を移動することになります。 |
1F1B | 2 | OW ルイージX座標 | 上記参考 |
1F1D | 2 | OW ルイージY座標 | 同じく |
上のRAMをカスタムブロックかなんかで弄れば、
次にOWに出たとき(クリアor死亡)ワープしてしまいます。
ステージの中に、両端からOWに戻れるマップを置いて、
その出口にそういったブロックを置いておけば、
通常、鍵に続く第3ゴールとしての役割をもたせられるでしょう。
この面をクリアしたら最後、戻れないという芸当も可能です。
鬼畜王マリオでも、雲のマップから落ちたら地上という演出もありましたね。
ただし、2Pプレイのことを考えると、
プレイヤーがマリオかルイージかで処理を分ける必要があるでしょう。
イベントフラグは、イベント0から1、2と順番に+0x80、+0x40、+0x20、+0x10、+0x08…と続いていくので注意。
ひとつのバイトにつき8イベントあり、全部で15バイトです。
1F11について補足すると、
0 | 1 | 2 | 3 | 4 | 5 | 6 |
OW | ヨースター島 | バニラ | 迷いの森 | クッパ | スペシャル | スター |
1F17,1F19について補足。LowByteのみを弄ってみたところ、
図の座標軸に対応する点に移動した。(数字は16進)
HighByteについて補足。
ワールドマップにおいてX座標Y座標ともに0で一番左上、X座標Y座標ともに2(LowByteはともに0)で一番右下になる。
その他の小さなマップではHighByteを弄る必要は無さそうです。
計算
できない時は答えを読み込む前にNOPをいくつか入れるとできるかも
$4203 $4206 $211Cへ書き込みを行うと演算が行われるので
これらのレジスタへ先に書き込むのは推奨しません。
-
かけ算(8bit×8bit→16bit)
$4202に被乗数~ >半角 >で始めると引用文になります。 $4203に乗数を代入すると
8サイクル後に$4216-$4217に答えが返ってくる。
$4202の値は初期化されずに残る
-
16bit×8bit→24bit
$211B(1回目)$211Bに被乗数の下位8bitをセット
$211B(2回目)$211Bに被乗数の上位8bitをセット
$211Cに乗数の8bitをセット
16サイクル後に$2134-$2136に乗算結果(24bit)が入ります。
$211Bの値は初期化されずに残る
ただし画面モードが7だと拡大縮小回転機能に使用されるので使えません
//(V-Blank中は画面描画を行ってないので使用可能)
符号有りで演算するので注意して下さい
-
わり算(16bit÷8bit→16bit)
$4204-$4205に被除数
$4206に除数を代入すると
16サイクル後に
$4214-$4215に商が $4216に余りが返ってくる。
$4204-$4205の値は初期化されずに残る
ゼロ除算が発生した場合$4214-$4215の値は$FFFFになり、$4216の値は被除数の値になる。
-
SA-1ROMの場合は
$2250にかけ算の場合は00を、割り算の場合は01を代入
$2251-$2252に被乗数又は被除数を
$2253-$2254に乗数又は除数を代入すると($2254に値を代入すると計算されます。)
かけ算の場合は$2306-$2309に乗算結果(32bit)が入ります。
割り算の場合は$2306-$2307に商が(16bit)が、$2308-$2309に余り(16bit)が入ります。
ゼロ除算が発生した場合$2306-$2309の値は$00000000になります。
いずれも符号有りで演算します
16bitモードと8bitモードの切り替え
REP #$20 ;16bitモードの時にしたい命令 SEP #$20
ステータスレジスタを切り替えてアキュームレータのモードを切り替えてます。
試しにINC Eとか命令を入れてそのアドレスを監視してみると8bitとの違いが良く分かります。
A,X,Y全て16bitにしたい場合はREP #$30とすれば良いらしい。
MVP、MVNについてお困りのあなたのための解説
ある時パッと閃いてMVP,MVNを使ったASMコードを作ろう!
と思ったあなたはいつものようにコードを書いたのであった。
こうして書いたコード、いつも通り完璧な出来だ! ただ一つMVP,MVNを除いては…
挿入してみると全く思ったような動作をしてくれない!特にMVP,MVNを書いた後のラベルを使う所を中心に…なぜ?
MVP,MVNはRAM、ROMなどから大量のデータを転送するのに65c816内で最も最適な命令です。しかし、それに伴ってA,X,Yレジスタを16bitで消費するという不便な点も…
実はそれに加えてDBレジスタの値も同時に変更してしまう結構面倒な命令なんです。
その回避法は↓
PHB
〜MVP,MVNを使ったコード〜
PLB
これでOKなはず。(スプライトならもちろんPHXも忘れずに)