Z800 CPU の全貌 4ページ
割り込みステータスレジスタ
 この16bit長のレジスタは、割り込みモード及び割り込みソースからの割り込み要求状況を表しています。また、割り込み入力がベクタによるものかどうかを表すビットも含んでいます。割り込みベクタイネーブルビット(IP0~IP6)のみがライト可能で、他はすべてリードオンリーです。
15 0
IC IB IA INMI 0 0 IM 0 IP6 IP5 IP4 IP3 IP2 IP1 IP0
割り込みステータスレジスタ
 このレジスタのフィールドは次の通りです。
割り込み要求決定(IP) IPnに1がセットされていると、レベルnの割り込みソースからの要求があったことを表しています。([割り込み&トラップ]参照)
割り込みモード(IM) この2bitフィールドの値は、割り込みモードnが有効であることを表しています。このフィールドはIM命令によって変更することができます。
割り込みベクタイネーブル(I) これら4つのbitは、4つの割り込み入力のそれぞれがベクトル化されるかどうかを表しています。Inに1がセットされると、割り込みラインnの割り込み信号は、CPUが割り込みモード3のときにベクトル化されます。また、Inが0でクリアされると、このライン上のすべての割り込みはインタラプト/トラップベクタテーブル内の同一のエントリを使用することになります。これらのbitは割り込みモード3以外では無視されます(モード3割り込みについて後述)。
インタラプト/トラップベクタテーブルポインタ
 この16bitレジスタは、インタラプト/トラップ ベクタテーブルの物理アドレスの上位12bitを示し、下位12bitには0が入ります。このレジスタ内の下位4bitは常に0でなければなりません。
15 0
A23 A22 A21 A20 A19 A18 A17 A16 A15 A14 A13 A12 0 0 0 0
インタラプト/トラップ ベクタテーブル
I/O ページ レジスタ
 この8bitレジスタは、I/Oアドレスフェイズ間のI/O処理の16bitアドレスデータの上位に付加されるビットを表しています。これによって24bit(64KB×256バンク)のI/Oアドレス空間が実現されます。
7 0
A23 A22 A21 A20 A19 A18 A17 A16
I/O ページレジスタ
マスター ステータス レジスタ
 マスターステータスレジスタは、現在実行中のプログラムの状態情報を示している16bitレジスタです。このレジスタはリセット時に0でクリアされます。
15 0
0 U/S 0 BH 0 0 SSP SS 0 E6 E5 E4 E3 E2 E1 E0
マスター ステータスレジスタ
 このレジスタのフィールドは次の通りです。
割り込み要求イネーブル(En) これらは7つの割り込みイネーブルbitで、マスク可能な割り込みソース(外部割り込み及び内部割り込み)のそれぞれに対応します。bitEnに1がセットされたとき、レベルnのソースからの割り込み要求が受け入れられるようになります。このbitが0のとき、レベルnの割り込み要求は無視されます。
シングルステップ(SS) このbitが1にセットされたとき、CPUはシングルステップモードに入ります。0でクリアされている間は自動シングルステップは無効になります。このbitはトラップまたは割り込みが発生すると自動的に0クリアされます。
シングルステップペンディング(SSP) このbitが1にセットされている間、CPUは命令の実行に優先してトラップを発生させます。SSbitは各命令の完了時に自動的にこのフィールドにコピーされます。このbitは退避されたマスターステータスレジスタ内のSSPbitが0でクリアされるように、シングルステップ、ページフォールト、特権命令、ブレイクオンホールト、あるいは被ゼロ除算が発生したとき、0でクリアされます。
ブレイクポイントーオンーホールト イネーブル(BH) このbitが1にセットされている間、CPUはHALT命令にぶつかるとブレークポイントトラップを発生させるようになります。0でクリアされている間は、HALT命令は通常通りに実行されます。
ユーザ/システム モード(U/S) このbitbitが0でクリアされている間、CPUはシステムモードとなり、1にセットされている間はユーザモードとなります。
システムスタック リミット レジスタ
 この16bitレジスタはシステムスタックオーバーフローワーニングが発生するときに参照されます。次のトラップコントロールレジスタ内の制御bit(S)をセットすることによってこのワーニングがイネーブルにされると、このレジスタの上位12bitとシステムスタックポインタの上位12bitが比較され、同じであったならトラップが発生します。このレジスタの下位4bitは0でなければなりません。
