Cでの開発環境が整ったのでテストプログラムを書いてみました。LEDに接続したパラレルポートを叩く関数led_dsp()にインクリメントデータを渡しています。
ここで問題なのがやはり8ビットの周辺デバイスを最下位のD0..D7に接続してしまったこと。直で出力できないのでPXレジスタ経由なのですがC言語でPXレジスタを指定するわけにはいかないのでインラインアセンブラ文asm()を使っています。
関数の第一引数はARレジスタに入る仕様らしいのでasm("px=ar;");でOKです。一方ポートに出力される上位中位の16ビット分はダミーで良いのですが、ポインタでキャストした実アドレスへ出力します。
*(unsigned int pm *)0x3F40=0;
プログラム空間へのアクセスであることを明示するためpm修飾子が付いています。それにしても回りくどい。データ空間のD15..D8に接続すればよかったとまだ悔やんでいます。
あと0x3F40という実アドレスもアーキテクチャファイルに記述したLED_OUTで参照できるはずなのですがやり方が悪いのか何故かうまくいきません。
さてこれをコンパイルしてアセンブリ中間ファイルを覗いてみます。
関数led_dsp()のところだけですが、Cでの記述に相当する部分は赤枠でくくった所だけでほぼそのままコードに落ちているのが判ります。ところがその前後にある関数の入口と出口の部分のオーバーヘッドが結構な量あり、関数本体の記述を軽くしようとかの努力はあまり効果がないみたいです。