MOS 6502
|
MOS Technology MOS 6502 Data 8bit / Address Bus 16bit Cycle 1.0MHz〜3.0MHz (1975) |
姉妹型:「MOS 6507」
廉価版。
「Atari 2600」で採用された。
発展型:「MOS 6510」
8bit汎用I/Oポートが追加。
「Commodore64」で採用された。
発展型:「MOS 8502」
倍クロック(2.048MHz)で動作可能。
「Commodore128」で採用された。
その他
「6502」の互換として有名なものはリコー「RP2A03」やハドソン(セイコーエプソン)「HuC6280」などがある。
「RP2A03」は任天堂「ファミリーコンピュータ」に採用されたもので、BCD(Binary-Coded Decimal:二進化十進)を削除し、サウンド機能を内包したものである。
「HuC6280」はNECホームエレクトロニクス「PCエンジン」に採用されたもので、クロックアップや命令拡張などがされている。
「6502」のレジスタを16bit化したものが、Western Design Center社「W65C816」。
apple社の「apple ][ GS」や任天堂「スーパーファミコン」(リコー「RC5A22」)に採用された。
●6502のピン配列
| Vss | 1 | 40 | RES | |
| RDY | 2 | 39 | φ2 | |
| φ1 | 3 | 38 | S0 | |
| IRQ | 4 | 37 | φ0 | |
| N.C. | 5 | 36 | N.C. | |
| NMI | 6 | 35 | N.C. | |
| SYNC | 7 | 34 | R/W | |
| Vcc | 8 | 33 | D0 | |
| A0 | 9 | 32 | D1 | |
| A1 | 10 | 31 | D2 | |
| A2 | 11 | 30 | D3 | |
| A3 | 12 | 29 | D4 | |
| A4 | 13 | 28 | D5 | |
| A5 | 14 | 27 | D6 | |
| A6 | 15 | 26 | D7 | |
| A7 | 16 | 25 | A15 | |
| A8 | 17 | 24 | A14 | |
| A9 | 18 | 23 | A13 | |
| A10 | 19 | 22 | A12 | |
| A11 | 20 | 21 | Vss |
●6502の特徴
「6502」の「アドレッシング」は「MC6800」のものを洗練化したといえるものである。
上述を基本として更に以下のような応用アドレッシングがある。
●ゼロページ
| $0000 | 34 12 | ←ゼロページで「$00」を指定したときはここ($0000) |
| $0002 | 78 56 | |
| $0004 | BC 9A | ←ゼロページXでインデックス「$04」を指定したときはここ($0004) |
| $0006 | F0 DE |
ゼロページX間接は上の例だと「$9ABC」(メモリ上ではリトルエンディアンである)となる。
ゼロページとの違いはゼロページはオペランドによる絶対アドレス指定($00〜$FF)となる。
X間接はオペランドに対してインデックスレジスタで修飾するので複数のポインタを取り扱いやすくなる。
ゼロページY間接は指定したゼロページで取得したアドレスに対してインデックスレジスタで修飾する。
「$04」なら「$1234」+「$04」となり「$1238」を取得する。
●6502の命令
命令(ニーモニック)は以下の構成となっている。
ニーモニック [SRC][,DEST]
データの流れは「SRC」→「DEST」となる。
※「A」は8bitアキュムレータ「A」を表す
※「PC」は16bitレジスタである「プログラムカウンタ」(PC)を表す
※「S」は8bitレジスタである「スタックポインタ」(SP)を表す
※「x」は8bitレジスタである「インデックスレジスタ」(X,Y)を表す
インデックスレジスタは高級言語における「配列」の位置を表す
(「MC6800」の場合は16bit=2bytesの単位となる)
※「f」はフラグ「N,V,B,D,I,Z,C」を表す(「B,D,I」は演算結果には影響されない)
フラグは演算結果の状態を表す(PSR:プロセッサステータスレジスタ)
bit7「N」:最上位bit(MSB)が「1」の場合、成立 (負数)
bit6「V」:オーバーフローの場合、成立
bit4「B」:ブレイクフラグ (1でBRK割込発生)
bit3「D」:デシマルフラグ (1でBCDモード)
bit2「I」:割込フラグ (1で割込禁止)
bit1「Z」:0になった場合、成立
bit0「C」:Carryがあった場合、もしくはBorrowがない場合、成立
●アキュムレータ関連命令 (転送、演算など)
| ニーモニック | Immed. | ABS. | Zero | Accum. | IZX | IZY | ZX | ABX | ABY | 動作 |
|---|---|---|---|---|---|---|---|---|---|---|
| LDA | O | O | O | X | O | O | O | O | O | アキュムレータに指定値をロード(読込) |
| STA | X | O | O | X | O | O | O | O | O | アキュムレータからストア(格納) |
| INC | X | O | O | X | X | X | O | X | O | 指定値をインクリメント(+1) |
| DEC | X | O | O | X | X | X | O | X | O | 指定値をデクリメント(-1) |
| ADC | O | O | O | X | O | O | O | O | O | 指定値に「C」フラグを加えた値を加算 |
| SBC | O | O | O | X | O | O | O | O | O | 指定値に「C」フラグを加えた値を減算 |
| AND | O | O | O | X | O | O | O | O | O | 指定値との論理積 |
| BIT | X | O | O | X | X | X | X | X | X | 指定値との論理積(値は反映せず=bit test) |
| ORA | O | O | O | X | O | O | O | O | O | 指定値との論理和 |
| EOR | O | O | O | X | O | O | O | O | O | 指定値との排他的論理和 |
| CMP | O | O | O | X | O | O | O | O | O | アキュムレータと指定値を比較(減算結果) |
| ROL | X | O | O | O | X | X | O | O | X | 指定値を左ローテーション |
| ROR | X | O | O | O | X | X | O | O | X | 指定値を右ローテーション |
| ASL | X | O | O | O | X | X | O | O | X | 指定値を左算術シフト |
| LSR | X | O | O | O | X | X | O | O | X | 指定値を右論理シフト |
●インデックスレジスタ (X,Y)関連命令
| ニーモニック | Immed. | ABS. | Zero | ZX | ABX | ABY | ZY | Impli. | 動作 |
|---|---|---|---|---|---|---|---|---|---|
| LDx | O | O | O | X | X | O | O | X | 「x」に指定値をロード |
| STx | O | O | O | X | X | O | O | X | 「x」からストア |
| CPx | O | O | O | X | X | X | X | X | 「x」と指定値を比較 |
| INx | X | X | X | X | X | X | X | O | 「x」をインクリメント |
| DEx | X | X | X | X | X | X | X | O | 「x」をデクリメント |
| TAx | X | X | X | X | X | X | X | O | アキュムレータの値を「x」に転送 |
| TxA | X | X | X | X | X | X | X | O | 「x」の値をアキュムレータに転送 |
| TSX | X | X | X | X | X | X | X | O | 「S」の値をインデックスレジスタ「X」に転送 |
| TXS | X | X | X | X | X | X | X | O | インデックスレジスタ「X」の値を「S」に転送 |
●インプライドアドレッシング命令
| ニーモニック | Impli. | 動作 |
|---|---|---|
| CLC | O | 「C」フラグをクリア(0にする) |
| SEC | O | 「C」フラグをセット(1にする) |
| CLD | O | 「D」フラグをクリア |
| SED | O | 「D」フラグをセット |
| CLV | O | 「V」フラグをクリア |
| SEV | O | 「V」フラグをセット |
| CLI | O | 「I」フラグをクリア |
| SEI | O | 「I」フラグをセット |
| PHA | O | アキュムレータの値をプッシュ(退避) |
| PLA | O | アキュムレータの値をポップ(復帰) |
| PHP | O | 「PSR」の値をプッシュ |
| PLP | O | 「PSR」の値をポップ |
●分岐命令 (Index:PC相対のみ)
| ニーモニック | 動作 |
|---|---|
| BCC | 「C」フラグが0のとき分岐(≧:Unsigned) |
| BCS | 「C」フラグが1のとき分岐(<:Unsigned) |
| BVC | 「V」フラグが0のとき分岐 |
| BVS | 「V」フラグが1のとき分岐 |
| BNE | 「Z」フラグが0のとき分岐(≠) |
| BEQ | 「Z」フラグが1のとき分岐(=) |
| BPL | 「N」フラグが0のとき分岐(>0) |
| BMI | 「N」フラグが1のとき分岐(<0) |
●ジャンプ命令
| ニーモニック | Index | ABS | Impli. | 動作 |
|---|---|---|---|---|
| JMP | O | O | X | 指定アドレスにジャンプ |
| JSR | X | O | X | 指定アドレスをサブルーチンコール(「PC」を「S」に保存) |
●復帰命令 (リターン)
| ニーモニック | Index | ABS | Impli. | 動作 |
|---|---|---|---|---|
| RTS | X | X | O | サブルーチンから復帰(「S」に保存されたアドレスを「PC」にロード) |
●その他命令
| ニーモニック | Index | ABS | Impli. | 動作 |
|---|---|---|---|---|
| NOP | X | X | O | 何もしない |
| RTI | X | X | O | 割込処理ルーチンから復帰(割込時に保存されたレジスタを復帰) |
| BRK | X | X | O | BRK割込 |