戻る

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のピン配列

Vss1 40RES
RDY2 39φ2
φ13 38S0
IRQ4 37φ0
N.C.5 36N.C.
NMI6 35N.C.
SYNC7 34R/W
Vcc8 33D0
A09 32D1
A110 31D2
A211 30D3
A312 29D4
A413 28D5
A514 27D6
A615 26D7
A716 25A15
A817 24A14
A918 23A13
A1019 22A12
A1120 21Vss

●6502の特徴

「6502」の「アドレッシング」は「MC6800」のものを洗練化したといえるものである。

上述を基本として更に以下のような応用アドレッシングがある。

●ゼロページ

$000034 12←ゼロページで「$00」を指定したときはここ($0000)
$000278 56
$0004BC 9A←ゼロページXでインデックス「$04」を指定したときはここ($0004)
$0006F0 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.ZeroAccum.IZXIZYZXABXABY動作
LDAOOOXOOOOOアキュムレータに指定値をロード(読込)
STAXOOXOOOOOアキュムレータからストア(格納)
INCXOOXXXOXO指定値をインクリメント(+1)
DECXOOXXXOXO指定値をデクリメント(-1)
ADCOOOXOOOOO指定値に「C」フラグを加えた値を加算
SBCOOOXOOOOO指定値に「C」フラグを加えた値を減算
ANDOOOXOOOOO指定値との論理積
BITXOOXXXXXX指定値との論理積(値は反映せず=bit test)
ORAOOOXOOOOO指定値との論理和
EOROOOXOOOOO指定値との排他的論理和
CMPOOOXOOOOOアキュムレータと指定値を比較(減算結果)
ROLXOOOXXOOX指定値を左ローテーション
RORXOOOXXOOX指定値を右ローテーション
ASLXOOOXXOOX指定値を左算術シフト
LSRXOOOXXOOX指定値を右論理シフト

●インデックスレジスタ (X,Y)関連命令

ニーモニックImmed.ABS.ZeroZXABXABYZYImpli.動作
LDxOOOXXOOX「x」に指定値をロード
STxOOOXXOOX「x」からストア
CPxOOOXXXXX「x」と指定値を比較
INxXXXXXXXO「x」をインクリメント
DExXXXXXXXO「x」をデクリメント
TAxXXXXXXXOアキュムレータの値を「x」に転送
TxAXXXXXXXO「x」の値をアキュムレータに転送
TSXXXXXXXXO「S」の値をインデックスレジスタ「X」に転送
TXSXXXXXXXOインデックスレジスタ「X」の値を「S」に転送

●インプライドアドレッシング命令

ニーモニックImpli.動作
CLCO「C」フラグをクリア(0にする)
SECO「C」フラグをセット(1にする)
CLDO「D」フラグをクリア
SEDO「D」フラグをセット
CLVO「V」フラグをクリア
SEVO「V」フラグをセット
CLIO「I」フラグをクリア
SEIO「I」フラグをセット
PHAOアキュムレータの値をプッシュ(退避)
PLAOアキュムレータの値をポップ(復帰)
PHPO「PSR」の値をプッシュ
PLPO「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)

●ジャンプ命令

ニーモニックIndexABSImpli.動作
JMPOOX指定アドレスにジャンプ
JSRXOX指定アドレスをサブルーチンコール(「PC」を「S」に保存)

●復帰命令 (リターン)

ニーモニックIndexABSImpli.動作
RTSXXOサブルーチンから復帰(「S」に保存されたアドレスを「PC」にロード)

●その他命令

ニーモニックIndexABSImpli.動作
NOPXXO何もしない
RTIXXO割込処理ルーチンから復帰(割込時に保存されたレジスタを復帰)
BRKXXOBRK割込

[TOPに戻る]