15 0
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 0 0 0 0
システムスタック リミット レジスタ
トラップコントロールレジスタ
 この8bitレジスタはマスク可能なトラップを制御します。このレジスタ内のbitの意味は以下の通りです。
7 0
0 0 0 0 0 I E S
トラップコントロールレジスタ
システムスタックオーバーフローワーニング(S) このbitが1にセットされている間、CPUはシステムスタックがあらかじめ設定されたあるメモリアドレスに達すると、スタックオーバーフローワーニングトラップを発生させるようになります。またリセット時、このレジスタは0でクリアされます。
EPUイネーブル(E) このbitが0でクリアされている間、CPUはEPU命令にぶつかるとトラップを発生させます。EPU命令は「拡張命令」のことで、浮動小数点演算命令などがこれに相当します。つまり、コプロセッサのエミュレーション用と考えられます。
ユーザI/O禁止(I) このbitが1にセットされている間、CPUはユーザモードで実行時にI/O命令にぶつかると特権命令トラップを発生させます。
キャッシュコントロール & ローカルアドレス レジスタ
 キャッシュコントロールレジスタについては「オンチップメモリー」の解説を、ローカルアドレスレジスタについては「マルチプロセッサモード」の解説を参照してください。
コラム4 コントロール レジスタ空間
 皆さんの中には理解に苦しむ方もいらっしゃると思います。この「コントロールレジスタ空間」というのは、Z800CPUの中に設けられた8bitと16bitを取り混ぜた10本のレジスタのことです。要は汎用レジスタやインデックスレジスタや特殊レジスタなど以外のレジスタ群なのです。その働きについては本文中に明記してありますのでそちらを参照してください。
 これらのレジスタ群は、新たに設けられた特権命令中の「LDCTL」(ロードコントロールレジスタ)という命令によって自由にリード/ライトできます。Cレジスタにアクセスしたいコントロールレジスタのアドレス(前ページ参照)を入れ、HL,IX,IYレジスタのうちのどれかにロードあるいはストアしたいデータを入れてLDCTL命令を実行します。コントロールレジスタが8bitの場合は、下位8bitのみが有効となります。
割り込み及びトラップの構造
 Z800MPUは非常に強力かつ柔軟性に富んだ割り込み並びにトラップを提供してくれます。割り込みはCPUに負担を強いる外部非同期イベントで、通常は周辺デバイスがサービスを要求することによって起きます。これに対しトラップは特定の命令の実行による同期イベントです。
割り込み
 割り込みにはマスク可能なもの(マスカブル割り込み)と不可能なもの(ノンマスカブル割り込み)の2種類あり、ともにZ800MPUはサポートしています(当たり前!)。ノンマスカブル割り込み(NMI)はソフトウェアではマスクすることができません。通常は直接アテンションを要求する最も優先度の高い外部イベントとして予約されています。これに対してマスカブル割り込みは、ソフトウェアによって自由にマスクすることができます。この2つの割り込みは両方ともベクタ方式にするか、あるいはそうしないかをプログラムできます。CPUはブロック転送、サーチ、I/O命令などの例外的な命令の実行中も割り込みを処理できます。繰り返し処理の途中であっても確実に割り込み要求を受け付け、その割り込み処理が終った後、ちゃんと元の繰り返し処理に復帰します。
割り込みソース
 Z800MPUは、NMI端子でのみノンマスカブル割り込みを受け付けます。マスカブル割り込みはINT端子、およびチップ内のカウンタ/タイマ,DMAチャネル,UARTからも受け付けます。Z800ファミリーの中でも40ピンのものは、INTA端子でのみマスカブル割り込みを受けます。
 割り込みラインA,B,Cは、ベクタ割り込みをサポートするため、割り込みステータスレジスタ内のビット操作によって自由にプログラムすることができます。外部割り込みは、割り込みモード3でベクタ化をするかしないかプログラムできます。
