MC6800から始まったMotorola社のマイクロプロセッサは、1979年に発表されたMC6801とMC6805というシングルチップマイクロコンピュータによってローコスト小型組み込み分野へと広く展開していきました。M6801のCPU部はM6800に多少の命令を追加しただけで、M6805はもともと低機能な命令体系だったM6800をさらに大幅に簡略化して、その分I/Oポートを追加したローコスト用マイクロコンピュータでした。
さて、それから数年も経つと、数倍の回路規模を持つLSIをずっと低価格で製造できるようになってきます。また、マイクロコンピュータの応用分野が広がり、シングルチップマイクロコンピュータのCPUにも高速高性能なものが要求されたり、多様なI/O機能が含まれるものを要求する応用も増えてきました。そういった状況に対応してMotorola社が発表したのがM68HC11シリーズマイクロコンピュータです。1984年のことです。
M6801に、インデックスレジスタを1本追加してその関連の命令を増やすとともに16 bit同士の除算命令を追加、さらに組み込み用には便利なビット操作命令を追加して、強化したプロセッサを含んでいます。また、HCMOSプロセスで低消費電力化するとともにSTOP/WAIT命令を追加して、低消費電力を要求するシステムに利用しやすくしています。
メモリは、最初に発表されたMC68HC11A8で8 KByteのROMを内蔵し、256 ByteのRWMとともに512 ByteのEEPROMまで内蔵していて、各種設定などを電源断後も記憶しておけるようになっています。
さらに3本のインプットキャプチャ機能や5種類のアウトプットコンペア出力を持つ16 bitタイマとか、シフトレジスタ型のシリアルインターフェースであるSPIや非同期シリアル通信用のSCI、ストローブ信号やハンドシェーク信号対応のパラレルポート、8 bit分解能のA/Dコンバータまで組み込まれていて、当時のシングルチップマイクロコンピュータとしてはなかなか強力なI/O機能です。
ROM無し版のMC68HC11A1で、それ以外はMC68HC11A8と同一機能。ただし、外部にROMを接続する都合上、18本分のI/Oポートが使えなくなってしまう。
具体的に細部を見ていくことにしましょう。
レジスタ構成は、このようになっています。
8 bitアキュムレータのA, Bレジスタは連結して16 bitアキュムレータDとして利用できます。また、M6801のインデックスレジスタXはIXと名称を変更されて、さらにもう一本のインデックスレジスタIYが追加されています。SPとPCはそれぞれ従来通りのスタックポインタとプログラムカウンタです。フラグ類を納めたコンデションコードレジスタ(CCR)は、下位6 bitはM6801と同一で、下からキャリー、オーバーフロー、ゼロ、ネガティブ、IRQ割り込みマスク、ハーフキャリーとなっています。第6ビットはXとなっていますが、これは新設のXIRQ割り込み用のマスクです。第7ビットのSはストップディスエーブルビットとなっています。
次に命令についてですが、M6801に含まれる命令はバイナリコードまですべて共通で、ビット操作命令など少数の新設命令とIY関係の命令が追加されているだけです。
アキュムレータやメモリ関係の命令はこのくらいあります。
意味 ニーモニック IMMED DIRECT INDEX_X INDEX_Y EXTEND IMPLIED 動作 Add ADDA 8B 2 2 9B 3 2 AB 4 2 18AB 5 3 BB 4 3 A + M -> A ADDB CB 2 2 DB 3 2 EB 4 2 18EB 5 3 FB 4 3 B + M -> B ADDD C3 4 3 D3 5 2 E3 6 2 18E3 7 3 F3 6 3 D + M -> D Add Accumulators ABA 1B 2 1 A + B -> A Add with Carry ADCA 89 2 2 99 3 2 A9 4 2 18A9 5 3 B9 4 3 A + M + C -> A ADCB C9 2 2 D9 3 2 E9 4 2 18E9 5 3 F9 4 3 B + M + C -> B And ANDA 84 2 2 94 3 2 A4 4 2 18A4 5 3 B4 4 3 A & M -> A ANDB C4 2 2 D4 3 2 E4 4 2 18E4 5 3 F4 4 3 B & M -> B Clear Bit(s) *BCLR 15 6 3 1D 7 3 181D 8 4 M & (not imm) -> M Set Bit(s) *BSET 14 6 3 1C 7 3 181C 8 4 M or imm -> M Bit Test BITA 85 2 2 95 3 2 A5 4 2 18A5 5 3 B5 4 3 A & M BITB C5 2 2 D5 3 2 E5 4 2 18E5 5 3 F5 4 3 B & M Clear CLR 6F 6 2 186F 7 3 7F 6 3 0 -> M CLRA 4F 2 1 0 -> A CLRB 5F 2 1 0 -> B Compare CMPA 81 2 2 91 3 2 A1 4 2 18A1 5 3 B1 4 3 A - M CMPB C1 2 2 D1 3 2 E1 4 2 18E1 5 3 F1 4 3 B - M *CPD 1A83 54 1A93 63 1AA3 73 CDA3 73 1AB3 7 4 D - M Compare Accumulators CBA 11 2 1 A - B Complement COM 63 6 2 1853 7 3 73 6 3 not M -> M COMA 43 2 1 not A -> A COMB 53 2 1 not B -> B Negate NEG 60 6 2 1860 7 3 70 6 3 0 - M -> M NEGA 40 2 1 0 - A -> A NEGB 50 2 1 0 - B -> B Decimal Adjust DAA 19 2 1 BCD補正 Decrement DEC 6A 6 2 186A 7 3 7A 6 3 M - 1 -> M DECA 4A 2 1 A - 1 -> A DECB 5A 2 1 B - 1 -> B Exclusive OR EORA 88 2 2 98 3 2 A8 4 2 18A8 5 3 B8 4 3 A eor M -> A EORB C8 2 2 D8 3 2 E8 4 2 18E8 5 3 F8 4 3 B eor M -> B Fractional Divide *FDIV 03 41 1 D/IX -> IX, r -> D Integer Divide *IDIV 02 41 1 D/IX -> IX, r -> D Increment INC 6C 6 2 186C 7 3 7C 6 3 M + 1 -> M INCA 4C 2 1 A + 1 -> A INCB 5C 2 1 B + 1 -> B Load Accumulator LDAA 86 2 2 96 3 2 A6 4 2 18A6 5 3 B6 4 3 M -> A LDAB C6 2 2 D6 3 2 E6 4 2 18E6 5 3 F6 4 3 M -> B LDD CC 3 3 DC 4 2 EC 5 2 18EC 6 3 FC 5 3 M -> D Multiply MUL 3D 10 1 A * B -> D Or ORAA 8A 2 2 9A 3 2 AA 4 2 18AA 5 3 BA 4 3 A or M -> A ORAB CA 2 2 DA 3 2 EA 4 2 18EA 5 3 FA 4 3 B or M -> B Push Data PSHA 36 3 1 A -> M(SP--) PSHB 37 3 1 B -> M(SP--) Pull Data PULA 32 4 1 M(++SP) -> A PULB 33 4 1 M(++SP) -> B Rotate Left ROL 69 6 2 1869 7 3 79 6 3 ROL(M) ROLA 49 2 1 ROL(A) ROLB 59 2 1 ROL(B) Rotate Right ROR 66 6 2 1866 7 3 76 6 3 ROR(M) RORA 46 2 1 ROR(A) RORB 56 2 1 ROR(B) Shift Left Arithmetic ASL 68 6 2 1868 7 3 78 6 3 ASL(M) ASLA 48 2 1 ASL(A) ASLB 58 2 1 ASL(B) ASLD 05 3 1 ASL(D) Shift Right Arithmetic ASR 67 6 2 1867 7 3 77 6 3 ASR(M) ASRA 47 2 1 ASR(A) ASRB 57 2 1 ASR(B) Shift Right Logic LSR 64 6 2 1864 7 3 74 6 3 LSR(M) LSRA 44 2 1 LSR(A) LSRB 54 2 1 LSR(B) LSRD 04 3 1 LSR(D) Store Accumulator STAA 97 3 2 A7 4 2 18A7 5 3 B7 4 3 A -> M STAB D7 3 2 E7 4 2 18E7 5 3 F7 4 3 B -> M STD DD 4 2 ED 5 2 18ED 6 3 FD 5 3 D -> M Subtract SUBA 80 2 2 90 3 2 A0 4 2 18A0 5 3 B0 4 3 A - M -> A SUBB C0 2 2 D0 3 2 E0 4 2 18E0 5 3 F0 4 3 B - M -> B SUBD 83 4 3 93 5 2 A3 6 2 18A4 7 3 B3 6 3 D - M -> D Subtract Accumulators SBA 10 2 1 A - B -> A Subtract with Carry SBCA 82 2 2 92 3 2 A2 4 2 18A2 5 3 B2 4 3 A - M - C -> A SBCB C2 2 2 D2 3 2 E2 4 2 18E2 5 3 F2 4 3 B - M - C -> B Transfer Accumulator TAB 16 2 1 A -> B TBA 17 2 1 B -> A Test Zero or Minus TST 6D 6 2 186D 7 3 7D 6 3 M - 0 TSTA 4D 2 1 A - 0 TSTB 5D 2 1 B - 0
この表で、ニーモニックの欄はアセンブラで使われるニーモニックを示します。この後の欄は数字3組の欄が六つ続いていますが、それぞれがアドレッシングモードに対応しています。数字3組のうち、最初の2桁の16進数が、その命令のオペコードです。次の1桁の数字が命令実行に必要なクロック数、最後の1桁がその命令全体のバイト数です。この数字が2や3になっている命令には、アドレス修飾に必要なバイトが1ないし2 Byteだけオペコードの後に続きます。CPD命令だけはクロック数とバイト数の間にスペースを入れていません。両方とも一桁ですから、それに注意して読んでください。
ニーモニックの直前に*が付けられているものがM6801に存在せずにM68HC11で新設された命令です。もちろん、INDEX IYアドレッシング部分はすべて新たに追加されたものです。
このグループで新設された命令は、ビット操作命令2種類と、Dレジスタとの比較命令CPDと、16 bit除算命令2種類だけです。
ビット操作命令はM68HC11に先立って別のM6801拡張プロセッサである日立のHD6301でも新設されていますが、ニーモニックも異なりバイナリ互換性もありません。
INDEX IYアドレッシングの命令コードは、INDEX IXアドレッシングの命令コードの直前に基本的に$18を配置したものとなっています。実行時間も$18というコードを読み込む分だけ、INDEX IXアドレッシングの命令より1クロック分遅くなっています。ですから、インデックスレジスタ1本だけ使用する場合には、できるだけIXレジスタを利用した方が高速になります。まぁ、2本のインデックスレジスタが必要な場面なら、M6801のときのようにインデックスレジスタを退避させながら利用するより、1クロックと1 Byteが余計に必要になってもずっと効率的ですから、IYレジスタをどんどん利用すべきです。
16 bit除算命令はFDIV命令とIDIV命令が用意されています。どちらもDレジスタの内容をIXレジスタで割り、その結果をIXレジスタに、余りをDレジスタに入れる命令です。IDIV命令が普通の整数除算を行う命令です。FDIV命令は小数点以下の商を得るための命令で、D < IXの場合に有効です。そのとき、Dの内容を16 bit左シフトした32 bit整数を16 bitのIXレジスタの内容で整数除算するのと同じ動作を行います。
なお、Motorolaのアセンブリ言語定義ではLSL, LSLA, LSLB, LSLDという論理シフト命令が存在していますが、これはそれぞれASL, ASLA, ASLB, ASLDという算術シフト命令と同一のバイナリコードのため、省略しています。左シフトの場合、算術シフトも論理シフトも同一の動作をするためです。
次にインデックスレジスタやスタックポインタ操作 関係のグループです。
意味 ニーモニック IMMED DIRECT INDEX_X INDEX_Y EXTEND IMPLIED 動作 Add B to Index X ABX 3A 3 1 B + X -> X Add B to Index Y *ABY 183A 4 2 B + Y -> Y Compare IX to Memory CPX 8C 4 3 9C 5 2 AC 6 2 CDAC 7 3 BC 6 3 X - M Compare IY to Memory *CPY 188C 5 4 189C 6 3 1AAC 7 3 18AC 7 3 18BC 7 4 Y - M Decrement Index X DEX 09 3 1 X - 1 -> X Decrement Index Y *DEY 1809 4 2 Y - 1 -> Y Decrement SP DES 34 3 1 SP - 1 -> SP Increment Index X INX 08 3 1 X + 1 -> X Increment Index Y *INY 1808 4 2 Y + 1 -> Y Increment SP INS 31 3 1 SP + 1 -> SP Load Index X LDX CE 3 3 DE 4 2 EE 5 2 CDEE 6 3 FE 5 3 M -> X Load Index Y *LDY 18CE 4 4 18DE 5 3 1AEE 6 3 18EE 6 3 18FE 5 3 M -> Y Load SP LDS 8E 3 3 9E 4 2 AE 5 2 18AE 6 3 BE 5 3 M -> SP Push Index X PSHX 3C 4 1 X -> M(SP--) Push Index Y *PSHY 183C 5 2 Y -> M(SP--) Pull Index X PULX 38 5 1 M(++SP) -> X Pull Index Y *PULY 1838 6 2 M(++SP) -> X Store Index X STX DF 4 2 EF 5 2 CDEF 6 3 FF 5 3 X -> M Store Index Y *STY 18DF 5 3 1AEF 6 3 18EF 6 3 18FF 6 4 Y -> M Store SP STS 9F 4 2 AF 5 2 18AF 6 3 BF 5 3 SP -> M Transfer IX to SP TXS 35 3 1 X - 1 -> SP Transfer IY to SP *TYS 1835 4 2 Y - 1 -> SP Transfer SP to IX TSX 30 3 1 SP + 1 -> X Transfer SP to IY *TSY 1830 4 2 SP + 1 -> Y Exchange D with IX *XGDX 8F 3 1 D <-> X Exchange D with IY *XGDY 188F 4 2 D <-> Y
MC6801にIYが追加された都合上、追加された命令のほとんどはIYレジスタに関するものです。IXとIYは命令のコードサイズと実行時間を除いて、機能的には同等といえます。
XGDX命令はHD6301でも新設されていますが、命令コードには互換性がありません。
次はプログラムカウンタ関係の命令ですね。このグループはプログラムカウンタ相対アドレッシングしか許されないブランチ系の命令と、それ以外に分けて表にします。
意味 ニーモニック REL 条件 Branch Always BRA 20 3 2 常に分岐 Branch Never BRN 21 3 2 常に分岐せず(2 Byte NOP命令) Branch If Carry Clear BCC 24 3 2 C = 0 (BHS: Higher or Same) Branch If Carry Set BCS 25 3 2 C = 1 (BLO: Lower) Branch If = Zero BEQ 27 3 2 Z = 1 Branch If >= Zero BGE 2C 3 2 N eor V = 0 Branch If > Zero BGT 2E 3 2 Z + (N eor V) = 0 Branch If Higher BHI 22 3 2 C + Z = 0 Branch If <= Zero BLE 2F 3 2 Z + (N eor V) = 1 Branch If Lower or Same BLS 23 3 2 C + Z = 1 Branch If < Zero BLT 2D 3 2 N eor V = 1 Branch If Minus BMI 2B 3 2 N = 1 Branch If Not Equal Zero BNE 26 3 2 Z = 0 Branch If Overflow Clear BVC 28 3 2 V = 0 Branch If Overflow Set BVS 29 3 2 V = 1 Branch If Plus BPL 2A 3 2 N = 0 Branch to Subroutine BSR 8D 6 2 動作: PC -> (SP--), PC += offset
最後のだけがサブルーチン呼び出しで特別な動作をしますが、他は条件分岐命令です。M6801と同一です。
BCC命令とBCS命令にはそれぞれBHS命令とBLO命令という別名が用意されています。数値の比較条件としてわかりやすいニーモニックを用意したのでしょう。
その他のプログラムカウンタ回りの命令には、このようなものがあります。
意味 ニーモニック DIRECT INDEX_X INDEX_Y EXTEND IMPLIED 動作 Branch if Bit(s) Clear*BRCLR 13 6 4 1F 7 4 181F 8 5 if(M & imm == 0) Branch if Bit(s) Set *BRSET 12 6 4 1E 7 4 181E 8 5 if((not M) & imm == 0) Jump JMP 6E 3 2 186E 4 3 7E 3 3 Addr -> PC Jump To Subroutine JSR 9D 5 2 AD 6 2 18AD 7 3 BD 6 3 PC -> (SP--), Addr -> PC No Operation NOP 01 2 1 Do nothing Return From Interrupt RTI 3B 12 1 Return From Subroutine RTS 39 5 1 (++SP) -> PC Stop Internal Clocks *STOP CF 2 1 Software Interrupt SWI 3F 14 1 Wait for Interrupt WAI 3E 12 1
BRCLR命令とBRSET命令は直接メモリのビットの状態を判定して条件分岐を行う命令です。アキュムレータやCCRの内容を一切変化させずにI/Oポートの状態などを判定できるため、便利な命令です。ただしIYを用いたインデックスアドレッシングモードでは5 Byte命令になってしまいます。BRCLR命令の場合、BIT命令とBEQ命令を組み合わせるのとバイト数や実行時間では変わりありませんし、CCRが変化しないことが有効なこともあるでしょう。BRSET命令は他の命令を組み合わせるより高速ということになりますかね。
STOP命令はCCRのSビットがクリアされている状態で実行された場合に限りSTOPモードに入る命令です。内部オシレータを含むすべての機能ブロックが停止して、もっとも消費電力の低い状態になります。RESET, XIRQ, マスクされていないIRQによって、STOPモードから通常のモードに遷移します。
WAI命令は従来、割り込み応答時間を改善するために前もって内部レジスタをスタックに待避しておいて割り込みを待ち受けるだけの命令でしたが、M68HC11ではさらに消費電力低減の役割も持たされています。もともと次の割り込みまで何もしない命令ですから、その分消費電力を押さえるのにも使おうということで。STOPモードと異なり、I/O周りのクロックなどは供給されていますから、シリアルデータの受信割り込みやインターバルタイマ割り込みなどで通常のモードに遷移することができます。
最後に残ったのがCCR、フラグ関係の命令ですね。これには、次の8命令が含まれます。
意味 ニーモニック IMPLIED 動作 Clear Carry CLC 0C 2 1 0 -> C Clear Interrupt Mask CLI 0E 2 1 0 -> I Clear Overflow CLV 0A 2 1 0 -> V Set Carry SEC 0D 2 1 1 -> C Set Interrupt Mask SEI 0F 2 1 1 -> I Set Overflow SEV 0B 2 1 1 -> V Transfer A to CCR TAP 06 2 1 A -> CCR Transfer CCR to A TPA 07 2 1 CCR -> A
M6801と変更点はありません。
Returnto IC Collection