コンパイルはできるようになりましたが、一つ問題があります。最初に実行されるmain()関数は必ずしもコードの先頭にはならず、プログラム次第で実行開始アドレスが変わってしまうことです。固定データや前方参照されるサブルーチン含む場合にそうなりますが、それを防ぐため必ずコードの先頭に配置される自前のスタートアップルーチンを用意しました。
スタートアップルーチンstart.asmの内容はこれだけでユーザプログラム本体の_mainを呼んでいるだけです
START.ASM
完全にROM化してスタンドアロンで動作させる場合はここでスタックポインタの初期化もすればいいのですが、今回はモニタの動作環境を継承するので何もすることはありません。
これもアセンブルしてstart.oを生成しておきます。
ns32k-pc532-netbsd-as -a -R start.asm >start.lst
START.LST
ユーザプログラムの本体をmain()でなく_main()、内部表現では__mainとしているのはこれと同じ理由です。単なるmainという名前の関数は特別な意味を持っていて必ず標準スタートアップルーチンcrt0.oに含まれるコンストラクタ__main()を呼ぼうとしてしまうからです。
自前のスタートアップルーチン、ユーザプログラムのオブジェクトができたので、この順番でリンク、実行アドレスの0xf80000にリロケート、バイナリ出力をリンカへ指示します。
ns32k-pc532-netbsd-ld --oformat=binary -Ttext 0x0f80000 -Map test1.map -o test1.bin start.o test1.o
生成された TEST1.MAP でリロケート状態を確認してみます
たしかに最初に実行する_startが0xf80000に配置されています。
こうしてやっとtest1.c→test1.s→test1.o→test1.binという具合に変換されてバイナリファイルができました。
いよいよバイナリをボードに転送して実行できます。・・が
トグル周波数48kHzとなりました。うーんこれは遅い・・
8ビットのTLCS-90の半分です。準備が大変だった割に結果がいまいちですがCが使えるだけ良しとします。