めざせ4004! IC24個で電卓用CPUを作ってみた: Chapter 2-5 インデックスレジスタのオフセット

 オフセットとは、RAMアドレスを計算する際にインデックスレジスタに加算する定数値のことです。近年のx86系ではディスプレイスメントと呼ばれます。配列の場合と異なり、オフセットと言う呼び方をした場合、定数値のビット幅はインデックスレジスタよりも小さいことが多いです。ちょうど前述の構造体のポインタの場合に相当します。またC言語のauto変数とかJavaのオブジェクトなど様々なシチュエーションで使われます。詳しく見ていきましょう。

 例えばZ80のインデックスレジスタIXとIYには8ビットのオフセット値を加算することが出来ます。

 図7をご覧ください。インデックスレジスタIXに構造体sxの先頭アドレスである0x0010が格納されているとします。この状態でオフセットに0x01を指定すると、IXの値とオフセットとが加算され、0x0011が目的のアドレスとなります。

 では、Z80のオフセットはなぜ8ビットの幅しか無いのでしょうか?

 これもMOS 6502と同様に、思想の問題です。Z80の設計者は必要ないと判断したと言うことです。 当時の半導体技術では16ビットの加算を1クロックで実行できませんので、もしオフセットを16ビット幅にしたら8ビットずつ2回の加算で計算する必要があり、命令の実行速度が遅くなってしまいます。また命令のサイズも増えてしまい、さらにCPUの内部回路も複雑になります。

 当時の設計者がそのような問題を避けるのは止むを得ないでしょう。

 では今回制作するEX4-2024ではどうするべきでしょうか。

 そもそも前提として、インデックスレジスタを使ったRAMへの間接参照を考える前に、インデックスレジスタを使わずにRAMにアクセスする状況を検討する方が先です。これは絶対アドレスとか直接アドレスなどと呼ばれ、命令中でRAMのアドレスを直接指定します。

 前述の表3をご覧ください。命令の2バイト目がそのままRAMのアドレス指定になっていることが分かるでしょう。これは絶対アドレスでRAMにアクセスするために必要な仕様です。これにインデックスレジスタを追加するのであれば、命令の2バイト目のアドレス指定をそのまま引き継いだ方が分かりやすいですし、必要となるICの数も少なくなることが予想できます。

 結論としてEX4-2024のインデックスレジスタのオフセットは8ビット幅とします。