MCS-48 (8048)
|
Intel MCS-48 Data 8bit / Address Bus 8bit Cycle 〜11MHz (1976) |
MCS-48(8048)はCPUと内蔵ROMにRAM、クロックジェネレータを内蔵したマイクロコントローラである。
動作クロックは最大11MHzと当時としてはかなり高速稼働も可能であった。
低コストで応用範囲が広く利用できるため、組込用途で21世紀になっても利用されている。
(同じマイクロコントローラである「8051」に置換されるケースもあるが、リモコンや電子玩具、パソコン周辺機器など様々な用途で使われている)
メインとしてはIMSAI-8048、Magnavox Odyssey2などで使われた。
●8048のピン配列
| T0 | 1 | 40 | Vcc | |
| XTAL1 | 2 | 39 | T1 | |
| XTAL2 | 3 | 38 | P27 | |
| RESETG | 4 | 37 | P26 | |
| SS | 5 | 36 | P25 | |
| INT | 6 | 35 | P24 | |
| EA | 7 | 34 | P17 | |
| RD | 8 | 33 | P16 | |
| PSEN | 9 | 32 | P15 | |
| WR | 10 | 31 | P14 | |
| ALE | 11 | 30 | P13 | |
| D0 | 12 | 29 | P12 | |
| D1 | 13 | 28 | P11 | |
| D2 | 14 | 27 | P10 | |
| D3 | 15 | 26 | Vdd | |
| D4 | 16 | 25 | PROG | |
| D5 | 17 | 24 | P23 | |
| D6 | 18 | 23 | P22 | |
| D7 | 19 | 22 | P21 | |
| Vss | 20 | 21 | P20 |
●8048の特徴
| レジスタ名 | bit幅 | 説明 |
|---|---|---|
| A | 8bit | →Accumlator |
| PC | 12bit | →Program Counter |
| PSW | 8bit | →Program Status Word |
| F1 | 1bit | →User Flag 1 |
| MB | 1bit | →Most significant Bit flag |
データレジスタはなく、代わりに内蔵RAMにScratchpad Registerが用意されている。
| 内蔵RAM (Scratchpad Register) | |
|---|---|
| 00H | Register Bank 0 |
| 07H | |
| 08H | Stack |
| 17H | |
| 18H | Register Bank 1 |
| 1FH | |
| 20H | User Memory |
| 3FH | |
●MCS-48の命令
命令(ニーモニック)は以下の構成となっている。
ニーモニック [DEST[,SRC]]
データの流れは「DEST」←「SRC」となる。
オペランド表記は以下の通りである。
※「A」 :8bitアキュムレータ
※「Rn」 :8bit汎用レジスタ「R0〜R7」
※「@Rn」:8bit汎用レジスタ「R0〜R1」(ポインタレジスタとしてはR0/1のみが使用される)
※「PC」 :12bitプログラムカウンタ
※「SP」 :4bitスタックポインタ (8bitレジスタ「PSW」の下位4bit)
(スタックは汎用レジスタであるレジスタバンク0,1に挟まれた08H〜17Hの領域が割り当てられている)
※「f」 :8bitレジスタ「PSW」の上位4bitである1bitフラグ「BS,F0,AC,C」と1bitフラグ「F1」「MB」を表す
「BS」:レジスタバンクを示す(0:00H〜07H/1:18H〜1FH)
「F0」:汎用フラグ0
「AC」:補助キャリーとしてBCD(二進化十進)補正用に使用
「C」 :桁あふれ(Carry)フラグ
「F1」:汎用フラグ1(割込時の扱いが異なる)
「MB」:分岐先の最上位bit(MSB)を示す
※「n」 :8bitイミディエイト値(Immediate Operand)を表す
※「@A」 :8bitアキュムレータが示すアドレスの値を表す
※「a」 :11bitアドレス値を表す
※「@a」 :8bit指定アドレスの値を表す
●アキュムレータ操作(演算)命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| ADD | A,Rn | アキュムレータの値と指定レジスタの値を加算し、アキュムレータに格納 |
| ADD | A,@Rn | アキュムレータの値と指定レジスタの値が示すアドレスの値を加算し、アキュムレータに格納 |
| ADD | A,#n | アキュムレータの値と8bitイミディエイト値を加算し、アキュムレータに格納 |
| ADDC | A,Rn | アキュムレータの値と指定レジスタの値に「C」フラグの値をを加算し、アキュムレータに格納 |
| ADDC | A,@Rn | アキュムレータの値と指定レジスタの値が示すアドレスの値に「C」フラグの値を加算し、アキュムレータに格納 |
| ADDC | A,#n | アキュムレータの値と8bitイミディエイト値に「C」フラグの値を加算し、アキュムレータに格納 |
| ANL | A,Rn | アキュムレータの値と指定レジスタの値の論理積をアキュムレータに格納 |
| ANL | A,@Rn | アキュムレータの値と指定レジスタの値が示すアドレスの値の論理積をアキュムレータに格納 |
| ANL | A,#n | アキュムレータの値と8bitイミディエイト値の論理積をアキュムレータに格納 |
| ORL | A,Rn | アキュムレータの値と指定レジスタの値の論理和をアキュムレータに格納 |
| ORL | A,@Rn | アキュムレータの値と指定レジスタの値が示すアドレスの値の論理和をアキュムレータに格納 |
| ORL | A,#n | アキュムレータの値と8bitイミディエイト値の論理和をアキュムレータに格納 |
| XRL | A,Rn | アキュムレータの値と指定レジスタの値の排他的論理和をアキュムレータに格納 |
| XRL | A,@Rn | アキュムレータの値と指定レジスタの値が示すアドレスの値の排他的論理和をアキュムレータに格納 |
| XRL | A,#n | アキュムレータの値と8bitイミディエイト値の排他的論理和をアキュムレータに格納 |
| RL | A | アキュムレータの値を左単純ローテート |
| RLC | A | アキュムレータの値を左ローテート (0bit目に「C」フラグの値、「C」フラグに7bit目の値を格納) |
| RR | A | アキュムレータの値を右単純ローテート |
| RRC | A | アキュムレータの値を右ローテート (7bit目に「C」フラグの値、「C」フラグに0bit目の値を格納) |
| CLR | A | 0をアキュムレータに格納 |
| CPL | A | アキュムレータの値の否定値をアキュムレータに格納 |
| INC | A | アキュムレータの値をインクリメント |
| DEC | A | アキュムレータの値をデクリメント |
| DA | A | データをBCD補正 (BCDデータの演算を行ったあとに使用) |
| SWAP | A | アキュムレータの上位4bitと下位4bitの値を交換 |
「ADDx」はCarryが発生した場合「C」フラグに1が入る。
減算命令はなく、補数を加算するか「DEC」で代用する。
●スクラッチパッドレジスタ操作命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| INC | Rn | 指定レジスタの値をインクリメント |
| INC | @Rn | 指定レジスタの値が示すアドレスの値をインクリメント |
| DEC | Rn | 指定レジスタの値をデクリメント |
●データ転送操作命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| MOV | A,Rn | 指定レジスタの値をアキュムレータに格納 |
| MOV | A,@Rn | 指定レジスタが示すアドレスの値をアキュムレータに格納 |
| MOV | A,#n | 8bitイミディエイト値をアキュムレータに格納 |
| MOV | Rn,A | アキュムレータの値を指定レジスタに格納 |
| MOV | @Rn,A | アキュムレータの値を指定レジスタが示すアドレスに格納 |
| MOV | Rn,#n | 8bitイミディエイト値を指定レジスタに格納 |
| MOV | @Rn,#n | 8bitイミディエイト値を指定レジスタが示すアドレスに格納 |
| MOV | A,PSW | 「PSP」の値をアキュムレータに格納 |
| MOV | PSW,A | アキュムレータの値を「PSP」に格納 |
| XCH | A,Rn | 指定レジスタの値とアキュムレータの値を交換 |
| XCH | A,@Rn | 指定レジスタが示すアドレスの値とアキュムレータの値を交換 |
| XCHD | A,@Rn | 指定レジスタが示すアドレスの下位4bit値とアキュムレータの下位4bit値を交換 |
| MOVP | A,@a | PC上位4bit(8〜11)の値で指定されるページの8bit指定アドレスの値をアキュムレータに格納 |
| MOVP3 | A,@a | ページ3(固定)の8bit指定アドレスの値をアキュムレータに格納 |
| MOVX | A,MEM | 外部データメモリの値をアキュムレータに格納 |
| MOVX | MEM,A | アキュムレータの値を外部データメモリに格納 |
●分岐制御命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| JMP | a | 11bitアドレス値をPC(0〜10)、「MB」フラグの値をPC(11bit目)に格納 |
| JMPP | @A | アキュムレータの値が示すアドレスの値をPC(0〜7)に格納 |
| CALL | a | PCの値と「PSW」フラグ上位4bitの値をSPが示すスタックに格納、SPをインクリメント、11bitアドレス値をPC(0〜10)、「MB」フラグの値をPC(11bit目)に格納 |
| RET | SPをデクリメント、SPが示すアドレスの値をPCに格納 | |
| RETR | SPをデクリメント、SPが示すアドレスの値をPCと「PSW」フラグ上位4bitに格納 (割込復帰) | |
| DJNZ | Rn,a | 指定レジスタの値をデクリメントし、その値が0以外のとき、8bitアドレス値をPC(0〜7)に格納 |
| JC | a | 「C」フラグの値が1のとき、8bitアドレス値をPC(0〜7)に格納 |
| JNC | a | 「C」フラグの値が0のとき、8bitアドレス値をPC(0〜7)に格納 |
| JZ | a | アキュムレータの値が0のとき、8bitアドレス値をPC(0〜7)に格納 |
| JNZ | a | アキュムレータの値が0以外のとき、8bitアドレス値をPC(0〜7)に格納 |
| JF0 | a | 「F0」フラグの値が1のとき、8bitアドレス値をPC(0〜7)に格納 |
| JF1 | a | 「F1」フラグの値が1のとき、8bitアドレス値をPC(0〜7)に格納 |
| JTF | a | 「TF」フラグ(内蔵タイマ)の値が1のとき、8bitアドレス値をPC(0〜7)に格納、「TF」フラグはリセット |
| JT0 | a | 「T0」ポートの値が1のとき、8bitアドレス値をPC(0〜7)に格納 |
| JNT0 | a | 「T0」ポートの値が0のとき、8bitアドレス値をPC(0〜7)に格納 |
| JT1 | a | 「T1」ポートの値が1のとき、8bitアドレス値をPC(0〜7)に格納 |
| JNT1 | a | 「T1」ポートの値が0のとき、8bitアドレス値をPC(0〜7)に格納 |
| JNI | a | 「INT*」ポートの値が0のとき、8bitアドレス値をPC(0〜7)に格納 |
| JBn | a | 「JBn」ポート(n=0〜7)の値が1のとき、8bitアドレス値をPC(0〜7)に格納 |
●フラグ操作命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| CLR | C | 0を「C」フラグに格納 (クリア) |
| CPL | C | 「C」フラグの否定値を「C」フラグに格納 |
| CLR | F0 | 0を「F0」フラグに格納 |
| CPL | F0 | 「F0」フラグの否定値を「F0」フラグに格納 |
| CLR | F1 | 0を「F1」フラグに格納 |
| CPL | F1 | 「F1」フラグの否定値を「F1」フラグに格納 |
| SEL | RB0 | 0を「BS」フラグに格納 |
| SEL | RB1 | 1を「BS」フラグに格納 |
| SEL | MB0 | 0を「MB」フラグに格納 |
| SEL | MB1 | 1を「MB」フラグに格納 |
●入出力命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| IN | A,Pn | Pnポート(n=1〜2)の値をアキュムレータに格納 |
| OUTL | Pn,A | アキュムレータの値をPnポート(n=1〜2)に出力 |
| ANL | Pn,#n | 8bitイミディエイト値とPnポート(n=1〜2)の値の論理積をPnポート(n=1〜2)に出力 |
| ORL | Pn,#n | 8bitイミディエイト値とPnポート(n=1〜2)の値の論理和をPnポート(n=1〜2)に出力 |
| INS | A,BUS | 外部バスの値をアキュムレータに格納 |
| OUTL | BUS,A | アキュムレータの値を外部バスに出力 |
| ANL | BUS,#n | 8bitイミディエイト値と外部バスの値の論理積を外部バスに出力 |
| ORL | BUS,#n | 8bitイミディエイト値と外部バスの値の論理和を外部バスに出力 |
| MOVD | A,Pn | Pnポート(n=1〜2)の値をアキュムレータ下位4bit、アキュムレータ上位4bitに0を格納 |
| MOVD | Pn,A | アキュムレータ下位4bitの値を、Pnポート(n=1〜2)に出力 |
| ANLD | Pn,A | アキュムレータ下位4bitの値とPnポート(n=1〜2)の値の論理積をPnポート(n=1〜2)に出力 |
| ORLD | Pn,A | アキュムレータ下位4bitの値とPnポート(n=1〜2)の値の論理和をPnポート(n=1〜2)に出力 |
●タイマ・カウンタ操作命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| MOV | A,T | 内蔵タイマの値をアキュムレータに格納 |
| MOV | T,A | アキュムレータの値を内蔵タイマに格納 |
| STRT | T | 内蔵タイマの動作を開始 |
| STRT | CNT | 内蔵カウンタの動作を開始 |
| STOP | TCNT | 内蔵タイマと内蔵カウンタの動作を停止 |
| EN | TCNTI | 内蔵タイマと内蔵カウンタの割込を許可 |
| DIS | TCNTI | 内蔵タイマと内蔵カウンタの割込を禁止 |
●その他命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| EN | I | 外部割込を許可 |
| DIS | I | 外部割込を禁止 |
| ENT0 | CLK | 「T0」ポートからの内部クロック信号出力を許可 |
| NOP | 何もしない | |
| HALT | 動作停止モードへ移行 (CMOSのみ) |