戻る

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のピン配列

T01 40Vcc
XTAL12 39T1
XTAL23 38P27
RESETG4 37P26
SS5 36P25
INT6 35P24
EA7 34P17
RD8 33P16
PSEN9 32P15
WR10 31P14
ALE11 30P13
D012 29P12
D113 28P11
D214 27P10
D315 26Vdd
D416 25PROG
D517 24P23
D618 23P22
D719 22P21
Vss20 21P20

●8048の特徴

レジスタ名bit幅説明
A8bit→Accumlator
PC12bit→Program Counter
PSW8bit→Program Status Word
F11bit→User Flag 1
MB1bit→Most significant Bit flag

データレジスタはなく、代わりに内蔵RAMにScratchpad Registerが用意されている。

内蔵RAM (Scratchpad Register)
00HRegister Bank 0
07H
08HStack
17H
18HRegister Bank 1
1FH
20HUser 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指定アドレスの値を表す

●アキュムレータ操作(演算)命令

ニーモニックオペランド動作
ADDA,Rnアキュムレータの値と指定レジスタの値を加算し、アキュムレータに格納
ADDA,@Rnアキュムレータの値と指定レジスタの値が示すアドレスの値を加算し、アキュムレータに格納
ADDA,#nアキュムレータの値と8bitイミディエイト値を加算し、アキュムレータに格納
ADDCA,Rnアキュムレータの値と指定レジスタの値に「C」フラグの値をを加算し、アキュムレータに格納
ADDCA,@Rnアキュムレータの値と指定レジスタの値が示すアドレスの値に「C」フラグの値を加算し、アキュムレータに格納
ADDCA,#nアキュムレータの値と8bitイミディエイト値に「C」フラグの値を加算し、アキュムレータに格納
ANLA,Rnアキュムレータの値と指定レジスタの値の論理積をアキュムレータに格納
ANLA,@Rnアキュムレータの値と指定レジスタの値が示すアドレスの値の論理積をアキュムレータに格納
ANLA,#nアキュムレータの値と8bitイミディエイト値の論理積をアキュムレータに格納
ORLA,Rnアキュムレータの値と指定レジスタの値の論理和をアキュムレータに格納
ORLA,@Rnアキュムレータの値と指定レジスタの値が示すアドレスの値の論理和をアキュムレータに格納
ORLA,#nアキュムレータの値と8bitイミディエイト値の論理和をアキュムレータに格納
XRLA,Rnアキュムレータの値と指定レジスタの値の排他的論理和をアキュムレータに格納
XRLA,@Rnアキュムレータの値と指定レジスタの値が示すアドレスの値の排他的論理和をアキュムレータに格納
XRLA,#nアキュムレータの値と8bitイミディエイト値の排他的論理和をアキュムレータに格納
RLAアキュムレータの値を左単純ローテート
RLCAアキュムレータの値を左ローテート (0bit目に「C」フラグの値、「C」フラグに7bit目の値を格納)
RRAアキュムレータの値を右単純ローテート
RRCAアキュムレータの値を右ローテート (7bit目に「C」フラグの値、「C」フラグに0bit目の値を格納)
CLRA0をアキュムレータに格納
CPLAアキュムレータの値の否定値をアキュムレータに格納
INCAアキュムレータの値をインクリメント
DECAアキュムレータの値をデクリメント
DAAデータをBCD補正 (BCDデータの演算を行ったあとに使用)
SWAPAアキュムレータの上位4bitと下位4bitの値を交換

「ADDx」はCarryが発生した場合「C」フラグに1が入る。
減算命令はなく、補数を加算するか「DEC」で代用する。

●スクラッチパッドレジスタ操作命令

ニーモニックオペランド動作
INCRn指定レジスタの値をインクリメント
INC@Rn指定レジスタの値が示すアドレスの値をインクリメント
DECRn指定レジスタの値をデクリメント

●データ転送操作命令

ニーモニックオペランド動作
MOVA,Rn指定レジスタの値をアキュムレータに格納
MOVA,@Rn指定レジスタが示すアドレスの値をアキュムレータに格納
MOVA,#n8bitイミディエイト値をアキュムレータに格納
MOVRn,Aアキュムレータの値を指定レジスタに格納
MOV@Rn,Aアキュムレータの値を指定レジスタが示すアドレスに格納
MOVRn,#n8bitイミディエイト値を指定レジスタに格納
MOV@Rn,#n8bitイミディエイト値を指定レジスタが示すアドレスに格納
MOVA,PSW「PSP」の値をアキュムレータに格納
MOVPSW,Aアキュムレータの値を「PSP」に格納
XCHA,Rn指定レジスタの値とアキュムレータの値を交換
XCHA,@Rn指定レジスタが示すアドレスの値とアキュムレータの値を交換
XCHDA,@Rn指定レジスタが示すアドレスの下位4bit値とアキュムレータの下位4bit値を交換
MOVPA,@aPC上位4bit(8〜11)の値で指定されるページの8bit指定アドレスの値をアキュムレータに格納
MOVP3A,@aページ3(固定)の8bit指定アドレスの値をアキュムレータに格納
MOVXA,MEM外部データメモリの値をアキュムレータに格納
MOVXMEM,Aアキュムレータの値を外部データメモリに格納

