アセンブル後のバイナリファイルを拙作ツール:Transputer Convergence Correctorで修正しモニタ上で動作させるという一連の開発手順が確立してきました。ところがデバッグを繰り返しているうちどうも変換に失敗し正常に動作しない場合があることに気付きました。
以下は正常に動作しないプログラムの一部を抜粋したものです
80000395番地にある命令:J CMDINは80000281番地のラベルCMDINに戻りジャンプしますが、このときの相対アドレスは飛び先アドレス-ジャンプ命令の次の命令のアドレスなので0x80000281-0x80000397=0xFFFFFEEA、10進表記で-278になります。
ところがアセンブル出力結果はトランスピュータのエンコードで6F/05=nfix #0/J #5、すなわち0xFFFFFF05(-251)と算出されているので明らかに間違いであり、ここはツールでの修正対象になります。
トランスピュータは相対アドレスの範囲により語長が可変長なのアセンブラは最適化で範囲が収まる最小語長でエンコードしますが自身が-251と思っているので2語長でコード生成してしまってます
(語長8のときの挙動は自信無し)
本当の-278を埋め込むためには最低3語長必要であり、今のツールの修正方法、現状のバイナリに上書きパッチをする、では対応できないことがわかります。(挿入してしまうとその後のアドレスが全部くるって収拾付かなくなるので)
とりあえず修正された相対アドレスが元の語長に収まらない場合はエラー停止するようにツールを修正しました。
これはアドレス計算の間違えが語長境界をまたいでしまう場合であって稀な現象かもしれません。またアドレス計算の間違えは前方前方にズレる傾向なので語長が大きくなる分には冗長になりますがアドレスは収まります。後方に戻る負のジャンプがオフセットゼロに近づく場合のみの問題といえそうです