NES on FPGA 2005/08/26

CPU (Central Processing Unit)

 NESにはRICOH製RP2A03が搭載されています。 これはMOS Technology社製プロセッサ6502の仕様をRICOHがコアとして設計し、 10進モード演算を排除、サウンド機能を追加したものです。 CMOS化された65C02はバグフィクスや命令拡張が行われています。

 6502プロセッサは使用可能な内部レジスタが少ないものの、 豊富なアドレッシングモードとその安価さからAppleIIに採用され、 当時としては高いコストパフォーマンスを誇ったそうです。

この説明では10進モード演算についての説明は省いています。

[レジスタ] [スタック] [割り込み] [トラップ] [アドレッシング] [命令セット] [実行クロック数] [アドレッシングサイクル]

! 現在でもRICOH製6502がIPコアとして利用可能と耳にしたので問い合わせてみたところ、 数年前に開発元とのライセンス契約などの更新を停止したため利用できません、とのこと。

MOS TECHNOLOGY社のMCS6500シリーズデータシートと、 RICOHの65C02データシートを参考にしています。

_
レジスタ

 6502で使用可能な内部レジスタは次のようになっており、 プログラムカウンタは16ビット、それ以外は8ビットです。
15     87     0用途
Aアキュームレータ
Xインデックスレジスタ
Yインデックスレジスタ
PCプログラムカウンタ
$01SPスタックポインタ
Pプロセッサステータスレジスタ

プロセッサステータスレジスタの各ビットは分岐命令などでフラグとして使用します。 ビット5は使用せず、常にセット(1をストア)しておきます。
7654 3210
ステータスフラグNV1B DIZC

N(Negative flag)
演算結果のビット7をストアします。 BIT命令ではメモリ値のビット7をストアします。
V(oVerflow flag)
演算によって$7F-$80をまたぐときにセットし、 そうでないならクリア(0をストア)します。 またBIT命令でメモリ値のビット6をストアし、CLV命令でクリアします。
B(Break flag)
BRK命令による割り込みが発生したときにセットします。 NMIやIRQの場合はクリアします。
D(Decimal flag)
オリジナルの6502ではこのフラグをセットすることによって、 演算命令で10進演算が使用されます。NESでは10進演算は削除されているため、 このフラグは無視します。 ただし、SED、CLD命令によって操作は可能です。
I(Interrupt flag)
割り込みが発生するとセットします。 またCLI命令でクリア、SEI命令でセットします。
Z(Zero flag)
演算結果がゼロであった場合にセットし、 そうでない場合はクリアします。
C(Carry flag)
ADC命令によってビット7からの桁上げが発生したとき、 SBC、CMP、CPX、CPX命令によってビット7からの桁上げが発生しなかったときにセットします。 またASL、ROL命令ではAのビット7を、LSR、ROR命令ではAのビット0をストアします。 CLC命令でクリア、SEC命令でセットします。
! こんだけ、でも人に言わせるとゼロページに256本あるじゃないか!らしい。

68系の6502はCPUではなく、MPUだそうだ。 ここではあくまでNESの“CPU”として扱う。

6502の読みは「ろくごーまるに」とか、 海外勢は「シックスファイブオーツー」とか。

_
スタック

 スタックは256バイトが使用可能で、WRAMのうち$0100〜$01FFが割り当てられます。 スタックアドレスの下位バイトとしてスタックポインタ(SP)を使用し、上位バイトは$01固定です。 スタックへプッシュすることでSPはアドレスの値が小さい方向へ伸びます。

 スタック操作は次の順序で行います。
・PUSH:データストア → SPデクリメント
・POP :SPインクリメント → データフェッチ

! データシートには詳しく記述されてない。スタック領域を直接いじるなってこと?

多くのゲームではSPの初期値として$FFをストアしている。

_
割り込み

 割り込みは、RESET、NMI、IRQ、BRKがあります。 NMI、IRQはハードウエア割り込みでアクティブローとなっています。 BRKはソフトウエア割り込みです。 割り込みベクタによって規定アドレスにジャンプします。
