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桁のデータを格納するため、演算項の桁合 わせが容易に行えます。(この場合の桁合わせはメモリアドレスのポインティングのみと なります。) 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を押し処理が終わるのを待つ 方法がありますが、おすすめできません。