戻る

MC6800

Motorola MC6800
Data 8/16bit / Address Bus 16bit
Cycle 1.0MHz〜2.0MHz
(1974)

姉妹型:「MC6802」
小規模システム用。
バックアップRAMが内蔵された。

●6800の特徴

「68系」の特徴としては「アドレッシング」の明確化がある。
(80系にも同様のものがあるが、ここまではっきりと体系化はされていない)

「アドレッシング」の概念は「C言語」などのポインタの概念と親和性が高い(というかそのもの)
この頃からアセンブリ言語と併用する形でコンパイラ型の高級言語プログラミングも発展していった。

●6800のピン配列

Vss1 40RESET
HALT2 39TSC
φ13 38N.C.
IRQ4 37φ2
VMA5 36DBE
NMI6 35N.C.
BA7 34R/W
Vcc8 33D0
AC9 32D1
A110 31D2
A211 30D3
A312 29D4
A413 28D5
A514 27D6
A615 26D7
A716 25A16
A817 24A14
A918 23A13
A1019 22A12
A1120 21Vss

●6800の命令

命令(ニーモニック)は以下の構成となっている。

  ニーモニック [DEST[,SRC]]

データの流れは「DEST」←「SRC」となる。

「a」は8bitアキュムレータ「A,B」を表す
「PC」は16bitレジスタである「プログラムカウンタ」(PC)を表す
「SP」は16bitレジスタである「スタックポインタ」(SP)を表す
「IX」は16bitレジスタである「インデックスレジスタ」(IX)を表す
 インデックスレジスタは高級言語における「配列」の位置を表す
 (「MC6800」の場合は16bit=2bytesの単位となる)
「f」はフラグ「H,N,Z,V,C」を表す (「I」は割込の許可・禁止を表すため、演算結果には影響されない)
 フラグは演算結果の状態を表す (CCR:コンデションコードレジスタ)

  bit5「H」:算術演算のbit3/4間(Half)でAUX 桁あふれ(Carry)、桁の繰り下がり(Borrow)があった場合、成立
  bit4「I」:割込マスク (1で割込禁止)
  bit3「N」:最上位bit(MSB)が「1」の場合、成立 (負数)
  bit2「Z」:0になった場合、成立
  bit1「V」:オーバーフローの場合、成立
  bit0「C」:Carryがあった場合、もしくはBorrowがない場合、成立

●アキュムレータ関連命令 (転送、演算など)

ニーモニックImmed.DirectIndexExtendImpli.動作
LDDaOOOOXアキュムレータに指定値をロード(読込)
STAaXOOOXアキュムレータからストア(格納)
INCXXOOX指定値をインクリメント(+1)
INCaXXXXOアキュムレータをインクリメント
DECXXOOX指定値をデクリメント(-1)
DECaXXXXOアキュムレータをデクリメント
ADDaOOOOX指定値を加算
ABAXXXXOアキュムレータ「A」に「B」の値を加算
ADCaOOOOX指定値に「C」フラグを加えた値を加算
SUBaOOOOXアキュムレータから指定値を減算
SBAXXXXOアキュムレータ「A」から「B」の値を減算
SBCaOOOOX指定値に「C」フラグを加えた値を減算
ANDaOOOOX指定値との論理積
BITaOOOOX指定値との論理積(値は反映せず=bit test)
ORAaOOOOX指定値との論理和
EORaOOOOX指定値との排他的論理和
COMXXOOX指定値の否定値
COMaXXXXOアキュムレータの否定値
NEGXXOOX指定値の符号反転
NEGaXXXXOアキュムレータの符号反転
CLRXXOOX指定値を0にする
CLRaXXOOXアキュムレータを0にする
CMPaXXXXOアキュムレータと指定値を比較
CBAXXXXOアキュムレータ「A」と「B」の値を比較
TSTXXOOX指定値から0を減算(=テスト:フラグへの反映)
TSTaXXXXOアキュムレータから0を減算
ROLXXOOX指定値を左ローテーション
ROLaXXXXOアキュムレータを左ローテーション
RORXXOOX指定値を右ローテーション
RORaXXXXOアキュムレータを右ローテーション
ASLXXOOX指定値を左算術シフト
ASLaXXXXOアキュムレータを左算術シフト
ASRXXOOX指定値を右算術シフト
ASRaXXXXOアキュムレータを右算術シフト
LSRXXOOX指定値を右論理シフト
LSRaXXXXOアキュムレータを右論理シフト
PSHaXXXXOアキュムレータをプッシュ(「SP」に保存 →「SP」アドレスのインクリメント)
PULaXXXXOアキュムレータへポップ (「SP」から取出→「SP」アドレスのデクリメント)
TABXXXXOアキュムレータ「A」の値を「B」に転送
TBAXXXXOアキュムレータ「B」の値を「A」に転送
DAAXXXXOBCD(Binary-Coded Decimal:二進化十進)補正