割り込み下位バイト上位バイト
NMI$FFFA$FFFB
RESET$FFFC$FFFD
IRQ、BRK$FFFE$FFFF

RESET
電源投入時、及びリセット時にRESETが励起され、 初期化のための6クロックの後に動作を開始します。 Iフラグをセットし、PCの下位バイトを$FFFCから、上位バイトを$FFFDからフェッチします。

割り込み動作は、次の命令を読み込む前に開始します。 このとき、通常PCは次の命令の先頭アドレスとなっています。

NMI (Non-maskable Interrupt)
割り込みが確認された時、割り込み動作を開始します。 Bフラグをクリアし、PCの上位バイト、 下位バイト、ステータスレジスタを順にスタックへ格納します。 次にIフラグをセットし、最後にPCの下位バイトを$FFFAから、上位バイトを$FFFBからフェッチします。

IRQ (Interrupt request)
割り込みが確認された時、Iフラグがセットされていれば割り込みは無視します。 Iフラグがクリアされていれば、割り込み動作を開始します。 BRK割り込みと区別するためにBフラグはクリアします。 次にPCの上位バイト、下位バイト、ステータスレジスタを順にスタックへ格納します。 次にIフラグをセットし、最後にPCの下位バイトを$FFFEから、上位バイトを$FFFFからフェッチします。

NMIと異なる点は、Iフラグによる無効化とベクタです。

BRK (Break)
割り込みが確認された時、Iフラグがセットされていれば割り込みは無視します。 Iフラグがクリアされていれば、割り込み動作を開始します。 BRKでは、Bフラグをセットし、PCに1を加算します。 次にPCの上位バイト、下位バイト、ステータスレジスタを順にスタックへ格納します。 次にIフラグをセットし、最後にPCの下位バイトを$FFFEから、上位バイトを$FFFFからフェッチします。

IRQと異なる点はBフラグとPCの扱いのみで、あとは同じです。 BRKではPCに1を加算するため、BRK命令のあるアドレス+2番地がリターンアドレスとなります。

_
6502のバグやトラップ

 データシートには記述されていない仕様や、 記述と異なる部分が存在します。 これらのトラップはNESのCPUにも存在します。

  • ジャンプサブルーチン命令(JSR)によってスタックに格納する復帰アドレスは、 次の命令の一つ前のアドレス(JSRの最後のバイト)であり、 リターンサブルーチン命令(RTS)によってインクリメントします。
  • 状態レジスタスタックプッシュ命令(PHP) によってスタックに格納する状態フラグでは、ブレイクフラグをセットしています。
  • DフラグはRESETや割り込みによってセットやクリアすることはありません。
  • 間接ジャンプ命令(JMP)においてページ(256バイト境界)をまたぐ間接アドレス指定は失敗します。 例として、$03FFと$0400にそれぞれジャンプ先アドレスの下位バイト、 上位バイトが格納されている場合、下位バイトは正しくフェッチされますが、 上位バイトは$0300からフェッチされます。
  • ブレイク割り込み(BRK)中にさらに割り込みが発生した場合、 ブレイク割り込みを無視します。
  • 全てのクロックにおいて、常に外部アクセスが発生します。 これはデータフェッチやストアが必要ないときでも発生します。 例えばインクリメント命令(INC)において演算サイクルの時にごみデータをストアします。 このごみデータはストアサイクルにおいて正しい演算結果で上書きします。
  • 仕様書には記載されていない命令(Undocumented instruction)が存在します。
! これらの情報が記録されたテキストが、 AppleIIプログラミングディレクトリに存在したらしい。 6502bugs.txtを参照。

CMOS版である65C02では修正されている。

未定義命令の動作についてはおそらく、 プロセッサコアを設計したメーカごとに異なる。

