裏CHUNSOFT > ゲーム解析入門 > 命令一覧

命令一覧

未完成ですが、よく使われる命令は殆ど書いてあると思います。

ここではXXはその値、{XX}はメモリのアドレス{XX}の値を意味します。 1バイトや2バイトでメモリのアドレスが指定された場合、実際に読み書きされるアドレスがどこになるかは基礎知識を参照して下さい。

コード命令意味
00 XXBRK #$XX割り込み、{FFE6} にジャンプ
01 XXORA ($XX+"X")"A" = "A" or {{XX+"X"}(2バイト読み込み)}
02 XXCOP #$XX割り込み、{FFE4} にジャンプ
03 XXORA $XX+"S""A" = "A" or {XX+"S"}
04 XXTSB $XX{XX} = {XX} or "A"
05 XXORA $XX"A" = "A" or {XX}
06 XXASL $XX$XX *= 2
07 XXORA [$XX]"A" = "A" or {{XX}(3バイト読み込み)}
08PHP"P" をプッシュ
09 XXORA #$XX"A" = "A" or XX
0AASL"A" *= 2
0BPHD"D" をプッシュ
0C XX YYTSB $YYXX{YYXX} = {YYXX} or "A"
0D XX YYORA $YYXX"A" = "A" or {YYXX}
0E XX YYASL $YYXX{YYXX} *= 2
0F XX YY ZZORA $ZZYYXX"A" = "A" or {ZZYYXX}
10 XXBPL #$XXN = 0 のとき相対ジャンプ
18CLCC = 0
1AINC"A" ++
1BTCS"S" = "A"
1F XX YY ZZORA $ZZYYXX+"X""A" = "A" or {ZZYYXX+"X"}
20 XX YYJSR $YYXXYYXX にジャンプ
22 XX YY ZZJSL $ZZYYXXZZYYXX にジャンプ
28PLP"P" にプル
29 XXAND #$XX"A" = "A" and XX
30 XXBMI #$XXN = 1 のとき相対ジャンプ
38SECC = 1
3BTSC"A" = "S"
3ADEC"A" --
40RTI元の命令へ(割り込みから復帰), I = 0
42WDM将来拡張用の未定義命令、何もしない
45 XXEOR $XX"A" xor {XX}
48PHA"A" をプッシュ
49 XXEOR #$XX"A" = "A" xor XX
4ALSR"A" /= 2, C = (余り)
4BPHK"PB" をプッシュ
4C XX YYJMP $YYXXYYXX にジャンプ
58CLII = 0
5APHY"Y" をプッシュ
5BTCD"D" = "A"
5C XX YY ZZJMP $ZZYYXXZZYYXX にジャンプ
60RTS元の命令へ(JSRに対して)
64 $XXSTZ $XX{XX} = 0
68PLA"A" にプル
69 XXADC #$XX"A" += XX + C
6BRTL元の命令へ(JSLに対して)
78SEII = 1
7C XX YYJMP ($YYXX+"X"){YYXX+"X"}(2バイト読み込み) にジャンプ
80 XXBRA #$XX無条件で相対ジャンプ
81 XXSTA ($XX+"X"){{XX+"X"}(2バイト読み込み)} = "A"
82 XX YYBRL $YYXX無条件で相対ジャンプ
83 XXSTA $XX+"S"{XX+"S"} = "A"
84 XXSTY $XX{XX} = "Y"
85 XXSTA $XX{XX} = "A"
86 XXSTX $XX{XX} = "X"
87 XXSTA [$XX]{{XX}(3バイト読み込み)} = "A"
88DEY"Y" --
89 XXBIT #$XX"A" and XX を計算して、その結果に応じて "P" を変化させる
8ATXA"A" = "X"
8BPHB"DB" をプッシュ
8C XX YYSTY $YYXX{YYXX} = "Y"
8D XX YYSTA $YYXX{YYXX} = "A"
8E XX YYSTX $YYXX{YYXX} = "X"
8F XX YY ZZSTA $ZZYYXX{ZZYYXX} = "A"
90 XXBCC #$XXC = 0 のとき相対ジャンプ
91 XXSTA ($XX)+"Y"{{XX}(2バイト読み込み)+"Y"} = "A"
92 XXSTA ($XX){{XX}(2バイト読み込み)} = "A"
93 XXSTA ($XX+"S")+"Y"{{XX+"S"}(2バイト読み込み)+"Y"} = "A"
94 XXSTY $XX+"X"{XX+"X"} = "Y"
95 XXSTA $XX+"X"{XX+"X"} = "A"
96 XXSTX $XX+"Y"{XX+"Y"} = "X"
97 XXSTA [$XX]+"Y"{{XX}(3バイト読み込み)+"Y"} = "A"
98TYA"A" = "Y"
99 XX YYSTA $YYXX+"Y"{YYXX+"Y"} = "A"
9ATSX"X" = "S"
9BTXY"Y" = "X"
9C XX YYSTZ $YYXX{YYXX} = 0
9D XX YYSTA $YYXX+"X"{YYXX+"X"} = "A"
9E XX YYSTZ $YYXX+"X"{YYXX+"X"} = 0
9F XX YY ZZSTA $ZZYYXX+"X"{ZZYYXX+"X"} = "A"
A2 XXLDX #$XX"X" = XX
A3 XXLDA $XX+"S""A" = {XX+"S"}
A5 XXLDA $XX"A" = {XX}
A9 XXLDA #$XX"A" = XX
AATAX"X" = "A"
ABPLB"DB" にプル
AE XX YYLDX $YYXX"X" = {YYXX}
B0 XXBCS #$XXC = 1 のとき相対ジャンプ
B1 XXLDA ($XX)+"Y""A" = {{XX}(2バイト読み込み)+"Y"}
B7 XXLDA [$XX]+"Y""A" = {{XX}(3バイト読み込み)+"Y"}
B9 XX YYLDA $YYXX+"Y""A" = {YYXX+"Y"}
BBTYX"X" = "Y"
BF XX YY ZZLDA $ZZYYXX+"X""A" = {ZZYYXX+"X"}
C0 XXCPY #$XX"Y" - XX を計算して、その結果に応じて "P" を変化させる
C2 XXREP #$XX"P" = "P" and (not XX)
C4 XXCPY $XX"Y" - {XX} を計算して、その結果に応じて "P" を変化させる
C5 XXCMP $XX"A" - {XX} を計算して、その結果に応じて "P" を変化させる
C8INY"Y" ++
C9 XXCMP #$XX"A" - XX を計算して、その結果に応じて "P" を変化させる
CADEX"X" --
D0 XXBNE #$XXZ = 0 のとき相対ジャンプ
D8CLDD = 0
DAPHX"X" をプッシュ
DBSTPCPUを停止
E0 XXCPX #$XX"X" - XX を計算して、その結果に応じて "P" を変化させる
E2 XXSEP #$XX"P" = "P" or XX
E6 XXINC $XX{XX} ++
E8INX"X" ++
EANOP何もしない
EBXBA"A" の上位バイトと下位バイトを交換
ED XX YYSBC $YYXX"A" -= {YYXX} - C + 1
F0 XXBEQ #$XXZ = 1 のとき相対ジャンプ
F4 XX YYPEA $YYXXYYXX をプッシュ
FBXCEC と E を交換
FF XX YY ZZSBC $ZZYYXX+"X""A" -= {ZZYYXX+"X"} - C + 1

