CPU実験室

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

コード見直し

それではためしにディスプレースメントを-1にしたらどうなるかやってみました。

              JUMP *-1

この場合、バイナリコードは[7F/DA/7F/00]となります。

-1がどうして「FF」でなく「7F」かというとNS32000ではディスプレースメントの上位1ビットか2ビットを使ってレンジを決定しています。x86でのnearジャンプ、farジャンプみたいなものでしょう

f:id:O3I:20191110081418j:plain

 

これで実行すると・・・

f:id:O3I:20191110082231j:plain

こんどは/RDだけ変化して/WRはネゲートされたままになります。

しかもアドレスラインは(ROMから見た)A0だけが0/1になるだけで残りビットはすべて0で変化しません。つまりこのプログラムが正常に動作するようになったということです。類似の命令でアドレッシングモードをPC相対ジャンプに特化させたBR(anch)命令でもBR 0[EA/00]はうまくいかずBR -1[EA/7F]ならOKです。

 

ちなみにマニュアルではPC(プログラムカウンタ)の動作説明として

f:id:O3I:20191110083608j:plain

「実行中は最初のインストラクションがあるアドレスを保持していて実行完了後に初めて次のインストラクションへインクリメントする」とありますからアセンブラの出力が正しいように思えますので実際の動きがなんか不思議です

一方、アドレッシングモードをabsolute(絶対アドレス)とした

      JUMP @x'000000   [7F/AA/00

で強制的に先頭アドレスに戻る方法ではうまくいってます。

 

いずれの場合でも1ダブルワード内のプログラムなので先頭アドレスに1バイトのコードを書き込んだROMをとっかえひっかえして動作確認していて、ROMがパズルピースのような有様になってます

f:id:O3I:20191110085058j:plain