_
命令セット

 6502の命令コード(オペコード)は8ビットで、命令の種類とアドレッシングモードを示します。 命令によってはオペランドが付加され命令を修飾します。
オペコード

オペコードオペランド

オペコードオペランドオペランド

_
アドレッシングモード

 6502には13種類のアドレッシングモードが存在します。

 クロック数削減のため、 アドレスの下位バイトからのキャリーが発生しなければ上位バイトへの加算を行わない、 条件分岐命令の条件が成立しなければオフセットの加算を行わないなどの工夫がみられます。 (パイプラインと間違われがちですが6502はパイプライン機構を持ちません)

 6502では256バイトを1ページとしており、 アドレスの下位バイトが$00ならページの先頭、$FFは最後となります。 特に$0000から始まるページはゼロページと呼ばれ、 他のページよりも少ないサイクル数でアクセスできるようになっています。

アドレッシング中の加算は桁上がりや符号の扱いが異なり、

  • 8ビット加算 上位バイトへの桁上げは無視
  • 16ビット加算 下位バイトからの桁上げは上位バイトに伝播
  • 符号拡張加算 8ビットを16ビットに符号拡張したものを加算
下の説明では加算に(8)(16)(符号拡張)をつけて加算の種類を示しています。
  • アキュムレータ・アドレス指定(Accumulator Addressing)
    アキュムレータ上での実行を意味します。
    オペコード

  • イミディエイト・アドレス指定(Immediate Addressing)
    2番目のバイトをデータそのものとして使用します。
    オペコードデータ

  • アブソリュート・アドレス指定(Absolute Addressing)
    2番目のバイトを下位アドレス、 3番目のバイトを上位アドレスとして実効アドレスとします。
    オペコード下位アドレス上位アドレス

  • ゼロページ・アドレス指定(Zero Page Addressing)
    上位アドレスとして$00、下位アドレスとして2番目のバイトを使用し実効アドレスとします。
    オペコード下位アドレス

  • ゼロページ・インデックス・アドレス指定(Indexed Zero Page Addressing)
    上位アドレスとして$00、 下位アドレスとして2番目のバイトにインデックスレジスタ(X,Y)を加算(8) した値を実効アドレスとします。 インデックスレジスタX、Yそれぞれについて、Zero Page, X、Zero Page, Y のアドレッシングモードがあります。
    オペコード下位アドレス

  • アブソリュート・インデックス・アドレス指定(Indexed Absolute Addressing)
    2番目のバイトを下位アドレス、3番目のバイトを上位アドレスとして、 このアドレスにインデックスレジスタ(X,Y)を加算(16)したものを実効アドレスとします。 インデックスレジスタX、Yそれぞれ、Absolute, X、Absolute, Y のアドレッシングモードがあります。
    オペコード下位アドレス上位アドレス

  • インプライド・アドレス指定(Implied Addressing)
    レジスタ類を操作する命令で使用され、アドレス指定はありません。
    オペコード
  • リラティブ・アドレス指定(Relative Addressing)
    条件分岐命令で使用されます。 次の命令を示すプログラムカウンタに2番目のバイトを加算(符号拡張)した値を実効アドレスとします。 オフセットとして、-128($80)〜+127($7F)を指定できます。
    オペコードオフセット
  • インデックス・インダイレクト・アドレス指定(Indexed Indirect Addressing)
    上位アドレスを$00とし、 また2番目のバイトにインデックスレジスタXを加算(8)した値を下位アドレスとします。 このアドレスに格納されている値を実効アドレスの下位バイト、 そしてその次のアドレスに格納されている値を実効アドレスの上位バイトとします。 このインクリメントにおいてキャリーは無視します。
    オペコード下位アドレス

  • インダイレクト・インデックス・アドレス指定(Indirect Indexed Addressing)
    まず上位アドレスを$00とし、下位アドレスとして2番目のバイトを使用します。 このアドレスに格納されている値を次の上位アドレス、 その次のアドレスに格納されている値を次の下位アドレスとします。 このときのインクリメントにおけるキャリーは無視します。 得られたアドレスにインデックスレジスタYを加算(16)したものを実効アドレスとします。
    オペコード下位アドレス

  • アブソリュート・インダイレクト・アドレス指定(Absolute Indirect Addressing)
    2、3番目のバイトで示されるアドレスに格納されている値を実効アドレスの下位バイト、 その次のアドレスに格納されている値を実効アドレスの上位バイトとします。 このインクリメントで下位バイトからのキャリーは無視します。
    オペコード下位アドレス上位アドレス

