CPU実験室

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

プログラムリロケート

ボードをテスト治具に接続し安定したデバッグ環境になりました。消費電流は意外に小さくこの程度です。

f:id:O3I:20210710093427j:plain

モニタのLOADコマンドはシリアル入力からボード上のプログラムメモリ0x800番地・・・これは外付け拡張したSRAMが有効になる先頭番地・・に配置するようにしています。DSP内蔵メモリと外付けメモリのアドレスは連続で境目はないのですが一応モニタとユーザプログラムの区別としています。

このためユーザプログラムの先頭での.MODULEディレクティブによるセクション指示が変わります。

f:id:O3I:20210710094002j:plain

このプログラムはプログラム空間に埋め込んだ2個の文字列MSG1,MSG2を出力するだけの簡単な処理です。文字列出力はすでにモニタプログラムでも実績のあるルーチンで1発OKと思ったのですが何故かMSG1(* string 1 *)だけ出力して終わってしまうという不思議な挙動をします。

文字列領域は256バイトと大きなエリアを確保して先頭の十数バイトしか初期化はしてないのですが先頭アドレスが合っていれば表示できるはずなのですが。

 

ビルド時のマップファイルを見てみるとコードの後に256バイトの領域が2個ちゃんと確保されていて、アドレス参照も問題なくできそうです。

f:id:O3I:20210710093547j:plain

 

ところが最終的にボードに転送するバイナリファイルを見てみるとなんか変です。

まずマップファイルから見ると生成されたコードは573ワード(573*3=1719バイト)のはずですがバイナリファイルは300バイト足らずしかありません。

f:id:O3I:20210710093516j:plain

文字列の最初の文字(*:’002A00’)のアドレスを見ると1個目は0xB7・・・メモリ展開後は0x800+0xB7/3=0x83DでこれはMSG1と同じなのでこれはたしかに表示されたわけです。

一方2個目は0xE7にあり、メモリ上アドレスは0x800+0xE7/3=0x84DになるのでこれをMSG2(0x93D)で呼ぼうとしても表示しないのは当たり前なのですがどこでおかしくなったか?が問題です。