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

Joseph Halfmoon

最強?のZ80後継機、Rabbit4000のオペコードマップを見てきましたが、ようやく完結です。今回はオペコードの第1バイトが0x6Dで始まるRabbit4000独自命令の面です。この面は「しがらみ」が無い分うさちゃんの「意思」がありあり。この面の全命令のニーモニックはLDなのですが、実は転送だけでもない、と。

※Rabbitシリーズのマニュアルは、販売元のDigi社のページからダウンロードできます。

オペコードマップ初回で見ましたが、うさちゃんはZ80の第1バイト・オペコードの中、かなりな「広さ」を占めていた、遠いご先祖から継承してきた古い8ビットの命令群をごっそり移転させて跡地に独自命令を打ち立ててます。たとえていえば、古い時代の平屋が多くを占めていた市の中心部を丸ごと移転し、「地上げ」でできた跡地に高層ビルを建てたようなものです。その移転先として、移転跡地の0x7Fを第1バイトとする第2バイトの1面を割り当ててます。大胆だな。

しかし第2バイトの拡張面を新設するのに使ったのは0x7Fだけではないです。もう一つ、0x6Dも使ってます。こちらの0x6Dは「ほぼほぼRabbit4000の新設命令」に割り当ててます。

なお以下のオペコードマップでは以下の色で命令の互換/新設等を表しています。OpcodeMapLegend

第1バイト0x6D左面

縦が上位4ビット、横が下位4ビットです。一度に掲げると見ずらいので、左右2面に分けてます。こちらは左面。

びっしりとLD命令が並んでいます。全ての命令がRabbit4000の持つ(Z80にはない)32ビットのインデックスレジスタ PW, PX, PY, PZの4本(Z80の伝統にもとづきこれらにも裏レジスタがあるので実は8本)関係です。これをみるとちょこっと32ビットレジスタを拡張した、というよりは、メモリアクセスにはこいつらを使えよ、という強い意志を感じる大盤振る舞いです。

LOW側0,1,2,3の列を占める命令群のうち、(PW+d)をオペランドに持つものは、インデックスレジスタPWにディスプレースメントdを足してメモリアドレスとした、(PW+HL)はインデックスレジスタPWにHLを足してメモリアドレスとしたメモリアクセス命令です。後者の方は、PW=ベース、HL=インデックスと理解すると、x86のベース+インデックス・アドレシングに近いアドレシングモードです。

一方、LOW側4,5,6の列は、2つのレジスタ間の加算結果をPW、PX、PY、PZに「ロード」する命令です。LD、LDなので全てが転送命令と思いきや、そうではないことが分かります。実体は加算命令。オペランドの片方はPW、PX、PY、PZの32ビットレジスタ、片方はIX、IY、DEという16ビットレジスタです。これを見たら分かるとおりデータの加算というより、アドレス計算のための命令群です。

またLOW側7の列は、PW、PX、PY、PZ間の32ビット幅の転送命令です。6Dleft

 

第1バイト0x6D右面

以下は右面のメモリマップです。6Dright

まず目を引くのが、LOW型Dの列とFの列の LD L, L と LD A, Aです。もともとZ80では第1オペコードのこの位置にあった8ビットレジスタ間の転送命令です。ただしソース、デスティネーションが同じなのでNOPと同様な意味しかない奴らです(Z80にはNOP命令が存在するので、これらをNOPに転用することはまず無いと思います。)

第1オペコードバイトでも、「移転対象」地域の中で LD E, E 命令が残ってましたが、それとは違うようです。LD E, Eの場合は、無害なオペコードを逆手にとり、Rabbit4000の持つユーザー/システムのモード切替に使ってました(特権モードでは無害なLD E, Eが、非特権モードではクリティカルな割り込みを起こすIDET命令と解釈される。)こちらの面では、LD L, LとLD A, Aの場所を見ればそれらの意味が推測できます。

    • LD L, L   0x6D
    • LD A, A  0x7F

どちらもうさちゃんで新設された拡張面に行くための第1オペコードと同じです。インストラクションデコーダのなんらかの「理由」でそのオペコードが第2面にも「イメージ」がでているだけのようです。なお、今回の0x6D面でなく、以前にやった0x7F面の方にも LD L, L、LD A, A が存在します。普通は0x7F面の方を使うと思うので、0x6D面の命令は「エイリアス」とでもいうべきものだと思います。

右面の新設命令群は左面と似ています。しかし、左面が16ビット・データ幅のロードストアであったことに対して、右面は32ビット・データ幅だ、という点が異なります。また左面のアドレス計算命令で「足りなかった」PW+dとか、PW+HLは右面に存在します。

8ビットCPUといいつつ、32ビット幅のレジスタ使ったアドレシング(物理メモリ的には20ビットまたは24ビット)が強力なうさちゃんでした。

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

うさちゃんと一緒(23) Z80の魔改造?Rabbit4000でアセンブラしてみる へ続く