CPU (Central Processing Unit)
_
|
6502で使用可能な内部レジスタは次のようになっており、 プログラムカウンタは16ビット、それ以外は8ビットです。
プロセッサステータスレジスタの各ビットは分岐命令などでフラグとして使用します。 ビット5は使用せず、常にセット(1をストア)しておきます。
| ! |
こんだけ、でも人に言わせるとゼロページに256本あるじゃないか!らしい。
68系の6502はCPUではなく、MPUだそうだ。 ここではあくまでNESの“CPU”として扱う。 6502の読みは「ろくごーまるに」とか、 海外勢は「シックスファイブオーツー」とか。 | |||||||||||||||||||||||||||||||||||||||
スタックは256バイトが使用可能で、WRAMのうち$0100〜$01FFが割り当てられます。 スタックアドレスの下位バイトとしてスタックポインタ(SP)を使用し、上位バイトは$01固定です。 スタックへプッシュすることでSPはアドレスの値が小さい方向へ伸びます。
スタック操作は次の順序で行います。 | ! |
データシートには詳しく記述されてない。スタック領域を直接いじるなってこと?
多くのゲームではSPの初期値として$FFをストアしている。 |
割り込みは、RESET、NMI、IRQ、BRKがあります。 NMI、IRQはハードウエア割り込みでアクティブローとなっています。 BRKはソフトウエア割り込みです。 割り込みベクタによって規定アドレスにジャンプします。
割り込み | 下位バイト | 上位バイト |
NMI | $FFFA | $FFFB |
RESET | $FFFC | $FFFD |
IRQ、BRK | $FFFE | $FFFF |
割り込み動作は、次の命令を読み込む前に開始します。 このとき、通常PCは次の命令の先頭アドレスとなっています。
NMIと異なる点は、Iフラグによる無効化とベクタです。
IRQと異なる点はBフラグとPCの扱いのみで、あとは同じです。 BRKではPCに1を加算するため、BRK命令のあるアドレス+2番地がリターンアドレスとなります。
データシートには記述されていない仕様や、 記述と異なる部分が存在します。 これらのトラップはNESのCPUにも存在します。
| ! |
これらの情報が記録されたテキストが、
AppleIIプログラミングディレクトリに存在したらしい。
6502bugs.txtを参照。
CMOS版である65C02では修正されている。 未定義命令の動作についてはおそらく、 プロセッサコアを設計したメーカごとに異なる。 |
6502の命令コード(オペコード)は8ビットで、命令の種類とアドレッシングモードを示します。
命令によってはオペランドが付加され命令を修飾します。
オペコード |
オペコード | オペランド |
オペコード | オペランド | オペランド |
6502には13種類のアドレッシングモードが存在します。
クロック数削減のため、 アドレスの下位バイトからのキャリーが発生しなければ上位バイトへの加算を行わない、 条件分岐命令の条件が成立しなければオフセットの加算を行わないなどの工夫がみられます。 (パイプラインと間違われがちですが6502はパイプライン機構を持ちません)
6502では256バイトを1ページとしており、 アドレスの下位バイトが$00ならページの先頭、$FFは最後となります。 特に$0000から始まるページはゼロページと呼ばれ、 他のページよりも少ないサイクル数でアクセスできるようになっています。
アドレッシング中の加算は桁上がりや符号の扱いが異なり、
オペコード |
オペコード | データ |
オペコード | 下位アドレス | 上位アドレス |
オペコード | 下位アドレス |
オペコード | 下位アドレス |
オペコード | 下位アドレス | 上位アドレス |
オペコード |
オペコード | オフセット |
オペコード | 下位アドレス |
オペコード | 下位アドレス |
オペコード | 下位アドレス | 上位アドレス |
・演算
ADC (Add M to A with C) | A + M + C -> A |
SBC (Subtract M from A with C) | A - M - not C -> A |
・論理演算
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 |
・シフト、ローテーション
・条件分岐
条件が成立した場合、リラティブ・アドレス指定により 分岐先のアドレスをPCへストアします。 成立しなかった場合、分岐命令の先頭アドレス+2をPCへストアします(単に次の命令アドレス)。
・ビット検査
演算の結果によって、フラグをセットします。
Cフラグは、正かゼロのときセットし、負のときクリアします。
(単にキャリーをストア)
CMP (Compare M and A) | A - M |
CPX (Compare M and X) | X - M |
CPY (Compare M and Y) | Y - M |
・インクリメント、デクリメント
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 |
・フラグ操作
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 |
・ロード
LDA (Load A from M) | M -> A |
LDX (Load X from M) | M -> X |
LDY (Load Y from M) | M -> Y |
・ストア
STA (Store A to M) | A -> M |
STX (Store X to M) | X -> M |
STY (Store Y to M) | Y -> M |
・レジスタ間転送
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 |
TXS (Transfer X to S) | X -> S |
・スタック
PHA (Push A on stack) | A -> stack |
PLA (Pull A from stack) | stack -> A |
PHP (Push P on stack) | P -> stack |
PLP (Pull P from stack) | stack -> P |
・No Operation
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