CPU実験室

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

エラー対策

正しい相対アドレスが既存の語長に収まらない時はどうするか・・ですが対策として無駄なコードを挿入して境界を跨がないようにするしかありません。以下は文字列入力ルーチンSTRINで発生したエラー対策の具体例です

左列は元のソースをそのままアセンブルした状態で最終行J STRIN08000044E-8000048A=FFFFFFC5(-59)の相対アドレスをオペランドで持たなければなりませんが実際には+7と誤認し1バイトコード07=J #7を生成してしまっています。ここで「DB 0」の無駄コードを適当に10個挿入してアセンブルしたのが右列です

最終行J STRIN080000450-80000497=FFFFFFB9(-71)となるべきところが依然間違っていますが2バイトコード60/0E=nfix #F/J #Eが生成されるのでパッチを埋込むエリアは確保できたことになります

この「DB 0」の詰め物は無条件ジャンプ/RET~次のラベルの間であれば実行されるわけではないので、ルーチンの処理速度には影響はなく値自体も何でもいいということになります。

どうしても実行される部分に無駄コードを挿入しなければならない時はNOP相当のコードである必要がありますが、トランスピュータのインストラクションセットにはまたしてもNOPが無いようです。ただ無条件ジャンプの飛び先相対アドレスは次の命令のアドレスが基準になるのでコード「J 0」は何もしないで次の命令に移行するだけ、NOP相当の動作となります。しかもこれのエンコードはうまい具合に「00」の1バイトコードなのでZ80NOPと同じです。もっともこれは偶然そうなったのではなくそのように設計されているわけで、マニュアルを見るとそれに触れています。尚且つ「J 0」は特殊な意味を持っていてイベントを発生させてブレークポイントに使えるとあります