割り込みモード
 CPUの割り込みには4種類あります。はじめの3つのモードは、Z80との互換性を保持するために継承したものです。第4のモードは、より柔軟性に優れた割り込み処理を実現してくれます。割り込みモードは外部で発生した割り込み要求に合ったものが選択されますが、チップ内の周辺デバイスはこれに関係なく第4のモードを使用します。割り込みモードは、特権命令であるIM0,IM1,IM2,IM3の使用によって決定されます。リセット時、Z800MPUは自動的にモード0に設定されます。現在有効な割り込みモードは、割り込みステータスレジスタを参照すれば知ることができます。
MODE 0 このモードは8080割り込み応答モードと全く同じです。このモードでは、マスカブル割り込みライン(A,B,Cの3本)上の割り込み要求デバイスが、コール(CALL)またはリスタート(RST)命令をデータバス上に出すことができ、CPUはこれを実行してくれます。結果的に割り込みデバイスがメモリの代わりに実行すべき次の命令を供給することになります。わかりやすく言うと、i8080CPU用の周辺LSIを使用する場合に使うモードだということです。まず使いません。
MODE 1 このモードが選択されている場合、CPUは外部マスカブル割り込みが発生すると、システムプログラムアドレス空間の論理アドレス0038Hにリスタートを実行します。これはわかりやすい割り込みですね。割り込みが入ると絶対アドレスの0038H番地が割り込みコールされるというわけです。通常は0038Hにジャンプ命令を置いて割り込みルーチンへ飛ばし、RETI命令で復帰します。
MODE 2 このモードはベクタ割り込みの応答モードです。割り込み発生デバイスからの1バイトデータを用いた間接コールが任意のメモリロケーションに対して実行できます。このモードでは、システムは各割り込みサービスルーチンのアドレステーブルを持っている必要があります。このテーブルは256byte(128エントリ)で、システムモードの論理アドレス空間内の任意のアドレスに置くことができます(Iレジスタで指定)。割り込みが受け付けられると、それに対応した割り込みサービスルーチンへ飛ぶため、テーブルからそのアドレスを決定します。テーブル内のオフセット(8bit)は割り込みを発生させた周辺デバイスがデータバスを通して送ってくることになっています(あらかじめ専用の周辺デバイス内のレジスタにオフセット値を設定しておく)。つまり、上位8bitがIレジスタ、下位8bitが割り込み発生デバイスから送られてきた値で作られる16bitアドレスが指すメモリの内容にジャンプするわけです。ジャンプアドレスはシステムアドレス空間内の論理アドレスですから、実際にはMMUによって物理アドレスに変換されます。
 ちなみにこのテーブルは奇数アドレスから配置しても問題なく動作します。周辺デバイス(Z80PIO・CTCなど)内部のベクタレジスタのLSBが有効である証拠といえるでしょう。また、モード2割り込み対応の周辺デバイスはデイジーチェーン(雛菊の輪)と呼ぶロジックに対応しており、割り込みコントローラがなくても優先順位をつけてしっかりと管理することができます。
MODE 3 これはZ800マイクロプロセッサファミリーの強化された部分(例えばシングルステップやユーザ/システム モードといったものなど)を有効に利用するために新たに追加された割り込み処理モードです。また、ベクタテーブルは、Z800TMファミリー、Z80ファミリー、及びZ8500ユニバーサルペリフェラルなどに、より数多くの割り込みベクタを提供するために外部割り込みソースにも使用されます。
 割り込み要求(マスカブル/ノンマスカブル)が受け入れられると、マスターステータスレジスタや再開アドレスや16bitの“リーズンコード”は、システムスタックにプッシュされます。新たなマスターステータスレジスタとプログラムカウンタは、そのときの割り込み/トラップベクタテーブルからフェッチされます。チップ外部で発生した割り込みの“リーズンコード”は、8bitデータバスの割り込みアクノリッジシーケンス中のバスの内容になります。このリーズンコードの上位バイトは0です。チップ内部の周辺デバイスが発生させた割り込みについては、リーズンコードはどの周辺デバイスが割り込みを発生させたのか識別するもので、割り込み/トラップベクタテーブル中のベクタアドレスと同じ値になります。割り込み/トラップベクタテーブルポインタはそのテーブルの参照に使用されます。
page 4