CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

間接アドレッシング

バイト演算も1ビットごとにばらしてビット演算を繰り返せば実現可能であることは容易にわかります。8ビットCPUに比べ同クロックで単純に8倍時間がかかるかもしれませんが。レジスタ間であればAND,OR,XOR,NOTといった論理演算SHR,SHL,ROTなどのシフト演算、ADD,SUB,MULなどの算術演算も実装できるでしょう。SUBができれば比較CMPもでき、既存のスキップ命令SKZと組み合わせれば条件分岐ができるはずです。

従来のCPUでできていたプログラミングをどのように移植できるか、いろいろ試していたのですが悩んだのが間接アドレッシングでした。

例えば以下のようなプログラムのLD C,(A)に当たる部分でテーブルデータ参照とか7セグデコーダとか絶対必要な処理です。

f:id:O3I:20210422221501j:plain

問題なのはレジスタの内容を単なるビットパタンではなく本当に「数値」としてみなければならないこと、データ領域にある数値を実効アドレス=コードとして処理しなければならないこと。ということになります。特に後者はアーキテクチャ的に普通は「できない」となってしまいます。

 

それでも無理くりコーディングしたらこんな感じになりました。Aレジスタに入った値をビットパタンでみて2分木で全分岐先をデコードし、それぞれ所定のテーブル値を持ち帰ってくるという力技です。もちろんAレジスタの任意の値に応答するのは無理なんで下位4ビット分0~15のみです。

f:id:O3I:20210422221515j:plain

これで一応動作しました。ただしたったこれだけのことをするのにメイン・サブルーチン、データテーブル合わせて396wordものコーディングになってます