_
命令

A アキュムレータ
M アドレッシングによってフェッチされたメモリデータ
flags 命令実行によって設定するフラグ

・演算
ADC (Add M to A with C)A + M + C -> A
SBC (Subtract M from A with C)A - M - not C -> A
flags: N V Z C

・論理演算
AND ("AND" M with A)A and M -> A
ORA ("OR" M with A)A or M -> A
EOR ("Exclusive-OR" M with A)A eor M -> A
flags: N Z

・シフト、ローテーション

ASL (Arithmetic shift left one bit)
Aを左シフト、ビット0には0
C <- Aのビット7

LSR (Logical shift right one bit)
Aを右シフト、ビット7には0
Aのビット0 -> C

ROL (Rotate left one bit)
Aを左シフト、ビット0にはC
C <- Aのビット7

ROR (Rotate right one bit)
Aを右シフト、ビット7にはC
Aのビット0 -> C

flags: N Z C

・条件分岐

条件が成立した場合、リラティブ・アドレス指定により 分岐先のアドレスをPCへストアします。 成立しなかった場合、分岐命令の先頭アドレス+2をPCへストアします(単に次の命令アドレス)。

BCC (Branch on C clear)
Cフラグがクリアされていれば分岐します。

BCS (Branch on C set)
Cフラグがセットされていれば分岐します。

BEQ (Branch on Z set (result equal))
Zフラグがセットされていれば分岐します。

BNE (Branch on Z clear (result not equal))
Zフラグがクリアされていれば分岐します。

BVC (Branch on V clear)
Vフラグがクリアされていれば分岐します。

BVS (Branch on V set)
Vフラグがセットされていれば分岐します。

BPL (Branch on N clear (result plus))
Nフラグがクリアされていれば分岐します。

BMI (Branch on N set (result minus))
Nフラグがセットされていれば分岐します。

flags: none

・ビット検査

BIT (Test Bits in M with A)
メモリのデータをAでテストします。
A and M の結果でZフラグをセットし、Mのビット7をNへ、ビット6をVへ転送します。
flags: N V Z

・ジャンプ
JMP (Jump to new location)
ADDR -> PC
flags: none

JSR (Jump to new location saving return address)
ADDR -> PC
サブルーチンへジャンプします。
まずジャンプ先のアドレスをアドレス指定によって取得した後、 PCを上位バイト、下位バイトの順にスタックへプッシュします。 このときのPCはトラップの項にもあるようにJSRの最後のバイトアドレスです。 最後にジャンプ先へジャンプします。
flags: none

RTS (Return from Subroutine)
サブルーチンから復帰します。
復帰アドレスをスタックから、下位バイト、 上位バイトの順にポップしたのちインクリメントします。
flags: none

・割り込み
BRK (Force Break)
ソフトウエア割り込みを発生します。
動作は割り込みの項を参照。
flags: B I

RTI (Return from Interrupt)
割り込みから復帰します。
スタックから、ステータスレジスタ、PCの下位バイト、上位バイトの順にポップします。
flags: all

・比較

演算の結果によって、フラグをセットします。
Cフラグは、正かゼロのときセットし、負のときクリアします。 (単にキャリーをストア)
CMP (Compare M and A)A - M
CPX (Compare M and X)X - M
CPY (Compare M and Y)Y - M
flags: N Z C

