うさちゃんと一緒(20) Z80の魔改造?Rabbit4000のオペコードマップその2

Joseph Halfmoon

前回は、Rabbit4000の、Z80「魔改造」第1バイトのオペコードマップを眺めてみました。しかしZ80にはDD、FDなどの第1バイトによって「拡張」されるオペコードマップも存在します。Rabbit4000の場合、DD,FD系も期待に違わぬ大拡張です。ただしここではZ80の元の命令には手は加えてません。

オペコードマップの凡例

Rabbitシリーズのマニュアルは、販売元のDigi社のページからダウンロードできます。その中の以下マニュアルにオペコードマップが掲載されています。

Rabbit Family of Microprocessor Instruction Reference Manual

しかし、以下、自力でオペコードマップを作製しているのは、Z80をどう改造したのか知りたかった、という点につきます。現状、オペコードマップを作製しながら以下の凡例のように分類しております。オレンジ色系の2つとピンク色分類が、Rabbit4000の「拡張命令」部分であります。OpcodeMapLegend

Z80のDD、FDバイトのおさらい

Z80の場合、ファーストバイトの256個のオペコードは「使い切っており」いくつかのファーストバイトに続く2バイト目をオペコードとして使って命令数を増やしています(Z80の元になったi8080に対して。)その中で、第1バイト、0xDDおよび0xFDは分かり易い拡張となっています。

    • 0xDDはIXレジスタ用
    • 0xFDはIYレジスタ用

i8080では存在せず、Z80で新設されたIX、IYレジスタを使う命令群がDDとFDの実体です。また、新設の仕方もまずまず分かり易いです。

    • 第1バイトのオペコードマップでHLレジスタを使った命令と「同じ場所(エンコード)」にHLの代わりにIXまたはIYを使った命令を置く
    • メモリアクセスを伴う命令には、すべて1バイトのディスプレースメントを付与する(第1バイトのHL命令ではディスプレースメント無の単純レジスタ間接)
    • ローテイト、ビット操作系についてはさらに第3バイトのオペコードマップを使用

i8080の場合、メモリアクセスというとHLレジスタペアにメモリアドレスを置いて行う方法がメインでした。補助的にBC、DEペアも使えるとは言え制限が多いので、HLは大忙しとなります。また、当時ライバル関係だった「68系一派」からは、80系は「インデックスアドレシングが無い」などとディスられてもいました。それに答えてZ80では、IX,IYという「インデックス・レジスタ」を追加したというわけです。

Rabbit4000のDDオペコードマップ

一度に掲げると見ずらいので、左右2面に分けてます。縦が上位4ビット、横が下位4ビットです。左面での拡張はわずかですが重要なものが含まれています。DDL

Z80ではこのDD面は、IXレジスタに捧げられていましたが、Rabbit4000では、IXだけでなくBCDEレジスタ(32ビット幅)と共用となっています。右面で大量に目にすることになるBCDE操作のうちPUSH/POPがこちらにあります。また、Rabbit4000は物理メモリ空間を拡張しているので、20ビットアドレス空間に直接アクセス可能なLDP命令も置かれています。またZ80では不在であったSPレジスタにディスプレースメントを加えるスタイルのアドレシングも追加されています。

続いて右面です。こちらは32ビットのBCDEレジスタ関係が大量に定義されています。BCDEレジスタのロード、ストアのために何気にPW, PX, PY, PZなどの32ビット長のRabbit4000新設インデックスレジスタ群も使われています。これらの命令は論理アドレスでも直接物理アドレスでも動作する「仕様」です。そのマジックが以下に

    • 0xFFFFxxxx は論理アドレスxxxxと解釈
    • 0x00yyyyyy は20ビットまたは24ビットの物理アドレスと解釈

この辺も「アクセスできればOK」的なRabbit的割り切りかと思います。

またよくみるとこの面にIYレジスタをアドレシングに使う命令が紛れこんでいます。これは記載誤りではなく、BCDEレジスタ操作にIYと使う場合はDD面ということだと思います。

また、CALL (IX)とか、BOOL IXとか、Z80になかったIXレジスタ関連の操作も強化されとります。DDR

第2オペコードバイト 0xCBにつづく部分には、IXレジスタを使用するローテイト、シフト系およびビット操作系の命令が置かれています。この部分についてはZ80と完全コンパチです。なお、ここは第3バイトがディスプレースメント固定で、第4バイトに第3オペコードが来るというちょっと変わった(しかしZ80的にはディスプレースメントは常に第3バイトにあるのだ、という原則を堅持)エンコードになっています。DDCB

Rabbit4000のFDオペコードマップ

基本の考え方はDDと一緒ですが、レジスタが異なります。

    • 16ビットインデックスレジスタは IY(DD面ではIX)
    • 32ビットレジスタはJKHL(DD面ではBCDE)

JKHLのJKは、Z80のBCDEHLのレジスタに加えてRabbitで追加されたレジスタです。

まずは左面FDL

続いて右面FDR

さらに FD-CB面FDCB

ついでに第1オペコードCB面

先にDD-CB面、FD-CB面を掲げてみましたが、ファーストバイトのCBこそ、本家的な立ち位置?にあります。BCDEHLそして(HL)とAを対象にしたローテイトシフト系、そしてビット操作系の命令がここに格納されています。この面はZ80完全互換です。

なおメモリアクセス(HL)がここに入っていますが、古のi8080では、(HL)はMと呼ばれて実体はメモリなのに「レジスタ扱い」する習慣でした。8ビットレジスタはBCDEHLMAという順番であったと。CB

これでオペコードマップ終わりかというとまだ手ごわいのが2面あるのです。もう1回だな。うさちゃん、命令拡張しすぎ。

うさちゃんと一緒(19) Z80の魔改造?Rabbit4000のオペコードマップその1 へ戻る

うさちゃんと一緒(21) Z80の魔改造?Rabbit4000のオペコードマップその3 へ続く