CPU実験室

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

ブート処理

リンク先ボードのメモリに読み書きができたので今度はそのボード上でプログラムの実行を指示する必要があります。

リセット後最初に受け取る制御コードが0x00のときはPOKE0x01のときはPEEKでしたが1より大きい(2以上)ときは続くコードを制御コードの数だけMemStart(=0x8000070番地)からセットして先頭から実行するとあります

ということはブートのために転送できるプログラムは255byte以下に制限されてしまう・・となりそうですが本当に実行させたいユーザプログラムの本体はPOKEコマンドでボード上の任意のアドレスにあらかじめ転送しておき(メモリ上限までサイズは制限なし)、ブート用プログラムはユーザプログラムの先頭番地に飛ぶだけのものにしておけばOKそうです

具体的なメモリマップはこのようにしました。

先ず①DLLではPOKEコマンドを使ってtransputer2ボード上の外付けメモリの先頭番地0x00000000からユーザプログラムを転送しておきます。次に②BOOT0x80000070番地から0x00000000番地にジャンプするコード列を転送、転送完了と同時に自動的にコード③JUMPが実行されてユーザプログラムの先頭に制御が移ります

もちろんユーザプログラムの格納場所をオンチップRAMにしておけば外付けRAMも必要なくなりCPUだけがびっしり並んだボードも実現できますが、プログラムが4kB以下に制限されることとリロケーションアドレスを0x00000000にしておけばROMモニタでロードするバイナリと共用できるメリットもあります

ブート処理を組み立てるためにまず「J 0x00000000」のコードをアセンブルしておきます。「0x27,0x2f,0x2f,0x2f,0x2f,0x2f,0x28,0x08」の8バイトのコードが得られました

一気に約2GBの空間を跳躍するのでオフセットが大きくなります