●「IX」「SP」関連命令

ニーモニックImmed.DirectIndexExtendImpli.動作
LDXOOOOX「IX」に指定値をロード
LDSOOOOX「SP」に指定値をロード
STXXOOOX「IX」からストア
STSXOOOX「SP」からストア
TXSXXXXO「IX」からデクリメントした値を「SP」に転送
TSXXXXXO「SP」にインクリメントした値を「IX」に転送
CPXOOOOX「IX」と指定値を比較
INXXXXXO「IX」をインクリメント
INSXXXXO「SP」をインクリメント
DEXXXXXO「IX」をデクリメント
DESXXXXO「SP」をデクリメント

●フラグ関連命令

ニーモニックImpli.動作
CLCO「C」フラグをクリア(0にする)
SECO「C」フラグをセット(1にする)
CLVO「V」フラグをクリア
SEVO「V」フラグをセット
CLIO「I」フラグをクリア
SEIO「I」フラグをセット
TAPOアキュムレータ「A」の値を「CCR」に転送
TPAO「CCR」の値をアキュムレータ「A」に転送

●「PC」関連命令 (ジャンプ)

ニーモニックIndexExtendImpli.動作
JMPOOXジャンプ(「PC」に指定値をロード)
JSROOX「PC」が示す絶対アドレスをコール(サブルーチン:元の「PC」が「SP」に保存され、リターンのときそのアドレスに戻る)

●「PC」関連命令 (分岐:PC相対のみ)

ニーモニック動作
BRA分岐(Branch)
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)
BHI「C」「Z」フラグのうち、最低1つが0のとき分岐(>:Unsigned)
BLS「C」「Z」フラグのうち、どちらか1つが1のとき分岐(≦:Unsigned)
BGE「N」「V」フラグの排他的論理和が0のとき分岐(≧:Signed)
BLT「N」「V」フラグの排他的論理和が1のとき分岐(<:Signed)
BGT「Z」フラグと「N]「V」フラグの排他的論理和の論理和が0のとき分岐(>:Signed)
BLE「Z」フラグと「N]「V」フラグの排他的論理和の論理和が1のとき分岐(≦:Signed)
BSR「PC」とオフセット値が示す相対アドレスでコール(サブルーチン:「PC」が「SP」に保存され、リターンのときそのアドレスに戻る)

●復帰命令 (リターン)

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

●その他命令

ニーモニックIndexExtendImpli.動作
NOPXXO何もしない
RTIXXO割込処理ルーチンから復帰(割込時に保存されたレジスタを復帰)
SWIXXOソフトウェア割込
WAIXXO割込待ち(レジスタは「SP」に保存される)

「i8080」のコードは「&H00」だが、「MC6800」では「$01」である
 このため、「0」クリアでは「MC6800」の場合「$00:未定義命令」の実行になることに留意


[TOPに戻る]