CPU実験室

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

アセンブル結果

出力されたリスティングファイルを見ていきます。

まずトランスピュータはROMブートする場合、最上位アドレス:0x7FFFFFFE番地から実行を開始するとあります。ですがここはアドレス終端まで2バイトしかありませんから置けるのはジャンプ命令、しかも2バイトで完結するコードになるので相対アドレスで±256バイト、つまり

  j   $+255         (is coded as    pfix  #F;   j    #F)

       j   $-256          (is coded as     nfix  #F;  j     #0)

の範囲に限定されます。前方に飛んでも内蔵RAM領域を越えられないので、いったん後方に256バイト戻ってROM内の0x7FFFFF00番地に飛ぶことにします。(ここならばオペランドが長くなっても大丈夫なので)ただしここでもコード領域は残り256バイトしかないため、ここを中継点としてさらにROM先頭:0x7FF80000番地へ大ジャンプさせます。

f:id:O3I:20211016154038j:plain

いちばん最初、テストのつもりで2回目の飛び先を外部RAMの先頭アドレス:0x00000000番地としたところ、アセンブル開始後なかなか終わらずTmasm.exe自体がフリーズしたのか?と思ったのですが十数秒後コマンドプロンプトに戻ってきたら、なんとHDD上に2Gbyteのバイナリファイルが出来上がってました。ちゃんと0x00000000~0x7FFFFFFFを埋めるファイルをコツコツと作ってくれたようです。

つづいてイミディエイトデータ部分の拡張の様子です。4ビット~32ビットについてはあらかじめ調べた通りpfix命令で拡張しています。

f:id:O3I:20211016154056j:plain

負数については-310xFFFFFFE1は同値のためアセンブラが最適化してnfix命令で同じコードを生成しました。

さらにコード拡張の様子を見るとopr命令、pfix命令で想定通りに展開されました。

f:id:O3I:20211022075519j:plain

 

ちょっと予想と違ったのはfpentry命令によるセレクターシーケンスです。これはアセンブラの仕様ということになりますがldc fpuabsの行はコードが生成されず、エラーすら出ていません。ここはfpuabsと直接コードを書くだけで全てのコードが展開されています。

ということでpfix,nfix,opr,fpentry命令は明示的に使わなくても良い、みたいです