CPU実験室

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

printf実装

イメージ 1

メカ制御などの組込み用途のシングルボードコンピュータに限れば、
接続されたIOのドライバ関数は当然作らなくてはなりませんが、
それ以外、標準ライブラリはほとんど使わなくてもなんとかなります。
せいぜいmem…系関数とstr…系関数くらいあればいいかなという感じです。
ただデバッグのときにシリアル出力にフォーマット整形した表示ができると
便利なのでprintf系関数の実装を行いました。

printfの書式構文を解析する処理は結構複雑で、はじめLSIC-86のライブラリソースから
移植しようと試みたのですが、下位ルーチンの呼出し関係が複雑なうえ、
最下層は8086のアセンブラで記述してあったのでこれは断念。
次に大昔のCPM/80上で動作するBDS-Cコンパイラのライブラリソースをひっぱりだしてきました。
これも始めはなかなかうまく行かなかったのですが、気付いたのは処理がほとんどポインタの演算なので
int型のバイト長の違いが影響しているのではないかと。(GCC68Kはintは32ビット、BDS-Cは16ビット)
試しに変数のint定義をshortに直したところ正常に動作するようになりました。

表示例はカウントアップしている値を16進と10進にフォーマットした文字列にして
液晶に送っているものです

for(i=0;i<100000;i++){
 sprintf(buf,"%6x(HEX) = %5d(dec)",i,i);
 set_str(0,0,buf,0);
}