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 >
Text File  |  1995-07-16  |  68KB  |  1,727 lines

  1. 1    SMC88の紹介
  2.      ChipCard TC-100で使用しています8ビットCPU SMC88112はセイコー・エプソン社
  3.      のSMCファミリーの一つです。このコアに採用されているCPUはSMC88
  4.      であり、以下にこのCPUを用いてプログラムを作成するに必要な情報を記述
  5.      してあります。
  6.      この文書はSMC88.TXTから始まり、SMC88ZQ2.TXTまで
  7.      です。
  8.      各文書は
  9.          SMC88.TXT  : 紹介、体系及びCPUについて     1章から3章まで
  10.          SMC88A1.TXT: 命令セット、アドレシングモード、記号の意味 4章から4章3.2まで
  11.          SMC88A2.TXT: 機能別命令一覧表                   4章3.3
  12.          SMC88B.TXT : 命令の詳細説明 ADC                 4章3.4
  13.          SMC88C.TXT : 命令の詳細説明 ADD                 4章3.4
  14.          SMC88D.TXT : 命令の詳細説明 AND                 4章3.4
  15.          SMC88E.TXT : 命令の詳細説明 BIT                 4章3.4
  16.          SMC88F.TXT : 命令の詳細説明 CALL                4章3.4
  17.          SMC88G.TXT : 命令の詳細説明 CARL                4章3.4
  18.          SMC88H.TXT : 命令の詳細説明 CARS                4章3.4
  19.          SMC88I.TXT : 命令の詳細説明 CP                  4章3.4
  20.          SMC88J.TXT : 命令の詳細説明 CPL                 4章3.4
  21.          SMC88K.TXT : 命令の詳細説明 DEC                 4章3.4
  22.          SMC88L.TXT : 命令の詳細説明 DIV                 4章3.4
  23.          SMC88M.TXT : 命令の詳細説明 DJR                 4章3.4
  24.          SMC88N.TXT : 命令の詳細説明 EX                  4章3.4
  25.          SMC88O.TXT : 命令の詳細説明 HALT                4章3.4
  26.          SMC88P.TXT : 命令の詳細説明 INC                 4章3.4
  27.          SMC88Q.TXT : 命令の詳細説明 INT                 4章3.4
  28.          SMC88R.TXT : 命令の詳細説明 JP                  4章3.4
  29.          SMC88S.TXT : 命令の詳細説明 JRL                 4章3.4
  30.          SMC88T.TXT : 命令の詳細説明 JRS                 4章3.4
  31.          SMC88U.TXT : 命令の詳細説明 8bitのLD命令-その1  4章3.4
  32.          SMC88U1.TXT: 命令の詳細説明 8bitのLD命令-その2  4章3.4
  33.          SMC88U2.TXT: 命令の詳細説明 8bitのLD命令-その3  4章3.4
  34.          SMC88U3.TXT: 命令の詳細説明 16bitのLD命令       4章3.4
  35.          SMC88V.TXT : 命令の詳細説明 MLT                 4章3.4
  36.          SMC88W.TXT : 命令の詳細説明 NEG                 4章3.4
  37.          SMC88X.TXT : 命令の詳細説明 NOP                 4章3.4
  38.          SMC88Y.TXT  : 命令の詳細説明 OR  その1          4章3.4
  39.          SMC88Y1.TXT : 命令の詳細説明 OR  その2          4章3.4
  40.          SMC88Z.TXT  : 命令の詳細説明 PACK               4章3.4
  41.          SMC88ZA.TXT : 命令の詳細説明 POP                4章3.4
  42.          SMC88ZB.TXT : 命令の詳細説明 PUSH               4章3.4
  43.          SMC88ZC.TXT : 命令の詳細説明 RET                4章3.4
  44.          SMC88ZD.TXT : 命令の詳細説明 RL                 4章3.4
  45.          SMC88ZE.TXT : 命令の詳細説明 RLC                4章3.4
  46.          SMC88ZF.TXT : 命令の詳細説明 RR                 4章3.4
  47.          SMC88ZG.TXT : 命令の詳細説明 RRC                4章3.4
  48.          SMC88ZH.TXT : 命令の詳細説明 SBC その1          4章3.4
  49.          SMC88ZH1.TXT: 命令の詳細説明 SBC その2          4章3.4
  50.          SMC88ZH2.TXT: 命令の詳細説明 SBC その3          4章3.4
  51.          SMC88ZH3.TXT: 命令の詳細説明 SBC その4          4章3.4
  52.          SMC88ZI.TXT : 命令の詳細説明 SEP                4章3.4
  53.          SMC88ZJ.TXT : 命令の詳細説明 SLA                4章3.4
  54.          SMC88ZK.TXT : 命令の詳細説明 SLL                4章3.4
  55.          SMC88ZL.TXT : 命令の詳細説明 SLP                4章3.4
  56.          SMC88ZM.TXT : 命令の詳細説明 SRA                4章3.4
  57.          SMC88ZN.TXT : 命令の詳細説明 SRL                4章3.4
  58.          SMC88ZO.TXT : 命令の詳細説明 SUB その1          4章3.4
  59.          SMC88ZO1.TXT: 命令の詳細説明 SUB その2          4章3.4
  60.          SMC88ZO2.TXT: 命令の詳細説明 SUB その3          4章3.4
  61.          SMC88ZO3.TXT: 命令の詳細説明 SUB その4          4章3.4
  62.          SMC88ZO4.TXT: 命令の詳細説明 SUB その5          4章3.4
  63.          SMC88ZP.TXT : 命令の詳細説明 SWAP               4章3.4
  64.          SMC88ZQ.TXT : 命令の詳細説明 XOR その1          4章3.4
  65.          SMC88ZQ1.TXT: 命令の詳細説明 XOR その2          4章3.4
  66.          SMC88ZQ2.TXT: 命令の詳細説明 XOR その3          4章3.4
  67.  
  68.       となっています。全てを順番に見る必要はありません。
  69.  
  70.  
  71. ------------------------------------------------------------------------------
  72. 2    体系
  73. 2.1  モデルについて
  74. SMC88ではモデルをいくつか持っていますが、ChipCardの場合はモデル3
  75. を参照してください。またモードの記述があった場合はマキシマム・モードを参照して
  76. ください。ここのモデル、モードについてはChipCardと関係ありませんので
  77. 省略します。
  78.  
  79. 2.2  演算部とレジスタ
  80.  
  81. 2.2.1  ALU
  82. ALU(算術論理演算ユニット)は2種類のテンポラリレジスタTEMP0 とTEMP1にストアされた
  83. 8ビットまたは16ビットデータ間の演算を行います。
  84.  
  85. 演算結果は16ビットのテンポラリレジスタTEMP2に一旦ストアされた後、演算命令にした
  86. がったレジスタ/メモリにストアされるか、アドレスデータとして使用されます。
  87. また、演算結果によりZ(ゼロ)フラグ、C(キャリー)フラグ、V(オーバーフロー)フラグ、
  88. N(ネガティブ)フラグがセット/リセットされます。
  89.  ⇒"2.2.3 フラグ"
  90.  
  91. 2.2.2 レジスタ構成
  92. SMC88のレジスタ構成を図2.2.2.1に示します。
  93.  
  94.                    標準部(MODEL0~MODEL3共通)
  95.  
  96.  MSB                               LSB
  97.  7(15)<--B------>0 7<-------A-----> 0  データレジスタ A、B、(BA)
  98.  7(15)<--H------>0 7<-------L-----> 0  インデックス(データ)レジスタ HL、(H、L)
  99.  15   <----------IX---------------> 0  インデックスレジスタ IX
  100.  15   <----------IY---------------> 0  インデックスレジスタ IY
  101.  15   <----------PC---------------> 0  プログラムカウンタ
  102.  15   <----------SP---------------> 0  スタックポインタ
  103.             7<------BR-----> 0  ベースレジスタ
  104.  
  105.                                    Z   ゼロ・フラグ(1ビット)
  106.                                    C   キャリー・フラグ(1ビット)
  107.                                    V   オーバーフロー・フラグ(1ビット)
  108.                                    N   ネガティブ・フラグ(1ビット)
  109.                                    D   デシマル・フラグ(1ビット)
  110.                                    U   アンパック・フラグ(1ビット)
  111.                                    I0  インタラプトフラグ0(1ビット)
  112.                                    I1  インタラプトフラグ1(1ビット)
  113.  
  114.                    拡張部(MODEL2、MODEL3)
  115.                   MSB              LSB
  116.             7 <---- NB ----> 0  ニューコードバンクレジスタ
  117.             7 <---- CB ----> 0  コードバンクレジスタ
  118.             7 <---- EP ----> 0  エクスパンドページレジスタ
  119.             7 <---- XP ----> 0  IX用エクスパンドページレジスタ
  120.             7 <---- YP ----> 0  IY用エクスパンドページレジスタ
  121.  
  122.  
  123.                             図2.2.2.1 レジスタ構成
  124.  
  125.  
  126. ■Aレジスタ、Bレジスタ
  127. Aレジスタ、Bレジスタはそれぞれ8ビットのデータレジスタで、他のレジスタやデータ
  128. メモリとのデータ転送や演算、即値データの転送、演算が行えます。8ビット転送/演算
  129. においてはそれぞれ単独に、16ビット転送/演算においてはBレジスタを上位8ビットと
  130. するBAペアで使用します。
  131.  
  132. ■HLレジスタ
  133. HLレジスタは16ビットのインデックスレジスタで、データメモリの間接アドレッシングに
  134. 使用します(ページ内のアドレスを指定)。
  135. 他のレジスタやデータメモリとの16ビットデータ転送や演算が行えます。また、Hレジス
  136. タ、Lレジスタの8ビットずつに分けてデータレジスタとしても使用できます。この場合の
  137. LレジスタはIXレジスタ、IYレジスタによる間接アドレッシングの際のディスプレースメ
  138. ントとして使用することもできます。
  139.  ⇒"2.4 データメモリ"
  140.  ⇒"4.1 アドレッシングモード"
  141.  
  142.        表2.2.1.1 ALUの演算機能
  143.  
  144.   演算機能       演算命令   16ビット演算
  145. 加算                      ADD,ADC            ○
  146. 減算                      SUB,SBC            ○
  147. 論理積                      AND
  148. 論理和                       OR
  149. 排他的論理和                XOR
  150. 比較                         CP              ○
  151. ビットテスト                BIT
  152. 1加算/減算                INC,DEC            ○
  153. 乗算                        MLT
  154. 除算                        DIV
  155. 補数                      CPL,NEG
  156. ローテート              RL,RLC,RR,RRC
  157. シフト                  SLA,SLL,SRA,SRL
  158. パック/アンパック        PACK,UPCK
  159. 符号拡張                    SEP
  160.  
  161.  
  162. ■IXレジスタ、IYレジスタ
  163. IXレジスタ、IYレジスタはそれぞれ16ビットのインデックスレジスタで、データメモリ
  164. の間接アドレッシングに使用します。(ページ内のアドレスを指定)。他のレジスタやデー
  165. タメモリとの16ビットデータ転送や演算が行えます。
  166.  ⇒"2.4 データメモリ"
  167.  ⇒"4.1 アドレッシングモード"
  168.  
  169. ■PC(プログラムカウンタ)
  170. PCはプログラムメモリのアドレッシングを行う16ビットのカウンタレジスタで、次に実行
  171. する命令のアドレスを示します。
  172.  ⇒"2.3 プログラムメモリ"
  173.  
  174. ■SP(スタックポインタ)
  175. SPは16ビットのカウンタレジスタでスタックアドレス(スタックページ内のアドレス)を示
  176. します。他のレジスタやデータメモリとの16ビットデータ転送や演算が行えます。
  177.  ⇒"2.4.3 スタック"
  178.  
  179. ■BR(ベースレジスタ)
  180. BRは8ビットのインデックスレジスタで、8ビット絶対アドレッシング(アドレスの下位8ビ
  181. ットを指定)の際にページ内の上位8ビットのアドレス指定に使用されます。
  182.  ⇒"4.1 アドレッシングモード"
  183.  
  184. ■SC(システムコンディションフラグ)
  185. SCは8ビットのフラグで、演算結果を示すZ、C、V、Nフラグ、演算モードを設定するD、U
  186. フラグ、割り込み優先レベルを設定するI0、I1フラグで構成されます。
  187.  ⇒"2.2.3 フラグ"
  188.  
  189. ■NB(ニューコードバンクレジスタ)
  190. NBレジスタはプログラムメモリのバンクを指定する8ビットのレジスタです。NBレジスタ
  191. はCPUモデルのMODEL2およびMODEL3に設定されています。
  192.  ⇒"2.3 プログラムメモリ"
  193.  
  194. ■CB(コードバンクレジスタ)
  195. CBレジスタはプログラムメモリの現在選択されているバンクを示す8ビットのレジスタで
  196. す。NBレジスタにデータを設定した場合、そのデータがCBレジスタにロードされ、新たな
  197. バンクが選択されます。CBレジスタはCPUモデルのMODEL2およびMODEL3に設定されていま
  198. す。
  199.  ⇒"2.3 プログラムメモリ"
  200.  
  201. ■EP、XP、YP(エクスパンドページレジスタ)
  202. これらのレジスタはデータメモリのページを指定する8ビットのレジスタです。
  203. EPレジスタはHLレジスタによる間接アドレッシング、あるいは即値データによる絶対アド
  204. レッシングの際に使用されます。
  205. XPレジスタはIXレジスタによる間接アドレッシング、YPレジスタはIYレジスタによる間接
  206. アドレッシングの際に使用されます。
  207. これらのレジスタは、CPUモデルのMODEL2およびMODEL3に設定されています。
  208.  ⇒"2.4.2 ページレジスタEP、XP、YP"
  209.  ⇒"4.1 アドレッシングモード"
  210.  
  211. 2.2.3 フラグ
  212. SMC88にはCPU内部の演算結果の状態などを表すシステムコンディションフラグ(SC)と周辺
  213. 回路の状態を表すカスタマイズコンディションフラグ(CC)が設定されています。
  214.  
  215. ■システムコンディションフラグ(SC)
  216.  
  217.  SC I1 I0 U D N V C Z
  218.                        Z(ゼロ)フラグ
  219.                        C(キャリー)フラグ
  220.                        V(オーバーフロー)フラグ
  221.                        N(ネガティブ)フラグ
  222.                        D(デシマル)フラグ
  223.                        U(アンパック)フラグ
  224.                        I0(インタラプト0)フラグ
  225.                        I1(インタラプト1)フラグ
  226.  
  227.   図2.2.3.1 システムコンディションフラグ(SC)
  228.  
  229. システムコンディションフラグは図2.2.3.1に示すとおり、8ビットのフラグで構成された
  230. レジスタSCとなっています。
  231. システムコンディションフラグのZ(ゼロ)、C(キャリー)、V(オーバーフロー)、N(ネガテ
  232. ィブ)フラグは演算の結果によりセット/リセットされ、I0、I1、(インタラプト)フラグは
  233. 割り込みによりセット/リセットされます。また、これらのフラグは以下の命令によって
  234. も操作できます。
  235.  
  236.          AND    SC,#nn    (任意のフラグをリセット)
  237.          OR     SC,#nn    (任意のフラグをセット)
  238.          XOR    SC,#nn    (任意のフラグを反転)
  239.          LD     SC,#nn    (フラグのライト)
  240.          LD     SC,A      (フラグのライト)
  241.          POP    SC        (フラグの復帰)
  242.          RETE             (フラグの復帰)
  243.  
  244. Z,C,V,NフラグはJRS命令やCARS命令などの条件ジャンプ/コール命令実行の際の条件判定
  245. に使用されます。
  246.  ⇒"4.4 命令の詳細説明"
  247.  
  248. (1)Z(ゼロ)フラグ
  249.    Zフラグは演算命令の実行結果が'0'になった場合に'1'にセット、結果が'0'以外の場
  250.    合に'0'にリセットされます。
  251.  
  252. (2)C(キャリー)フラグ
  253.    Cフラグは加算命令の実行によりキャリー(最上位ビットから桁上げ)が発生した場合、
  254.    または減算命令/比較命令の実行によりボロー(最上位ビットに借り)が発生した場合
  255.    に'1'にセット、それ以外の場合に'0'にリセットされます。ただし、1加減算命令(
  256.    INC、DEC命令)の実行ではCフラグは変化しません。
  257.    また、ローテート/シフト命令の実行によってもCフラグ変化します。
  258.    乗除算命令(MLT、DIV命令)を実行した場合は'0'にリセットされます。
  259.  
  260. (3)Vオーバーフロー)フラグ
  261.   Vフラグは演算を行った結果が8ビットまたは16ビットで補数表現可能な範囲を越えた
  262.   場合に'1'にセット、範囲内の場合に'0'にリセットされます。補数表現の範囲は8ビッ
  263.   トが-128~127、16ビットが-32768~32767になります。
  264.    ただし、演算命令の中でも論理演算命令(デスティネーションがSCの場合を除くAND、
  265.    OR、XOR命令)、ビット操作命令(BIT命令)、1加減算命令(INC、DEC命令)の実行ではVフ
  266.    ラグは変化しません。乗算命令(MLT命令)を実行した場合は'0'にリセットされます。
  267.    除算命令(DIV命令)を実行した場合は、商が8ビットを越えるときに'1'にセットされま
  268.    す。
  269.    Cフラグが絶対値演算のオーバー(アンダー)フローを示すのに対し、Vフラグは補数演
  270.    算のオーバーフローを示します。オーバーフローが起こりうる補数演算を行う場合は
  271.    Vフラグをチェックして、'1'のときには演算結果を補正する必要があります。
  272.  ⇒"2.2.4 補数演算とオーバーフロー"
  273.  
  274. (4)N(ネガティブ)フラグ
  275.    Nフラグは演算を行った結果がマイナス(最上位ビットが'1')になった場合に'1'にセッ
  276.   ト、プラス(最上位ビットが'0')の場合に'0'にリセットされます。ただし、1加減算命
  277.   令(INC、DEC命令)の実行ではNフラグは変化しません。
  278.  
  279. (5)D(デシマル)フラグ
  280.    Dフラグは8ビット加減算命令の実行の際に10進演算(演算結果が10進補正される)を行
  281.    うように設定するビットで、'1'を設定することにより10進演算を行い、'0'で16進演
  282.    算を行います。
  283.   ⇒"2.2.5 10進演算とアンパック演算"
  284.  
  285. (6)U(アンパック)フラグ
  286.    Uフラグは8ビット加減算の実行の際にアンパック演算(上位4ビットを'0'として演算を
  287.    行うように設定するビットで、'1'を設定することによりアンパック演算を行い、'0'
  288.    で通常の8ビット演算を行います。
  289.   ⇒"2.2.5 10進演算とアンパック演算"
  290.  
  291. (7)I0、I1(インタラプト)フラグ
  292.   I0およびI1フラグは割り込み優先レベルを設定するビットで、この2ビットで設定した
  293.   レベルより高いレベルの割り込み のみCPUは受付けます。
  294.    また、割り込みが発生した際にも、そのレベル以下の割り込みをマスクするよう、新
  295.    たな値が自動設定されます。
  296.   ⇒"3.5.3 割り込み"
  297.  
  298. 命令セット一覧表等では命令の実行により変化するフラグを" "を付けて示しています。
  299. Dフラグ、Uフラグは"★"を付けて、その命令が10進演算、アンパック演算可能であること
  300. を示しています。
  301.  
  302. 2.2.4 補数演算とオーバーフロー
  303. SMC88内部ではマイナスのデータを扱うために補数表現が用いられます。以下に補数表現
  304. と補数を用いた演算について説明します.
  305.  
  306. ■補数
  307. マイクロコンピュータでマイナス(負)の数を扱う場合、一般的には補数表現が用いられま
  308. す。補数には2の補数と1の補数の2種類の表現方法があり、通常単に補数といった場合、
  309. 2の補数を指します。
  310. SMC88でもマイナスの数は2の補数で表しています。
  311.  
  312. 任意の数Nの補数は以下の式で表され、2の補数表現が可能な範囲は8ビットの場合が-128
  313. ~127、16ビットの場合が-32767~32767になります。
  314. 補数表現した場合、マイナスの数の最上位ビットは必ず'1'になります。この最上位ビッ
  315. トの内容がN(ネガティブ)フラグに反映されます。
  316.  
  317. なお、8ビットのデータを補数に変換するための命令として"CPL"命令(1の補数に変換)と
  318. "NEG"命令(2の補数に変換)が、8ビットの補数を16ビットに拡張するための命令として
  319. "SEP"命令が用意されています。
  320.  
  321. 例:NEG命令とSEP命令
  322.  
  323.     命令           Breg.        A reg.  Nフラグ
  324.  
  325.    LD  A,#127    0000 0000    0111 1111    0
  326.  
  327.    NEG A         0000 0000    1000 0001    1
  328.  
  329.    SEP           1111 1111    1000 0001    1
  330.  
  331.  
  332.  
  333.               2の補数
  334.  
  335.   8ビット   -N = 2 - N = 256 - N
  336.  
  337.    127 = 0111 1111b
  338.  
  339.    126 = 0111 1110b
  340.            :
  341.      2 = 0000 0010b
  342.  
  343.      1 = 0000 0001b
  344.  
  345.      0 = 0000 0000b
  346.  
  347.     -1 = 1111 1111b (= 1 0000 0000b - 0000 0001b)
  348.  
  349.     -2 = 1111 1110b (= 1 0000 0000b - 0000 0010b)
  350.            :
  351.   -127 = 1000 0001b (= 1 0000 0000b - 0111 1111b)
  352.  
  353.   -126 = 1000 0000b (= 1 0000 0000b - 1000 0000b)
  354.  
  355.  
  356.  
  357.  16ビット    -N = 2 - N = 65536 - N
  358.  
  359.  32767 = 0111 1111 1111 1111b
  360.  
  361.  32766 = 0111 1111 1111 1110b
  362.            :
  363.      2 = 0000 0000 0000 0010b
  364.  
  365.      1 = 0000 0000 0000 0001b
  366.  
  367.      0 = 0000 0000 0000 0000b
  368.  
  369.     -1 = 1111 1111 1111 1111b (= 1 0000 0000 0000 0000b - 0000 0000 0000 0001b)
  370.  
  371.     -2 = 1111 1111 1111 1110b (= 1 0000 0000 0000 0000b - 0000 0000 0000 0010b)
  372.            :
  373. -32767 = 1000 0000 0000 0001b (= 1 0000 0000 0000 0000b - 0111 1111 1111 1111b)
  374.  
  375. -32768 = 1000 0000 0000 0000b (= 1 0000 0000 0000 0000b - 1000 0000 0000 0000b)
  376.  
  377.  
  378.  
  379.  
  380.               1の補数
  381.  
  382.   8ビット   -N = 2 - 1 - N = 255 - N (= N)
  383.  
  384.    127 = 0111 1111b
  385.  
  386.    126 = 0111 1110b
  387.            :
  388.      2 = 0000 0010b
  389.  
  390.      1 = 0000 0001b
  391.  
  392.      0 = 0000 0000b
  393.  
  394.     -1 = 1111 1111b (= 1111 1111b - 0000 0001b)
  395.  
  396.     -2 = 1111 1110b (= 1111 1111b - 0000 0010b)
  397.            :
  398.   -126 = 1000 0001b (= 1111 1111b - 0111 1110b)
  399.  
  400.   -127 = 1000 0000b (= 1111 1111b - 0111 1111b)
  401.  
  402.  
  403.  
  404.  16ビット    -N = 2 - 1 - N = 65535 - N (= N)
  405.  
  406.  32767 = 0111 1111 1111 1111b
  407.  
  408.  32766 = 0111 1111 1111 1110b
  409.            :
  410.      2 = 0000 0000 0000 0010b
  411.  
  412.      1 = 0000 0000 0000 0001b
  413.  
  414.      0 = 0000 0000 0000 0000b
  415.  
  416.     -1 = 1111 1111 1111 1110b (= 1111 1111 1111 1111b - 0000 0000 0000 0001b)
  417.  
  418.     -2 = 1111 1111 1111 1101b (= 1111 1111 1111 1111b - 0000 0000 0000 0010b)
  419.            :
  420. -32766 = 1000 0000 0000 0001b (= 1111 1111 1111 1111b - 0111 1111 1111 1110b)
  421.  
  422. -32767 = 1000 0000 0000 0000b (= 1111 1111 1111 1111b - 0111 1111 1111 1111b)
  423.  
  424.  
  425.  
  426. ■補数演算とV(オーバーフロー)フラグ
  427. アドレス計算などの絶対値による演算の場合、8ビットでは0~255、16ビットでは0~
  428. 65535の範囲で正しい演算結果が得られます。演算によりオーバーフローあるいはアンダ
  429. ーフローが発生し範囲を外れた場合は、C(キャリー)フラグが'1'にセットされます。
  430. 演算後、被演算数が補数になっている場合の正しい演算結果の範囲は、8ビットが-128
  431. ~127、16ビットが-32768~32767となり、Cフラグのみでは演算結果が正しいかどうか
  432. 判断できません。この判断を行うためにV(オーバーフロー)フラグが設定されており、補
  433. 数表現の範囲を越えた場合にVフラグが'1'にセットされます。
  434.  
  435. なお、ALUは絶対値演算、補数演算を区別してはいませんので、Cフラグ、Vフラグのセッ
  436. ト/リセットは単に演算結果が上記の範囲内にあるかどうかで行われます。したがって、
  437. 絶対値演算においてもVフラグが'1'にセットされる場合があります。この場合のVフラグ
  438. は意味を持ちませんので、プログラムでVフラグを確認する必要はありません。Vフラグ
  439. でオーバーフローが判断できるのは補数演算の場合に限られますので、アプリケーショ
  440. ンで扱うデータが符合付きかどうかを判断してください。
  441.  
  442. 以下に8ビットの演算例とその演算結果によるVフラグ、Cフラグの変化を示します。
  443.  
  444. 例:"ADD A,B"命令による加算例
  445.  
  446.   A reg.      B reg.    結果(A reg.)   Vフラグ  Cフラグ
  447.  
  448. 0101 1010   1010 0101    1111 1111        0        0
  449.  
  450. 0101 1011   1010 0101    0000 0000        0        1
  451.  
  452. 0101 1010   0010 0101    1000 0000        1        0
  453.  
  454.  
  455.    "SUB A,B"命令による減算例
  456.  
  457.   A reg.      B reg.    結果(A reg.)   Vフラグ  Cフラグ
  458.  
  459. 0101 1010   0101 1010    0000 0000        0        0
  460.  
  461. 0101 1011   0101 1011    1111 1111        0        1
  462.  
  463. 0101 1010   1101 1010    1000 0000        1        1
  464.  
  465.  
  466. 2.2.5 10進演算とアンパック演算
  467. SMC88では以下の8ビット演算命令実行時、通常の16進演算の他に10進演算、アンパック
  468. 演算、およびその組み合わせによって演算を行うように設定することができます。この
  469. 設定はD(デシマル)フラグ、U(アンパック)フラグによって行います。
  470.  
  471.   10進演算とアンパック演算が可能な演算命令
  472.  
  473.       ADD    ADC    SUB    SBC    NEG
  474.  
  475. いずれも8ビット演算命令で、命令セット一覧表等ではDフラグUフラグの部分に"★"を
  476. 付けて、10進演算、アンパック演算が可能であることを示しています。
  477.  
  478. ■10進演算
  479. Dフラグを'1'にセットして8ビット算術演算(ADD、ADC、SUB、SBC、NEG)命令を実行する
  480. と、2桁の10進演算が行われます。演算結果はBCD(2進化10進数)コードで得られます。
  481. 10進演算を行う場合は演算命令の実行前に"OR SC,#00010000B"命令等でDフラグを'1'に設
  482. 定します。また、演算数および被演算数はBCDコードを設定してから演算を実行してくだ
  483. さい。BCDコードになっていない場合は、正しい結果が得られません。
  484.  
  485. 10進演算時のSCフラグ
  486. 10進演算実行後、演算結果によってSCのN/V/C/Zフラグは下記のように設定されます。
  487.  
  488. N: 常時 リセット(0)
  489. V: 常時 リセット(0)
  490. C: 2桁の10進数に対して
  491.   桁上げまたは桁借りがあったとき セット(1)
  492.   桁上げまたは桁借りがないとき  リセット(0)
  493. Z: 演算結果=0のとき セット(1)
  494.   演算結果 0のとき リセット(0)
  495.  
  496.  
  497.  
  498. 例:"ADD A,B"命令による10進演算例
  499.  
  500.     設定値             結果            SC
  501.  
  502. A reg.    B reg.    A reg.(和)    N   V   C   Z
  503.  
  504.   55        28          83        0   0   0   0
  505.  
  506.   74        98          72        0   0   1   0
  507.  
  508.  
  509.   "SUB A,B"命令による10進演算例
  510.  
  511.     設定値             結果            SC
  512.  
  513. A reg.    B reg.    A reg.(差)    N   V   C   Z
  514.  
  515.   55        55          00        0   0   0   1
  516.  
  517.   55        28          27        0   0   0   0
  518.  
  519.   74        98          76        0   0   1  0
  520.  
  521.  
  522.  
  523. ■アンパック演算
  524. Uフラグを'1'にセットして8ビット算術演算(ADD、ADC、SUB、SBC、NEG)命令を実行すると
  525. 下記に示すアンパック形式での演算を行うことができます。
  526. アンパック演算は、上位4ビットのデータを無視し、下位4ビットのみを対象に演算を行い
  527. ます。実行後は下位4ビットのみの演算結果が出力され、上位4ビットは'0'が出力されま
  528. す。
  529. アンパック演算は、メモリ1アドレスに対して1桁のデータを格納するため、演算項の桁合
  530. わせが容易に行えます。(この場合の桁合わせはメモリアドレスのポインティングのみと
  531. なります。)
  532.  
  533. <ADD命令の例>
  534.  
  535.   MSB          2 2          LSB
  536.  
  537.     不定データ      被加数       レジスタ OR メモリ
  538.  
  539. +)  不定データ       加数        レジスタ OR メモリ
  540.  
  541.         0           結果(和)     レジスタ OR メモリ
  542.  
  543.  
  544. アンパック演算時のSCフラグ
  545. アンパック演算は下位4ビットデータのみを対象にしますので、SCフラグも下位4ビットの
  546. 演算結果によって変化します。
  547. アンパック演算実行後、演算結果によってSCのN/V/C/Zフラグは下記のように設定されま
  548. す。
  549.  
  550. N: 2ビットが'1'のとき         セット(1)
  551.    2ビットが'0'のとき         リセット(0)
  552.  
  553. V: 4ビットの補数表現(-8~7)
  554.    を越えたとき               セット(1)
  555.    以内のとき                 リセット(0)
  556.  
  557. C: 2ビットからの桁上げ、2ビットへの桁借りが
  558.    あったとき                 セット(1)
  559.    ないとき                   リセット(0)
  560.  
  561. Z: 下位4ビット=0のとき        セット(1)
  562.    下位4ビット 0のとき        リセット(0)
  563.  
  564.  
  565. 例:"ADD A、B"命令によるアンパック演算例
  566.  
  567.     設定値             結果            SC
  568.  
  569. A reg.    B reg.    A reg.(和)    N   V   C   Z
  570.  
  571.  20H       D0H         00H        0   0   0   1
  572.  
  573.  2EH       53H         01H        0   0   1   0
  574.  
  575.  C7H       52H         09H        1   1   0  0
  576.  
  577.  
  578. アンパック演算補助命令
  579. アンパック形式とパック形式(通常の8ビットデータ形式)を交互に変換する"PACK"、
  580. "UPCK"命令が用意されており、容易にフォーマット変換できます。
  581.  
  582. PACK命令: BAレジスタのアンパック形式データをパック形式に変換し、Aレジスタに格納
  583.           します。
  584.  
  585.                    B reg.   A reg.         A reg.
  586.                    *  m     *  n    →    m  n
  587.  
  588.  
  589. 例: PACKの実行例
  590.  
  591. 設定値     結果            SC
  592.  
  593. B reg.     A reg.      N   V   C   Z
  594.  
  595. 38C4H       84H            不変
  596.  
  597.  
  598. UPCK命令: Aレジスタの8ビットデータをアンパック形式に変換し、BAレジスタに格納
  599.           します。
  600.  
  601.                    B reg.   A reg.         A reg.
  602.                    *  m     *  n    →     m  n
  603.  
  604.  
  605. 例: UPCKの実行例
  606.  
  607. 設定値     結果            SC
  608.  
  609. A reg.     BA reg.      N   V   C   Z
  610.  
  611.  84H       0804H            不変
  612.  
  613.  
  614. 2.2.6 乗除算
  615. SMC88のMODEL1およびMODEL3は乗除算機能を持っています。MODEL0およびMODEL2ではこの
  616. 機能および以下に説明する乗除算命令は使用できません。
  617.  
  618. ■乗算
  619. 乗算はMLT命令によって行います。
  620. MLT命令を実行すると、Lレジスタ×Aレジスタの演算が行われ、積がHLレジスタに格納さ
  621. れます。この演算結果により、SCのN/V/C/Zフラグは次のように設定されます。
  622.  
  623. N: HLレジスタ(積)の最上位ビットが
  624.   '1'のとき         セット(1)
  625.   '0'のとき         リセット(0)
  626.  
  627. V: 常時             リセット(0)
  628.  
  629. C: 常時             リセット(0)
  630.  
  631. Z: HLレジスタ(積)が
  632.    0000Hのとき      セット(1)
  633.    0000H以外のとき  リセット(0)
  634.  
  635. 以下にMLT命令の実行例を示します。
  636.  
  637.     設定値             結果            SC
  638.  
  639. L reg.    A reg.    HL reg.(積)  N   V   C   Z
  640.  
  641.  00H       64H        0000H       0   0   0   1
  642.  
  643.  64H       58H        2260H       0   0   0   0
  644.  
  645.  C8H       58H        44C0H       0   0   0  0
  646.  
  647.  A5H       93H        5EBFH       0   0   0   0
  648.  
  649.  C8H       A5H        80E8H       1  0   0   0
  650.  
  651.  
  652. 乗算は上記の設定値を符合なし8ビットデータとして扱い、符合なしの演算を行いますの
  653. で、演算結果により設定ざれるNフラグは符合を表しません。したがって、上記例のC8H×
  654. A5Hのように負の数どうしの乗算を行った場合でも、Nフラグが'0'に設定されないことが
  655. あります。
  656.  
  657. ■除算
  658. 除算はDIV命令によって行います。
  659. DIV命令を実行すると、HLレジスタ÷Aレジスタの演算が行われ、商がLレジスタに、剰余
  660. がHレジスタに格納されます。
  661. 商が8ビットを越える場合はV(オーバーフロー)フラグがセットされ、HLレジスタの内容は
  662. 被除数が保持されます。
  663. Aレジスタに'0'を設定してDIV命令を実行した場合はゼロ除算例外処理が発生します。
  664. この演算結果により、SCのN/V/C/Zフラグは次のように設定されます。
  665.  
  666. N: Lレジスタ(商)の最上位ビットが
  667.    '1'のとき      セット(1)
  668.    '0'のとき      リセット(0)
  669.  
  670. V: 商が8ビット以内に
  671.    納まらなとき   セット(1)
  672.    納まるとき     リセット(0)
  673.  
  674. C: 常時           リセット(0)
  675.  
  676. Z: Lレジスタ(商)が
  677.    00Hのとき       セット(1)
  678.    00H以外のとき   リセット(0)
  679.  
  680.  
  681. SCの動作例
  682.  
  683.     設定値                SC               備考
  684.  
  685. HL reg.    A reg.    N   V   C   Z
  686.  
  687.  nz         nz               0
  688.  
  689. 0000H       nz       0   0   0   1
  690.  
  691.  nz        00H       1   1   0  0     ゼロ除算
  692.  
  693. 0000H      00H       1   1   0   0       例外処理発生
  694.  
  695.  
  696. nzは'0'以外の8ビットまたは16ビットデータを表します。
  697.  
  698. 除算実行例
  699.  
  700. 以下にDIV命令の実行例を示します。
  701.  
  702.     設定値                      結果                    SC
  703.  
  704. HL reg.    A reg.      L(商)   H(剰余)   A reg.    N   V   C   Z
  705.  
  706. 1A16H       64H        42H      4EH       64H      0   0   0   0
  707.  
  708. 332CH       64H        83H      00H       64H      1   0   0   0
  709.  
  710. 0000H       58H        00H      00H       58H      0   0   0   1
  711.  
  712. 0301H       02H        01H      03H       02H      1   1   0   0
  713.  
  714.  
  715. 上記例の0301H÷02Hは商が8ビットを越えるため、HLレジスタの値が保持され結果が出力
  716. されません。このような場合には、下記のように被除数を上位8ビット、下位8ビットに分
  717. 離して除算を行います。
  718.  
  719. <0301H÷02Hの実行例>
  720.  
  721.     LD    HL,#0003H      ;被除数=上位8ビット
  722.  
  723.     LD    A,#02H         ;除数
  724.  
  725.     DIV                  ;L=商,H=剰余
  726.  
  727.     LD    [hhll],L       ;商(上位8ビット)をメモリに格納
  728.  
  729.     LD    L,#01H         ;被除数=Hレジスタ+下位8ビット
  730.  
  731.     DIV                  ;
  732.  
  733.  
  734.     設定値                      結果                    SC
  735.  
  736. HL reg.    A reg.      L(商)   H(剰余)   A reg.    N   V   C   Z
  737.  
  738. 0003H       02H        01H      01H       02H      0   0   0   0
  739.  
  740. 0101H       02H        80H      01H       02H      1   0   0   0
  741.  
  742.                                                   剰余:01H
  743.  
  744.                                                   商  :0180H
  745.  
  746.  
  747. 2.3 プログラムメモリ
  748.  
  749. 2.3.1 プログラムメモリの構成
  750. SMC88のアドレス空間16Mバイトの中で前半の8Mバイト(アドレス000000H~FFFFFH)がプロ
  751. グラミング領域として使用できるようになっています。ただし、MODEL0とMODEL1について
  752. はアドレス空間が最大64Kバイトのため、プログラミング領域もそれ以内に制限されます。
  753.  
  754.  
  755.  
  756. 0000H    コモンエリア              バンク0        000000H
  757. 7FFFH    (32Kバイト)               (32Kバイト)    007FFFH
  758. 8000H    バンクエリア              バンク1        008000H
  759. FFFFH    (32Kバイト)               (32Kバイト)    00FFFFH
  760.                                    バンク2    010000H
  761.                                    (32Kバイト)  017FFFH
  762.                                    バンク3    018000H
  763.                                    (32Kバイト)  01FFFFH
  764.                                 :       :         020000H
  765.                                 :       :            :
  766.                                 :       :         7EFFFFH
  767.                                    バンク254   7F0000H
  768.                                    (32Kバイト)  7F7FFFH
  769.                                    バンク255   7F8000H
  770.                                    (32Kバイト)  7FFFFFH
  771.  
  772.  
  773.             図2.3.1.1 プログラムメモリの構成
  774.  
  775.  
  776.  
  777.  
  778. 8ビットCPUの論理空間64Kバイトを越えるメモリを管理するため、SMC88ではバンクマッピ
  779. ング方式を採用しています。最大8Mバイトのプログラムメモリはバンク0~バンク255まで、
  780. それぞれ32Kバイトのバンクに分割されます。
  781.  
  782. 64Kバイトの論理空間上には2つのバンクがアドレス0000H~FFFFHとして論理的に連続する
  783. ように配置され、そのアドレス空間内でプログラムを実行します。論理空間内のアドレッ
  784. シングはPC(プログラムカウンタ)が行います。
  785.  
  786. 論理空間内のアドレス0000H~7FFFHにはコモンバンクとしてバンク0(アドレス000000H~
  787. 007FFFH)が配置され、この物理アドレスは常時固定となります。アドレス000000H~
  788. OOOOFFHは例外処理(割り込み等)のベクタが割り付けられます。
  789.  ⇒"3.5.2 例外処理要因とベクタ"
  790.  
  791. コモンエリアが固定のため、各バンクに例外処理ベクタを割り付ける必要はありません。
  792. また、汎用的なサブルーチン等もコモンエリアに記述することができます。
  793.  
  794. 後半のアドレス8000H~FFFFHのバンクエリアにはCB(コードバンク)レジスタで選択される
  795. バンクが配置されます。この部分に配置されるバンクはプログラムで任意に選択できます。
  796. ただし、MODEL0とMODEL1についてはバンク1に固定、MODEL2とMODEL3のミニマムモードに
  797. ついては任意に選択された1つのバンクに固定されます。
  798.  
  799. 2.3.2 PC(プログラミングカウンタ)とCB(コードバンク)レジスタ
  800. PC(プログラムカウンタ)は実行するプログラムのアドレスを保持しています。PCの内容は
  801. 64Kバイトの論理空間内のアドレスで、物理アドレスが連続しない32Kずつのコモンエリア
  802. とバンクエリアを論理的に連続したプログラムメモリとしてアドレッシングしています。
  803. コモンエリアは物理アドレスのバンク0に固定されていますが、バンクエリアは256バンク
  804. の中から任意の1バンクを選択できるようになっています。
  805. (MODEL2とMODEL3)
  806. このバンクエリアに割り当てるバンクアドレス(0~255)を示すレジスタがCB(コードバン
  807. ク)です。
  808. 実際にメモリをアクセスするためにアドレスバスに出力される物理アドレスはCPU内部で
  809. 図2.3.2.1のように生成されます。
  810.  
  811.      コモンエリアのアクセス(0000H~7FFFH)
  812.  
  813.                     ←----論理アドレス----→
  814. 7              0    15                             0
  815.        00H       ← 0           PC(15)
  816.  
  817.  
  818.  
  819.  23 22             15 14                           0
  820.   0        00H                  PC(15)
  821.   ←--------物理アドレス---------→
  822.  
  823.  
  824.      バンクエリアのアクセス(8000H~FFFFH)
  825.  
  826.                     ←----論理アドレス----→
  827. 7              0    15                             0
  828.        CB(8)     ← 0           PC(15)
  829.  
  830.  
  831.  
  832.  23 22             15 14                           0
  833.   0        CB(8)                PC(15)
  834.   ←--------物理アドレス---------→
  835.  
  836.  
  837.             図2.3.2.1 論理アドレスと物理アドレス(MODEL2/3)
  838.  
  839. 図に示すとおり、16ビットのPCの中でアドレスバスに出力されるのは最上位ビットを除く
  840. 15ビットです。その内容はアドレスバスのA00~A14に出力されます。PCの最上位ビットは
  841. '0'でコモンエリア、'1'でバンクエリアを示しており、この内容によってCBをアドレスバ
  842. スに出力するかどうかを決定します。コモンエリアの場合はアドレスバスのA15~A22に00
  843. Hが出力され、バンクエリアの場合のA23はデータメモリ領域専用で、最大8Mバイトのプロ
  844. グラムアクセス時には常時'0'を出力します。以上のようにPCの最上位ビットはアドレス
  845. バスに出力されませんので、システム開発時には注意して下さい。
  846.  
  847. MODEL0とMODEL1についてはアドレスバスが16ビットのため、PCの内容がそのまま出力され
  848. ます。
  849.  
  850.  "LD BA,PC"命令、"LD HL,PC"命令のPC値
  851.  "LD BA,PC"命令、"LD HL,PC"命令はPC値をBAレジスタおよびHLレジスタに読み込む命令
  852.  です。読み込むPC値を"PC"、本命令のおかれている先頭アドレスを"PC'"とすると、
  853.              PC←PC'+2
  854. で示されるPC値がBA及びHLレジスタに読み込まれます。たとえば、"LD BA,PC"命令が100H
  855. 番地に置かれているとすると、BAレジスタには102Hが読み込まれます。
  856.  
  857. 2.3.3 バンク管理
  858. プログラムの実行は基本的に論理空間に割り当てられたバンク内に限られています。バン
  859. クが変更されるのは、プログラムによって分岐命令が実行される時点で他のバンクが指定
  860. されている場合です。
  861.  
  862. 注!   プログラムの実行によりPCのカウントがオーバーフローした場合でもCBは更新
  863.      されません。再びコモンエリアの先頭からの実行となります。
  864.  
  865. 以下にバンク指定の方法と、分岐命令実行時の動作について説明します。
  866. なお、バンク変更にかかわる記載事項はMODEL2およびMODEL3にのみ摘要されます。
  867.  
  868. ■リセット時のバンク設定
  869. イニシャルリセット時にCBは'1'に初期化され、バンクエリアにはバンク1が割り当てられ
  870. ます。
  871. コモンエリアはバンク0に固定されますので、論理アドレスは物理アドレスと同様になり
  872. ます。
  873. この設定は別のバンクがプログラムで指定され、分岐命令によって実際に分岐が行われる
  874. まで変更されません。
  875.  
  876. ■バンクの指定
  877. 選択されているバンクを示すCBはプログラムによって直接変更することはできません。
  878. バンク指定用にはNB(ニューコードバンク)レジスタが用意されており、分岐命令実行直前
  879. に分岐先のアドレス(0~255)を以下の命令によって書き込んでおきます。
  880.  LD NB,A  (Aレジスタによる指定)
  881.  LD NB,#bb(8ビット即値データによる指定)
  882. NBの内容はその直後の分岐命令の実行により実際に分岐が行われる時点でCBにロードされ
  883. 新たなバンクがバンクエリアに選択されます。条件ジャンプなどにおいて条件が合わずに
  884. 分岐が行われない場合は、CBの内容が逆にNBにロードされます。したがって、NBに値を設
  885. 定せずに分岐命令を実行した場合はその時点の論理空間内に分岐するようになっています。
  886.  
  887.  
  888.                      NB               CB                     PC
  889.  
  890.                 現在のバンク   現在のバンク              xxxxH
  891.  
  892. 分岐先バンク  分岐先バンク   現在のバンク       yyyyH
  893.    を指定
  894.  
  895.  分岐の発生
  896.  
  897.                 分岐先バンク   分岐先バンク       zzzzH
  898.  
  899.  
  900.                        図2.3.3.1 バンクの変更
  901.  
  902.  
  903. 2.3.4 分岐命令
  904. 分岐命令はPCとCBを変更してプログラムを任意のアドレスに分岐させます。
  905. 分岐命令の種類は動作の違いにより、以下のように分類されます。
  906.  
  907.  
  908.                 表2.3.3.1 バンクの変更
  909.  
  910.   種類         条件          命令
  911.  
  912. PC相対ジャンプ        条件/無条件   JRS、JRL、DJR
  913.  
  914. 間接ジャンプ              無条件         JP
  915.  
  916. PC相対コール            条件/無条件      CARS、CARL
  917.  
  918. 間接コール                無条件         CALL
  919.  
  920. リターン                  無条件         RET、RETS、RETE
  921.  
  922. ソフトウェア割り込み      無条件         INT
  923.  
  924.  
  925. 上記の分岐命令それぞれの中にも無条件に分岐する無条件分岐命令とフラグの状態によっ
  926. て分岐する数種類の条件分岐命令があります。
  927. 条件分岐命令の条件が満たされていない場合は、分岐が行われずにその分岐命令の次の命
  928. 令を実行します。
  929.  ⇒"4.4 命令の詳細説明"
  930.  
  931. ■PC相対ジャンプ命令(JRS、JRL、DJR)
  932. PC相対ジャンプはPCにオペランドで指定された相対アドレスを加え、そのアドレスに分岐
  933. させる命令で、リロケーターブルなプログラミングを可能にしています。
  934. 相対アドレスは分岐実行時のアドレスから分岐先アドレスまでのディスプレースメントで
  935. 1または2バイトで指定します。
  936. 指定できる相対アドレスは"JRS"命令、"DJR"命令が8ビット補数表現の-128~127、"JRL"
  937. 命令が16ビット補数表現の-32768~32767の範囲です。
  938. なお、この相対アドレスはPCに加算されるため分岐先のアドレスは論理アドレスとなりま
  939. す。直前のNBの設定によって他のバンクにも指定できますが、分岐先はあくまでも論理空
  940. 間内で物理的な相対アドレスの指定はできません。
  941. 図2.3.4.1にPC相対ジャンプの動作を示します。
  942. "JRS"命令は無条件ジャンプと20種類の条件ジャンプが設定されています。
  943. "JRL"命令は無条件ジャンプと4種類の条件ジャンプが設定されています。
  944.  
  945.                                  バンク1
  946. 物理アドレス  論理アドレス    :       NB   CB   PC
  947.  
  948.  00A06DH          A06DH       LD  NB,#2    01H    01H    A06DH
  949.  
  950.  00A070H          A070H         JRL  S+57H    02H    01H    A070H
  951.  
  952.  00A073H          A073H             :
  953.  
  954.                                  バンク2
  955.  
  956.  0120C7H          A0C7H       LD  A,B      02H    02H    A070H+57H=A0C7H
  957.  
  958.          図2.3.4.1  PC相対ジャンプの動作(MODEL2/3の例)
  959.  
  960. "DJR NZ,rr"命令はBレジスタの'1'減算を行い、その結果が'0'以外の場合に"JRS"の無条
  961. 件ジャンプ命令を実行します。この命令によって、Bレジスタをカウンタとしたその初期
  962. 値分の繰り返しルーチンが簡単に記述できます。
  963. 例:50cycle時間のウェイトルーチン
  964. LD B,#12  ;初期値をBレジスタにセット(2cycle)
  965. DJR NZ,S  ;Bレジスタが0になるまで繰り返す。(48cycle)
  966.  
  967. ■間接ジャンプ命令(JP)
  968. 間接ジャンプは分岐先のアドレスを間接的に指定する命令です。
  969. "JP [kk]"命令はアドレス00kk(kk=00H~FFH、ページは'0'固定)のメモリの内容をPCの下
  970. 位8ビットに、アドレス00kk+1のメモリの内容をPCの上位8ビットにそれぞれロードして、
  971. そのアドレスに無条件に分岐します。ここで使用するアドレス00kkは例外処理やソフトウ
  972. ェア割り込みのベクタ領域となっています。
  973. "JP HL"命令はHLレジスタの内容をアドレスとして無条件に分岐します。この命令は演算
  974. 結果等をそのまま分岐先アドレスにすることができるため、ジャンプテーブルの作成など
  975. に有効です。
  976.  
  977. ■PC相対コール命令(CARS、CARL)
  978. PC相対コールはPCにオペランドで指定された相対アドレスを加え、そのアドレスからのサ
  979. ブルーチンをコールする命令です。
  980. 相対アドレスは分岐実行時のアドレスから分岐先アドレスまでのディスプレースメントで
  981. 1または2バイトで指定します。
  982. 指定できる相対アドレスは"CARS"命令が8ビット補数表現の-128~127、"CARL"命令が16ビ
  983. ット補数表現の-32768~32767の範囲です。
  984. なお、この相対アドレスはPCに加算されるため分岐先のアドレスは論理アドレスとなりま
  985. す。直前のNBの設定によって他のバンクにも分岐できますが、分岐先はあくまでも論理空
  986. 間内で物理的な相対アドレスの指定はできません。
  987. サブルーチンコール実行時にはリターン情報としてPC値(コール命令の次の命令の先頭ア
  988. ドレス)がスタックに退避されます。
  989. MODEL2/3のマキシマムモードではPC値以外にCB値もスタックに退避され、リターン時には
  990. コール元のバンクに戻るようになっています。
  991. MODEL2/3のミニマムモードではMODEL0/1と同様、PC値のみのスタックとなるため、64Kバ
  992. イト以上のプログラムメモリを使用することはできません。
  993. 図2.3.4.2.にPC相対コールの動作を示します。
  994. "CARS"命令は無条件コールと20種類の条件コール命令が設定されています。
  995. "CARL"命令は無条件コールと4種類の条件コール命令が設定されています。
  996.  
  997. ■間接コール命令(CALL)
  998. 間接コールはサブルーチンのアドレスを間接的に指定するコール命令です。
  999. "CALL [hhll]"命令はアドレスhhll(hhll=0000h~FFFFH、ページはEPレジスタによって指
  1000. 定)のメモリの内容をPCの下位8ビットに、アドレスhhll+1のメモリの内容をPCの上位8ビ
  1001. ットにそれぞれロードして、そのアドレスのサブルーチンを無条件にコールします。
  1002. サブルーチンコール実行時にはPC相対コールと同様、リターン情報としてPC値(コール命
  1003. 令の次の命令の先頭アドレス)とCB値(MODEL2/3マキシマムモードの場合)がスタックに退
  1004. 避されます。
  1005.  
  1006. ■リターン命令(RET、RETS、RETE)
  1007. リターン命令はコール命令によって呼び出されたサブルーチンからのコール元のルーチン
  1008. に戻るための命令です。
  1009. リターン命令はサブルーチンコール実行時にスタックに退避されているPC値(コール命令
  1010. の次の命令の先頭アドレス)を元に戻します。MODEL2/3のマキシマムモードではCB値の復
  1011. 帰も行われ、コールしたバンクに戻ります。
  1012. MODEL2/3のミニマムモードではMODEL0/1と同様、PC値のみ復帰します。
  1013.  
  1014.  
  1015.                                  バンク1
  1016. 物理アドレス  論理アドレス    :       NB   CB        PC
  1017.  
  1018.  00A06DH          A06DH       LD  NB,#2    01H    01H         A06DH
  1019.  
  1020.  00A070H          A070H         JRL  S+57H    02H    01H         A070H
  1021.                                                         スタック
  1022.  00A073H          A073H             :                     73H
  1023.                                                           A0H
  1024.                                  バンク2                  01H
  1025.  
  1026.  0120C7H          A0C7H       LD  A,B      02H    02H        A070H+57H=A0C7H
  1027.  
  1028.    :                :               :
  1029.  
  1030.  012110H          A110H         RET           02H    02H         A110H
  1031.  
  1032.                                  バンク1                スタック
  1033.                                                           73H
  1034.                                     :                     A0H
  1035.                                                           01H
  1036.  00A06DH          A06DH       LD  NB,#2
  1037.  
  1038.  00A070H          A070H         JRL  S+57H
  1039.  
  1040.  00A073H          A073H             :         01H    01H         A073H
  1041.  
  1042.  
  1043.    図2.3.4.2 PC相対コールの動作(MODEL2/3マキシマムモードの例)
  1044.  
  1045.  
  1046. ミニマムモードでコール命令の実行時、または実行後にバンクの変更を行っている場合は
  1047. リターン命令を実行しても正常なアドレスへ戻ることはできません。
  1048. "RET"命令はリターン情報そのままに、コール命令の次の命令の先頭アドレスに処理を戻
  1049. します。
  1050. "RETS"命令はリターン情報のPC値に'2'を加えてリターンしますので、コール命令の次の2
  1051. バイト命令をスキップすることができます。
  1052.  
  1053.  
  1054.               メインルーチン          サブルーチン
  1055.  
  1056.                   :                      :
  1057.  
  1058. 論理アドレス      :                   ADD A.,B
  1059.  
  1060.       1000H    CARS rr                   :
  1061.  
  1062.       1002H    JRS  rr                JRS NC,S+3
  1063.  
  1064.       1004H    LD   B,H               RET             1002Hへ
  1065.                                                          リターン
  1066.                  :                     RETS            1004Hへ
  1067.                                                          リターン
  1068.  
  1069.                   図2.3.4.3 サブルーチンからのリターン
  1070.  
  1071. "RETE"命令はソフトウェア割り込みルーチンや例外処理ルーチン専用のリターン命令で、
  1072. リターン情報にSC(システムコンディションフラグ)の内容が含まれていることが"RET"命
  1073. 令との違いです。
  1074.  ⇒"3.5 例外処理状態"
  1075.  
  1076. ■ソフトウェア割り込み命令(INT)
  1077. ソフトウェア割り込み"INT [kk]"はアドレス00kkを想定して、その割り込みルーチンを
  1078. 実行させる命令です。間接コール命令の一種ですが、分岐前に(SC)システムコンディショ
  1079. ンフラグ)もスタックに退避されます。したがって、この命令により実行される割り込み
  1080. ルーチンは必ず"RETE"命令でリターンする必要があります。
  1081.  ⇒"3.5 例外処理状態"
  1082.  
  1083.  
  1084. 相対分岐命令のPC値
  1085.  
  1086. JRS命令、CARS命令、DJR命令
  1087. JRS命令、CARS命令、DJR命令は符合付8ビットPC相対ジャンプ命令で、PC値に相対値rr(
  1088. -128~127)を符合付きで加算し分岐先を決定します。
  1089. 分岐先アドレスを"PC"、本命令の置かれている先頭アドレスを"PC'"とすると、
  1090.  
  1091.                 PC←PC'+rr+(n-1)
  1092.  
  1093. となります。
  1094. ここでnは命令のバイト数を示します。
  1095. たとえば、"JRS LE,rr"命令が100H番地に置かれているとすると分岐先アドレスは102H+rr
  1096. 番地となります。
  1097.  
  1098. JRL命令、CARL命令
  1099. JRL命令、CARL命令は符合付き16ビットPC相対ジャンプ命令で、PC値に相対値qqrr(-32768
  1100. ~32767)を符合付きで加算し分岐先を決定します。分岐先アドレスを"PC",本命令の置か
  1101. れている先頭アドレスを"PC'"とすると、
  1102.  
  1103.                          PC←PC'+qqrr+2
  1104.  
  1105. となります。
  1106. たとえば、"JRL C,qqrr"命令が100H番地に置かれているとすると分岐先アドレスは102H+
  1107. qqrr番地となります。
  1108.  
  1109. 2.4 データメモリ
  1110.  
  1111. 2.4.1 データメモリの構成
  1112. SMC88のアドレス空間は(最大16Mバイト)の中でプログラムメモリとして使用する領域を除
  1113. くすべてをデータメモリとして使用することができます。
  1114. データメモリ領域にはRAMや表示メモリ、周辺回路を制御するI/Oメモリなどが配置されま
  1115. す。
  1116. データメモリは64Kバイトを1つのページとして管理します。
  1117. 図2.4.1.1にデータメモリの構成を示します。
  1118. MODEL0/1においてはアドレス空間が64Kバイトのため、ページによる管理をする必要があ
  1119. りません。MODEL2/3は最大で256ページの構成となります。
  1120.  
  1121. 2.4.2 ページレジスタEP、XP、YP
  1122. データメモリの物理空間は64Kバイトのページに論理的に区切られています。したがって、
  1123. 物理アドレスの上位8ビットがページ部、下位16ビットが論理アドレスとして管理されま
  1124. す。ページ内のアドレス指定はアドレッシングモードにしたがってインデックスレジスタ、
  1125. 即値データ等によって行います。MODEL2とMODEL3にはページ部の指定用として3組のペー
  1126. ジレジスタEP、XP、YPが設定されており、アドレッシングモードの指定にしたがって使い
  1127. 分けられます。図2.4.2.1にアドレッシングモードとレジスタの対応を示します。
  1128.  ⇒"4.1 アドレッシングモード"
  1129.  
  1130.           MODEL0/1      MODEL2/3
  1131.  
  1132. 0000H                                 000000H
  1133.            ページ0       ページ0
  1134.           (64Kバイト)   (64Kバイト)
  1135. FFFFH                                 00FFFFH
  1136.                                       010000H
  1137.                          ページ1
  1138.                         (64Kバイト)
  1139.                                       01FFFFH
  1140.                                       020000H
  1141.                          ページ2
  1142.                         (64Kバイト)
  1143.                                       02FFFFH
  1144.                              :
  1145.                              :
  1146.                                       FE0000H
  1147.                          ページ254
  1148.                         (64Kバイト)
  1149.                                       FEFFFFH
  1150.                                       FF0000H
  1151.                          ページ255
  1152.                         (64Kバイト)
  1153.                                       FFFFFFH
  1154.  
  1155.                   図2.4.1.1 データメモリの構成
  1156.  
  1157.  
  1158.  
  1159.    ページ指定        アドレス指定
  1160.  
  1161.  
  1162.                                                  アドレッシングモード
  1163.   7  XP  0 15        IX        0
  1164.  
  1165.   7  YP  0 15        IY        0       レジスタ間接
  1166.  
  1167.   7  EP  0 15        HL        0
  1168.  
  1169.   7  EP  0 15     <即値データ>      0       16ビット絶対
  1170.  
  1171.   7  EP  0  7  BR  0  7<即値データ>0      8ビット絶対
  1172.  
  1173. 物理アドレス                     物理アドレス
  1174.     A16~A23                     A0~A15
  1175.                 ページ
  1176.                    0
  1177.  
  1178.                       255
  1179.  
  1180.                    図2.4.2.1 データメモリのアドレッシング
  1181.  
  1182.  
  1183. 2.4.3 スタック
  1184. スタックはLIFO(Last In, First Out)形式でアクセスされるメモリで、SMC88ではデータ
  1185. メモリのRAM領域に割り当てられます。
  1186. スタックはサブルーチンコールや例外処理(割り込み)などが発生した場合にCPUのレジス
  1187. タ情報を退避するのに使用されます。またプログラムの任意の場所でレジスタの退避等を
  1188. 行うことができます。
  1189. 以下、スタックにデータを記憶させることを"プッシュ"、記憶したデータを取り出すこと
  1190. を"ポップ"と記述します。
  1191.  
  1192. ■スタックポインタSP
  1193. データはスタックの最上位アドレスから順番にプッシュされ、逆にデータを取り出すとき
  1194. には最後にプッシュされたデータから順にポップされます。このプッシュとポップを行う
  1195. スタックのアドレスを示すレジスタがSP(スタックポインタ)です。
  1196. SPは1バイトデータのプッシュにより'1'減算(プリデクリメント)され、1バイトデータの
  1197. ポップにより'1'加算(ポストインクリメント)されます。
  1198.  
  1199.                                1 初期状態
  1200.                                    SP
  1201. アドレス   スタック   ←  0000H
  1202.  FFFFH                             |
  1203.  FFFEH                             |
  1204.  FFFDH                         2 "データ1"をプッシュ
  1205.    :                               |
  1206.                                    ↓
  1207. アドレス                           SP
  1208.  FFFFH        データ1       ←    FFFFH  (SP=SP-1)
  1209.  FFFEH                             |
  1210.  FFFDH                             ↓
  1211.    :                           3 "データ2"をプッシュ
  1212.                                    |
  1213. アドレス                           ↓
  1214.  FFFFH        データ1              SP
  1215.  FFFEH        データ2       ←    FFFFH  (SP=SP-1)
  1216.  FFFDH                             |
  1217.    :                           4 データをポップ
  1218.                                   ↓
  1219. アドレス                        SP
  1220.  FFFFH         データ1      ←    FFFFH  (SP=SP+1)
  1221.  FFFEH         データ2
  1222.  FFFDH                           データ2
  1223.    :
  1224.  
  1225.                図2.4.3.1 スタックの動作
  1226.  
  1227. 物理メモリ内でのスタックの位置は周辺回路からコアCPUに入力されるSPP0~SPP7(スタッ
  1228. クポインタページ)信号によってページアドレスが決定され、スタックアクセス時には
  1229. SPP0~SPP7の内容がそのままアドレスバスのページ部(A16~A23)に出力されます。そのペ
  1230. ージ内のアドレスはSPによって指定されます。一般的にはSPの初期値としてアドレス0000
  1231. Hを設定することにより、そのページの最終アドレスFFFFHから下位のアドレスに向かって
  1232. データが順にプッシュされます。
  1233.  
  1234. 注!   SP(スタックポインタ)はイニシャルリセット時は不定ですので、スタックが使
  1235.      用される前に必ずプログラム("LD SP,  命令)で初期化を行って下さい。
  1236.  
  1237. ■サブルーチンコールとスタック
  1238. コール命令を実行すると、サブルーチンに分岐する前にリターンアドレスとしてコール命
  1239. 令の次の命令先頭アドレスとCB(MODEL2/3のマキシマムモードの場合)がスタックにプッシ
  1240. ュされます。
  1241. スタックにプッシュされたリターン情報はリターン命令実行によりポップされ、PCとCBに
  1242. 再設定されます。
  1243. サブルーチンの中からさらに別のサブルーチンをコールするようなネスティングはスタッ
  1244. クが割り当てられたページの使用可能なメモリの範囲内で何レベルまででも可能です。
  1245.  
  1246.      スタック   ←   SP
  1247.                                 |
  1248.                           サブルーチンコール
  1249.                           実行時にCBとPCが
  1250.                           プッシュされます。
  1251.             CB                  |
  1252.            PC(H)                ↓
  1253.            PC(L)        ←    SP=SP-3
  1254.  
  1255.  
  1256.             図2.4.3.2 サブルーチンコール実行時のスタック消費
  1257.  
  1258. MODEL2/3のマキシマムモード、サブルーチンコールによりスタックを3バイト(CB、PC)消
  1259. 費します。MODEL0/1およびMODEL2/3のミニマムモードではCBを除くPCの2バイト分を消費
  1260. します。
  1261.  
  1262. ■例外処理とスタック
  1263. 例外処理(割り込み等)発生時もサブルーチンコールと同様にリターン情報がスタックにプ
  1264. ッシュされます。このときのリターン情報にはリターンアドレスPCとCB(MODEL2/3)のマキ
  1265. シマムモード)のほかにSCも含まれます.
  1266.  
  1267.           スタック   ←   SP
  1268.                                 |
  1269.                           例外処理発生時に
  1270.                           CB、PC、SCが
  1271.                           プッシュされます。
  1272.             CB                  |
  1273.            PC(H)                |
  1274.            PC(L)                ↓
  1275.             SC          ←    SP=SP-4
  1276.  
  1277.             図2.4.3.3 例外処理発生時のスタック消費
  1278.  
  1279. MODEL2/3のマキシマムモードでは、例外処理の発生によりスタックを4バイト(CB、PC、
  1280. SC)消費します。MODEL0/1およびMODEL2/3のミニマムモードではCBをのぞくPCとSCの3バイ
  1281. ト分を消費します。
  1282.  
  1283. ■その他のスタック操作
  1284. サブルーチンコールや例外処理(割り込み等)でのリターン情報のプッシュは自動的に行わ
  1285. れますが、汎用レジスタのプッシュは行われません。サブルーチンや例外処理ルーチンか
  1286. ら汎用レジスタの内容をプッシュ/ポップする命令を配置する必要があります。
  1287. レジスタのプッシュ/ポップは"PUSH"命令と"POP"命令によって行えます。この命令によっ
  1288. てプッシュ/ポップできるレジスタは以下のとおりです。
  1289.  
  1290.  A、B、L、H、BR、SC、EP、IP(XPとYP)※、BA、HL、IX、IY
  1291.                          ※はMODEL0/1にはありません
  1292.  
  1293. また、上記のSCを除くすべてのレジスタを1命令でプッシュする"PUSH ALL"、"PUSH ALE"
  1294. 命令と、1命令でポップする"POP ALL"、"POP ALE"命令も用意されています。
  1295.  
  1296.  PUSH ALL = PUSH BA   POP ALL = POP BR
  1297.             PUSH HL             POP IY
  1298.             PUSH IX             POP IX
  1299.             PUSH IY             POP HL
  1300.             PUSH BR             POP BA
  1301.  
  1302.  PUSH ALE = PUSH BA   POP ALE = POP IP
  1303.             PUSH HL             POP EP
  1304.             PUSH IX             POP BR
  1305.             PUSH IY             POP IY
  1306.             PUSH BR             POP IX
  1307.             PUSH EP             POP HL
  1308.             PUSH IP             POP BA
  1309.  
  1310. オペランドの"ALL"はMODEL0/1用で、"ALE"はMODEL2/3で拡張されているレジスタEPとIP(
  1311. XPとYP)のプッシュ/ポップも行います。
  1312.  
  1313. 構造化プログラミングにおいてはサブルーチンに渡す引数などをスタック領域にストアす
  1314. るといったことがよく行われますが、上記の"PUSH"命令や"POP"命令を使用せずにSPを操
  1315. 作したりスタック領域の直接アクセスが容易に行われる命令等も用意されています。
  1316.  
  1317.  
  1318.      ADD、SUB、CP、INC、DEC、LD
  1319.  
  1320.  ⇒"4.4 命令の詳細説明2
  1321.  
  1322. 注!    スタックは汎用RAM領域に割り当てられますので、データ領域とスタック領域
  1323.       が重ならないよう注意してください。
  1324.  
  1325. 2.4.4 メモリマップドI/O
  1326. SMC88 FamilyはSMC88をコアCPUとして,その周辺に入出力ポート等、各種の回路を内蔵し
  1327. ます。SMC88では、それらの周辺回路の制御にメモリマップドI/O方式を採用しており、周
  1328. 辺回路の制御ビットやデータをやり取りするためのレジスタがデータメモリ領域に配置さ
  1329. れます。
  1330. このメモリ領域を汎用RAMと区別するためにI/Oメモリと呼びますが、ページの管理やアク
  1331. セスの方法はデータメモリと共通ですので、通常のメモリアクセスの命令を使って周辺回
  1332. 路を制御することができます。
  1333.  
  1334.         データレジスタ
  1335.  
  1336.                             入出力
  1337. I/Oメモリ                   データ
  1338.  
  1339.            D7         D0
  1340.                                          周辺回路
  1341.                         制御ビット
  1342.  
  1343.                   ステータスビット
  1344.  
  1345.               コントロール/ステータスレジスタ
  1346.  
  1347.        図2.4.1.1 周辺回路とメモリマップドI/O
  1348.  
  1349.  
  1350. 3 CPUの動作と処理状態
  1351.  
  1352. CPUはシステムクロックに同期して動作します.
  1353. また、CPUの処理にはプログラムをシーケンシャルに実行している状態やスタンバイ状態
  1354. 等各種の状態があります。
  1355. ここでは割り込みなども含む各種の処理状態ついて説明します。
  1356.  
  1357.  
  1358. 3.1 タイミングジェネレータとバス制御
  1359. はじめに、CPU動作の基本となるクロックとバスの制御について説明します。
  1360.  
  1361. 3.1.1 バスサイクル
  1362. SMC88のタイミングジェネレータは入力されたクロックCLKから2相分周した信号PK、PLを
  1363. 作りCLKをステートに分解します。1ステートはCLKの1/2サイクルとなり、命令実行の単位
  1364. となる1バスサイクルは4ステートの構成となります。
  1365.  
  1366. 命令セット一覧表などでサイクルとして示された数値はこのバスサイクル数を表していま
  1367. す。
  1368.  
  1369. ■ハイインピーダンス
  1370. 内部レジスタアクセス時にはデータバスがハイインピーダンスとなります。また、読み出
  1371. し信号RDと書き込み信号WRが共にHIGHレベルに固定され、アドレスバスはバスサイクルの
  1372. 期間中ダミーアドレスを出力します。
  1373.  
  1374. ■割り込みベクタアドレスリード
  1375. 割り込みベクタアドレスはT2~T3ステートの間にデータバスから読み込まれます。
  1376. このリードに際しては読みだし信号RDが出力されず、割り込みベクタアドレス専用のリー
  1377. ド信号RDIVが出力されます。アドレスバスはバスサイクルの期間中ダミーアドレスを出力
  1378. します。
  1379.  
  1380.  
  1381. ■メモリライト
  1382. メモリライト時はT2~T4ステートの間データバスに書き込みデータが出力され、T3ステー
  1383. トにおいて書き込み信号WRが出力されます。アドレスバスはバスサイクルの期間中対象ア
  1384. ドレスを出力します。
  1385.  
  1386. ■メモリリード
  1387. メモリリード時はT2~T3ステートの間読みだし信号RDが出力され、データバス上のデータ
  1388. を読み込みます。アドレスバスはバスサイクルの期間中対象アドレスを出力します。
  1389.  
  1390. 3.1.2 ウェイトステート
  1391. SMC88はバスラインに接続された低速デバイスのアクセスを確実に行うために、ウェイト
  1392. ステートを挿入してバスサイクルを伸ばすことができます。
  1393. SMC88ではウェイトを挿入する機能を持っており、WAIT端子の入力信号によってその制御
  1394. を行います。
  1395.  
  1396. なお、ウェイトステートはメモリ空間内に接続されたデバイスをアクセスする時のみ挿入
  1397. され、内部レジスタをアクセスするときには挿入されません。
  1398.  
  1399. 3.2 処理状態の概要
  1400. SMC88の動作をその処理の内容により分類するとリセット状態、プログラム実行状態、例
  1401. 外処理状態、例外処理状態、バス権解放状態、スタンバイ状態の5種類になります。
  1402. 表3.2.1に処理状態の分類を示します。
  1403.  
  1404.  
  1405.                            表3.2.1 処理状態の分類
  1406.  
  1407.    処理状態                        概   要
  1408.  
  1409. リセット状態          CPUがリセットされ、停止している状態
  1410.  
  1411. プログラム実行状態    CPUがプログラムを順次実行している状態
  1412.  
  1413. 例外処理状態          リセット、割り込み等の例外処理要因によって起動される例
  1414.              外処理(ベクタアドレスのフェッチ、PCとSCの退避、PCに対
  1415.              する分岐アドレスの設定)を実行している過渡的な状態
  1416.  
  1417. バス解放状態       外部からのバス権要求信号により外部バスを解放している状
  1418.              態
  1419.  
  1420. スタンバイ状態  HALT  CPUを停止し、消費電力を低減させている状態
  1421.  
  1422.                   SLEEP  CPUおよび周辺回路を停止し、消費電力を低減させている状
  1423.                       態
  1424.  
  1425.  
  1426. 3.3 リセット状態
  1427. リセット状態とは、SMC88がリセットされ停止している状態を示します。SR端子にLOWレベ
  1428. ルを入力することによりSMC88がリセットされます。リセットはCLKと非同期に行われます
  1429. ので、すべての処理状態から即時リセット状態に移行します。リセットにより一部の内部
  1430. レジスタが初期化されます。表3.3.1にレジスタの初期設定値を示します。
  1431.  
  1432. 図3.3.1にリセット状態とリセット解除後のシーケンスを示します。
  1433. SR端子がLOWレベルのリセット期間中はアドレスバス、データバス、リード/ライト信号が
  1434. ハイインピーダンスになります。ただし、アドレスバスとリード/ライト信号はCPU内部で
  1435. プルアップされるため、HIGHレベルが出力されます。
  1436. SR端子がHIGHレベルになるとリセットが解除され、CLKが立ち下がりエッジが2回入力され
  1437. た時点で最初のバスサイクルを開始します。このバスサイクルではアドレスバスにダミー
  1438. アドレスが出力され、次のバスサイクルで割り込みアクノリッジIACKがイネーブルになり
  1439. ます。
  1440. これにより、ベクタテーブルに格納されているスタートアドレスを、不定の状態にあるPC
  1441. (プログラムカウンタ)にロードするリセットの例外処理を開始します。また、このときに
  1442. NB(ニューコードバンクレジスタ)の初期値01HをCB(コードバンクレジスタ)にロードする
  1443. 処理も同時に行います。このため、リセット後のバンクエリアにはバンク1(008000H~00
  1444. FFFFH)が選択されます。
  1445.  
  1446. 以上の処理により、イニシャルリセット後は000000H~000001Hのメモリに格納されたスタ
  1447. ートアドレスからプログラムの実行を開始します。
  1448.  
  1449.                 表3.3.1 内部レジスタの初期設定値
  1450.  
  1451.          レジスタ名称            記号     ビット長     初期値
  1452.  
  1453. データレジスタA                   A         8         不定
  1454. データレジスタB                   B          8          不定
  1455. インデックス(データ)レジスタL     L          8          不定
  1456. インデックス(データ)レジスタH     H          8          不定
  1457. インデックスレジスタIX            IX         16         不定
  1458. インデックスレジスタIY            IY         16         不定
  1459. プログラムカウンタ                PC         16         不定
  1460. スタックポインタ                  SP         16         不定
  1461. ベースレジスタ                    BR         8          不定
  1462. ゼロフラグ                        Z          1           0
  1463. キャリーフラグ                    C          1           0
  1464. オーバーフローフラグ              V          1           0
  1465. ネガティブフラグ                  N          1           0
  1466. デシマルフラグ                    D          1           0
  1467. アンパックフラグ                  U          1           0
  1468. インタラプトフラグ0               I0         1           1
  1469. インタラプトフラグ1               I1         1           1
  1470. ニューコードバンクレジスタ        NB         8          01H
  1471. コードバンクレジスタ              CB         8          不定
  1472. エクスパンドページレジスタ        EP         8          00H
  1473. IX用エクスパンドページレジスタ  XP         8          00H
  1474. IY用エクスパンドページレジスタ    YP         8          00H
  1475.  
  1476.  *リセット例外処理によって、0バンクのメモリの先頭(000000H~000001H)に格納されて
  1477.   いる値がPCにロードされます。また、この時同時にNBの初期値01HがCBにロードされま
  1478.   す。
  1479.  
  1480. レジスタNB、CB、EP、XPおよびYPはMODEL2/3にのみ設定されており、MODEL0/1にはありま
  1481. せん。
  1482.  
  1483. 注!   リセットで初期化されないレジスタは、必要に応じてプログラムで初期化を行
  1484.      う必要があります。
  1485.  
  1486.  
  1487. 3.4 プログラム実行状態
  1488. プログラム実行状態とは、SMC88がプログラムを順次実行している状態を示します。
  1489. SMC88では、命令の第1オペコードのフェッチが直前の命令の最終サイクルに重複して行わ
  1490. れます。
  1491. したがって、SMC88の1命令の実行サイクルは第2オペコードのフェッチサイクル、第1オペ
  1492. ランドのリードサイクル、第1実行サイクルのいずれか(命令により異なる)から始まり、
  1493. 次の命令の第1オペコードのフェッチサイクルで完了します。1サイクル命令については、
  1494. 次に命令の第1オペコードのフェッチサイクルのみとなります。また、オペランドのリー
  1495. ドサイクル後、実行サイクルをはさまずに第1オペコードのフェッチサイクルに移行する
  1496. 場合もあります。
  1497. 第1オペコードのフェッチサイクルでは、その期間中SYNC信号がHIGHレベルになります。
  1498.  
  1499.  
  1500. 3.5 例外処理状態
  1501. 例外処理状態とは、割り込みなどの例外処理要因によってSMC88が通常のプログラム実行
  1502. を中断して処理の流れを変える過渡的な状態を示します。
  1503. 例外処理のシーケンスを図3.5.1に示します。
  1504.  
  1505. 例外処理は例外処理要因が発生した時点で実行している命令のサイクル終了時に開始され
  1506. ます。
  1507. 例外処理フローに示すとおり、中断したルーチンを再開するためのリターン情報をスタッ
  1508. クに退避後、例外処理要因に対応したベクタアドレスから例外処理ルーチン(ユーザーが
  1509. 設定した処理ルーチン)のスタートアドレスをPCにロードしてその処理ルーチンに分岐し
  1510. ます。ただし、リセット例外処理についてはリターン情報の退避は行われません。
  1511. この例外処理ルーチンに分岐するまでの過渡的な状態が例外処理状態で、分岐後は通常の
  1512. プログラム実行状態になります。
  1513.  
  1514. ユーザーが作成する例外処理ルーチンはサブルーチンの形式を取りますが、スタックにSC
  1515. が退避されるためリターン命令は必ず"RETE"命令を使用する必要があります。"RETE"命令
  1516. により、例外処理で中断されていたルーチンの実行を再開します。
  1517.  
  1518.  
  1519.        例外処理要因発生
  1520.  
  1521.                      ↓
  1522.  
  1523.       ↑ CB(コードバンクレジスタ)を
  1524.       │       スタックに退避
  1525.       │
  1526.       │             ↓MODEL2/3 (マキシマムモード)
  1527.       │
  1528.       │ PC(プログラムカウンタ)を
  1529.       │    スタックに退避
  1530.       │
  1531. 例外処理状態         ↓
  1532.       │
  1533.       │ SC(システムコンディション
  1534.       │  フラグ)をスタックに退避
  1535.       │
  1536.    │       ↓←――――リセット例外処理要因発生
  1537.       │
  1538.       │ 例外処理ベクタを読み出し
  1539.       ↓    PCにロード
  1540.  
  1541.            ↓
  1542.  
  1543.         例外処理ルーチンを実行
  1544.                      :
  1545.              "RETE"命令
  1546.  
  1547.                     ↓
  1548.  
  1549.         例外処理発生時に戻る
  1550.  
  1551.              図3.5.1 例外処理フロー
  1552.  
  1553.  
  1554. 3.5.1 例外処理の種類と優先度
  1555. 例外処理の種類と優先度を表3.5.1.1に示します。
  1556.  
  1557.                                                 表3.5.1.1 例外処理のタイミング
  1558.  
  1559. 優先度   種 類            例外処理の開始タイミング
  1560.  
  1561.  高   リセット  SR端子がLOWレベルからHIGHレベルに変化後の最初のフェッチサ
  1562.  ↑         イクル
  1563.   │
  1564.   │      ゼロ除算    除数ゼロでDIV命令(除算)を実行した場合のDIV命令実行直後
  1565.   │
  1566.   │                  <ノンマスカブル割り込み>
  1567.   │      NMI         NMI端子に立ち下がりエッジが入力された時点で実行中の命令ま
  1568.   │            たは例外処理終了時
  1569.   │
  1570.   │                <割り込み要求3>
  1571.   │      IRQ3        IRQ3端子に立ち下がりエッジが入力された時点で実行中の命令ま
  1572.   │                  たは例外処理終了時
  1573.   │
  1574.   │                <割り込み要求2>
  1575.   │      IRQ2        IRQ2端子に立ち下がりエッジが入力された時点で実行中の命令ま
  1576.   │                  たは例外処理終了時
  1577.   │
  1578.   ↓                  <割り込み要求1>
  1579.   低      IRQ1        IRQ1端子に立ち下がりエッジが入力された時点で実行中の命令ま
  1580.                       たは例外処理終了時
  1581.  
  1582.  なし    INT命令      <ソフトウェア割り込み>
  1583.                       INT命令の実行
  1584.  
  1585.  
  1586. 例外処理要因には優先順位が設定されており、複数の要因が同時に発生した場合は優先度
  1587. の高い例外処理が先に実行されます。
  1588. また、例外処理状態において新たな例外処理要因が発生した場合は、その時点の例外処理
  1589. 終了後(例外処理ルーチンの実行前)に新たな例外処理が実行されます。
  1590. たとえば、IRQ3の例外処理中にNMIが発生した場合、IRQ3の例外処理の最後にNMIのサンプ
  1591. リングが行われ、ユーザーの処理ルーチンとしてはNMI処理ルーチンがIRQ処理ルーチンよ
  1592. り先に実行されます。
  1593. このため、割り込みによる例外処理ではその割り込みより優先度の低い割り込みがマスク
  1594. されるようになっています。
  1595. INT命令による例外処理はプログラムによって開始できますので、優先度は設定されませ
  1596. ん。
  1597.  
  1598. 3.5.2 例外処理要因とベクタ
  1599. 例外処理ルーチンのスタートアドレスは、各例外処理に対応したベクタアドレスにベクタ
  1600. として設定しておきます。
  1601. このベクタが例外処理の最後にPCにロードされ、例外処理ルーチンへ分岐します。
  1602. 表3.5.2.1に例外処理要因とベクタアドレスの対応を示します。
  1603.  
  1604.  
  1605.    表3.5.2.1 例外処理要因とベクタアドレスの対応
  1606.  
  1607. 例外処理要因  ベクタアドレス  ベクタアドレス発生元
  1608.  
  1609.  リセット     000000H~000001H        CPU内部
  1610.  
  1611.   ゼロ除算     000002H~000003H        CPU内部
  1612.  
  1613.    NMI       000004H~000005H        CPU内部
  1614.  
  1615.  IRQ1~IRQ3    000006H~0000FFH        周辺回路
  1616.  
  1617.    INT命令     000000H~0000FFH     命令のオペランド
  1618.  
  1619.  
  1620. ベクタはCPUモデルにかかわらず論理アドレスを示す2バイトのアドレス情報に固定されて
  1621. います。MODEL2/3においてもユーザーが作成した例外処理ルーチンのバンクをベクタによ
  1622. り指定することはできません。したがって、どのバンクのプログラムを実行している場合
  1623. でも共通の例外処理ルーチンに分岐させるために、ベクタにより指定される例外処理ルー
  1624. チンの先頭をコモンエリア内(000000H~007FFH)に配置する必要があります。
  1625.  
  1626. IRQ1~IRQ3のベクタアドレスは周辺回路によって設定されます。INT命令の場合は命令の
  1627. オペランドがそのままベクタアドレスとなり、他の例外処理要因も含めると最大128ベク
  1628. タまで確保できます。
  1629.  
  1630.  
  1631. 3.5.3 割り込み
  1632. 割り込みにはNMI、IRQ3、IRQ2、IRQ1の4種類があり、それぞれには表3.5.3.1に示す割り
  1633. 込み優先レベルが設定されています。
  1634.  
  1635.  
  1636.                          表3.5.3.1 割り込み優先レベル
  1637.  
  1638.                   優先度  割り込み優先レベル  割り込み要因
  1639.  
  1640.                    高       4                NMI
  1641.                     ↑              3                 IRQ3
  1642.                     ↓              2                 IRQ2
  1643.                     低              1                 IRQ1
  1644.  
  1645. 割り込みはインタラプトフラグI0、I1によってマスク(割り込みを受け付けないように設
  1646. 定)することができます。プログラムによってI0、I1の2ビットに割り込み優先レベルを設
  1647. 定すると、それより高い優先レベルの割り込みのみが受け付けられます。このうち、レベ
  1648. ル4の優先度を持っているMNIはI0とI1の設定にかかわらず、常時受け付けられます。
  1649. また、割り込み要因の発生により例外処理が実行されるとI0とI1は受け付けた割り込みと
  1650. 同じレベルに設定され、同一レベル以下の割り込みがマスクされます。このマスクの設定
  1651. はSC(システムコンディションフラグ)のスタック退避後に行われますので、割り込み処理
  1652. ルーチンを"RETE"命令で終了した時点でSCが元の状態に戻り、割り込みマスクも元の優先
  1653. レベルに戻ります。割り込みルーチン内で同一レベル以下の多重割り込みを許可したい場
  1654. 合は、そのルーチンの中で再度優先レベルの設定を行って下さい。
  1655.  
  1656. なお、NBおよびSCの内容を変更する命令を実行している最中は割り込みを受け付けません。
  1657. その間に発生した割り込みの例外処理は、次の命令終了後に開始されます。
  1658.  
  1659.                          表3.5.3.2 割り込みマスクの設定
  1660.  
  1661.                        I1  I0  受け付け可能な割り込み
  1662.  
  1663.                         1     1       NMI
  1664.  
  1665.                         1     0       NMI IRQ3
  1666.  
  1667.                         0     1       NMI IRQ3 IRQ2
  1668.  
  1669.                         0     0       NMI IRQ3 IRQ2 IRQ1
  1670.  
  1671.  
  1672.  
  1673.                          表3.5.3.3 割り込み受け付け後のI0とI1
  1674.  
  1675.                         受け付けた割り込み要因  I1  I0
  1676.  
  1677.                                 NMI               1     1
  1678.  
  1679.                                 IRQ3              1     1
  1680.  
  1681.                                 IRQ2              1     0
  1682.  
  1683.                                 IRQ1              0     1
  1684.  
  1685. 3.5.4 例外処理のシーケンス
  1686. 例外処理のサンプリングはSYNC信号の立上りエッジ(命令の第1オペコードフェッチサイク
  1687. ル開始時)で行われます。ここで例外処理要因が発生している場合、CPUは割り込みアクノ
  1688. リッジ信号IACKを出力し例外処理を開始します。IRQ1~IRQ3割り込みの場合、割り込みを
  1689. 発生させた周辺回路はIACK信号を受けてベクタアドレスをホールドします。
  1690.  
  1691.                                 MODEL2/3マキシマムモードではCBがスタックに退避
  1692.                                 されます。
  1693.  
  1694. 3.6 バス権解放状態
  1695. この機能はChipCardでは使用できません。
  1696.  
  1697. 3.7 スタンバイ状態
  1698. SMC88にはCPUの動作を停止させる機能があり、これによって消費電力を大幅に低減するこ
  1699. とができます。アプリケーションプログラムがある期間CPUに実行させる処理がない場合
  1700. にこの機能を用いてCPUを停止させることができます。低消費電力化のためにCPUを停止さ
  1701. せた状態がスタンバイ状態で、この状態にも以下に説明するHALT状態とSLEEP状態の2種類
  1702. があります。
  1703.  
  1704. 3.7.1 HALT状態
  1705. HALT状態はCPUのみが停止するもので、"HALT"命令によって移行することができます。
  1706. HALT状態からはリセットまたは任意の割り込み(NMI、IRQ1~IRQ3)によって例外処理に移
  1707. 行することができ、割り込みによる再起動の場合は例外処理ルーチン実行後"RETE"命令に
  1708. よって"HALT"命令の次の命令からプログラムの実行を再開できます。発振回路などの周辺
  1709. 回路はHALT状態の間も動作しているため、MCU(SMC88 Family)の外部にCPU再起動用の割り
  1710. 込み回路などを設ける必要もなく、再起動も瞬時に行われます。
  1711. CPU内のレジスタ等は"HALT"命令実行時点の内容がHALT状態の間も保持されます。
  1712.  
  1713.  
  1714. 3.7.2 SLEEP状態
  1715. この状態にはいるとChipCardはRESET以外、受け付けません。
  1716. SLEEP状態はCPUとMCU内部の周辺回路の動作が停止するもので、"SLP"命令によって移行す
  1717. ることができます。
  1718. SLEEP状態では発振回路などの周辺回路も停止するため、HALT状態に比べて消費電力が大
  1719. 幅に低減できます。ただし、再起動の際に発振回路の安定待ち時間が必要となりますので、
  1720. 瞬時の立ち上げの必要のない長時間のスタンバイに有効です。
  1721. SLEEP状態でも規定電圧の印加によりCPU内のレジスタ等は"SLP"命令実行時点の内容が保
  1722. 持されます。但しRESET処理により各レジスター値は初期化されます。特に初期化を
  1723. したくない場合は、「=」キーを押したまま、RESETを押し処理が終わるのを待つ
  1724. 方法がありますが、おすすめできません。
  1725.  
  1726.  
  1727.