・インクリメント、デクリメント
INC (Increment M by one)M + 1 -> M
DEC (Decrement M by one)M - 1 -> M
INX (Increment X by one)X + 1 -> X
DEX (Decrement X by one)X - 1 -> X
INY (Increment Y by one)Y + 1 -> Y
DEY (Decrement Y by one)Y - 1 -> Y
flags: N Z

・フラグ操作
CLC (Clear C flag)0 -> C
SEC (Set C flag)1 -> C
CLI (Clear Interrupt disable)0 -> I
SEI (Set Interrupt disable)1 -> I
CLD (Clear Decimal mode)0 -> D
SED (Set Decimal mode)1 -> D
CLV (Clear V flag)0 -> V
flags: 対応するフラグのみ

・ロード
LDA (Load A from M)M -> A
LDX (Load X from M)M -> X
LDY (Load Y from M)M -> Y
flags: N Z

・ストア
STA (Store A to M)A -> M
STX (Store X to M)X -> M
STY (Store Y to M)Y -> M
flags: none

・レジスタ間転送
TAX (Transfer A to X)A -> X
TXA (Transfer X to A)X -> A
TAY (Transfer A to Y)A -> Y
TYA (Transfer Y to A)Y -> A
TSX (Transfer S to X)S -> X
flags: N Z

TXS (Transfer X to S)X -> S
flags: none

・スタック
PHA (Push A on stack)A -> stack
flags: none
PLA (Pull A from stack)stack -> A
flags: N Z
PHP (Push P on stack)P -> stack
flags: none
PLP (Pull P from stack)stack -> P
flags: all

・No Operation

NOP (No operation)
何もしません。
flags: none

_
命令セットと実行クロック

MODE    アドレッシング
SYNTAX  アセンブラ構文
LEN     バイト数
CLK     実行クロック数
+1      アドレッシングにおいてページクロスで1クロック追加
           ( Absolute,X  Absolute,Y  Indirect,Y )
+1or2   ブランチ命令において条件が成立した場合に1クロック追加、
        さらにページクロスで1クロック追加
MODE          SYNTAX      OPCODE LEN CLK

Immediate     ADC #$44      $69   2   2
Zero Page     ADC $44       $65   2   3
Zero Page,X   ADC $44,X     $75   2   4
Absolute      ADC $4400     $6D   3   4
Absolute,X    ADC $4400,X   $7D   3   4 +1
Absolute,Y    ADC $4400,Y   $79   3   4 +1
Indirect,X    ADC ($44,X)   $61   2   6
Indirect,Y    ADC ($44),Y   $71   2   5 +1

Immediate     SBC #$44      $E9   2   2
Zero Page     SBC $44       $E5   2   3
Zero Page,X   SBC $44,X     $F5   2   4
Absolute      SBC $4400     $ED   3   4
Absolute,X    SBC $4400,X   $FD   3   4 +1
Absolute,Y    SBC $4400,Y   $F9   3   4 +1
Indirect,X    SBC ($44,X)   $E1   2   6
Indirect,Y    SBC ($44),Y   $F1   2   5 +1

Immediate     AND #$44      $29   2   2
Zero Page     AND $44       $25   2   3
Zero Page,X   AND $44,X     $35   2   4
Absolute      AND $4400     $2D   3   4
Absolute,X    AND $4400,X   $3D   3   4 +1
Absolute,Y    AND $4400,Y   $39   3   4 +1
Indirect,X    AND ($44,X)   $21   2   6
Indirect,Y    AND ($44),Y   $31   2   5 +1

Immediate     ORA #$44      $09   2   2
Zero Page     ORA $44       $05   2   3
Zero Page,X   ORA $44,X     $15   2   4
Absolute      ORA $4400     $0D   3   4
Absolute,X    ORA $4400,X   $1D   3   4 +1
Absolute,Y    ORA $4400,Y   $19   3   4 +1
Indirect,X    ORA ($44,X)   $01   2   6
Indirect,Y    ORA ($44),Y   $11   2   5 +1

