CPU実験室

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

飛び先修正

条件付き分岐CJの飛び先相対アドレスが何か間違っているんじゃ・・となると無条件分岐Jもヤバいのではないかと原始モニタのソースコードから相対ジャンプする行を抜き出してみました。

next Iptrはジャンプ命令の次の命令のインストラクションポインタ、destinationは実際に飛びたいラベルのアドレス、spanはその差、符号付きオフセットを示します。ただしトランスピュータはその差分をそのままオペランドに与えるのではなくpfix/nfix命令で4ビットづつ押し込んでいくという特殊なエンコードをします

こうしてみるとあるアドレスから突然オフセット値がハンドアセンブルの結果と1~2バイトずれ始めているのがわかります(ピンク網掛け)ずれ始める部分にはLOADとかEXECといったルーチンのラベル参照がありこれが影響している可能性があります。

オフセット値は可変長で指示できるので、特に前方参照するときそのアドレスが未解決だと命令長が確定しないということは考えられます。これはアセンブラのリリースノートにも触れられているのですが・・

アセンブル時の画面出力にも未解決前方参照をチェックしている・・というようなメッセージが現れています

このアセンブラにまさかシロウトがすぐ気づくようなバグを抱えているとも考えられず、記述の問題か、何か疑似命令のようなものが要るのかあるいはメモリロケーションが悪いのかさっぱり判りません。

とりあえずバイナリエディタでピンク網掛けのコードをハンドアセンブルした値にポチポチ修正しROM焼き、実行したら無事期待通りの動作になりました