補足説明

相対ジャンプの引数は符号付き1バイト(BRLは符号付き2バイト)です。 基点は次の命令の1バイト目です。 dis65816ではジャンプ先のアドレスも出力してくれます。

REPは引数の1のビットに対応する"P"のビットを0にする、SEPは引数の1のビットに対応する"P"のビットを1にする、ということです。 殆どは"A","X","Y"のサイズを変更するのに使われます。 と言うかそれ以外の目的で使われているのを見たことがありません。 以下にサイズ変更の場合のパターンを列挙しておきますが、どうしてそうなるのかを命令一覧の数式から納得して下さい。

dis65816の問題

dis65816は、逆アセンブル結果にコメントも付加してくれますが、鵜呑みにしてはいけません。 例えば、LDA $XXとLDA $XX+"S"を区別してくれませんし、加算命令は引数に加えてC("P"のbit0)の値も加えなければなりません。 コメントは自分でしっかり書きましょう。

また、LDA #$XXのような値を直接レジスタに入れる命令は、X,M("P"のbit4,5)によって引数のバイト数が変わります。 これにより、しばしば逆アセンブルのミスを起こします。 何かおかしいと思ったら最後のREP,SEP命令を見て、それが逆アセンブル結果と矛盾するようであれば、命令一覧を参考に自分で手直しする必要があります。

2010年3月28日更新

裏CHUNSOFT > ゲーム解析入門 > 命令一覧