Z800 CPU の全貌 5ページ
トラップ
 Z800CPUは内部的に発生する8つのトラップをサポートします。以下のトラップは無効にすることができます。
EPAトラップ EPUをエミュレートするためのプログラムに制御を移す
スタックワーニングトラップ トラップを起こす命令の最後に起こる
ブレーク-オン-ホールト トラップ HALT命令にぶつかったときに起こる
シングルステップトラップ 各命令ごとに起こる
 また、I/O命令は、特権命令としても扱えます。トラップはCPUレジスタを一切変更しません。(システムスタックポインタは除きます。これはプログラムステータスがシステムスタックにプッシュされるとき、否応なしに変更されるからです。)
 システムスタックへの、プログラムステータスの退避、および割り込み/トラップベクタテーブルからの新しいプログラムステータスのフェッチは、どの割り込みモードにおいても同様です。
 もしもZ800CPUのトラップ発生の特徴的なもの(例えば、システムスタックオーバーフローワーニングなど)が明らかにイネーブルになっていると、トラップが発生しうる。トラップは、オペレーティングシステムがZ800CPUの拡張部分を使用することによって明らかにイネーブルになっている場合を除いて、Z80インストラクションセットの命令上では起こりえません。
●拡張命令。 このトラップは、トラップコントロールレジスタ内のEPAビットが0のときに、CPUが拡張命令にぶつかったときに発生します。4本のトラップベクタがEPAトラップのために用意されていて、それぞれがEPA命令の各タイプに対応しています。これにより、EPAをアクセスするためのI/O命令、あるいはEPUをエミュレートするソフトウェアを使用するトラップハンドラが大いに簡略化されます。
●特権命令。 CPUがユーザモードのときに特権命令が実行されると発生します。(ユーザモードはマスターステータスレジスタのユーザ/システムモードコントロールビットが1のとき。)
●システムコール。 システムコール(SC)命令が実行されると、このトラップが発生します。
●アクセス違反。 MMUのトランスレーションモードが有効で、変換されるべきアドレスが無効か、あるいはライト時に書き込み保護がかかっていたときに発生します。
●システムスタックオーバーフローワーニング。 このトラップは、トラップコントロールレジスタ内のスタックオーバーフローワーニングビットが1のときのみ発生します。システムスタックへのプッシュ時に、スタックポインタの上位12bittがスタックリミットレジスタの内容と比較され、値が一致したときにトラップが発生します。スタックオーバーフローワーニングビットは、そのときにトラップが繰り返し何回も起きないように自動的にクリアされます。
●除算例外。 割る数が0のとき(ある数を0で割った場合)や、商が目的の精度で表現しきれないとき(オーバーフロー)に発生します。これら2つのケースを区別するために、CPUのフラグがセットされます。
●シングルステップ。 マスターステータスレジスタ内のシングルステップペンディングコントロールビットが1にセットされると、命令が実行される直前に発生します。マスターステータスレジスタ内の2つのビットがシングルステップトラップのために使用されています。シングルステップビット(bit8:SS)は最初クリアされており、次命令の実行後に発生するこのトラップの要因となります。このbitが1にセットされている間は、ある命令の実行がトラップを引き起こすと、トラップ処理ルーチンの実行後にシングルステップトラップが発生します。シングルステップペンディングビット(bit9:SSP)は、シングルステップビットが1にセットされている間、シングルステップトラップが各命令実行時に1回だけ発生するようにするため、CPUによって使用されます。
●ブレイク-オン-ホールト。 マスターステータスレジスタ内のブレークオンホールトコントロールビットが1で、かつHALT命令にぶつかったときにこのトラップが発生します。
割り込み及びトラップの無効制御
 マスカブル割り込みは、マスターステータスレジスタ内の対応するコントロールビットをセットしたりクリアしたりすることで有効/無効にできます。マスターステータスレジスタ内の7bitのマスクフィールドは、要求された割り込みが受け付けられるということを示すものです。割り込み要求は次のようにグループ分けされます。各グループは、個々の割り込みイネーブルビットによりコントロールされています。表は優先順位の高い方から順(上→下)に示してあります。また、項目中の要素も優先順位の高い順(左→右)に示してあります。
