今更Z280MPUを調べて見た
8bitCPUでは大人気のCPUだったZ80の機能強化版として1987年にリリースされたのがZ280。しかしながら市場は16bitに移行しつつあり時期が遅すぎたことで採用するメーカーも現れずに消え去ったのでした。
リリースされた時期が遅れたのは開発に難航したからだろうと推察されます。事実仕様をみるとZ80にMMUをくっつけただけではなくモダンなOSが実装できる機能が加えられており、EDAツールが碌に存在しなかった時代では無理も無いかなと。
拡張された主な機能をみると、
- Z80とオブジェクトコードレベルでコンパチブル
- キャッシュと、それを有効に使えるメモリアクセスの追加
- マルチタスク用の機能の追加
- HLレジスタを8ビット時のAレジスタと同様の16bitレジスタとして使えるようになった。
- 乗算、除算命令の追加
- 新規アドレッシングモードの追加
- MMUを利用した24bitの物理アドレスの追加
- 3ステージのパイプライン
- バスの16bit化
従来のZ80システムに載せられることができるようにバス幅を8bit/16bitで使用しているかを示すB/Wb(Byte/Word)端子が追加されています。IOポート等はこの端子とA0をデコードすることで8bitのシステムと互換性がとれます。
これが1980年代初期に出ていれば始めは高速で広いメモリ空間を持つZ80として利用し、メモリや外部記憶装置が安くなればUnix LikeなOSを利用するといったシナリオも考えられ歴史が変わったかも。
Z280の機能を見ていきます。
キャッシュメモリの導入はプロセッサの高速化では定番です。単にキャッシュメモリを導入するだけでは無くキャッシュを有効に活用できるメモリアクセスが必要となります。
そのため4ワードのメモリ一度にリードするバーストアクセスができるようになっています。ひとかたまりのメモリデータを読み込みon-cacheで実行出来るようになり、パイプラインを有効に活用できるようになります。
メモリインターフェースはDRAMのページモード(同一ロウアドレスではカラムアドレスだけでアクセスできる。)を利用できる様に設計することになるでしょう。
・マルチタスク用の機能
Z280はマルチタスクに必要なハードウエアとソフトウエアの機能を搭載しています。
MMUがシステム用とユーザー用の2セット用意されておりOSがユーザープログラムから影響を受けない様になっています。システムとユーザーの切り替えはMMU Master Control Registerで設定します。どのモードかはMaster Status Registerで確認できます。
ユーザー空間で実行するプログラムはシステムに影響するようなI/O命令は特権命令となっており、実行するとI/O Trap割り込みが発生しシステムプログラムに移行します。
ユーザープログラムがシステムプログラムにアクセスするためにはSC(System Call)命令を実行します。この命令が発行されるとシステム用のスタックポインタに実行時のプログラムカウンタとMaster Status Resisterの値と16ビットの任意の引数を積んでSC Trapを発生させます。
またマルチタスクやMMUを使用する為の割り込みモード3が追加され便利な割り込みトラップ(割り込み)が使用できるようになっています。
このようにZ280は本格的なマルチタスクを実行できる機能を備えています。
・MMUの機能
Z280のMMUはユーザー/システムの2セット用意されており16bitのアドレスを24bitに拡張しています。
MMUテーブルはアドレス上位4bitで一つ選択され、テーブルの16bitのデータ中、12bitが拡張するアドレス、4bitがMMUのアトリビュート(Write Protect,変換、変更の有無,キャッシュの有無)となります。
また命令実行中にページフォルトが発生すると、その命令は中止されシステム用のスタックに実行アドレスを格納してAccess Violation Trapを発生させます。OSはTrapが発生したらMMU Master Control Registerでどのページで発生したかを確認しMMUテーブルを書き換えた後、ページフォルトを発生させた命令を再実行させます。
この様に6809+MMUの様な簡易的なアドレス拡張ではなく本格的な仮想記憶の機能を備えています。
・拡張された命令
Z280で拡張された主だった命令を見ていきます。
Z280ではZ80とオブジェクトコンパチブルにするためZ80の未定義領域に命令を追加しています。
アドレッシングモードの拡張
アドレッシングモードではPC(プログラムカウンタ)相対とSP(スタックポインタ)相対が追加されています。
PC相対アドレッシングは16bitまで指定でき6809の様なリロケータブルなプログラムの作成が可能となっています。
SP相対アドレッシングではスタックポインタに積んだデータのアクセスが簡単に行える様になりました。このアドレッシングが追加されたのはOSのカーネルがトラップ発生時にスタックの情報を簡単取り扱える様にする為でしょう。
16bitロード命令
HL,IX,IYレジスタが16bitのポインタとしてメモリアクセスができる便利な命令が追加されています。
- LDW (addr),nn
addrに指定したメモリに16bitの直値nnを代入する - LDW <addr>,nn
実行した命令からaddrを加算したアドレスに直値nnを代入する - LDW HL,(IX or IY or HL+dd)
IX,IY,HLレジスタにdd(16bit)を加算したアドレスの値をHLレジスタに代入する - LDW IX or IY,(IX or IY or HL+dd)
IX,IY,HLレジスタにdd(16bit)を加算したアドレスの値をIX,IYレジスタに代入する - LDW HL,(HL+IX or HL+IY or IX+IY)
HL+IX or HL+IY or IX+IYの演算した結果のアドレスの値をHLレジスタに代入する。 - LDW IX or IY,(HL+IX or HL+IY or IX+IY)
HL+IX or HL+IY or IX+IYの演算した結果のアドレスの値をIX or IYレジスタに代入する。 - LDW HL,<addr>
実行した命令のアドレスにaddrを加算したアドレスの値をHLに代入する - LDW IX or IY,<addr>
実行した命令のアドレスaddrを加算したアドレスの値をIXまたはIYに代入する - LDW HL,(SP+dd)
スタックポインタの値からdd(16bit)を加算したアドレスの値をHLに代入する - LDW IX or IY,(SP+dd)
スタックポインタの値からdd(16bit)を加算したアドレスの値をIXまたはIYに代入する
以降は上記のsrcとdistが逆の命令です。
- LDW HL,(HL+IX) LDW HL,(HL+IY) LDW HL,(IX+IY)
- LDW IX or IY,(HL+IX) LDW IX or IY,(HL+IY) LDW IX or IY,(IX+IY)
- LDW (IX or IY or HL+dd),HL
- LDW (IX or IY or HL+dd),IX or IY
- LDW <addr>,HL
- LDW <addr>,IX or IY
- LDW (SP+dd),HL
- LDW (SP+dd),IX or IY
- LDW (HL+IX),HL LDW (HL+IY),HL LDW (IX+IY),HL
- LDW (HL+IX),IX or IY LDW (HL+IY),IX or IY LDW (IX+IY),IX or IY
乗除算命令
8bitまたは16bitの乗除算命令が追加されています。
8bit Aレジスタとソース(レジスタ、メモリ)の乗算結果をHLレジスタに代入します。符号付きと符号なし(MULTU)があり。
使用例)
- レジスタ間
MULT A,C - IX,IYレジスタ間
MULT A,IX(high byte or low byte) - レジスタ間接
MULT A,(HL) - メモリ
MULT A,(5000H) - 直値
MULT A,76H - PC相対
MULT A,<120H>
16bit HLレジスタとソースレジスタ、メモリ)の乗算結果をDEHLレジスタに代入します。符号付きと符号なし(MULTUW)があり。
使用例)
- レジスタ間
MULTW HL,DE - メモリ
MULTW HL,(4000H) - 直値
MULTW HL,1234H - IX,IYレジスタ間
MULTW HL,(IY+4H) - レジスタ間接
MULTW HL,(HL) - PC相対
MULTW HL,<30H>
32bit DEHLレジスタとソースレジスタ、メモリ)の除算結果をDEHLレジスタに代入します。
演算結果が16bit未満の時はHLに商をDEに余りを格納します。
演算結果が16bitを超える時はDEHLは変更せずOverFlow flagを1にして除算例外割り込みが発生します。
ゼロで割るとOverFlow flagを1にしてSing flagを0にして除算例外割り込みが発生します。
使用例)
- レジスタ間
DIVW DEHL,BC - メモリ
DIVW DEHL,(4000H) - 直値
DIVW DEHL,1234H - IX,IYレジスタ間
DIVW DEHL,(IY+4H) - レジスタ間接
DIVW DEHL,(HL) - PC相対
DIVW DEHL,<30H>
乗算と同様に8bitの除算と符号なしの除算もできます。
8bit時はHLレジスタの値をソースレジスタやメモリの値で除算し商をAレジスタ、Lレジスタに余りが格納されます。
16bitのINC,DEC
対象のメモリ16bitのデータに対してインクリメント、デクリメントができる様になりました。2byteメモリデータの+1.-1が1命令でできます。
Z80の時の様に
- LD HL,(addr)
- INC HL
- LD (addr),HL
のようにしなくても良くなっています。またIX,IYレジスタのインクリメント、デクリメントも追加されています。
使用例)
INCW (HL)
INCW (2000H)
DECW (IX+20H)
DECW <0400H>
INCW IX
DECW IY
JUMP,CALLの相対アドレッシング対応
Z80では相対JUMP命令は8bitでしたが、Z280ではJUMP,CALL命令が16bitのPC相対アドレッシングに対応したことによりどのアドレスからも実行できるプログラムが作成できる様になりました。
使用例)
- 条件付きジャンプ
JP NZ,<label1> - 無条件ジャンプ
JP <label2> - 条件付きサブルーチ実行
CALL C,<label3> - 無条件サブルーチン実行
CALL <label4>
16bit COMPARE命令
Z80ではAレジスタとの8bitの比較でしたがZ280ではHLレジスタとの16bitの比較ができるようになりました。
使用例)
- レジスタとの比較
CPW HL,BC - IX,IYレジスタとの比較
CPW HL,IY - 直値との比較
CPW HL,1234H - メモリとの比較
CPW HL,(6000H) - IX,IYレジスタ間接アドレスの値との比較
CPW HL,(IX+300H) - PC相対アドレスの値との比較
CPW HL,<200H>
加算、減算
Aレジスタを使用した8bitの加減算ではZ280の新規アドレッシングモードが追加されています。
使用例)
PC相対アドレスの値との加算
ADC A,<400H>
またフラグ無し16bitの加減算では新規アドレッシングモードの追加の他に直値の演算が可能になっています。
例) HLレジスタに1234Hを加算
ADDW HL,1234H
とりあえず目についた追加命令は以上です。総じてZ80で不足していたレジスタやメモリの操作が充実しています。
Z80がAレジスタを中心に8bitの処理を行うCPUとすれば、Z280はHLレジスタを中心に16bitの処理を行うCPUといえるでしょう。
Z80では実行ステート数が増える為、高速化のため避けていたインデックスレジスタIX,IYの使用もバスの16bit化とキャッシュ+パイプラインが実装されたことにより積極的に使えます。キャッシュやパイプラインを意識したコンパイラを使用すればZ80Aの5-10倍の処理能力がありそうです。
以上のようにZ280は8bitCPUとしては非常に強力なものとなっていますがリリース時期が遅すぎました。おそらくチップの仕様から見てザイログ社はZ280を通信、印刷をマルチタスクで実行する必要があるネット端末の様な組み込み用に利用されること考えていたのではないでしょうか。