CPU実験室

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

多ビット演算

サブルーチンが使えるようになりメモリアクセスの問題も解決したので少し長いプログラムを書いてみました。

MC14500はもともとリレー制御の代替なので数点のセンサ入力と数点の接点出力が制御できればいいわけですが、あえて「数値」を扱う方法を考えてみます。このプロジェクトの最初のころに数のインクリメントはやってみましたが、それを一般化してみます。

例題としてはこのような感じ。Z80風のニーモニックで書きましたがレジスタ内容を加算してパラレルのLEDに出力するLチカテストです。

f:id:O3I:20210418084241j:plain

8ビットCPUで書けばこのように数行で済んでしまいますが、これをMC14500でやったらどうなるか、ということです。

先ずはレジスタですがMC14500のデータ幅は1ビットしかないので例えば8ビット幅レジスタをつくるにはビットをばらしてデータメモリ上の8アドレスへ割り付けることになります。そのほか使いそうなワーキングレジスタ(ビット)も定義しておきます

f:id:O3I:20210418084705j:plain

OUT命令は簡単。レジスタ内容を1ビットづつLEDがつながっているI/Oアドレスへコピーするだけです。困るのがLD A,0といったレジスタへの即値代入で、ハーバードアーキテクチャのためコード領域にデータが書けず、レジスタ経由で渡せたとしても「1ビット」なので、あらかじめLD A,0LD A,1、・・・・LD A,255とすべてのパタンを用意しておき名前で呼び出す必要があります。もっとも必要なものだけつくればいいのでここら辺はコンパイラの仕事ですね

f:id:O3I:20210418084731j:plain

つぎは加算処理です。当然ADD命令なんてないのでANDXORの論理演算によって加算器を構成します。

まず半加算器HADDRをつくり全加算器FADDRは半加算器をサブルーチンとして呼び出します。これだけの長さでやっと加算ができますがあくまでもこれは1ビット分です。8ビットレジスタ同士の数値演算はこれを8回呼び出す必要があります

f:id:O3I:20210418083647j:plain