マスカブル割り込みA (bit0)
カウンタ/タイマ0,DMA0 (bit1)
マスカブル割り込みB (bit2)
カウンタ/タイマ1,UARTレシーバ,DMA1 (bit3)
マスカブル割り込みC (bit4)
カウンタ/タイマ2,UARTトランスミッタ,DMA2 (bit5)
カウンタ/タイマ3,DMA3 (bit6)
 ある割り込みソースが無効化されると、CPUはその割り込みソースのあらゆる要求を無視します。
 システムスタックオーバーフローワーニングトラップ、ユーザモードでのI/O命令(特権命令トラップ)、あるいは拡張命令トラップは、トラップコントロールレジスタ内のコントロールビットを設定することによって有効にすることができ、シングルステップやブレイクオンホールトトラップは、マスターステータスレジスタ内のコントロールビットを設定することにより有効にできます。また、これらのみが無効化できるトラップでもあります。
割り込み/トラップ ベクタテーブル
 割り込み/トラップベクタテーブルのフォーマットはマスターステータスレジスタとプログラムカウンタのペアよりなり、それはチップ内割り込み用とトラップ用とに分かれています。各外部割り込み用にもマスターステータスレジスタとプログラムカウンタは用意されています(割り込みがベクタ式でないときのため)。外部割り込みがベクタ式であったときには、各割り込み入力ラインごとに設けられた128本のプログラムカウンタよりなるテーブルの中の1本が、そのときのプログラムカウンタの代わりに使用されることになります。このようにベクタ式の割り込みでは、各割り込みタイプごとにマスターステータスレジスタが1本しかありません。
割り込み/トラップ ベクタテーブルのフォーマット
Address Contents
00 未使用
04 NMI Vector
08 Interrupt Line A Vector (End of Process)
0C Interrupt Line B Vector
10 Interrupt Line C Vector
14 Counter/Timer 0 Vector
18 Counter/Timer 1 Vector
1C Counter/Timer 2 Vector
20 Counter/Timer 3 Vector
24 DMA 0 Vector
28 DMA 1 Vector
2C DMA 2 Vector
30 DMA 3 Vector
34 UART Receiver Vector
38 UART Transmitter Vector
3C Singl-Step Trap Vector
40 Breakpoint-on-Halt Trap Vector
44 Division Exception Trap Vector
48 Stack Overflow Warning Trap Vector
4C Page Fault Trap Vector
50 System Call Trap Vector
54 Priveleged instruction Trap Vector
58 EPU ← Memmory Trap Vector
5C Memmory ← EPU Trap Vector
60 A ← EPU Trap Vector
64 EPU Internal Operation Trap Vector
68-6C リザーブ
70-16E 128 Program Counters from NMI & Interrupt Line A Vectors (MSR from 04 & 08)
170-26E 128 Program Counters from Interrupt Line B Vectors (MSR from 0C)
270-36E 128 Program Counters from Interrupt Line c Vectors (MSR from 10)
アドレッシングモード
 アドレッシングモードは、CPUが命令実行の際に必要となるオペランドの実効アドレスを計算するためのものです。Z800CPUでは9種類のアドレッシングモードをサポートしています。このうちの4種類がZ80からのアドレッシングモードに新たに追加されたものです(16bitディスプレースメントインデックス,スタックポインタ相対,プログラムカウンタ相対,ベースインデックス)。そして残りの5種類は、Z80のものと同じか、あるいは拡張したものです。
