アットウィキロゴ
 

ここは?

65C816プログラミングの説明が非常に丁寧なので、
そして板のほうで重複はまずいと言われたので、
こちらは講座ではなく資料集でも作ってみようと思います。

目次

ASM命令表

バイナリ&ASM一覧
65c816資料/ASM命令表

資料リンク

  • 文書

[http://web.archive.org/web/20071111200111/http://www.geocities.com/Qwertie256/attic/snesemu/qsnesdoc.html グラフィック関連](Internet Archive)
[http://patpend.net/technical/snes/snes.txt PPUレジスタ関連]
[http://en.wikibooks.org/wiki/Super_NES_Programming SFCプログラミング全般]

弄りがいのあるRAMの表

やっぱ日本語がいいよね!
他に良く使うものがあったらどんどん追加してください。


  • 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が入っている。

http://vip.rgr.jp/sm4wiki/image/lm/save.gif システム系

$ 長さ 意味 備考
0013 1 フレームカウンター1 毎フレーム1増える
0014 1 フレームカウンター2 毎フレーム1増えるが、ロック時には止まる
0015 1 コントローラー入力データ1  図1参照↓
0016 1 コントローラー入力データ1 (1フレームだけ) 図1参照↓
0017 1 コントローラー入力データ2  図1参照↓
0018 1 コントローラー入力データ2 (1フレームだけ)  図1参照↓
0100 1 ゲームモード 図9参照↓
13BF 1 level(メッセージ用)  メッセージ表示時に、どの面のを表示するか
これ弄れば他の面のメッセージ出せます
13CE 1 中間ゲートを通ったか 0=通ってない 1=通った
1426 1 メッセージトリガー  01…メッセージ1を表示。02…同2。03…でっていう初登場。
04…でかいスイッチ押したときに出るメッセージ。
そのあとOWに戻るとスイッチがばら撒かれる
(実際は押してないことになってる。)
1697 1 敵を連続で踏んだ回数

http://vip.rgr.jp/sm4wiki/image/ow/layer2.gif OW系

$ 長さ 意味 備考
0DFB 1 OW アニメーション用RAM OW状態の時、値が増加していき、0Bの後00に戻る。LEVELに入ると止まる。
13C1 1 OW 16x16タイルマップ 現在マリオが載っている16x16タイルの番号
入る値はhttp://vip.rgr.jp/sm4wiki/image/ow/16tile.gifの値と同じ
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座標 同じく

http://vip.rgr.jp/sm4wiki/image/ow/level.gif ステージ系

$ 長さ 意味 備考
0064 1 Sprite Layer http://vip.rgr.jp/sm4wiki/image/lm/map_base.gifのマップモード指定にあるSprite Layerの値が入る
0085 1 水中面フラグ 00で通常、01でステージ全体が水中面となる
0086 1 滑りやすさ 00で通常、01からFFになるほどステージ全体が滑りやすくなる。
ちなみに、オリジナルの氷属性面は80となっている
0DAE 1 明るさ 0からFまで。演出にどうぞ。
0DDA 1 Music http://vip.rgr.jp/sm4wiki/image/ow/submap_music.gifの音楽の詳細設定を参照、実際に値を変えても変更不可能
たぶんスターの音楽を直したりする時に使われる
0F25 3 残り時間 0F25が100の位、0F26が10の位、0F27が1の位
141C 1 秘密ゴールフラグ 00で通常、01で秘密ゴール扱いになる
1425 1 ボーナスゲームフラグ 00でボーナスゲームは発生しない、FF(?)で発生?
1493 1 ゴールさせる FF代入でゴール。音は自分でいじる必要あり。
そのままだと連続で処理して疑似フリーズするので分岐処理などで1回だけ行わせる必要あり
186B 1 10コインブロックタイマー 01で10コインブロックがただのブロックになる
1890 1 ボーナスゲームの残り1うpキノコ数
1925 1 マップモード http://vip.rgr.jp/sm4wiki/image/lm/map_base.gifで指定するマップモードの番号が入る
1DFB 1 Music 0DDAの変更できる版http://vip.rgr.jp/sm4wiki/image/ow/submap_music.gif参照。
1DFC 1 効果音 効果音一覧の番号代入で鳴る
1F27 4 でかいスイッチを押したか 緑,黄色,青,赤の順。00 OFF/01 ON

http://vip.rgr.jp/sm4wiki/image/lm/layer1.gif スクロール系

$ 長さ 意味 備考
0022 2 レイヤー3の位置(x)
0024 2 レイヤー3の位置(y) 水面の高さとか弄れます。通常は0060
0055 2 レイヤー1の描画モードの指定(縦) が0の時はどの値を入れても反応しない。これを応用すると・・・?
1411 1 水平スクロール 0 スクロールしない/1 する
1412 1 垂直スクロール 0 スクロールしない/1 する
1462 2 レイヤー1の位置(x) 要するにカメラの位置
1464 2 レイヤー1の位置(y) 適当に代入すると崩れるっぽい
1466 2 レイヤー2の位置(x)
1468 2 レイヤー2の位置(y)

http://vip.rgr.jp/sm4wiki/image/lm/map_base.gif マリオ状態系

$ 長さ 意味 備考
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 マリオの横方向速度 右が正 00〜7F=右(数が大きいほど速い) 80〜FF=左(数が小さいほど速い)
007D 1 マリオの縦方向速度 下が正 00〜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で凍った《色だけ》
0DBE 1 残機
0DBF 1 コイン数
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 スタータイマー 毎フレーム減って00で切れる
1496 1 マリオ汎用アニメタイマー? 歩き、走り時00で次イメージになる。死亡時のタイマー。きのこ、ダメージのにょきにょきタイマー
1497 1 マリオ無敵タイマー ダメージを受けた後の点滅
149F 1 マント飛行タイマー マントマリオで猛ダッシュからジャンプした瞬間に代入、減少開始
00で飛行に移るが、00を常時代入していると飛行不可
14A2 1 マントイメージタイマー 00で次イメージ
14A4 1 マント飛行タイマー 重力を受けない時間
14A6 1 マリオが回転するタイマー 毎フレーム減って00で切れる
14AD 1 青Pタイマー 同じく
14AE 1 銀Pタイマー 同じく
14AF 1 ON/OFFスイッチフラグ 00:ON/01:OFF
1887 1 地面を揺らすタイマー 毎フレーム減って00で切れる
1891 1 Pバルーンタイマー 同じく
18BD 1 マリオ硬直タイマー 同じく

http://vip.rgr.jp/sm4wiki/image/lm/ext_gfx.gif 画面上系

$ 長さ 意味 備考
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 キャラのコイン数
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)

http://vip.rgr.jp/sm4wiki/image/lm/add_sprites.gif ヨッシー系

$ 長さ 意味 備考
0EF8 1 でっていう初登場フラグ  00なら未登場、ヨッシーの挨拶有り。
141E 1 でっていうの状態フラグ  01でマリオがファイアを出せる、02で翼あり
187A 1 でっていうに乗っているかのフラグ 00:乗っていない/1or2:乗っている
18E7 1 でっていうの状態フラグ2 01で地面着地時に煙がでる

http://vip.rgr.jp/sm4wiki/image/ow/sprite_list.gif その他

$ 長さ 意味 備考
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 汎用タイマー オープニング待機時間の他様々に使われる

http://vip.rgr.jp/sm4wiki/image/lm/sprite.gif スプライトテーブル

$ 長さ 意味 備考
9E,x 12 スプライト番号 Lunar Magic/スプライトリスト一覧表を参考
AA,x 12 垂直スピード $01802Aなどのルーチンの対応番号
B6,x 12 水平スピード 上に同じ
D8,x 12 y座標(ドット単位)
E4,x 12 x座標(ドット単位)
14D4,x 12 y座標(ページ単位)
14E0,x 12 x座標(ページ単位)
14C8,x 12 スプライトの状態 図6参照↓
1504,x 12 物投げタイマー
161A,x 12 インデックスinLevel $FFでスプライトが画面外に行くともう出てこない
163E,x 12 ジャンプタイマー
164A,x 12 水中・溶岩フラグ? +0x01=水中、+0x80=溶岩(+0x81で落下スピードも水中と同様になる)

http://vip.rgr.jp/sm4wiki/image/ow/sprite.gif 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



http://vip.rgr.jp/sm4wiki/image/lm/16tile_map.gif ブロックツール系

$ 長さ 意味 備考
X スプライトインデックス spUD,LRで使用。触れたスプライトのが入るっぽい
Y 16xページ番号 タイル番号の0x100の位の数値
03 1 16xタイル番号 一時的にこれが入るっぽい
1693 1 マリオが乗っているブロックの効果番号 下位 上位番号はYレジスタに代入される
185F 1 スプライトが触れているブロックの効果番号 下位 スプライトのRAMではないので注意
18D7 1 スプライトが触れているブロックの効果番号 上位 スプライトのRAMではないので注意


図1 ($15,$17)

#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
      図2 ($78)
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (mario.png)




図3 ($0EF9)
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。

0F08,0F23の部分は、左右反転されてしまうっぽい。
どう入れればどう出るのかは下の対応表の通り。

#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (図3B.png)


この方法だと残念ながら文字色がまちまちです。
それが嫌なら、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 マリオに投げられた状態
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 乱数を取得 結果はDと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


対オブジェクト判定

赤いドットは基準点
緑は各判定位置
基本的に上のドットが天井、下のドットが床判定…となっている

#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (ObjClipping.png)

水中低下処理を行う場合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にするという効果を持ちます。

はフレームカウンターで、毎フレーム1増加されます。
2進法で考えると、その1の位は0→1→0→1→...と交互に変わります。
と00000001をANDした数というのは、
00000000と00000001と交互に変わるのです。
ここでBNE(もし0でなかったら、ラベルへ飛ぶ)を設置すれば、
2フレームに1回その間の処理を飛ばす、ということになるのですね。

余談でしょうが、AND計算する値を00000011とすれば4フレームに1回
00000111とすれば8フレームに1回の処理にできます。


外部から特定のスプライトをいじる

 自作のスプライトなら自分で操作しやすいですが、
 そうでないのをいじるにはこうすればいいようです。
 LevelASMでもコマンドスプライトでもブロックでもいいはず。
 例えばマグナムキラーの速度を2倍にしようと思ったら…

LDY #$0B 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進)

#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (a.png)

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の値は被除数の値になる。

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も忘れずに)

コメント

最終更新:2011年04月16日 17:42