めざせ4004! IC24個で電卓用CPUを作ってみた: Chapter 2-4 インデックスレジスタのビット幅
インデックスレジスタを搭載するにあたり、いくつか検討すべき項目があります。特にビット幅はインデックスレジスタの用途をほぼ確定してしまうので、慎重に設計する必要があります。
Intel 4004など、ほとんどのCPUではインデックスレジスタのビット幅はRAMアドレスのビット幅に合わせてありますが、一部には例外もあります。例えばMOS 6502にはXとYという2本のインデックスレジスタがありますが、これらは両方とも8ビットしかありません。アドレスの幅は16ビットなので半分しかありません。
これは思想の問題です。詳細な説明は省きますがMOS 6502では配列を使う場合に最適な構造になっています[1]。
図6をご覧ください。MOS 6502のアブソリュート・インデックスXモードを用いてRAM上のアドレスを計算する様子を示しています。
配列cxの先頭アドレスである0x0010番地をアブソリュート・インデックスXモードの定数として指定し、配列の添え字はインデックスレジスタXとして指定します。ここでインデックスレジスタXの内容が1だとすると、自動的に0x0010とインデックスレジスタXの内容である1とを加算し、目的のアドレスである0x0011番地が決まります。 これはまさに前節で述べた配列の場合に相当します。
逆にポインタはMOS 6502は不得意です。インデックスレジスタが8ビットしかないため、そのままではRAM全体を自由に指し示すことができないからです。解決策としてRAM上に16ビットのポインタを配置して間接参照を行う機能が用意されていますが、使いこなすには慣れが必要ですし、速度の点でも疑問符が付きます。MC6809でアセンブラを学んだ筆者にとっては使いにくいです。
結論として、今回制作するEX4-2024では無理をせず、素直にRAMアドレスと同じビット幅のインデックスレジスタを搭載することにします。RAMの容量が256語なので、アドレスは8ビットとなり、インデクスレジスタも8ビット幅とします。 欠点として、ビット幅がインデックスレジスタとアキュムレーターとで異なってしまうため、両者間でのデータ転送が出来なくなり、インデックスレジスタ使用時の柔軟性が足りないという問題が発生します。これについては後述します。
[1] もちろん配列以外に適したモードもあります。