Immediate     EOR #$44      $49   2   2
Zero Page     EOR $44       $45   2   3
Zero Page,X   EOR $44,X     $55   2   4
Absolute      EOR $4400     $4D   3   4
Absolute,X    EOR $4400,X   $5D   3   4 +1
Absolute,Y    EOR $4400,Y   $59   3   4 +1
Indirect,X    EOR ($44,X)   $41   2   6
Indirect,Y    EOR ($44),Y   $51   2   5 +1

Accumulator   ASL A         $0A   1   2
Zero Page     ASL $44       $06   2   5
Zero Page,X   ASL $44,X     $16   2   6
Absolute      ASL $4400     $0E   3   6
Absolute,X    ASL $4400,X   $1E   3   6 +1

Accumulator   LSR A         $4A   1   2
Zero Page     LSR $44       $46   2   5
Zero Page,X   LSR $44,X     $56   2   6
Absolute      LSR $4400     $4E   3   6
Absolute,X    LSR $4400,X   $5E   3   6 +1

Accumulator   ROL A         $2A   1   2
Zero Page     ROL $44       $26   2   5
Zero Page,X   ROL $44,X     $36   2   6
Absolute      ROL $4400     $2E   3   6
Absolute,X    ROL $4400,X   $3E   3   6 +1

Accumulator   ROR A         $6A   1   2
Zero Page     ROR $44       $66   2   5
Zero Page,X   ROR $44,X     $76   2   6
Absolute      ROR $4400     $6E   3   6
Absolute,X    ROR $4400,X   $7E   3   6 +1

Relative      BCC $44       $90   2   2 +1or2
Relative      BCS $44       $B0   2   2 +1or2
Relative      BEQ $44       $F0   2   2 +1or2
Relative      BNE $44       $D0   2   2 +1or2
Relative      BVC $44       $50   2   2 +1or2
Relative      BVS $44       $70   2   2 +1or2
Relative      BPL $44       $10   2   2 +1or2
Relative      BMI $44       $30   2   2 +1or2

Zero Page     BIT $44       $24   2   3
Absolute      BIT $4400     $2C   3   4

Absolute      JMP $5597     $4C   3   3
Indirect      JMP ($5597)   $6C   3   5

Absolute      JSR $5597     $20   3   6

Implied       RTS           $60   1   6

Implied       BRK           $00   1   7
Implied       RTI           $40   1   6

Immediate     CMP #$44      $C9   2   2
Zero Page     CMP $44       $C5   2   3
Zero Page,X   CMP $44,X     $D5   2   4
Absolute      CMP $4400     $CD   3   4
Absolute,X    CMP $4400,X   $DD   3   4 +1
Absolute,Y    CMP $4400,Y   $D9   3   4 +1
Indirect,X    CMP ($44,X)   $C1   2   6
Indirect,Y    CMP ($44),Y   $D1   2   5 +1

Immediate     CPX #$44      $E0   2   2
Zero Page     CPX $44       $E4   2   3
Absolute      CPX $4400     $EC   3   4

Immediate     CPY #$44      $C0   2   2
Zero Page     CPY $44       $C4   2   3
Absolute      CPY $4400     $CC   3   4

Zero Page     INC $44       $E6   2   5
Zero Page,X   INC $44,X     $F6   2   6
Absolute      INC $4400     $EE   3   6
Absolute,X    INC $4400,X   $FE   3   6 +1

Zero Page     DEC $44       $C6   2   5
Zero Page,X   DEC $44,X     $D6   2   6
Absolute      DEC $4400     $CE   3   6
Absolute,X    DEC $4400,X   $DE   3   6 +1

Implied       INX           $E8   1   2
Implied       DEX           $CA   1   2
Implied       INY           $C8   1   2
Implied       DEY           $88   1   2

Implied       CLC           $18   1   2
Implied       SEC           $38   1   2
Implied       CLI           $58   1   2
Implied       SEI           $78   1   2
Implied       CLD           $D8   1   2
Implied       SED           $F8   1   2
Implied       CLV           $B8   1   2

