戻る

MC6809

Motorola MC6809
Data 8/16bit / Address Bus 16bit
Cycle 1.0MHz〜2.0MHz
(1979)

※余談:MSX「ゴーファーの野望」はグラディウス暦「6809」年という設定である。

●6809のピン配列

Vss1 40HALT
NMI2 39XTAL
IRQ3 38EXTAL
FIRQ4 37RESET
BS5 36MRDY
BA6 35Q
Vcc7 34E
A08 33DAM/BREQ
A19 32R/W
A210 31D0
A311 30D1
A412 29D2
A513 28D3
A614 27D4
A715 26D5
A816 25D6
A917 24D7
A1018 23A15
A1119 22A14
A1220 21A13

●6809の特徴

「MC6809」においては「MC6800」より「アドレッシング」が更に強化された。

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

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

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

「a」は8bitアキュムレータ「A,B」を表す
「D」は8bitアキュムレータ「A,B」をつなげた16bitアキュムレータ「D」を表す
「PC」は16bitレジスタである「プログラムカウンタ」(PC)を表す
「U」は16bitレジスタである「スタックポインタ」(SP)でユーザが自由に使える「USP」を表す
「s」は16bitレジスタである「スタックポインタ」(S,U)を表す
「x」は16bitレジスタである「インデックスレジスタ」(X,Y)を表す
 インデックスレジスタは高級言語における「配列」の位置を表す
 (「MC6809」の場合は16bit=2bytesの単位となる)
「DP」は8bitレジスタである「ダイレクトページレジスタ」を表す
「f」はフラグ「H,N,Z,V,C」を表す (「E,F,I」はマスクであり、演算結果には影響されない)
 フラグは演算結果の状態を表す (CCR:コンデションコードレジスタ)

  bit7「E」:Entireフラグ→割込で全レジスタを退避した場合、1
  bit6「F」:FIRQ (Fast Interrupt ReQuest:高速割込要求)マスク→1でFIRQ割込禁止
  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.DirectIndexExtendInher.動作
LDaOOOOXアキュムレータに指定値をロード(読込)
STaXOOOXアキュムレータからストア(格納)
INCXXOOX指定値をインクリメント(+1)
INCaXXXXOアキュムレータをインクリメント
DECXOOOX指定値をデクリメント(-1)
DECaXXXXOアキュムレータをデクリメント
ADDaOOOOX指定値を加算
ADCaOOOOX指定値に「C」フラグを加えた値を加算
SUBaOOOOXアキュムレータから指定値を減算
SBCaOOOOX指定値に「C」フラグを加えた値を減算
MULXXXXOアキュムレータ「A」と「B」の値を乗算し、結果をアキュムレータ「D」として格納
ANDaOOOOX指定値との論理積
BITaOOOOX指定値との論理積(値は反映せず=bit test)
ORAaOOOOX指定値との論理和
EORaOOOOX指定値との排他的論理和
COMXOOOX指定値の否定値
COMaXXXXOアキュムレータの否定値
NEGXOOOX指定値の符号反転
NEGaXXXXOアキュムレータの符号反転
CLRXOOOX指定値を0にする
CLRaXXXXOアキュムレータを0にする
CMPaOOOOXアキュムレータと指定値を比較
TSTXOOOX指定値から0を減算(=テスト:フラグへの反映)
TSTaXXXXOアキュムレータから0を減算
ROLXOOOX指定値を左ローテーション
ROLaXXXXOアキュムレータを左ローテーション
RORXOOOX指定値を右ローテーション
RORaXXXXOアキュムレータを右ローテーション
ASLXOOOX指定値を左算術シフト
ASLaXXXXOアキュムレータを左算術シフト
ASRXOOOX指定値を右算術シフト
ASRaXXXXOアキュムレータを右算術シフト
LSRXOOOX指定値を右論理シフト
LSRaXXXXOアキュムレータを右論理シフト
PSHaXXXXOアキュムレータをプッシュ(「SP」に保存 →「SP」アドレスのインクリメント)
PULaXXXXOアキュムレータへポップ (「SP」から取出→「SP」アドレスのデクリメント)
DAAXXXXOBCD(Binary-Coded Decimal:二進化十進)補正

●16bitアキュムレータ関連命令

ニーモニックImmed.DirectIndexExtendInher.動作
LDDOOOOXアキュムレータに指定値をロード
STDXOOOXアキュムレータからストア
ADDDOOOOX指定値を加算
SUBDOOOOXアキュムレータから指定値を減算
CMPDOOOOXアキュムレータと指定値を比較
SEXXXXXOアキュムレータ「B」を符号拡張して「D」に格納

●「IX」「SP」関連命令

ニーモニックImmed.DirectIndexExtendInher.動作
LDxOOOOX「IX」に指定値をロード
LDsOOOOX「SP」に指定値をロード
STxXOOOX「IX」からストア
STsXOOOX「SP」からストア
LEAxXXXXO「IX」からストア
LEAsXXXXO「SP」からストア
CMPxOOOOX「IX」と指定値を比較
CMPsOOOOX「SP」と指定値を比較
LEAxXXOXX「IX」に指定値を加算(アドレス指定)
LEAsXXOXX「SP」に指定値を加算
ABXXXXXOインデックスレジスタ「X」にアキュムレータ「B」の値を加算して「X」に格納

●レジスタアドレッシング命令

ニーモニック動作
EXG指定したレジスタ値を交換
TFRレジスタ1の値をレジスタ2に転送
PSHsレジスタ値を「SP」にプッシュ
PULsレジスタ値を「SP」からポップ

●フラグ関連命令

ニーモニックImmed.DirectIndexExtend動作
ANDCCOXXX「CCR」と指定値の論理積
ORCCOXXX「CCR」と指定値の論理和
CWAIXOOO「CCR」と指定値の論理積を取って割込待ち

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

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

●「PC」関連命令 (分岐:PC相対のみ)
各ニーモニックの先頭に「L」を付けると16bitオフセット命令となる。

ニーモニック動作
BRA分岐(Branch)
BRN分岐しない
BCC「C」フラグが0のとき分岐(≧:Unsigned)
BHS「C」フラグが0のとき分岐
BCS「C」フラグが1のとき分岐(<:Unsigned)
BLO「C」フラグが1のとき分岐
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」に保存され、リターンのときそのアドレスに戻る)

●その他命令 (インヘレント)

ニーモニック動作
NOP何もしない
RTSサブルーチンから復帰
RTI割込処理ルーチンから復帰(割込時に保存されたレジスタを復帰)
SWIソフトウェア割込1
SWI2ソフトウェア割込2
SWI3ソフトウェア割込3
SYNC割込待ち(レジスタは「SP」に保存される)

アキュムレータ「A」の全bitに「B」の「MSB(Most Significant Bit:最上位bit)」をコピー
 符号付の場合、MSBが符号を表すとともに数値以外の桁はMSBと同値となるため、このような動作になる。


[TOPに戻る]