home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 January (DVD)
/
VPR980100.ISO
/
DRIVER
/
IBM
/
VW200
/
VW200_2.EXE
/
DEVINFO
/
SMC88.TXT
< prev
next >
Wrap
Text File
|
1995-07-16
|
68KB
|
1,727 lines
1 SMC88の紹介
ChipCard TC-100で使用しています8ビットCPU SMC88112はセイコー・エプソン社
のSMCファミリーの一つです。このコアに採用されているCPUはSMC88
であり、以下にこのCPUを用いてプログラムを作成するに必要な情報を記述
してあります。
この文書はSMC88.TXTから始まり、SMC88ZQ2.TXTまで
です。
各文書は
SMC88.TXT : 紹介、体系及びCPUについて 1章から3章まで
SMC88A1.TXT: 命令セット、アドレシングモード、記号の意味 4章から4章3.2まで
SMC88A2.TXT: 機能別命令一覧表 4章3.3
SMC88B.TXT : 命令の詳細説明 ADC 4章3.4
SMC88C.TXT : 命令の詳細説明 ADD 4章3.4
SMC88D.TXT : 命令の詳細説明 AND 4章3.4
SMC88E.TXT : 命令の詳細説明 BIT 4章3.4
SMC88F.TXT : 命令の詳細説明 CALL 4章3.4
SMC88G.TXT : 命令の詳細説明 CARL 4章3.4
SMC88H.TXT : 命令の詳細説明 CARS 4章3.4
SMC88I.TXT : 命令の詳細説明 CP 4章3.4
SMC88J.TXT : 命令の詳細説明 CPL 4章3.4
SMC88K.TXT : 命令の詳細説明 DEC 4章3.4
SMC88L.TXT : 命令の詳細説明 DIV 4章3.4
SMC88M.TXT : 命令の詳細説明 DJR 4章3.4
SMC88N.TXT : 命令の詳細説明 EX 4章3.4
SMC88O.TXT : 命令の詳細説明 HALT 4章3.4
SMC88P.TXT : 命令の詳細説明 INC 4章3.4
SMC88Q.TXT : 命令の詳細説明 INT 4章3.4
SMC88R.TXT : 命令の詳細説明 JP 4章3.4
SMC88S.TXT : 命令の詳細説明 JRL 4章3.4
SMC88T.TXT : 命令の詳細説明 JRS 4章3.4
SMC88U.TXT : 命令の詳細説明 8bitのLD命令-その1 4章3.4
SMC88U1.TXT: 命令の詳細説明 8bitのLD命令-その2 4章3.4
SMC88U2.TXT: 命令の詳細説明 8bitのLD命令-その3 4章3.4
SMC88U3.TXT: 命令の詳細説明 16bitのLD命令 4章3.4
SMC88V.TXT : 命令の詳細説明 MLT 4章3.4
SMC88W.TXT : 命令の詳細説明 NEG 4章3.4
SMC88X.TXT : 命令の詳細説明 NOP 4章3.4
SMC88Y.TXT : 命令の詳細説明 OR その1 4章3.4
SMC88Y1.TXT : 命令の詳細説明 OR その2 4章3.4
SMC88Z.TXT : 命令の詳細説明 PACK 4章3.4
SMC88ZA.TXT : 命令の詳細説明 POP 4章3.4
SMC88ZB.TXT : 命令の詳細説明 PUSH 4章3.4
SMC88ZC.TXT : 命令の詳細説明 RET 4章3.4
SMC88ZD.TXT : 命令の詳細説明 RL 4章3.4
SMC88ZE.TXT : 命令の詳細説明 RLC 4章3.4
SMC88ZF.TXT : 命令の詳細説明 RR 4章3.4
SMC88ZG.TXT : 命令の詳細説明 RRC 4章3.4
SMC88ZH.TXT : 命令の詳細説明 SBC その1 4章3.4
SMC88ZH1.TXT: 命令の詳細説明 SBC その2 4章3.4
SMC88ZH2.TXT: 命令の詳細説明 SBC その3 4章3.4
SMC88ZH3.TXT: 命令の詳細説明 SBC その4 4章3.4
SMC88ZI.TXT : 命令の詳細説明 SEP 4章3.4
SMC88ZJ.TXT : 命令の詳細説明 SLA 4章3.4
SMC88ZK.TXT : 命令の詳細説明 SLL 4章3.4
SMC88ZL.TXT : 命令の詳細説明 SLP 4章3.4
SMC88ZM.TXT : 命令の詳細説明 SRA 4章3.4
SMC88ZN.TXT : 命令の詳細説明 SRL 4章3.4
SMC88ZO.TXT : 命令の詳細説明 SUB その1 4章3.4
SMC88ZO1.TXT: 命令の詳細説明 SUB その2 4章3.4
SMC88ZO2.TXT: 命令の詳細説明 SUB その3 4章3.4
SMC88ZO3.TXT: 命令の詳細説明 SUB その4 4章3.4
SMC88ZO4.TXT: 命令の詳細説明 SUB その5 4章3.4
SMC88ZP.TXT : 命令の詳細説明 SWAP 4章3.4
SMC88ZQ.TXT : 命令の詳細説明 XOR その1 4章3.4
SMC88ZQ1.TXT: 命令の詳細説明 XOR その2 4章3.4
SMC88ZQ2.TXT: 命令の詳細説明 XOR その3 4章3.4
となっています。全てを順番に見る必要はありません。
------------------------------------------------------------------------------
2 体系
2.1 モデルについて
SMC88ではモデルをいくつか持っていますが、ChipCardの場合はモデル3
を参照してください。またモードの記述があった場合はマキシマム・モードを参照して
ください。ここのモデル、モードについてはChipCardと関係ありませんので
省略します。
2.2 演算部とレジスタ
2.2.1 ALU
ALU(算術論理演算ユニット)は2種類のテンポラリレジスタTEMP0 とTEMP1にストアされた
8ビットまたは16ビットデータ間の演算を行います。
演算結果は16ビットのテンポラリレジスタTEMP2に一旦ストアされた後、演算命令にした
がったレジスタ/メモリにストアされるか、アドレスデータとして使用されます。
また、演算結果によりZ(ゼロ)フラグ、C(キャリー)フラグ、V(オーバーフロー)フラグ、
N(ネガティブ)フラグがセット/リセットされます。
⇒"2.2.3 フラグ"
2.2.2 レジスタ構成
SMC88のレジスタ構成を図2.2.2.1に示します。
標準部(MODEL0~MODEL3共通)
MSB LSB
7(15)<--B------>0 7<-------A-----> 0 データレジスタ A、B、(BA)
7(15)<--H------>0 7<-------L-----> 0 インデックス(データ)レジスタ HL、(H、L)
15 <----------IX---------------> 0 インデックスレジスタ IX
15 <----------IY---------------> 0 インデックスレジスタ IY
15 <----------PC---------------> 0 プログラムカウンタ
15 <----------SP---------------> 0 スタックポインタ
7<------BR-----> 0 ベースレジスタ
Z ゼロ・フラグ(1ビット)
C キャリー・フラグ(1ビット)
V オーバーフロー・フラグ(1ビット)
N ネガティブ・フラグ(1ビット)
D デシマル・フラグ(1ビット)
U アンパック・フラグ(1ビット)
I0 インタラプトフラグ0(1ビット)
I1 インタラプトフラグ1(1ビット)
拡張部(MODEL2、MODEL3)
MSB LSB
7 <---- NB ----> 0 ニューコードバンクレジスタ
7 <---- CB ----> 0 コードバンクレジスタ
7 <---- EP ----> 0 エクスパンドページレジスタ
7 <---- XP ----> 0 IX用エクスパンドページレジスタ
7 <---- YP ----> 0 IY用エクスパンドページレジスタ
図2.2.2.1 レジスタ構成
■Aレジスタ、Bレジスタ
Aレジスタ、Bレジスタはそれぞれ8ビットのデータレジスタで、他のレジスタやデータ
メモリとのデータ転送や演算、即値データの転送、演算が行えます。8ビット転送/演算
においてはそれぞれ単独に、16ビット転送/演算においてはBレジスタを上位8ビットと
するBAペアで使用します。
■HLレジスタ
HLレジスタは16ビットのインデックスレジスタで、データメモリの間接アドレッシングに
使用します(ページ内のアドレスを指定)。
他のレジスタやデータメモリとの16ビットデータ転送や演算が行えます。また、Hレジス
タ、Lレジスタの8ビットずつに分けてデータレジスタとしても使用できます。この場合の
LレジスタはIXレジスタ、IYレジスタによる間接アドレッシングの際のディスプレースメ
ントとして使用することもできます。
⇒"2.4 データメモリ"
⇒"4.1 アドレッシングモード"
表2.2.1.1 ALUの演算機能
演算機能 演算命令 16ビット演算
加算 ADD,ADC ○
減算 SUB,SBC ○
論理積 AND
論理和 OR
排他的論理和 XOR
比較 CP ○
ビットテスト BIT
1加算/減算 INC,DEC ○
乗算 MLT
除算 DIV
補数 CPL,NEG
ローテート RL,RLC,RR,RRC
シフト SLA,SLL,SRA,SRL
パック/アンパック PACK,UPCK
符号拡張 SEP
■IXレジスタ、IYレジスタ
IXレジスタ、IYレジスタはそれぞれ16ビットのインデックスレジスタで、データメモリ
の間接アドレッシングに使用します。(ページ内のアドレスを指定)。他のレジスタやデー
タメモリとの16ビットデータ転送や演算が行えます。
⇒"2.4 データメモリ"
⇒"4.1 アドレッシングモード"
■PC(プログラムカウンタ)
PCはプログラムメモリのアドレッシングを行う16ビットのカウンタレジスタで、次に実行
する命令のアドレスを示します。
⇒"2.3 プログラムメモリ"
■SP(スタックポインタ)
SPは16ビットのカウンタレジスタでスタックアドレス(スタックページ内のアドレス)を示
します。他のレジスタやデータメモリとの16ビットデータ転送や演算が行えます。
⇒"2.4.3 スタック"
■BR(ベースレジスタ)
BRは8ビットのインデックスレジスタで、8ビット絶対アドレッシング(アドレスの下位8ビ
ットを指定)の際にページ内の上位8ビットのアドレス指定に使用されます。
⇒"4.1 アドレッシングモード"
■SC(システムコンディションフラグ)
SCは8ビットのフラグで、演算結果を示すZ、C、V、Nフラグ、演算モードを設定するD、U
フラグ、割り込み優先レベルを設定するI0、I1フラグで構成されます。
⇒"2.2.3 フラグ"
■NB(ニューコードバンクレジスタ)
NBレジスタはプログラムメモリのバンクを指定する8ビットのレジスタです。NBレジスタ
はCPUモデルのMODEL2およびMODEL3に設定されています。
⇒"2.3 プログラムメモリ"
■CB(コードバンクレジスタ)
CBレジスタはプログラムメモリの現在選択されているバンクを示す8ビットのレジスタで
す。NBレジスタにデータを設定した場合、そのデータがCBレジスタにロードされ、新たな
バンクが選択されます。CBレジスタはCPUモデルのMODEL2およびMODEL3に設定されていま
す。
⇒"2.3 プログラムメモリ"
■EP、XP、YP(エクスパンドページレジスタ)
これらのレジスタはデータメモリのページを指定する8ビットのレジスタです。
EPレジスタはHLレジスタによる間接アドレッシング、あるいは即値データによる絶対アド
レッシングの際に使用されます。
XPレジスタはIXレジスタによる間接アドレッシング、YPレジスタはIYレジスタによる間接
アドレッシングの際に使用されます。
これらのレジスタは、CPUモデルのMODEL2およびMODEL3に設定されています。
⇒"2.4.2 ページレジスタEP、XP、YP"
⇒"4.1 アドレッシングモード"
2.2.3 フラグ
SMC88にはCPU内部の演算結果の状態などを表すシステムコンディションフラグ(SC)と周辺
回路の状態を表すカスタマイズコンディションフラグ(CC)が設定されています。
■システムコンディションフラグ(SC)
SC I1 I0 U D N V C Z
Z(ゼロ)フラグ
C(キャリー)フラグ
V(オーバーフロー)フラグ
N(ネガティブ)フラグ
D(デシマル)フラグ
U(アンパック)フラグ
I0(インタラプト0)フラグ
I1(インタラプト1)フラグ
図2.2.3.1 システムコンディションフラグ(SC)
システムコンディションフラグは図2.2.3.1に示すとおり、8ビットのフラグで構成された
レジスタSCとなっています。
システムコンディションフラグのZ(ゼロ)、C(キャリー)、V(オーバーフロー)、N(ネガテ
ィブ)フラグは演算の結果によりセット/リセットされ、I0、I1、(インタラプト)フラグは
割り込みによりセット/リセットされます。また、これらのフラグは以下の命令によって
も操作できます。
AND SC,#nn (任意のフラグをリセット)
OR SC,#nn (任意のフラグをセット)
XOR SC,#nn (任意のフラグを反転)
LD SC,#nn (フラグのライト)
LD SC,A (フラグのライト)
POP SC (フラグの復帰)
RETE (フラグの復帰)
Z,C,V,NフラグはJRS命令やCARS命令などの条件ジャンプ/コール命令実行の際の条件判定
に使用されます。
⇒"4.4 命令の詳細説明"
(1)Z(ゼロ)フラグ
Zフラグは演算命令の実行結果が'0'になった場合に'1'にセット、結果が'0'以外の場
合に'0'にリセットされます。
(2)C(キャリー)フラグ
Cフラグは加算命令の実行によりキャリー(最上位ビットから桁上げ)が発生した場合、
または減算命令/比較命令の実行によりボロー(最上位ビットに借り)が発生した場合
に'1'にセット、それ以外の場合に'0'にリセットされます。ただし、1加減算命令(
INC、DEC命令)の実行ではCフラグは変化しません。
また、ローテート/シフト命令の実行によってもCフラグ変化します。
乗除算命令(MLT、DIV命令)を実行した場合は'0'にリセットされます。
(3)Vオーバーフロー)フラグ
Vフラグは演算を行った結果が8ビットまたは16ビットで補数表現可能な範囲を越えた
場合に'1'にセット、範囲内の場合に'0'にリセットされます。補数表現の範囲は8ビッ
トが-128~127、16ビットが-32768~32767になります。
ただし、演算命令の中でも論理演算命令(デスティネーションがSCの場合を除くAND、
OR、XOR命令)、ビット操作命令(BIT命令)、1加減算命令(INC、DEC命令)の実行ではVフ
ラグは変化しません。乗算命令(MLT命令)を実行した場合は'0'にリセットされます。
除算命令(DIV命令)を実行した場合は、商が8ビットを越えるときに'1'にセットされま
す。
Cフラグが絶対値演算のオーバー(アンダー)フローを示すのに対し、Vフラグは補数演
算のオーバーフローを示します。オーバーフローが起こりうる補数演算を行う場合は
Vフラグをチェックして、'1'のときには演算結果を補正する必要があります。
⇒"2.2.4 補数演算とオーバーフロー"
(4)N(ネガティブ)フラグ
Nフラグは演算を行った結果がマイナス(最上位ビットが'1')になった場合に'1'にセッ
ト、プラス(最上位ビットが'0')の場合に'0'にリセットされます。ただし、1加減算命
令(INC、DEC命令)の実行ではNフラグは変化しません。
(5)D(デシマル)フラグ
Dフラグは8ビット加減算命令の実行の際に10進演算(演算結果が10進補正される)を行
うように設定するビットで、'1'を設定することにより10進演算を行い、'0'で16進演
算を行います。
⇒"2.2.5 10進演算とアンパック演算"
(6)U(アンパック)フラグ
Uフラグは8ビット加減算の実行の際にアンパック演算(上位4ビットを'0'として演算を
行うように設定するビットで、'1'を設定することによりアンパック演算を行い、'0'
で通常の8ビット演算を行います。
⇒"2.2.5 10進演算とアンパック演算"
(7)I0、I1(インタラプト)フラグ
I0およびI1フラグは割り込み優先レベルを設定するビットで、この2ビットで設定した
レベルより高いレベルの割り込み のみCPUは受付けます。
また、割り込みが発生した際にも、そのレベル以下の割り込みをマスクするよう、新
たな値が自動設定されます。
⇒"3.5.3 割り込み"
命令セット一覧表等では命令の実行により変化するフラグを" "を付けて示しています。
Dフラグ、Uフラグは"★"を付けて、その命令が10進演算、アンパック演算可能であること
を示しています。
2.2.4 補数演算とオーバーフロー
SMC88内部ではマイナスのデータを扱うために補数表現が用いられます。以下に補数表現
と補数を用いた演算について説明します.
■補数
マイクロコンピュータでマイナス(負)の数を扱う場合、一般的には補数表現が用いられま
す。補数には2の補数と1の補数の2種類の表現方法があり、通常単に補数といった場合、
2の補数を指します。
SMC88でもマイナスの数は2の補数で表しています。
任意の数Nの補数は以下の式で表され、2の補数表現が可能な範囲は8ビットの場合が-128
~127、16ビットの場合が-32767~32767になります。
補数表現した場合、マイナスの数の最上位ビットは必ず'1'になります。この最上位ビッ
トの内容がN(ネガティブ)フラグに反映されます。
なお、8ビットのデータを補数に変換するための命令として"CPL"命令(1の補数に変換)と
"NEG"命令(2の補数に変換)が、8ビットの補数を16ビットに拡張するための命令として
"SEP"命令が用意されています。
例:NEG命令とSEP命令
命令 Breg. A reg. Nフラグ
LD A,#127 0000 0000 0111 1111 0
NEG A 0000 0000 1000 0001 1
SEP 1111 1111 1000 0001 1
2の補数
8ビット -N = 2 - N = 256 - N
127 = 0111 1111b
126 = 0111 1110b
:
2 = 0000 0010b
1 = 0000 0001b
0 = 0000 0000b
-1 = 1111 1111b (= 1 0000 0000b - 0000 0001b)
-2 = 1111 1110b (= 1 0000 0000b - 0000 0010b)
:
-127 = 1000 0001b (= 1 0000 0000b - 0111 1111b)
-126 = 1000 0000b (= 1 0000 0000b - 1000 0000b)
16ビット -N = 2 - N = 65536 - N
32767 = 0111 1111 1111 1111b
32766 = 0111 1111 1111 1110b
:
2 = 0000 0000 0000 0010b
1 = 0000 0000 0000 0001b
0 = 0000 0000 0000 0000b
-1 = 1111 1111 1111 1111b (= 1 0000 0000 0000 0000b - 0000 0000 0000 0001b)
-2 = 1111 1111 1111 1110b (= 1 0000 0000 0000 0000b - 0000 0000 0000 0010b)
:
-32767 = 1000 0000 0000 0001b (= 1 0000 0000 0000 0000b - 0111 1111 1111 1111b)
-32768 = 1000 0000 0000 0000b (= 1 0000 0000 0000 0000b - 1000 0000 0000 0000b)
1の補数
8ビット -N = 2 - 1 - N = 255 - N (= N)
127 = 0111 1111b
126 = 0111 1110b
:
2 = 0000 0010b
1 = 0000 0001b
0 = 0000 0000b
-1 = 1111 1111b (= 1111 1111b - 0000 0001b)
-2 = 1111 1110b (= 1111 1111b - 0000 0010b)
:
-126 = 1000 0001b (= 1111 1111b - 0111 1110b)
-127 = 1000 0000b (= 1111 1111b - 0111 1111b)
16ビット -N = 2 - 1 - N = 65535 - N (= N)
32767 = 0111 1111 1111 1111b
32766 = 0111 1111 1111 1110b
:
2 = 0000 0000 0000 0010b
1 = 0000 0000 0000 0001b
0 = 0000 0000 0000 0000b
-1 = 1111 1111 1111 1110b (= 1111 1111 1111 1111b - 0000 0000 0000 0001b)
-2 = 1111 1111 1111 1101b (= 1111 1111 1111 1111b - 0000 0000 0000 0010b)
:
-32766 = 1000 0000 0000 0001b (= 1111 1111 1111 1111b - 0111 1111 1111 1110b)
-32767 = 1000 0000 0000 0000b (= 1111 1111 1111 1111b - 0111 1111 1111 1111b)
■補数演算とV(オーバーフロー)フラグ
アドレス計算などの絶対値による演算の場合、8ビットでは0~255、16ビットでは0~
65535の範囲で正しい演算結果が得られます。演算によりオーバーフローあるいはアンダ
ーフローが発生し範囲を外れた場合は、C(キャリー)フラグが'1'にセットされます。
演算後、被演算数が補数になっている場合の正しい演算結果の範囲は、8ビットが-128
~127、16ビットが-32768~32767となり、Cフラグのみでは演算結果が正しいかどうか
判断できません。この判断を行うためにV(オーバーフロー)フラグが設定されており、補
数表現の範囲を越えた場合にVフラグが'1'にセットされます。
なお、ALUは絶対値演算、補数演算を区別してはいませんので、Cフラグ、Vフラグのセッ
ト/リセットは単に演算結果が上記の範囲内にあるかどうかで行われます。したがって、
絶対値演算においてもVフラグが'1'にセットされる場合があります。この場合のVフラグ
は意味を持ちませんので、プログラムでVフラグを確認する必要はありません。Vフラグ
でオーバーフローが判断できるのは補数演算の場合に限られますので、アプリケーショ
ンで扱うデータが符合付きかどうかを判断してください。
以下に8ビットの演算例とその演算結果によるVフラグ、Cフラグの変化を示します。
例:"ADD A,B"命令による加算例
A reg. B reg. 結果(A reg.) Vフラグ Cフラグ
0101 1010 1010 0101 1111 1111 0 0
0101 1011 1010 0101 0000 0000 0 1
0101 1010 0010 0101 1000 0000 1 0
"SUB A,B"命令による減算例
A reg. B reg. 結果(A reg.) Vフラグ Cフラグ
0101 1010 0101 1010 0000 0000 0 0
0101 1011 0101 1011 1111 1111 0 1
0101 1010 1101 1010 1000 0000 1 1
2.2.5 10進演算とアンパック演算
SMC88では以下の8ビット演算命令実行時、通常の16進演算の他に10進演算、アンパック
演算、およびその組み合わせによって演算を行うように設定することができます。この
設定はD(デシマル)フラグ、U(アンパック)フラグによって行います。
10進演算とアンパック演算が可能な演算命令
ADD ADC SUB SBC NEG
いずれも8ビット演算命令で、命令セット一覧表等ではDフラグUフラグの部分に"★"を
付けて、10進演算、アンパック演算が可能であることを示しています。
■10進演算
Dフラグを'1'にセットして8ビット算術演算(ADD、ADC、SUB、SBC、NEG)命令を実行する
と、2桁の10進演算が行われます。演算結果はBCD(2進化10進数)コードで得られます。
10進演算を行う場合は演算命令の実行前に"OR SC,#00010000B"命令等でDフラグを'1'に設
定します。また、演算数および被演算数はBCDコードを設定してから演算を実行してくだ
さい。BCDコードになっていない場合は、正しい結果が得られません。
10進演算時のSCフラグ
10進演算実行後、演算結果によってSCのN/V/C/Zフラグは下記のように設定されます。
N: 常時 リセット(0)
V: 常時 リセット(0)
C: 2桁の10進数に対して
桁上げまたは桁借りがあったとき セット(1)
桁上げまたは桁借りがないとき リセット(0)
Z: 演算結果=0のとき セット(1)
演算結果 0のとき リセット(0)
例:"ADD A,B"命令による10進演算例
設定値 結果 SC
A reg. B reg. A reg.(和) N V C Z
55 28 83 0 0 0 0
74 98 72 0 0 1 0
"SUB A,B"命令による10進演算例
設定値 結果 SC
A reg. B reg. A reg.(差) N V C Z
55 55 00 0 0 0 1
55 28 27 0 0 0 0
74 98 76 0 0 1 0
■アンパック演算
Uフラグを'1'にセットして8ビット算術演算(ADD、ADC、SUB、SBC、NEG)命令を実行すると
下記に示すアンパック形式での演算を行うことができます。
アンパック演算は、上位4ビットのデータを無視し、下位4ビットのみを対象に演算を行い
ます。実行後は下位4ビットのみの演算結果が出力され、上位4ビットは'0'が出力されま
す。
アンパック演算は、メモリ1アドレスに対して1桁のデータを格納するため、演算項の桁合
わせが容易に行えます。(この場合の桁合わせはメモリアドレスのポインティングのみと
なります。)
<ADD命令の例>
MSB 2 2 LSB
不定データ 被加数 レジスタ OR メモリ
+) 不定データ 加数 レジスタ OR メモリ
0 結果(和) レジスタ OR メモリ
アンパック演算時のSCフラグ
アンパック演算は下位4ビットデータのみを対象にしますので、SCフラグも下位4ビットの
演算結果によって変化します。
アンパック演算実行後、演算結果によってSCのN/V/C/Zフラグは下記のように設定されま
す。
N: 2ビットが'1'のとき セット(1)
2ビットが'0'のとき リセット(0)
V: 4ビットの補数表現(-8~7)
を越えたとき セット(1)
以内のとき リセット(0)
C: 2ビットからの桁上げ、2ビットへの桁借りが
あったとき セット(1)
ないとき リセット(0)
Z: 下位4ビット=0のとき セット(1)
下位4ビット 0のとき リセット(0)
例:"ADD A、B"命令によるアンパック演算例
設定値 結果 SC
A reg. B reg. A reg.(和) N V C Z
20H D0H 00H 0 0 0 1
2EH 53H 01H 0 0 1 0
C7H 52H 09H 1 1 0 0
アンパック演算補助命令
アンパック形式とパック形式(通常の8ビットデータ形式)を交互に変換する"PACK"、
"UPCK"命令が用意されており、容易にフォーマット変換できます。
PACK命令: BAレジスタのアンパック形式データをパック形式に変換し、Aレジスタに格納
します。
B reg. A reg. A reg.
* m * n → m n
例: PACKの実行例
設定値 結果 SC
B reg. A reg. N V C Z
38C4H 84H 不変
UPCK命令: Aレジスタの8ビットデータをアンパック形式に変換し、BAレジスタに格納
します。
B reg. A reg. A reg.
* m * n → m n
例: UPCKの実行例
設定値 結果 SC
A reg. BA reg. N V C Z
84H 0804H 不変
2.2.6 乗除算
SMC88のMODEL1およびMODEL3は乗除算機能を持っています。MODEL0およびMODEL2ではこの
機能および以下に説明する乗除算命令は使用できません。
■乗算
乗算はMLT命令によって行います。
MLT命令を実行すると、Lレジスタ×Aレジスタの演算が行われ、積がHLレジスタに格納さ
れます。この演算結果により、SCのN/V/C/Zフラグは次のように設定されます。
N: HLレジスタ(積)の最上位ビットが
'1'のとき セット(1)
'0'のとき リセット(0)
V: 常時 リセット(0)
C: 常時 リセット(0)
Z: HLレジスタ(積)が
0000Hのとき セット(1)
0000H以外のとき リセット(0)
以下にMLT命令の実行例を示します。
設定値 結果 SC
L reg. A reg. HL reg.(積) N V C Z
00H 64H 0000H 0 0 0 1
64H 58H 2260H 0 0 0 0
C8H 58H 44C0H 0 0 0 0
A5H 93H 5EBFH 0 0 0 0
C8H A5H 80E8H 1 0 0 0
乗算は上記の設定値を符合なし8ビットデータとして扱い、符合なしの演算を行いますの
で、演算結果により設定ざれるNフラグは符合を表しません。したがって、上記例のC8H×
A5Hのように負の数どうしの乗算を行った場合でも、Nフラグが'0'に設定されないことが
あります。
■除算
除算はDIV命令によって行います。
DIV命令を実行すると、HLレジスタ÷Aレジスタの演算が行われ、商がLレジスタに、剰余
がHレジスタに格納されます。
商が8ビットを越える場合はV(オーバーフロー)フラグがセットされ、HLレジスタの内容は
被除数が保持されます。
Aレジスタに'0'を設定してDIV命令を実行した場合はゼロ除算例外処理が発生します。
この演算結果により、SCのN/V/C/Zフラグは次のように設定されます。
N: Lレジスタ(商)の最上位ビットが
'1'のとき セット(1)
'0'のとき リセット(0)
V: 商が8ビット以内に
納まらなとき セット(1)
納まるとき リセット(0)
C: 常時 リセット(0)
Z: Lレジスタ(商)が
00Hのとき セット(1)
00H以外のとき リセット(0)
SCの動作例
設定値 SC 備考
HL reg. A reg. N V C Z
nz nz 0
0000H nz 0 0 0 1
nz 00H 1 1 0 0 ゼロ除算
0000H 00H 1 1 0 0 例外処理発生
nzは'0'以外の8ビットまたは16ビットデータを表します。
除算実行例
以下にDIV命令の実行例を示します。
設定値 結果 SC
HL reg. A reg. L(商) H(剰余) A reg. N V C Z
1A16H 64H 42H 4EH 64H 0 0 0 0
332CH 64H 83H 00H 64H 1 0 0 0
0000H 58H 00H 00H 58H 0 0 0 1
0301H 02H 01H 03H 02H 1 1 0 0
上記例の0301H÷02Hは商が8ビットを越えるため、HLレジスタの値が保持され結果が出力
されません。このような場合には、下記のように被除数を上位8ビット、下位8ビットに分
離して除算を行います。
<0301H÷02Hの実行例>
LD HL,#0003H ;被除数=上位8ビット
LD A,#02H ;除数
DIV ;L=商,H=剰余
LD [hhll],L ;商(上位8ビット)をメモリに格納
LD L,#01H ;被除数=Hレジスタ+下位8ビット
DIV ;
設定値 結果 SC
HL reg. A reg. L(商) H(剰余) A reg. N V C Z
0003H 02H 01H 01H 02H 0 0 0 0
0101H 02H 80H 01H 02H 1 0 0 0
剰余:01H
商 :0180H
2.3 プログラムメモリ
2.3.1 プログラムメモリの構成
SMC88のアドレス空間16Mバイトの中で前半の8Mバイト(アドレス000000H~FFFFFH)がプロ
グラミング領域として使用できるようになっています。ただし、MODEL0とMODEL1について
はアドレス空間が最大64Kバイトのため、プログラミング領域もそれ以内に制限されます。
0000H コモンエリア バンク0 000000H
7FFFH (32Kバイト) (32Kバイト) 007FFFH
8000H バンクエリア バンク1 008000H
FFFFH (32Kバイト) (32Kバイト) 00FFFFH
バンク2 010000H
(32Kバイト) 017FFFH
バンク3 018000H
(32Kバイト) 01FFFFH
: : 020000H
: : :
: : 7EFFFFH
バンク254 7F0000H
(32Kバイト) 7F7FFFH
バンク255 7F8000H
(32Kバイト) 7FFFFFH
図2.3.1.1 プログラムメモリの構成
8ビットCPUの論理空間64Kバイトを越えるメモリを管理するため、SMC88ではバンクマッピ
ング方式を採用しています。最大8Mバイトのプログラムメモリはバンク0~バンク255まで、
それぞれ32Kバイトのバンクに分割されます。
64Kバイトの論理空間上には2つのバンクがアドレス0000H~FFFFHとして論理的に連続する
ように配置され、そのアドレス空間内でプログラムを実行します。論理空間内のアドレッ
シングはPC(プログラムカウンタ)が行います。
論理空間内のアドレス0000H~7FFFHにはコモンバンクとしてバンク0(アドレス000000H~
007FFFH)が配置され、この物理アドレスは常時固定となります。アドレス000000H~
OOOOFFHは例外処理(割り込み等)のベクタが割り付けられます。
⇒"3.5.2 例外処理要因とベクタ"
コモンエリアが固定のため、各バンクに例外処理ベクタを割り付ける必要はありません。
また、汎用的なサブルーチン等もコモンエリアに記述することができます。
後半のアドレス8000H~FFFFHのバンクエリアにはCB(コードバンク)レジスタで選択される
バンクが配置されます。この部分に配置されるバンクはプログラムで任意に選択できます。
ただし、MODEL0とMODEL1についてはバンク1に固定、MODEL2とMODEL3のミニマムモードに
ついては任意に選択された1つのバンクに固定されます。
2.3.2 PC(プログラミングカウンタ)とCB(コードバンク)レジスタ
PC(プログラムカウンタ)は実行するプログラムのアドレスを保持しています。PCの内容は
64Kバイトの論理空間内のアドレスで、物理アドレスが連続しない32Kずつのコモンエリア
とバンクエリアを論理的に連続したプログラムメモリとしてアドレッシングしています。
コモンエリアは物理アドレスのバンク0に固定されていますが、バンクエリアは256バンク
の中から任意の1バンクを選択できるようになっています。
(MODEL2とMODEL3)
このバンクエリアに割り当てるバンクアドレス(0~255)を示すレジスタがCB(コードバン
ク)です。
実際にメモリをアクセスするためにアドレスバスに出力される物理アドレスはCPU内部で
図2.3.2.1のように生成されます。
コモンエリアのアクセス(0000H~7FFFH)
←----論理アドレス----→
7 0 15 0
00H ← 0 PC(15)
23 22 15 14 0
0 00H PC(15)
←--------物理アドレス---------→
バンクエリアのアクセス(8000H~FFFFH)
←----論理アドレス----→
7 0 15 0
CB(8) ← 0 PC(15)
23 22 15 14 0
0 CB(8) PC(15)
←--------物理アドレス---------→
図2.3.2.1 論理アドレスと物理アドレス(MODEL2/3)
図に示すとおり、16ビットのPCの中でアドレスバスに出力されるのは最上位ビットを除く
15ビットです。その内容はアドレスバスのA00~A14に出力されます。PCの最上位ビットは
'0'でコモンエリア、'1'でバンクエリアを示しており、この内容によってCBをアドレスバ
スに出力するかどうかを決定します。コモンエリアの場合はアドレスバスのA15~A22に00
Hが出力され、バンクエリアの場合のA23はデータメモリ領域専用で、最大8Mバイトのプロ
グラムアクセス時には常時'0'を出力します。以上のようにPCの最上位ビットはアドレス
バスに出力されませんので、システム開発時には注意して下さい。
MODEL0とMODEL1についてはアドレスバスが16ビットのため、PCの内容がそのまま出力され
ます。
"LD BA,PC"命令、"LD HL,PC"命令のPC値
"LD BA,PC"命令、"LD HL,PC"命令はPC値をBAレジスタおよびHLレジスタに読み込む命令
です。読み込むPC値を"PC"、本命令のおかれている先頭アドレスを"PC'"とすると、
PC←PC'+2
で示されるPC値がBA及びHLレジスタに読み込まれます。たとえば、"LD BA,PC"命令が100H
番地に置かれているとすると、BAレジスタには102Hが読み込まれます。
2.3.3 バンク管理
プログラムの実行は基本的に論理空間に割り当てられたバンク内に限られています。バン
クが変更されるのは、プログラムによって分岐命令が実行される時点で他のバンクが指定
されている場合です。
注! プログラムの実行によりPCのカウントがオーバーフローした場合でもCBは更新
されません。再びコモンエリアの先頭からの実行となります。
以下にバンク指定の方法と、分岐命令実行時の動作について説明します。
なお、バンク変更にかかわる記載事項はMODEL2およびMODEL3にのみ摘要されます。
■リセット時のバンク設定
イニシャルリセット時にCBは'1'に初期化され、バンクエリアにはバンク1が割り当てられ
ます。
コモンエリアはバンク0に固定されますので、論理アドレスは物理アドレスと同様になり
ます。
この設定は別のバンクがプログラムで指定され、分岐命令によって実際に分岐が行われる
まで変更されません。
■バンクの指定
選択されているバンクを示すCBはプログラムによって直接変更することはできません。
バンク指定用にはNB(ニューコードバンク)レジスタが用意されており、分岐命令実行直前
に分岐先のアドレス(0~255)を以下の命令によって書き込んでおきます。
LD NB,A (Aレジスタによる指定)
LD NB,#bb(8ビット即値データによる指定)
NBの内容はその直後の分岐命令の実行により実際に分岐が行われる時点でCBにロードされ
新たなバンクがバンクエリアに選択されます。条件ジャンプなどにおいて条件が合わずに
分岐が行われない場合は、CBの内容が逆にNBにロードされます。したがって、NBに値を設
定せずに分岐命令を実行した場合はその時点の論理空間内に分岐するようになっています。
NB CB PC
現在のバンク 現在のバンク xxxxH
分岐先バンク 分岐先バンク 現在のバンク yyyyH
を指定
分岐の発生
分岐先バンク 分岐先バンク zzzzH
図2.3.3.1 バンクの変更
2.3.4 分岐命令
分岐命令はPCとCBを変更してプログラムを任意のアドレスに分岐させます。
分岐命令の種類は動作の違いにより、以下のように分類されます。
表2.3.3.1 バンクの変更
種類 条件 命令
PC相対ジャンプ 条件/無条件 JRS、JRL、DJR
間接ジャンプ 無条件 JP
PC相対コール 条件/無条件 CARS、CARL
間接コール 無条件 CALL
リターン 無条件 RET、RETS、RETE
ソフトウェア割り込み 無条件 INT
上記の分岐命令それぞれの中にも無条件に分岐する無条件分岐命令とフラグの状態によっ
て分岐する数種類の条件分岐命令があります。
条件分岐命令の条件が満たされていない場合は、分岐が行われずにその分岐命令の次の命
令を実行します。
⇒"4.4 命令の詳細説明"
■PC相対ジャンプ命令(JRS、JRL、DJR)
PC相対ジャンプはPCにオペランドで指定された相対アドレスを加え、そのアドレスに分岐
させる命令で、リロケーターブルなプログラミングを可能にしています。
相対アドレスは分岐実行時のアドレスから分岐先アドレスまでのディスプレースメントで
1または2バイトで指定します。
指定できる相対アドレスは"JRS"命令、"DJR"命令が8ビット補数表現の-128~127、"JRL"
命令が16ビット補数表現の-32768~32767の範囲です。
なお、この相対アドレスはPCに加算されるため分岐先のアドレスは論理アドレスとなりま
す。直前のNBの設定によって他のバンクにも指定できますが、分岐先はあくまでも論理空
間内で物理的な相対アドレスの指定はできません。
図2.3.4.1にPC相対ジャンプの動作を示します。
"JRS"命令は無条件ジャンプと20種類の条件ジャンプが設定されています。
"JRL"命令は無条件ジャンプと4種類の条件ジャンプが設定されています。
バンク1
物理アドレス 論理アドレス : NB CB PC
00A06DH A06DH LD NB,#2 01H 01H A06DH
00A070H A070H JRL S+57H 02H 01H A070H
00A073H A073H :
バンク2
0120C7H A0C7H LD A,B 02H 02H A070H+57H=A0C7H
図2.3.4.1 PC相対ジャンプの動作(MODEL2/3の例)
"DJR NZ,rr"命令はBレジスタの'1'減算を行い、その結果が'0'以外の場合に"JRS"の無条
件ジャンプ命令を実行します。この命令によって、Bレジスタをカウンタとしたその初期
値分の繰り返しルーチンが簡単に記述できます。
例:50cycle時間のウェイトルーチン
LD B,#12 ;初期値をBレジスタにセット(2cycle)
DJR NZ,S ;Bレジスタが0になるまで繰り返す。(48cycle)
■間接ジャンプ命令(JP)
間接ジャンプは分岐先のアドレスを間接的に指定する命令です。
"JP [kk]"命令はアドレス00kk(kk=00H~FFH、ページは'0'固定)のメモリの内容をPCの下
位8ビットに、アドレス00kk+1のメモリの内容をPCの上位8ビットにそれぞれロードして、
そのアドレスに無条件に分岐します。ここで使用するアドレス00kkは例外処理やソフトウ
ェア割り込みのベクタ領域となっています。
"JP HL"命令はHLレジスタの内容をアドレスとして無条件に分岐します。この命令は演算
結果等をそのまま分岐先アドレスにすることができるため、ジャンプテーブルの作成など
に有効です。
■PC相対コール命令(CARS、CARL)
PC相対コールはPCにオペランドで指定された相対アドレスを加え、そのアドレスからのサ
ブルーチンをコールする命令です。
相対アドレスは分岐実行時のアドレスから分岐先アドレスまでのディスプレースメントで
1または2バイトで指定します。
指定できる相対アドレスは"CARS"命令が8ビット補数表現の-128~127、"CARL"命令が16ビ
ット補数表現の-32768~32767の範囲です。
なお、この相対アドレスはPCに加算されるため分岐先のアドレスは論理アドレスとなりま
す。直前のNBの設定によって他のバンクにも分岐できますが、分岐先はあくまでも論理空
間内で物理的な相対アドレスの指定はできません。
サブルーチンコール実行時にはリターン情報としてPC値(コール命令の次の命令の先頭ア
ドレス)がスタックに退避されます。
MODEL2/3のマキシマムモードではPC値以外にCB値もスタックに退避され、リターン時には
コール元のバンクに戻るようになっています。
MODEL2/3のミニマムモードではMODEL0/1と同様、PC値のみのスタックとなるため、64Kバ
イト以上のプログラムメモリを使用することはできません。
図2.3.4.2.にPC相対コールの動作を示します。
"CARS"命令は無条件コールと20種類の条件コール命令が設定されています。
"CARL"命令は無条件コールと4種類の条件コール命令が設定されています。
■間接コール命令(CALL)
間接コールはサブルーチンのアドレスを間接的に指定するコール命令です。
"CALL [hhll]"命令はアドレスhhll(hhll=0000h~FFFFH、ページはEPレジスタによって指
定)のメモリの内容をPCの下位8ビットに、アドレスhhll+1のメモリの内容をPCの上位8ビ
ットにそれぞれロードして、そのアドレスのサブルーチンを無条件にコールします。
サブルーチンコール実行時にはPC相対コールと同様、リターン情報としてPC値(コール命
令の次の命令の先頭アドレス)とCB値(MODEL2/3マキシマムモードの場合)がスタックに退
避されます。
■リターン命令(RET、RETS、RETE)
リターン命令はコール命令によって呼び出されたサブルーチンからのコール元のルーチン
に戻るための命令です。
リターン命令はサブルーチンコール実行時にスタックに退避されているPC値(コール命令
の次の命令の先頭アドレス)を元に戻します。MODEL2/3のマキシマムモードではCB値の復
帰も行われ、コールしたバンクに戻ります。
MODEL2/3のミニマムモードではMODEL0/1と同様、PC値のみ復帰します。
バンク1
物理アドレス 論理アドレス : NB CB PC
00A06DH A06DH LD NB,#2 01H 01H A06DH
00A070H A070H JRL S+57H 02H 01H A070H
スタック
00A073H A073H : 73H
A0H
バンク2 01H
0120C7H A0C7H LD A,B 02H 02H A070H+57H=A0C7H
: : :
012110H A110H RET 02H 02H A110H
バンク1 スタック
73H
: A0H
01H
00A06DH A06DH LD NB,#2
00A070H A070H JRL S+57H
00A073H A073H : 01H 01H A073H
図2.3.4.2 PC相対コールの動作(MODEL2/3マキシマムモードの例)
ミニマムモードでコール命令の実行時、または実行後にバンクの変更を行っている場合は
リターン命令を実行しても正常なアドレスへ戻ることはできません。
"RET"命令はリターン情報そのままに、コール命令の次の命令の先頭アドレスに処理を戻
します。
"RETS"命令はリターン情報のPC値に'2'を加えてリターンしますので、コール命令の次の2
バイト命令をスキップすることができます。
メインルーチン サブルーチン
: :
論理アドレス : ADD A.,B
1000H CARS rr :
1002H JRS rr JRS NC,S+3
1004H LD B,H RET 1002Hへ
リターン
: RETS 1004Hへ
リターン
図2.3.4.3 サブルーチンからのリターン
"RETE"命令はソフトウェア割り込みルーチンや例外処理ルーチン専用のリターン命令で、
リターン情報にSC(システムコンディションフラグ)の内容が含まれていることが"RET"命
令との違いです。
⇒"3.5 例外処理状態"
■ソフトウェア割り込み命令(INT)
ソフトウェア割り込み"INT [kk]"はアドレス00kkを想定して、その割り込みルーチンを
実行させる命令です。間接コール命令の一種ですが、分岐前に(SC)システムコンディショ
ンフラグ)もスタックに退避されます。したがって、この命令により実行される割り込み
ルーチンは必ず"RETE"命令でリターンする必要があります。
⇒"3.5 例外処理状態"
相対分岐命令のPC値
JRS命令、CARS命令、DJR命令
JRS命令、CARS命令、DJR命令は符合付8ビットPC相対ジャンプ命令で、PC値に相対値rr(
-128~127)を符合付きで加算し分岐先を決定します。
分岐先アドレスを"PC"、本命令の置かれている先頭アドレスを"PC'"とすると、
PC←PC'+rr+(n-1)
となります。
ここでnは命令のバイト数を示します。
たとえば、"JRS LE,rr"命令が100H番地に置かれているとすると分岐先アドレスは102H+rr
番地となります。
JRL命令、CARL命令
JRL命令、CARL命令は符合付き16ビットPC相対ジャンプ命令で、PC値に相対値qqrr(-32768
~32767)を符合付きで加算し分岐先を決定します。分岐先アドレスを"PC",本命令の置か
れている先頭アドレスを"PC'"とすると、
PC←PC'+qqrr+2
となります。
たとえば、"JRL C,qqrr"命令が100H番地に置かれているとすると分岐先アドレスは102H+
qqrr番地となります。
2.4 データメモリ
2.4.1 データメモリの構成
SMC88のアドレス空間は(最大16Mバイト)の中でプログラムメモリとして使用する領域を除
くすべてをデータメモリとして使用することができます。
データメモリ領域にはRAMや表示メモリ、周辺回路を制御するI/Oメモリなどが配置されま
す。
データメモリは64Kバイトを1つのページとして管理します。
図2.4.1.1にデータメモリの構成を示します。
MODEL0/1においてはアドレス空間が64Kバイトのため、ページによる管理をする必要があ
りません。MODEL2/3は最大で256ページの構成となります。
2.4.2 ページレジスタEP、XP、YP
データメモリの物理空間は64Kバイトのページに論理的に区切られています。したがって、
物理アドレスの上位8ビットがページ部、下位16ビットが論理アドレスとして管理されま
す。ページ内のアドレス指定はアドレッシングモードにしたがってインデックスレジスタ、
即値データ等によって行います。MODEL2とMODEL3にはページ部の指定用として3組のペー
ジレジスタEP、XP、YPが設定されており、アドレッシングモードの指定にしたがって使い
分けられます。図2.4.2.1にアドレッシングモードとレジスタの対応を示します。
⇒"4.1 アドレッシングモード"
MODEL0/1 MODEL2/3
0000H 000000H
ページ0 ページ0
(64Kバイト) (64Kバイト)
FFFFH 00FFFFH
010000H
ページ1
(64Kバイト)
01FFFFH
020000H
ページ2
(64Kバイト)
02FFFFH
:
:
FE0000H
ページ254
(64Kバイト)
FEFFFFH
FF0000H
ページ255
(64Kバイト)
FFFFFFH
図2.4.1.1 データメモリの構成
ページ指定 アドレス指定
アドレッシングモード
7 XP 0 15 IX 0
7 YP 0 15 IY 0 レジスタ間接
7 EP 0 15 HL 0
7 EP 0 15 <即値データ> 0 16ビット絶対
7 EP 0 7 BR 0 7<即値データ>0 8ビット絶対
物理アドレス 物理アドレス
A16~A23 A0~A15
ページ
0
255
図2.4.2.1 データメモリのアドレッシング
2.4.3 スタック
スタックはLIFO(Last In, First Out)形式でアクセスされるメモリで、SMC88ではデータ
メモリのRAM領域に割り当てられます。
スタックはサブルーチンコールや例外処理(割り込み)などが発生した場合にCPUのレジス
タ情報を退避するのに使用されます。またプログラムの任意の場所でレジスタの退避等を
行うことができます。
以下、スタックにデータを記憶させることを"プッシュ"、記憶したデータを取り出すこと
を"ポップ"と記述します。
■スタックポインタSP
データはスタックの最上位アドレスから順番にプッシュされ、逆にデータを取り出すとき
には最後にプッシュされたデータから順にポップされます。このプッシュとポップを行う
スタックのアドレスを示すレジスタがSP(スタックポインタ)です。
SPは1バイトデータのプッシュにより'1'減算(プリデクリメント)され、1バイトデータの
ポップにより'1'加算(ポストインクリメント)されます。
1 初期状態
SP
アドレス スタック ← 0000H
FFFFH |
FFFEH |
FFFDH 2 "データ1"をプッシュ
: |
↓
アドレス SP
FFFFH データ1 ← FFFFH (SP=SP-1)
FFFEH |
FFFDH ↓
: 3 "データ2"をプッシュ
|
アドレス ↓
FFFFH データ1 SP
FFFEH データ2 ← FFFFH (SP=SP-1)
FFFDH |
: 4 データをポップ
↓
アドレス SP
FFFFH データ1 ← FFFFH (SP=SP+1)
FFFEH データ2
FFFDH データ2
:
図2.4.3.1 スタックの動作
物理メモリ内でのスタックの位置は周辺回路からコアCPUに入力されるSPP0~SPP7(スタッ
クポインタページ)信号によってページアドレスが決定され、スタックアクセス時には
SPP0~SPP7の内容がそのままアドレスバスのページ部(A16~A23)に出力されます。そのペ
ージ内のアドレスはSPによって指定されます。一般的にはSPの初期値としてアドレス0000
Hを設定することにより、そのページの最終アドレスFFFFHから下位のアドレスに向かって
データが順にプッシュされます。
注! SP(スタックポインタ)はイニシャルリセット時は不定ですので、スタックが使
用される前に必ずプログラム("LD SP, 命令)で初期化を行って下さい。
■サブルーチンコールとスタック
コール命令を実行すると、サブルーチンに分岐する前にリターンアドレスとしてコール命
令の次の命令先頭アドレスとCB(MODEL2/3のマキシマムモードの場合)がスタックにプッシ
ュされます。
スタックにプッシュされたリターン情報はリターン命令実行によりポップされ、PCとCBに
再設定されます。
サブルーチンの中からさらに別のサブルーチンをコールするようなネスティングはスタッ
クが割り当てられたページの使用可能なメモリの範囲内で何レベルまででも可能です。
スタック ← SP
|
サブルーチンコール
実行時にCBとPCが
プッシュされます。
CB |
PC(H) ↓
PC(L) ← SP=SP-3
図2.4.3.2 サブルーチンコール実行時のスタック消費
MODEL2/3のマキシマムモード、サブルーチンコールによりスタックを3バイト(CB、PC)消
費します。MODEL0/1およびMODEL2/3のミニマムモードではCBを除くPCの2バイト分を消費
します。
■例外処理とスタック
例外処理(割り込み等)発生時もサブルーチンコールと同様にリターン情報がスタックにプ
ッシュされます。このときのリターン情報にはリターンアドレスPCとCB(MODEL2/3)のマキ
シマムモード)のほかにSCも含まれます.
スタック ← SP
|
例外処理発生時に
CB、PC、SCが
プッシュされます。
CB |
PC(H) |
PC(L) ↓
SC ← SP=SP-4
図2.4.3.3 例外処理発生時のスタック消費
MODEL2/3のマキシマムモードでは、例外処理の発生によりスタックを4バイト(CB、PC、
SC)消費します。MODEL0/1およびMODEL2/3のミニマムモードではCBをのぞくPCとSCの3バイ
ト分を消費します。
■その他のスタック操作
サブルーチンコールや例外処理(割り込み等)でのリターン情報のプッシュは自動的に行わ
れますが、汎用レジスタのプッシュは行われません。サブルーチンや例外処理ルーチンか
ら汎用レジスタの内容をプッシュ/ポップする命令を配置する必要があります。
レジスタのプッシュ/ポップは"PUSH"命令と"POP"命令によって行えます。この命令によっ
てプッシュ/ポップできるレジスタは以下のとおりです。
A、B、L、H、BR、SC、EP、IP(XPとYP)※、BA、HL、IX、IY
※はMODEL0/1にはありません
また、上記のSCを除くすべてのレジスタを1命令でプッシュする"PUSH ALL"、"PUSH ALE"
命令と、1命令でポップする"POP ALL"、"POP ALE"命令も用意されています。
PUSH ALL = PUSH BA POP ALL = POP BR
PUSH HL POP IY
PUSH IX POP IX
PUSH IY POP HL
PUSH BR POP BA
PUSH ALE = PUSH BA POP ALE = POP IP
PUSH HL POP EP
PUSH IX POP BR
PUSH IY POP IY
PUSH BR POP IX
PUSH EP POP HL
PUSH IP POP BA
オペランドの"ALL"はMODEL0/1用で、"ALE"はMODEL2/3で拡張されているレジスタEPとIP(
XPとYP)のプッシュ/ポップも行います。
構造化プログラミングにおいてはサブルーチンに渡す引数などをスタック領域にストアす
るといったことがよく行われますが、上記の"PUSH"命令や"POP"命令を使用せずにSPを操
作したりスタック領域の直接アクセスが容易に行われる命令等も用意されています。
ADD、SUB、CP、INC、DEC、LD
⇒"4.4 命令の詳細説明2
注! スタックは汎用RAM領域に割り当てられますので、データ領域とスタック領域
が重ならないよう注意してください。
2.4.4 メモリマップドI/O
SMC88 FamilyはSMC88をコアCPUとして,その周辺に入出力ポート等、各種の回路を内蔵し
ます。SMC88では、それらの周辺回路の制御にメモリマップドI/O方式を採用しており、周
辺回路の制御ビットやデータをやり取りするためのレジスタがデータメモリ領域に配置さ
れます。
このメモリ領域を汎用RAMと区別するためにI/Oメモリと呼びますが、ページの管理やアク
セスの方法はデータメモリと共通ですので、通常のメモリアクセスの命令を使って周辺回
路を制御することができます。
データレジスタ
入出力
I/Oメモリ データ
D7 D0
周辺回路
制御ビット
ステータスビット
コントロール/ステータスレジスタ
図2.4.1.1 周辺回路とメモリマップドI/O
3 CPUの動作と処理状態
CPUはシステムクロックに同期して動作します.
また、CPUの処理にはプログラムをシーケンシャルに実行している状態やスタンバイ状態
等各種の状態があります。
ここでは割り込みなども含む各種の処理状態ついて説明します。
3.1 タイミングジェネレータとバス制御
はじめに、CPU動作の基本となるクロックとバスの制御について説明します。
3.1.1 バスサイクル
SMC88のタイミングジェネレータは入力されたクロックCLKから2相分周した信号PK、PLを
作りCLKをステートに分解します。1ステートはCLKの1/2サイクルとなり、命令実行の単位
となる1バスサイクルは4ステートの構成となります。
命令セット一覧表などでサイクルとして示された数値はこのバスサイクル数を表していま
す。
■ハイインピーダンス
内部レジスタアクセス時にはデータバスがハイインピーダンスとなります。また、読み出
し信号RDと書き込み信号WRが共にHIGHレベルに固定され、アドレスバスはバスサイクルの
期間中ダミーアドレスを出力します。
■割り込みベクタアドレスリード
割り込みベクタアドレスはT2~T3ステートの間にデータバスから読み込まれます。
このリードに際しては読みだし信号RDが出力されず、割り込みベクタアドレス専用のリー
ド信号RDIVが出力されます。アドレスバスはバスサイクルの期間中ダミーアドレスを出力
します。
■メモリライト
メモリライト時はT2~T4ステートの間データバスに書き込みデータが出力され、T3ステー
トにおいて書き込み信号WRが出力されます。アドレスバスはバスサイクルの期間中対象ア
ドレスを出力します。
■メモリリード
メモリリード時はT2~T3ステートの間読みだし信号RDが出力され、データバス上のデータ
を読み込みます。アドレスバスはバスサイクルの期間中対象アドレスを出力します。
3.1.2 ウェイトステート
SMC88はバスラインに接続された低速デバイスのアクセスを確実に行うために、ウェイト
ステートを挿入してバスサイクルを伸ばすことができます。
SMC88ではウェイトを挿入する機能を持っており、WAIT端子の入力信号によってその制御
を行います。
なお、ウェイトステートはメモリ空間内に接続されたデバイスをアクセスする時のみ挿入
され、内部レジスタをアクセスするときには挿入されません。
3.2 処理状態の概要
SMC88の動作をその処理の内容により分類するとリセット状態、プログラム実行状態、例
外処理状態、例外処理状態、バス権解放状態、スタンバイ状態の5種類になります。
表3.2.1に処理状態の分類を示します。
表3.2.1 処理状態の分類
処理状態 概 要
リセット状態 CPUがリセットされ、停止している状態
プログラム実行状態 CPUがプログラムを順次実行している状態
例外処理状態 リセット、割り込み等の例外処理要因によって起動される例
外処理(ベクタアドレスのフェッチ、PCとSCの退避、PCに対
する分岐アドレスの設定)を実行している過渡的な状態
バス解放状態 外部からのバス権要求信号により外部バスを解放している状
態
スタンバイ状態 HALT CPUを停止し、消費電力を低減させている状態
SLEEP CPUおよび周辺回路を停止し、消費電力を低減させている状
態
3.3 リセット状態
リセット状態とは、SMC88がリセットされ停止している状態を示します。SR端子にLOWレベ
ルを入力することによりSMC88がリセットされます。リセットはCLKと非同期に行われます
ので、すべての処理状態から即時リセット状態に移行します。リセットにより一部の内部
レジスタが初期化されます。表3.3.1にレジスタの初期設定値を示します。
図3.3.1にリセット状態とリセット解除後のシーケンスを示します。
SR端子がLOWレベルのリセット期間中はアドレスバス、データバス、リード/ライト信号が
ハイインピーダンスになります。ただし、アドレスバスとリード/ライト信号はCPU内部で
プルアップされるため、HIGHレベルが出力されます。
SR端子がHIGHレベルになるとリセットが解除され、CLKが立ち下がりエッジが2回入力され
た時点で最初のバスサイクルを開始します。このバスサイクルではアドレスバスにダミー
アドレスが出力され、次のバスサイクルで割り込みアクノリッジIACKがイネーブルになり
ます。
これにより、ベクタテーブルに格納されているスタートアドレスを、不定の状態にあるPC
(プログラムカウンタ)にロードするリセットの例外処理を開始します。また、このときに
NB(ニューコードバンクレジスタ)の初期値01HをCB(コードバンクレジスタ)にロードする
処理も同時に行います。このため、リセット後のバンクエリアにはバンク1(008000H~00
FFFFH)が選択されます。
以上の処理により、イニシャルリセット後は000000H~000001Hのメモリに格納されたスタ
ートアドレスからプログラムの実行を開始します。
表3.3.1 内部レジスタの初期設定値
レジスタ名称 記号 ビット長 初期値
データレジスタA A 8 不定
データレジスタB B 8 不定
インデックス(データ)レジスタL L 8 不定
インデックス(データ)レジスタH H 8 不定
インデックスレジスタIX IX 16 不定
インデックスレジスタIY IY 16 不定
プログラムカウンタ PC 16 不定
スタックポインタ SP 16 不定
ベースレジスタ BR 8 不定
ゼロフラグ Z 1 0
キャリーフラグ C 1 0
オーバーフローフラグ V 1 0
ネガティブフラグ N 1 0
デシマルフラグ D 1 0
アンパックフラグ U 1 0
インタラプトフラグ0 I0 1 1
インタラプトフラグ1 I1 1 1
ニューコードバンクレジスタ NB 8 01H
コードバンクレジスタ CB 8 不定
エクスパンドページレジスタ EP 8 00H
IX用エクスパンドページレジスタ XP 8 00H
IY用エクスパンドページレジスタ YP 8 00H
*リセット例外処理によって、0バンクのメモリの先頭(000000H~000001H)に格納されて
いる値がPCにロードされます。また、この時同時にNBの初期値01HがCBにロードされま
す。
レジスタNB、CB、EP、XPおよびYPはMODEL2/3にのみ設定されており、MODEL0/1にはありま
せん。
注! リセットで初期化されないレジスタは、必要に応じてプログラムで初期化を行
う必要があります。
3.4 プログラム実行状態
プログラム実行状態とは、SMC88がプログラムを順次実行している状態を示します。
SMC88では、命令の第1オペコードのフェッチが直前の命令の最終サイクルに重複して行わ
れます。
したがって、SMC88の1命令の実行サイクルは第2オペコードのフェッチサイクル、第1オペ
ランドのリードサイクル、第1実行サイクルのいずれか(命令により異なる)から始まり、
次の命令の第1オペコードのフェッチサイクルで完了します。1サイクル命令については、
次に命令の第1オペコードのフェッチサイクルのみとなります。また、オペランドのリー
ドサイクル後、実行サイクルをはさまずに第1オペコードのフェッチサイクルに移行する
場合もあります。
第1オペコードのフェッチサイクルでは、その期間中SYNC信号がHIGHレベルになります。
3.5 例外処理状態
例外処理状態とは、割り込みなどの例外処理要因によってSMC88が通常のプログラム実行
を中断して処理の流れを変える過渡的な状態を示します。
例外処理のシーケンスを図3.5.1に示します。
例外処理は例外処理要因が発生した時点で実行している命令のサイクル終了時に開始され
ます。
例外処理フローに示すとおり、中断したルーチンを再開するためのリターン情報をスタッ
クに退避後、例外処理要因に対応したベクタアドレスから例外処理ルーチン(ユーザーが
設定した処理ルーチン)のスタートアドレスをPCにロードしてその処理ルーチンに分岐し
ます。ただし、リセット例外処理についてはリターン情報の退避は行われません。
この例外処理ルーチンに分岐するまでの過渡的な状態が例外処理状態で、分岐後は通常の
プログラム実行状態になります。
ユーザーが作成する例外処理ルーチンはサブルーチンの形式を取りますが、スタックにSC
が退避されるためリターン命令は必ず"RETE"命令を使用する必要があります。"RETE"命令
により、例外処理で中断されていたルーチンの実行を再開します。
例外処理要因発生
↓
↑ CB(コードバンクレジスタ)を
│ スタックに退避
│
│ ↓MODEL2/3 (マキシマムモード)
│
│ PC(プログラムカウンタ)を
│ スタックに退避
│
例外処理状態 ↓
│
│ SC(システムコンディション
│ フラグ)をスタックに退避
│
│ ↓←――――リセット例外処理要因発生
│
│ 例外処理ベクタを読み出し
↓ PCにロード
↓
例外処理ルーチンを実行
:
"RETE"命令
↓
例外処理発生時に戻る
図3.5.1 例外処理フロー
3.5.1 例外処理の種類と優先度
例外処理の種類と優先度を表3.5.1.1に示します。
表3.5.1.1 例外処理のタイミング
優先度 種 類 例外処理の開始タイミング
高 リセット SR端子がLOWレベルからHIGHレベルに変化後の最初のフェッチサ
↑ イクル
│
│ ゼロ除算 除数ゼロでDIV命令(除算)を実行した場合のDIV命令実行直後
│
│ <ノンマスカブル割り込み>
│ NMI NMI端子に立ち下がりエッジが入力された時点で実行中の命令ま
│ たは例外処理終了時
│
│ <割り込み要求3>
│ IRQ3 IRQ3端子に立ち下がりエッジが入力された時点で実行中の命令ま
│ たは例外処理終了時
│
│ <割り込み要求2>
│ IRQ2 IRQ2端子に立ち下がりエッジが入力された時点で実行中の命令ま
│ たは例外処理終了時
│
↓ <割り込み要求1>
低 IRQ1 IRQ1端子に立ち下がりエッジが入力された時点で実行中の命令ま
たは例外処理終了時
なし INT命令 <ソフトウェア割り込み>
INT命令の実行
例外処理要因には優先順位が設定されており、複数の要因が同時に発生した場合は優先度
の高い例外処理が先に実行されます。
また、例外処理状態において新たな例外処理要因が発生した場合は、その時点の例外処理
終了後(例外処理ルーチンの実行前)に新たな例外処理が実行されます。
たとえば、IRQ3の例外処理中にNMIが発生した場合、IRQ3の例外処理の最後にNMIのサンプ
リングが行われ、ユーザーの処理ルーチンとしてはNMI処理ルーチンがIRQ処理ルーチンよ
り先に実行されます。
このため、割り込みによる例外処理ではその割り込みより優先度の低い割り込みがマスク
されるようになっています。
INT命令による例外処理はプログラムによって開始できますので、優先度は設定されませ
ん。
3.5.2 例外処理要因とベクタ
例外処理ルーチンのスタートアドレスは、各例外処理に対応したベクタアドレスにベクタ
として設定しておきます。
このベクタが例外処理の最後にPCにロードされ、例外処理ルーチンへ分岐します。
表3.5.2.1に例外処理要因とベクタアドレスの対応を示します。
表3.5.2.1 例外処理要因とベクタアドレスの対応
例外処理要因 ベクタアドレス ベクタアドレス発生元
リセット 000000H~000001H CPU内部
ゼロ除算 000002H~000003H CPU内部
NMI 000004H~000005H CPU内部
IRQ1~IRQ3 000006H~0000FFH 周辺回路
INT命令 000000H~0000FFH 命令のオペランド
ベクタはCPUモデルにかかわらず論理アドレスを示す2バイトのアドレス情報に固定されて
います。MODEL2/3においてもユーザーが作成した例外処理ルーチンのバンクをベクタによ
り指定することはできません。したがって、どのバンクのプログラムを実行している場合
でも共通の例外処理ルーチンに分岐させるために、ベクタにより指定される例外処理ルー
チンの先頭をコモンエリア内(000000H~007FFH)に配置する必要があります。
IRQ1~IRQ3のベクタアドレスは周辺回路によって設定されます。INT命令の場合は命令の
オペランドがそのままベクタアドレスとなり、他の例外処理要因も含めると最大128ベク
タまで確保できます。
3.5.3 割り込み
割り込みにはNMI、IRQ3、IRQ2、IRQ1の4種類があり、それぞれには表3.5.3.1に示す割り
込み優先レベルが設定されています。
表3.5.3.1 割り込み優先レベル
優先度 割り込み優先レベル 割り込み要因
高 4 NMI
↑ 3 IRQ3
↓ 2 IRQ2
低 1 IRQ1
割り込みはインタラプトフラグI0、I1によってマスク(割り込みを受け付けないように設
定)することができます。プログラムによってI0、I1の2ビットに割り込み優先レベルを設
定すると、それより高い優先レベルの割り込みのみが受け付けられます。このうち、レベ
ル4の優先度を持っているMNIはI0とI1の設定にかかわらず、常時受け付けられます。
また、割り込み要因の発生により例外処理が実行されるとI0とI1は受け付けた割り込みと
同じレベルに設定され、同一レベル以下の割り込みがマスクされます。このマスクの設定
はSC(システムコンディションフラグ)のスタック退避後に行われますので、割り込み処理
ルーチンを"RETE"命令で終了した時点でSCが元の状態に戻り、割り込みマスクも元の優先
レベルに戻ります。割り込みルーチン内で同一レベル以下の多重割り込みを許可したい場
合は、そのルーチンの中で再度優先レベルの設定を行って下さい。
なお、NBおよびSCの内容を変更する命令を実行している最中は割り込みを受け付けません。
その間に発生した割り込みの例外処理は、次の命令終了後に開始されます。
表3.5.3.2 割り込みマスクの設定
I1 I0 受け付け可能な割り込み
1 1 NMI
1 0 NMI IRQ3
0 1 NMI IRQ3 IRQ2
0 0 NMI IRQ3 IRQ2 IRQ1
表3.5.3.3 割り込み受け付け後のI0とI1
受け付けた割り込み要因 I1 I0
NMI 1 1
IRQ3 1 1
IRQ2 1 0
IRQ1 0 1
3.5.4 例外処理のシーケンス
例外処理のサンプリングはSYNC信号の立上りエッジ(命令の第1オペコードフェッチサイク
ル開始時)で行われます。ここで例外処理要因が発生している場合、CPUは割り込みアクノ
リッジ信号IACKを出力し例外処理を開始します。IRQ1~IRQ3割り込みの場合、割り込みを
発生させた周辺回路はIACK信号を受けてベクタアドレスをホールドします。
MODEL2/3マキシマムモードではCBがスタックに退避
されます。
3.6 バス権解放状態
この機能はChipCardでは使用できません。
3.7 スタンバイ状態
SMC88にはCPUの動作を停止させる機能があり、これによって消費電力を大幅に低減するこ
とができます。アプリケーションプログラムがある期間CPUに実行させる処理がない場合
にこの機能を用いてCPUを停止させることができます。低消費電力化のためにCPUを停止さ
せた状態がスタンバイ状態で、この状態にも以下に説明するHALT状態とSLEEP状態の2種類
があります。
3.7.1 HALT状態
HALT状態はCPUのみが停止するもので、"HALT"命令によって移行することができます。
HALT状態からはリセットまたは任意の割り込み(NMI、IRQ1~IRQ3)によって例外処理に移
行することができ、割り込みによる再起動の場合は例外処理ルーチン実行後"RETE"命令に
よって"HALT"命令の次の命令からプログラムの実行を再開できます。発振回路などの周辺
回路はHALT状態の間も動作しているため、MCU(SMC88 Family)の外部にCPU再起動用の割り
込み回路などを設ける必要もなく、再起動も瞬時に行われます。
CPU内のレジスタ等は"HALT"命令実行時点の内容がHALT状態の間も保持されます。
3.7.2 SLEEP状態
この状態にはいるとChipCardはRESET以外、受け付けません。
SLEEP状態はCPUとMCU内部の周辺回路の動作が停止するもので、"SLP"命令によって移行す
ることができます。
SLEEP状態では発振回路などの周辺回路も停止するため、HALT状態に比べて消費電力が大
幅に低減できます。ただし、再起動の際に発振回路の安定待ち時間が必要となりますので、
瞬時の立ち上げの必要のない長時間のスタンバイに有効です。
SLEEP状態でも規定電圧の印加によりCPU内のレジスタ等は"SLP"命令実行時点の内容が保
持されます。但しRESET処理により各レジスター値は初期化されます。特に初期化を
したくない場合は、「=」キーを押したまま、RESETを押し処理が終わるのを待つ
方法がありますが、おすすめできません。