Immediate     LDA #$44      $A9   2   2
Zero Page     LDA $44       $A5   2   3
Zero Page,X   LDA $44,X     $B5   2   4
Absolute      LDA $4400     $AD   3   4
Absolute,X    LDA $4400,X   $BD   3   4 +1
Absolute,Y    LDA $4400,Y   $B9   3   4 +1
Indirect,X    LDA ($44,X)   $A1   2   6
Indirect,Y    LDA ($44),Y   $B1   2   5 +1

Immediate     LDX #$44      $A2   2   2
Zero Page     LDX $44       $A6   2   3
Zero Page,Y   LDX $44,Y     $B6   2   4
Absolute      LDX $4400     $AE   3   4
Absolute,Y    LDX $4400,Y   $BE   3   4 +1

Immediate     LDY #$44      $A0   2   2
Zero Page     LDY $44       $A4   2   3
Zero Page,X   LDY $44,X     $B4   2   4
Absolute      LDY $4400     $AC   3   4
Absolute,X    LDY $4400,X   $BC   3   4 +1

Zero Page     STA $44       $85   2   3
Zero Page,X   STA $44,X     $95   2   4
Absolute      STA $4400     $8D   3   4
Absolute,X    STA $4400,X   $9D   3   4 +1
Absolute,Y    STA $4400,Y   $99   3   4 +1
Indirect,X    STA ($44,X)   $81   2   6
Indirect,Y    STA ($44),Y   $91   2   5 +1

Zero Page     STX $44       $86   2   3
Zero Page,Y   STX $44,Y     $96   2   4
Absolute      STX $4400     $8E   3   4

Zero Page     STY $44       $84   2   3
Zero Page,X   STY $44,X     $94   2   4
Absolute      STY $4400     $8C   3   4

Implied       TAX           $AA   1   2
Implied       TXA           $8A   1   2
Implied       TAY           $A8   1   2
Implied       TYA           $98   1   2
Implied       TXS           $9A   1   2
Implied       TSX           $BA   1   2

Implied       PHA           $48   1   3
Implied       PLA           $68   1   4
Implied       PHP           $08   1   3
Implied       PLP           $28   1   4

Implied       NOP           $EA   1   2

! MOSのデータシートでは、一部の命令において常に7クロック(アドレッシングで桁上げが発生) となるように記述されています。記述ミスか?

Relativeアドレッシングは、ジャンプ先アドレスの計算時に桁上がりが無い場合すぐにジャンプする。 投機的命令フェッチと呼ばれるらしい。パイプラインではない。

_
アドレッシングサイクル

OP    オペコード
ABS   アブソリュートアドレス =AH,AL
CALC  内部演算
-L   アドレス下位
-H   アドレス上位
ABS,A アドレス
ZA   ゼロページアドレス =00,ZA
S    スタックアドレス =01,S
VA   割り込みベクタアドレス
OF   オフセット

CLK ADDR     DIO    R/W

Accumulator
1   PC       OP      R
2   PC+1     CALC   (R)
1   PC+1     OP      R

Imediate
1   PC       OP      R
2   PC+1     DATA    R
1   PC+2     OP      R

Absolute
1   PC       OP      R
2   PC+1     AL      R
3   PC+2     AH      R
4   ABS      DATA   R/W
1   PC+3     OP      R

Absolute (Mem)
1   PC       OP      R
2   PC+1     AL      R
3   PC+2     AH      R
4   ABS      DATA    R
5   ABS      CALC   (W)
6   ABS      DATA    W
1   PC+3     OP      R

Absolute (JMP)
1   PC       OP      R
2   PC+1     newPCL  R
3   PC+2     newPCH  R
1   newPC    OP      R

Absolute (JSR)
1   PC       OP      R
2   PC+1     newPCL  R
3   S        CALC   (R)
4   S        PCH     W
5   S-1      PCL+2   W
6   PC+2     newPCH  R
1   newPC    OP      R

