命令一覧
未完成ですが、よく使われる命令は殆ど書いてあると思います。
ここではXXはその値、{XX}はメモリのアドレス{XX}の値を意味します。 1バイトや2バイトでメモリのアドレスが指定された場合、実際に読み書きされるアドレスがどこになるかは基礎知識を参照して下さい。
| コード | 命令 | 意味 |
|---|---|---|
| 00 XX | BRK #$XX | 割り込み、{FFE6} にジャンプ |
| 01 XX | ORA ($XX+"X") | "A" = "A" or {{XX+"X"}(2バイト読み込み)} |
| 02 XX | COP #$XX | 割り込み、{FFE4} にジャンプ |
| 03 XX | ORA $XX+"S" | "A" = "A" or {XX+"S"} |
| 04 XX | TSB $XX | {XX} = {XX} or "A" |
| 05 XX | ORA $XX | "A" = "A" or {XX} |
| 06 XX | ASL $XX | $XX *= 2 |
| 07 XX | ORA [$XX] | "A" = "A" or {{XX}(3バイト読み込み)} |
| 08 | PHP | "P" をプッシュ |
| 09 XX | ORA #$XX | "A" = "A" or XX |
| 0A | ASL | "A" *= 2 |
| 0B | PHD | "D" をプッシュ |
| 0C XX YY | TSB $YYXX | {YYXX} = {YYXX} or "A" |
| 0D XX YY | ORA $YYXX | "A" = "A" or {YYXX} |
| 0E XX YY | ASL $YYXX | {YYXX} *= 2 |
| 0F XX YY ZZ | ORA $ZZYYXX | "A" = "A" or {ZZYYXX} |
| 10 XX | BPL #$XX | N = 0 のとき相対ジャンプ |
| 18 | CLC | C = 0 |
| 1A | INC | "A" ++ |
| 1B | TCS | "S" = "A" |
| 1F XX YY ZZ | ORA $ZZYYXX+"X" | "A" = "A" or {ZZYYXX+"X"} |
| 20 XX YY | JSR $YYXX | YYXX にジャンプ |
| 22 XX YY ZZ | JSL $ZZYYXX | ZZYYXX にジャンプ |
| 28 | PLP | "P" にプル |
| 29 XX | AND #$XX | "A" = "A" and XX |
| 30 XX | BMI #$XX | N = 1 のとき相対ジャンプ |
| 38 | SEC | C = 1 |
| 3B | TSC | "A" = "S" |
| 3A | DEC | "A" -- |
| 40 | RTI | 元の命令へ(割り込みから復帰), I = 0 |
| 42 | WDM | 将来拡張用の未定義命令、何もしない |
| 45 XX | EOR $XX | "A" xor {XX} |
| 48 | PHA | "A" をプッシュ |
| 49 XX | EOR #$XX | "A" = "A" xor XX |
| 4A | LSR | "A" /= 2, C = (余り) |
| 4B | PHK | "PB" をプッシュ |
| 4C XX YY | JMP $YYXX | YYXX にジャンプ |
| 58 | CLI | I = 0 |
| 5A | PHY | "Y" をプッシュ |
| 5B | TCD | "D" = "A" |
| 5C XX YY ZZ | JMP $ZZYYXX | ZZYYXX にジャンプ |
| 60 | RTS | 元の命令へ(JSRに対して) |
| 64 $XX | STZ $XX | {XX} = 0 |
| 68 | PLA | "A" にプル |
| 69 XX | ADC #$XX | "A" += XX + C |
| 6B | RTL | 元の命令へ(JSLに対して) |
| 78 | SEI | I = 1 |
| 7C XX YY | JMP ($YYXX+"X") | {YYXX+"X"}(2バイト読み込み) にジャンプ |
| 80 XX | BRA #$XX | 無条件で相対ジャンプ |
| 81 XX | STA ($XX+"X") | {{XX+"X"}(2バイト読み込み)} = "A" |
| 82 XX YY | BRL $YYXX | 無条件で相対ジャンプ |
| 83 XX | STA $XX+"S" | {XX+"S"} = "A" |
| 84 XX | STY $XX | {XX} = "Y" |
| 85 XX | STA $XX | {XX} = "A" |
| 86 XX | STX $XX | {XX} = "X" |
| 87 XX | STA [$XX] | {{XX}(3バイト読み込み)} = "A" |
| 88 | DEY | "Y" -- |
| 89 XX | BIT #$XX | "A" and XX を計算して、その結果に応じて "P" を変化させる |
| 8A | TXA | "A" = "X" |
| 8B | PHB | "DB" をプッシュ |
| 8C XX YY | STY $YYXX | {YYXX} = "Y" |
| 8D XX YY | STA $YYXX | {YYXX} = "A" |
| 8E XX YY | STX $YYXX | {YYXX} = "X" |
| 8F XX YY ZZ | STA $ZZYYXX | {ZZYYXX} = "A" |
| 90 XX | BCC #$XX | C = 0 のとき相対ジャンプ |
| 91 XX | STA ($XX)+"Y" | {{XX}(2バイト読み込み)+"Y"} = "A" |
| 92 XX | STA ($XX) | {{XX}(2バイト読み込み)} = "A" |
| 93 XX | STA ($XX+"S")+"Y" | {{XX+"S"}(2バイト読み込み)+"Y"} = "A" |
| 94 XX | STY $XX+"X" | {XX+"X"} = "Y" |
| 95 XX | STA $XX+"X" | {XX+"X"} = "A" |
| 96 XX | STX $XX+"Y" | {XX+"Y"} = "X" |
| 97 XX | STA [$XX]+"Y" | {{XX}(3バイト読み込み)+"Y"} = "A" |
| 98 | TYA | "A" = "Y" |
| 99 XX YY | STA $YYXX+"Y" | {YYXX+"Y"} = "A" |
| 9A | TSX | "X" = "S" |
| 9B | TXY | "Y" = "X" |
| 9C XX YY | STZ $YYXX | {YYXX} = 0 |
| 9D XX YY | STA $YYXX+"X" | {YYXX+"X"} = "A" |
| 9E XX YY | STZ $YYXX+"X" | {YYXX+"X"} = 0 |
| 9F XX YY ZZ | STA $ZZYYXX+"X" | {ZZYYXX+"X"} = "A" |
| A2 XX | LDX #$XX | "X" = XX |
| A3 XX | LDA $XX+"S" | "A" = {XX+"S"} |
| A5 XX | LDA $XX | "A" = {XX} |
| A9 XX | LDA #$XX | "A" = XX |
| AA | TAX | "X" = "A" |
| AB | PLB | "DB" にプル |
| AE XX YY | LDX $YYXX | "X" = {YYXX} |
| B0 XX | BCS #$XX | C = 1 のとき相対ジャンプ |
| B1 XX | LDA ($XX)+"Y" | "A" = {{XX}(2バイト読み込み)+"Y"} |
| B7 XX | LDA [$XX]+"Y" | "A" = {{XX}(3バイト読み込み)+"Y"} |
| B9 XX YY | LDA $YYXX+"Y" | "A" = {YYXX+"Y"} |
| BB | TYX | "X" = "Y" |
| BF XX YY ZZ | LDA $ZZYYXX+"X" | "A" = {ZZYYXX+"X"} |
| C0 XX | CPY #$XX | "Y" - XX を計算して、その結果に応じて "P" を変化させる |
| C2 XX | REP #$XX | "P" = "P" and (not XX) |
| C4 XX | CPY $XX | "Y" - {XX} を計算して、その結果に応じて "P" を変化させる |
| C5 XX | CMP $XX | "A" - {XX} を計算して、その結果に応じて "P" を変化させる |
| C8 | INY | "Y" ++ |
| C9 XX | CMP #$XX | "A" - XX を計算して、その結果に応じて "P" を変化させる |
| CA | DEX | "X" -- |
| D0 XX | BNE #$XX | Z = 0 のとき相対ジャンプ |
| D8 | CLD | D = 0 |
| DA | PHX | "X" をプッシュ |
| DB | STP | CPUを停止 |
| E0 XX | CPX #$XX | "X" - XX を計算して、その結果に応じて "P" を変化させる |
| E2 XX | SEP #$XX | "P" = "P" or XX |
| E6 XX | INC $XX | {XX} ++ |
| E8 | INX | "X" ++ |
| EA | NOP | 何もしない |
| EB | XBA | "A" の上位バイトと下位バイトを交換 |
| ED XX YY | SBC $YYXX | "A" -= {YYXX} - C + 1 |
| F0 XX | BEQ #$XX | Z = 1 のとき相対ジャンプ |
| F4 XX YY | PEA $YYXX | YYXX をプッシュ |
| FB | XCE | C と E を交換 |
| FF XX YY ZZ | SBC $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日更新