●分岐制御命令

ニーモニックオペランド動作
JMPa11bitアドレス値をPC(0〜10)、「MB」フラグの値をPC(11bit目)に格納
JMPP@Aアキュムレータの値が示すアドレスの値をPC(0〜7)に格納
CALLaPCの値と「PSW」フラグ上位4bitの値をSPが示すスタックに格納、SPをインクリメント、11bitアドレス値をPC(0〜10)、「MB」フラグの値をPC(11bit目)に格納
RETSPをデクリメント、SPが示すアドレスの値をPCに格納
RETRSPをデクリメント、SPが示すアドレスの値をPCと「PSW」フラグ上位4bitに格納 (割込復帰)
DJNZRn,a指定レジスタの値をデクリメントし、その値が0以外のとき、8bitアドレス値をPC(0〜7)に格納
JCa「C」フラグの値が1のとき、8bitアドレス値をPC(0〜7)に格納
JNCa「C」フラグの値が0のとき、8bitアドレス値をPC(0〜7)に格納
JZaアキュムレータの値が0のとき、8bitアドレス値をPC(0〜7)に格納
JNZaアキュムレータの値が0以外のとき、8bitアドレス値をPC(0〜7)に格納
JF0a「F0」フラグの値が1のとき、8bitアドレス値をPC(0〜7)に格納
JF1a「F1」フラグの値が1のとき、8bitアドレス値をPC(0〜7)に格納
JTFa「TF」フラグ(内蔵タイマ)の値が1のとき、8bitアドレス値をPC(0〜7)に格納、「TF」フラグはリセット
JT0a「T0」ポートの値が1のとき、8bitアドレス値をPC(0〜7)に格納
JNT0a「T0」ポートの値が0のとき、8bitアドレス値をPC(0〜7)に格納
JT1a「T1」ポートの値が1のとき、8bitアドレス値をPC(0〜7)に格納
JNT1a「T1」ポートの値が0のとき、8bitアドレス値をPC(0〜7)に格納
JNIa「INT*」ポートの値が0のとき、8bitアドレス値をPC(0〜7)に格納
JBna「JBn」ポート(n=0〜7)の値が1のとき、8bitアドレス値をPC(0〜7)に格納

●フラグ操作命令

ニーモニックオペランド動作
CLRC0を「C」フラグに格納 (クリア)
CPLC「C」フラグの否定値を「C」フラグに格納
CLRF00を「F0」フラグに格納
CPLF0「F0」フラグの否定値を「F0」フラグに格納
CLRF10を「F1」フラグに格納
CPLF1「F1」フラグの否定値を「F1」フラグに格納
SELRB00を「BS」フラグに格納
SELRB11を「BS」フラグに格納
SELMB00を「MB」フラグに格納
SELMB11を「MB」フラグに格納

●入出力命令

ニーモニックオペランド動作
INA,PnPnポート(n=1〜2)の値をアキュムレータに格納
OUTLPn,Aアキュムレータの値をPnポート(n=1〜2)に出力
ANLPn,#n8bitイミディエイト値とPnポート(n=1〜2)の値の論理積をPnポート(n=1〜2)に出力
ORLPn,#n8bitイミディエイト値とPnポート(n=1〜2)の値の論理和をPnポート(n=1〜2)に出力
INSA,BUS外部バスの値をアキュムレータに格納
OUTLBUS,Aアキュムレータの値を外部バスに出力
ANLBUS,#n8bitイミディエイト値と外部バスの値の論理積を外部バスに出力
ORLBUS,#n8bitイミディエイト値と外部バスの値の論理和を外部バスに出力
MOVDA,PnPnポート(n=1〜2)の値をアキュムレータ下位4bit、アキュムレータ上位4bitに0を格納
MOVDPn,Aアキュムレータ下位4bitの値を、Pnポート(n=1〜2)に出力
ANLDPn,Aアキュムレータ下位4bitの値とPnポート(n=1〜2)の値の論理積をPnポート(n=1〜2)に出力
ORLDPn,Aアキュムレータ下位4bitの値とPnポート(n=1〜2)の値の論理和をPnポート(n=1〜2)に出力

●タイマ・カウンタ操作命令

ニーモニックオペランド動作
MOVA,T内蔵タイマの値をアキュムレータに格納
MOVT,Aアキュムレータの値を内蔵タイマに格納
STRTT内蔵タイマの動作を開始
STRTCNT内蔵カウンタの動作を開始
STOPTCNT内蔵タイマと内蔵カウンタの動作を停止
ENTCNTI内蔵タイマと内蔵カウンタの割込を許可
DISTCNTI内蔵タイマと内蔵カウンタの割込を禁止

●その他命令

ニーモニックオペランド動作
ENI外部割込を許可
DISI外部割込を禁止
ENT0CLK「T0」ポートからの内部クロック信号出力を許可
NOP何もしない
HALT動作停止モードへ移行 (CMOSのみ)

[TOPに戻る]