Zero Page
1   PC       OP      R
2   PC+1     ZA      R
3   ZA       DATA   R/W
1   PC+2     OP      R

Zero Page (Mem)
1   PC       OP      R
2   PC+1     ZA      R
3   ZA       DATA    R
4   ZA       CALC   (W)
5   ZA       DATA    W
1   PC+2     OP      R

Zero Page Index
1   PC       OP      R
2   PC+1     ZA      R
3   PC+1     CALC   (R)
4   ZA+IDX   DATA   R/W
1   PC+2     OP      R

Zero Page Index (Mem)
1   PC       OP      R
2   PC+1     ZA      R
3   PC+1     CALC   (R)
4   ZA+IDX   DATA    R
5   ZA+IDX   CALC   (W)
6   ZA+IDX   DATA    W
1   PC+2     OP      R

Absolute Index
1   PC       OP      R
2   PC+1     AL      R
3   PC+2     AH      R
3a  PC+2     CALC   (R)
4   ABS+IDX  DATA   R/W
1   PC+3     OP      R
  a ページクロス時のみ

Absolute Index (Mem)
1   PC       OP      R
2   PC+1     AL      R
3   PC+2     AH      R
3a  PC+2     CALC   (R)
4   ABS+IDX  DATA    R
5   ABS+IDX  CALC   (W)
6   ABS+IDX  DATA    W
1   PC+3     OP      R
  a ページクロス時のみ

Implied
1   PC       OP      R
2   PC+1     CALC   (R)
1   PC+1     OP      R

Implied (StackPush)
1   PC       OP      R
2   PC+1     CALC   (R)
3   S        REG     W
1   PC+1     OP      R

Implied (StackPull)
1   PC       OP      R
2   PC+1     CALC   (R)
3   S        CALC   (R)
4   S        REG     R
1   PC+1     OP      R

Implied (RTS)
1   PC       OP      R
2   PC+1     CALC   (R)
3   S        CALC   (R)
4   S+1      newPCL  R
5   S+2      newPCH  R
6   newPC    CALC   (R)
1   PC+1     OP      R

Implied (RTI)
1   PC       OP      R
2   PC+1     CALC   (R)
3   S        CALC   (R)
4   S+1      P       R
5   S+2      newPCL  R
6   S+3      newPCH  R
1   newPC    OP      R

Implied (Interrupt)
1   PC       OP      R
2   PC *1    CALC   (R)
3   S        PCH    R/W *3
4   S-1      PCL *2 R/W *3
5   S-2      P      R/W *3
6   VA       newPCL  R
7   VA+1     newPCH  R
1   newPC    OP      R
  *1 BRKはPC+1
  *2 BRKはPCL+2
  *3 RESETのみR

Relative
1   PC       OP      R
2   PC+1     OF      R
2a  PC+2     CALC   (R)
2b  PC+2     CALC   (R)
1   PC+2+OF* OP      R
  a ブランチが発生した時のみ
  b ページクロス時のみ
  * ブランチしない時はOF=0

Index Indirect X
1   PC       OP      R
2   PC+1     ZA      R
3   PC+1     CALC   (R)
4   ZA+X     AL      R
5   ZA+X+1   AH      R
6   A        DATA   R/W
1   PC+2     OP      R

Indirect Index Y
1   PC       OP      R
2   PC+1     ZA      R
3   ZA       AL      R
4   ZA+1     AH      R
4a  ZA+1     CALC   (R)
5   A+Y      DATA   R/W
1   PC+2     OP      R
  a ページクロス時のみ

Indirect (JMP)
1   PC       OP      R
2   PC+1     AL      R
3   PC+2     AH      R
4   PC+2     CALC   (R)
5   ABS      PCL     R
6   ABS+1    PCH     R
1   newPC    OP      R


Copyright(C) pgate1 All Rights Reserved.