◎レジスタ。 オペランドは8bitレジスタ(A,B,C,D,E,H,L,IXH,IXL,IYH,IYL)の中のどれか1つ、16bitレジスタ(BC,DE,HL,IX,IY,SP)の中のどれか1つ、あるいは特殊1バイトレジスタ(I,R)の中の1つになります。
◎イミディエイト。 オペランドは命令自身に含まれていて、実効アドレスは持ちません。
◎レジスタ間接。 レジスタの内容がオペランドの実効アドレスを表します。HLレジスタはメモリのアクセスに最もよく使用されるレジスタです。Cレジスタは、I/Oやコントロールレジスタをアクセスするときに使用されます。
◎直接アドレス。 オペランドの実効アドレスは、命令内に含まれるアドレスです。実際の命令では、記述されたオペランドがI/Oあるいはデータメモリ空間内を指すアドレスということになります。
◎インデックス。 オペランドの実効アドレスは、HL,IX,IYレジスタ中の「インデックス」値に命令中の16bitアドレスを加えたアドレスです。
◎ショートインデックス。 オペランドの実効アドレスは、IX,IYレジスタの内容に命令中の8bitディスプレースメントを加えたものです。このアドレッシングモードはZ80CPUのインデックスモードと同じものです。
◎リラティブ(相対)。 命令中の8bitまたは16bitのディスプレースメントが、オペランドの実効アドレスを発生させるためにプログラムカウンタに加算されます。
◎スタックポインタ相対。 オペランドの実効アドレスは、スタックポインタの内容に命令中の16bitディスプレースメントを加えたアドレスです。
◎ベースインデックス。 オペランドの実効アドレスは、HL,IX,IYレジスタの内容を、これら以外のレジスタに加えることによって求められるアドレスです。
オペランドのアドレッシング一覧
命令内 レジスタ内 メモリまたはI/O内
Register
レジスタ
レジスタの値がそのままオペランド。
Immediate
イミディエイト(直値)
命令中にオペランド値が含まれている。
Register Indirect
レジスタ間接
レジスタの値で示されたアドレスの内容。
Direct Address
直接アドレス
命令中に含まれるアドレスの内容。
Index
インデックス
命令中のアドレスにオフセットとしてレジスタの値を加算して求められるアドレスの内容。
Short Index
ショート・インデックス
レジスタで示されたアドレスに、命令中の8ビットディスプレースメントを加算して求められる
アドレスの内容。
Relative
リラティブ(PC相対)
プログラムカウンタで示されたアドレスに命令中のディスプレースメントを加算して求めらる
アドレスの内容
Stack Pointer Relative
スタックポインタ相対
スタックポインタで示されたアドレスに、命令中のディスプレースメントを加算して求められる
アドレスの内容
Base Index
ベース・インデックス
レジスタで示されたアドレスに、レジスタで示されたディスプレースメントを加算して求められる
アドレスの内容
コラム5 実際のZ800MPUとZ380
 ザイログ社はZ800をZ280という名称で実際に発売しました。本文と異なる点が幾つかありますから、若干の仕様変更があったようです。最も大きな変更点はラインナップとパッケージでしょう。Z800シリーズとして4種類のMPUが予定されていましたが、実際には1種類のみで本文のZ8216に相当するチップのようです。68ピンのQFPが出回っていました。また、内部的にはCTCが3チャネルとなっており、1チャネル減っています。それ以外のペリフェラルには変更はないようです。クロック周波数も10~25MHzとなっていましたが、少なくとも16MHz版が発売されていました。次いで25MHz版も発売予定だったようですが、実際に発売された気配はありません。しかし「Z80完全上位コンパチ」はしっかりと謳われています。
 Z280はほとんど市場に出回ることなく消えていき、ザイログ社は32bit版のZ380を投入します。このZ380もZ80の完全上位コンパチを通しており、レジスタセットが32bitに拡張されたりバンク増設されたりしているものの、あくまでもZ80の拡張形式になっています。このZ380はいちおう現役らしく、入手も可能なようです('05現在)。しかし、動作クロックは5V駆動で18MHzと32bitCPUとしては低く、外部データバスも16bitしかありません(アドレスバスは32bit)。さらにZ280にあった内蔵キャッシュメモリも省かれています。ただ、クロック効率は悪くありません。レジスタ間のコピーや加減算などは2クロック、16bit乗算で10クロック、除算で20クロック、そして分岐命令が条件付きでも2クロックと高速です。このため、Z80のオブジェクトを実行すると他の追随を許しません。単純に考えてクロック効率がZ80の約2倍、データバス幅が2倍、そしてクロックが18MHzということですから、Z80の72MHz版ということになります。結構スゴイですね。
page 5