MC6809
|
Motorola MC6809 Data 8/16bit / Address Bus 16bit Cycle 1.0MHz〜2.0MHz (1979) |
※余談:MSX「ゴーファーの野望」はグラディウス暦「6809」年という設定である。
●6809のピン配列
| Vss | 1 | 40 | HALT | |
| NMI | 2 | 39 | XTAL | |
| IRQ | 3 | 38 | EXTAL | |
| FIRQ | 4 | 37 | RESET | |
| BS | 5 | 36 | MRDY | |
| BA | 6 | 35 | Q | |
| Vcc | 7 | 34 | E | |
| A0 | 8 | 33 | DAM/BREQ | |
| A1 | 9 | 32 | R/W | |
| A2 | 10 | 31 | D0 | |
| A3 | 11 | 30 | D1 | |
| A4 | 12 | 29 | D2 | |
| A5 | 13 | 28 | D3 | |
| A6 | 14 | 27 | D4 | |
| A7 | 15 | 26 | D5 | |
| A8 | 16 | 25 | D6 | |
| A9 | 17 | 24 | D7 | |
| A10 | 18 | 23 | A15 | |
| A11 | 19 | 22 | A14 | |
| A12 | 20 | 21 | A13 |
●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. | Direct | Index | Extend | Inher. | 動作 |
|---|---|---|---|---|---|---|
| LDa | O | O | O | O | X | アキュムレータに指定値をロード(読込) |
| STa | X | O | O | O | X | アキュムレータからストア(格納) |
| INC | X | X | O | O | X | 指定値をインクリメント(+1) |
| INCa | X | X | X | X | O | アキュムレータをインクリメント |
| DEC | X | O | O | O | X | 指定値をデクリメント(-1) |
| DECa | X | X | X | X | O | アキュムレータをデクリメント |
| ADDa | O | O | O | O | X | 指定値を加算 |
| ADCa | O | O | O | O | X | 指定値に「C」フラグを加えた値を加算 |
| SUBa | O | O | O | O | X | アキュムレータから指定値を減算 |
| SBCa | O | O | O | O | X | 指定値に「C」フラグを加えた値を減算 |
| MUL | X | X | X | X | O | アキュムレータ「A」と「B」の値を乗算し、結果をアキュムレータ「D」として格納 |
| ANDa | O | O | O | O | X | 指定値との論理積 |
| BITa | O | O | O | O | X | 指定値との論理積(値は反映せず=bit test) |
| ORAa | O | O | O | O | X | 指定値との論理和 |
| EORa | O | O | O | O | X | 指定値との排他的論理和 |
| COM | X | O | O | O | X | 指定値の否定値 |
| COMa | X | X | X | X | O | アキュムレータの否定値 |
| NEG | X | O | O | O | X | 指定値の符号反転 |
| NEGa | X | X | X | X | O | アキュムレータの符号反転 |
| CLR | X | O | O | O | X | 指定値を0にする |
| CLRa | X | X | X | X | O | アキュムレータを0にする |
| CMPa | O | O | O | O | X | アキュムレータと指定値を比較 |
| TST | X | O | O | O | X | 指定値から0を減算(=テスト:フラグへの反映) |
| TSTa | X | X | X | X | O | アキュムレータから0を減算 |
| ROL | X | O | O | O | X | 指定値を左ローテーション |
| ROLa | X | X | X | X | O | アキュムレータを左ローテーション |
| ROR | X | O | O | O | X | 指定値を右ローテーション |
| RORa | X | X | X | X | O | アキュムレータを右ローテーション |
| ASL | X | O | O | O | X | 指定値を左算術シフト |
| ASLa | X | X | X | X | O | アキュムレータを左算術シフト |
| ASR | X | O | O | O | X | 指定値を右算術シフト |
| ASRa | X | X | X | X | O | アキュムレータを右算術シフト |
| LSR | X | O | O | O | X | 指定値を右論理シフト |
| LSRa | X | X | X | X | O | アキュムレータを右論理シフト |
| PSHa | X | X | X | X | O | アキュムレータをプッシュ(「SP」に保存 →「SP」アドレスのインクリメント) |
| PULa | X | X | X | X | O | アキュムレータへポップ (「SP」から取出→「SP」アドレスのデクリメント) |
| DAA | X | X | X | X | O | BCD(Binary-Coded Decimal:二進化十進)補正 |
●16bitアキュムレータ関連命令
| ニーモニック | Immed. | Direct | Index | Extend | Inher. | 動作 |
|---|---|---|---|---|---|---|
| LDD | O | O | O | O | X | アキュムレータに指定値をロード |
| STD | X | O | O | O | X | アキュムレータからストア |
| ADDD | O | O | O | O | X | 指定値を加算 |
| SUBD | O | O | O | O | X | アキュムレータから指定値を減算 |
| CMPD | O | O | O | O | X | アキュムレータと指定値を比較 |
| SEX | X | X | X | X | O | アキュムレータ「B」を符号拡張※して「D」に格納 |
●「IX」「SP」関連命令
| ニーモニック | Immed. | Direct | Index | Extend | Inher. | 動作 |
|---|---|---|---|---|---|---|
| LDx | O | O | O | O | X | 「IX」に指定値をロード |
| LDs | O | O | O | O | X | 「SP」に指定値をロード |
| STx | X | O | O | O | X | 「IX」からストア |
| STs | X | O | O | O | X | 「SP」からストア |
| LEAx | X | X | X | X | O | 「IX」からストア |
| LEAs | X | X | X | X | O | 「SP」からストア |
| CMPx | O | O | O | O | X | 「IX」と指定値を比較 |
| CMPs | O | O | O | O | X | 「SP」と指定値を比較 |
| LEAx | X | X | O | X | X | 「IX」に指定値を加算(アドレス指定) |
| LEAs | X | X | O | X | X | 「SP」に指定値を加算 |
| ABX | X | X | X | X | O | インデックスレジスタ「X」にアキュムレータ「B」の値を加算して「X」に格納 |
●レジスタアドレッシング命令
| ニーモニック | 動作 |
|---|---|
| EXG | 指定したレジスタ値を交換 |
| TFR | レジスタ1の値をレジスタ2に転送 |
| PSHs | レジスタ値を「SP」にプッシュ |
| PULs | レジスタ値を「SP」からポップ |
●フラグ関連命令
| ニーモニック | Immed. | Direct | Index | Extend | 動作 |
|---|---|---|---|---|---|
| ANDCC | O | X | X | X | 「CCR」と指定値の論理積 |
| ORCC | O | X | X | X | 「CCR」と指定値の論理和 |
| CWAI | X | O | O | O | 「CCR」と指定値の論理積を取って割込待ち |
●「PC」関連命令 (ジャンプ)
| ニーモニック | Direct | Index | Extend | 動作 |
|---|---|---|---|---|
| JMP | O | O | O | ジャンプ(「PC」に指定値をロード) |
| JSR | O | O | O | 「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と同値となるため、このような動作になる。