CPU実験室

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

Lチカ苦戦中

単純に1づつ増加するデータをパラレル出力するというだけなのですがここのところずっと嵌ってます。同じ動作をするはずのプログラムをいくつか書いてみました。

 

f:id:O3I:20191227222922j:plain

1は現状の書き方。+1のクイック加算でインクリメントしています。

2は通常の加算命令でソースを+1のイミディエイトとしています。実際にはソースを-8~+7の即値にするとアセンブラが勝手に最適化してADDQ命令のコードを生成してしまうので手打ちで直しています

3はソースを+1を代入したレジスタR1にしたものです

これらのどれもがR0がインクリメントせずに0x55と0xABを交互に出力するという謎の動きになってしまいます。増分kを1~7に変えて出力結果をみてみると、

f:id:O3I:20191227225219j:plain

と算術的に増加してほしいところが

f:id:O3I:20191227224951j:plain

と2つの値しかとりません。これはロジック的にみると

f:id:O3I:20191227225648j:plain

という論理演算をしていることになります。(XORでマスクが掛けられているので交互に変化する)加算ADD命令のところを減算SUB命令に置き換えてみると今度は

f:id:O3I:20191227230141j:plain

となりこれは

f:id:O3I:20191227230347j:plain

という演算をしていることになります。

CPUがフェッチしているコードは間違いはないのでこれはもうCPUの算術演算ユニットがイカレているかマイクロコードがバグっているのか・・・ ALUでの加減算がダメだとアドレス計算も影響あるわけで相対アドレスジャンプがおかしいのもそのせいかもしれません