libom は オンメモリCライブラリの意味です(^^;
PowerX-VM(現Ver 0.0.07)ではファイルIO操作が行えません。libomでは
予めメモリにファイルイメージを組み込んでおく事で、ストリーム系
関数(freadやfwriteなど)を仮想的に実現します。また、printfやmalloc
などはスタブ関数として定義されています。
libomではファイルストリーム系関数を使用したライブラリ等を、取りあえず
使用できるという第一目的がありますが、将来PowerX-VMやPowerXの実機上で、
本物のファイルストリームが扱える様になった場合でも、最低限のソースの
変更と再コンパイルで実行ファイルを再構築できるというメリットも備えて
います。いや、備えているといいなぁ(^^;(<弱気)
アーカイブをダウンロードし、適当なディレクトリに展開します。
後はリンク時にlibom.aをリンクします。
ヘッダファイルはppclibc2のものを使用します。普通に
#include <stdlib.h> #include <stdio.h>でインクルードして下さい。続いて、libom内で使用しているグローバル変数 を宣言して下さい。
extern FILE file_buf[256] ; extern int file_cur ;
FILE *fp; /** 普通にファイルポインタを宣言する **/ /** メモリfpをセットする **/ file_buf[file_cur]._p =(char*)0x70000 ; /**ファイルイメージが0x70000から始まっている**/ file_buf[file_cur]._blksize=26960 ; /**ファイルサイズを指定 **/ file_buf[file_cur]._offset =0 ; /**ファイルシーク位置. 0をセットします **/ fp=fopen("dummy.bin","wb"); /**ファイルポインタにセット 名前やモードはダミー**/ 又は fp=&file_buf[file_cur] ; /**ファイルポインタにセット **/
malloc()のスタブを使用します。次のグローバル変数を宣言します。
extern int heap_top ;
heap_top = 0x60000 ; /** heapの先頭をセットする **/
その他 printf(),fprintf(),putc(),getc()などの様に標準入出力を使用するものは、
入力関数は常にEOFを返し、出力関数は空関数となっています。
ppclibcのlibc.a内の関数をすり替える様なイメージで使用しますが、
リンクには少々コツが必要となっています(^^;
LIBPATH = ../../ppclib2/lib LIBOMPATH = ../../libom/lib INCPATH = ../../ppclib2/include BINPATH = ../../ppcbin CFLAGS = $(OPT) -I. -I$(INCPATH) LD = $(BINPATH)/ld -V -Qy -dn -Bstatic -Ttext 0x10000 \ -Tdata 0x20000 -Tbss 0x30000 LDFLAGS = -Map map.log $(PROGRAM) : $(OBJS) $(LD) $(LDFLAGS) $(LIBPATH)/start.o \ #リンク1 $(OBJS) $(LIBOMPATH)/libom.a -L$(LIBPATH) -lc \ #リンク2 $(LIBOMPATH)/libom.a -L$(LIBPATH) -lc \ #リンク3 $(LIBPATH)/libgcc.a -o $@ #リンク4 bcut -s 0x10000 $@ > $@.bin $(BINPATH)/objdump --source $@ > $@.dis
取りあえずPowerX-VM上で動作するプログラムを作成する為にでっち
あげたライブラリなので、かなりいい加減で且つ多くの制限を持って
います。PowerX-VMで本物のファイルエミュレーションが使用できる様に
なれば不要となるでしょう(^^; それまでのつなぎって感じで使用して
いただけると幸いです。
2000/05/18 : 初版 2000/05/21 : 言い回しをいくつか修正