最強(最恐)のZ80後継機、Rabbit4000のオペコードマップを前々回、前回とみてきた3回目です。今回は、オペコードの第1バイトが0xEDで始まるZ80の拡張命令(i8080に対しての拡張)面です。第1バイトでは命令の移転先を作ったりして殊勝なうさちゃんもED面では手厳しいです。自由自在どころが傍若無人な勢い。
※「うさちゃんと一緒」投稿順indexはこちら
Rabbitシリーズのマニュアルは、販売元のDigi社のページからダウンロードできます。その中の以下マニュアルにオペコードマップが掲載されています。
Rabbit Family of Microprocessor Instruction Reference Manual
以下、自力でオペコードマップを作製しているのは、Z80をどう改造したのか知りたかった、という点につきます。以下凡例のように分類しております。
IO空間に関しては大きく異なるRabbit4000
「80系」の系譜をつぐCPUは、現在のパソコンで使われているx86/x64にいたるまで、メモリ空間と別なIO空間というものをもってきました。今となってはちょっと盲腸的な感じがしないでもないです。i8080の「上位互換」であったZ80もその例外ではなく、IO空間持ってます。
-
- i8080、IO空間は256バイト、Aレジスタを介した直接アドレス指定
- Z80、IO空間は建前256バイト、上記のAレジスタだけでなく他の汎用レジスタの入出力も可能になった。Cレジスタ間接アドレシングが追加され、そのアドレシングを使ったときにBレジスタの内容が外部に「漏れて」くるので実質64KバイトのIO空間に拡張可能であった。また、ブロック入出力命令あり。
という感じで、Z80は強力に拡張されていたのが分かります。しかし、うさちゃん、Rabbit4000では、IO空間へのアクセスの方法そのものが根本から変更されてます。IOアクセスは、機種依存であることがほとんどなので、そこの部分は書き換えないとならないのだから良いだろ~という割り切りでしょうか。Rabbit4000では以下のように変更されています。
-
- IO空間は2つ存在する。内部IO空間と外部IO空間
- 通常のメモリアクセス命令に「内部IO空間向け」「外部IO空間向け」のプリフィックス(i8080以来のIO命令のオペコードが使われている)を付与することでIOアクセスが可能
- 内部IO空間は16ビットのアドレス幅でアクセス可能(実装されているレジスタ次第)、外部IO空間も命令的には16ビットアドレスだが、メモリマップ上は64Kの空間内の8Kバイト分に限られる。
これから見るED面には、Z80拡張のIN/OUT命令群が含まれていたのですが、これらは「回収されて」他の目的に再利用されています。
Rabbit4000 ED面オペコードマップ(左半分)
一度に掲げると見ずらいので、左右2面に分けてます。縦が上位4ビット、横が下位4ビットです。もともとED面の上位ニブル 0,1,2,3およびC, D, E, Fには命令がアサインされていなかったので、ここにはRabbit4000独特の命令が大量に定義されています。
まず目立つのが、32ビット幅のインデックスレジスタPW、PX、PY、PZ関係の命令群です。大変充実してます(この面だけでなく、また別の面でもさらに定義されています。)メモリアドレシングはこいつら使え、という意思を感じます。
またZ80で不満の声があった筈の、「裏レジスタ」へのアクセスがし難いという点についても改善が見られます。わざわざ「まとめてレジスタをひっくり返す」ことをしないでも裏レジスタにアクセスできます。
もともとZ80(そしてi8080)でも16ビットの演算はHL中心ということになっていましたが、Rabbit4000はHLを32ビット化したJKHLというレジスタを導入しているので、32ビットの演算もJKHLで可能にしてます。「8ビットCPU」という看板を下ろしたわけではないので限定的ですが、Z80が持たなかった32ビット対応が追加されています。勿論、HLレジスタ中心の16ビット処理も強化されています。
データ幅だけでなく、物理メモリも増えているのでジャンプ系の命令も強化されています。Z80では8ビット幅だった相対ジャンプのディスプレースメントが、16ビットも追加(JRE命令)されていたり、24ビットの空間全てにジャンプ可能なFARジャンプもあるなど強化されています。
Rabbit4000 ED面オペコードマップ(右半分)
右半面の特徴も左と共通ですが、こちらの面で特徴的なのは、右肩にあるCONV系の命令群です。これらは、PW系の32ビットレジスタに論理メモリアドレス(16ビット)を物理メモリアドレス(24ビットまたは20ビット)に変換して載せるための命令群です。通常のZ80命令では16ビット幅の論理アドレスのみなので、直接全ての空間を相手にするときには必要な命令です。なお、CONVCはコード(命令)に対するアドレス変換、CONVDはデータに対する変換です。
また、左面にもありましたが、割り込みのプライオリティ制御とか、拡張されている割り込みテーブル設定など、いろいろ変更されている割り込み関係も存在します。また、Z80には存在しない、ユーザー、スーパバイザモード関係制御などもあり。
ブロック転送関係
ブロック転送系の命令はZ80のi8080に対するアドバンテージとしてもてはやされた「拡張」でした。Rabbit4000では、この部分の違いが大きいです。
-
- 16ビットアドレスを使ったメモリ転送命令(LDDなど)はZ80互換維持
- 32ビットアドレスを使ったメモリ転送命令(COPYなど)を新設
- Z80のブロックIO命令は廃止。その代わりとなる命令(LDISRなど)を新設
- Z80のブロックサーチ(CPIなど)は廃止。
3の廃止は、そもそもIO空間の定義が違うので致し方ないですし、また、同様なことをやろうと思えばできる命令が新設されているので納得です。しかし、4はなんでなんでしょうか。個人的には納得いかないデス。そんなもん、使わん、ということでしょうかね。ここまで「ほぼほぼ上位」方向に拡張してきた中で、穴が空いている部分です。まあ、こういう非対称なところも伝統か?