MC68HC11

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機能です。

MC68HC11A1
ROM無し版のMC68HC11A1で、それ以外はMC68HC11A8と同一機能。ただし、外部にROMを接続する都合上、18本分のI/Oポートが使えなくなってしまう。

具体的に細部を見ていくことにしましょう。
レジスタ構成は、このようになっています。
MC68HC11 registers
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.