CPU実験室

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

バスデータ解析

ここのところ動作が不調でプロジェクトが停滞していますが、やはりどうも動きが変です。

まず、今実行しているテストコードをあらためて示すとこうなります

f:id:O3I:20191221212133j:plain

期待する動きはパラレルLEDに0x55からはじまって0x56,0x57・・・0xFF,0x00・・とインクリメントするはずなのですが実際に実行すると0x55と0xABを交互に出力しているようです。(実行中にリセットボタンを押すとほぼ50%の確率で0x55か0xABとなる)

このコードを4つのROMへアサインすると

f:id:O3I:20191221213257j:plain

ループに含まれる3つのコードmovb、addqb、jump命令がこのように割付けられます。各命令の先頭が32ビット境界(.align4)にないのはなんかイヤですがNS32000シリーズはそれでも実行できるようです

この状態で全バスラインの動きをロジアナに取り込んでみました。本当にCPUに読み込まれる信号を取得するためにバスバッファよりCPU側のバスでサンプルしています。サンプルできるのは一度に16chのみなのでトリガ位置を合わせて切り貼りしています。

f:id:O3I:20191221212007j:plain

 

読込み信号/RDの立ち上がりでステートを切り分けると各アドレス状態でROMに焼きこまれたデータがそっくりそのままバスに乗っていることがわかります。アドレスの変化もいったんJump命令の次のプリフェッチアドレス0x14まで到達しますが直後に飛び先の0x06になってるのでこれも問題なさそう。

気になるところは/RD信号が割れていて変なステートが紛れ込んでいるところですがこれがフェッチ・実行されているかはわかりません。

そもそもLEDに繰返し出力される0x55と0xABの関係を見てみると、

   0x55 xor not(0x01)= 0xAB

   0xAB xor not(0x01)= 0x55

であってインクリメントでは決してないですが規則的な演算を繰り返していることは確かです。

インストラクションの扱いでなにか根本的な勘違いしているかも・・という気もしてきました