CPU実験室

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

固定データ領域

テストプログラムのコンパイル結果も問題なく動くので周辺I/Oの確認をしながらライブラリを作っていこうと思いこんなプログラムを書いてみました

putcom():シリアルからの1文字出力。内蔵レジスタを直接叩くのでインラインアセンブラで記述

putstr():シリアルからの文字列出力。文字列先頭アドレスからNULL文字までputcom()を呼ぶ

ここらへんの関数は他のCPUボードでも問題なく動作している部分です

なんですがputstr()の引数に文字列を与えたテストプログラムを実行しても何も表示せず終わってしまいます。

そこでアセンブリ中間ファイルを見てみると引数の文字列はYデータ空間に埋め込まれていることがわかりました

これは考えれば至極当然です。プログラム空間とデータ空間が分離しているDSPではデータはデータ空間を参照しようとするわけで、データをロードしていないYデータ空間は0かゴミしか入ってません。

データをプログラム空間に配置できないかとコンパイルオプションを探してみましたがそれは無いようで、#pragma構文で初期化済データブロックをコードに埋め込む指示はできますが参照は依然としてデータ空間なのでうまくいきません。

結局手間はかかりますがプログラムファイルのロードに続いてデータファイルのロードをしてやれば正常に動作します

ただしYデータ空間の$100-$1FFはROMなのでリンケージコントロールファイルでメモリ開始番地を”BASE P:$0000,Y:$0200”で明示しておく必要があります