README.TXT
3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
標準関数ライブラリ V1.31 (libnustd.a)について
標準関数ライブラリ libnustd.a は ANSI準拠関数ライブラリです。
N64OSには、ANSI準拠ライブラリの関数は一部分しか含まれていないため、
それを補うために、このライブラリは作成されました。
コンソール入出力などを除くANSI準拠のほとんどの関数がソース付きで提供されて
おり、ユーザーがカスタマイズすることも出来ます。
数値演算関数にはdouble版とfloat版があります。
メモリ割当てルーチンにはアラインメント調整つきのものも用意し、メモリ割当ての
整合性をチェックするルーチンもあります。
関数の詳細についてはマニュアル大全集のNuSYSTEMの下の標準関数リファ
レンスまたは各関数ソースのコメントをご覧ください。
○SGIコンパイラでの使用方法
標準関数ライブラリを使用するためには、Makefile に、以下のようにインクルード
パスとライブラリパスを指定する必要があります。
N64KITDIR = /usr/local/n64kit
NUSTDINCDIR = $(N64KITDIR)/nustd/include
NUSTDLIBDIR = $(N64KITDIR)/nustd/lib
(略)
LCINCS = -I$(NUSTDINCDIR)
LDFLAGS = $(MKDEPOPT) -nostdlib -L$(ROOT)/usr/lib -L$(NUSTDLIBDIR) \
-u sprintf -lultra_d -lnustd_d
ROMバージョンを作る際は LDFLAGS を以下のようにします。
LDFLAGS = $(MKDEPOPT) -nostdlib -L$(ROOT)/usr/lib L$(NUSTDLIBDIR) \
-lultra_rom -lnustd
malloc_memcheck(), mt_malloc_memcheck(), malloc_memdsp(),
mt_malloc_memdsp() では、sprintf を使用しているため、これらの関数を使
用する場合には -u sprintf の記述をしなければならないことに注意してくだ
さい。
○exeGCC(N64)での使用方法
exeGCC には ANSI準拠のライブラリが付属しているため libnustd.a を使う
必要性は少ないかもしれません。
関数名・インクルードファイル名ともexeGCCと同じ名前を使用しているので、
このライブラリを使用する場合、以下のようにオプションを付ける必要があります。
N64KITDIR = c:\nintendo\n64kit
NUSTDINCDIR = $(N64KITDIR)/nustd/include
NUSTDLIBDIR = $(N64KITDIR)/nustd/lib
.c.o:
$(CC) -g -G 0 -c -nostdinc -I- -I$(NUSTDINCDIR) -I$(INC)/PR \
-I$(INC) -D_MIPS_SZLONG=32 -D_MIPS_SZINT=32 $<
(略)
LDFLAGS = $(MKDEPOPT) -L$(LIB) -L$(NUSTDLIBDIR) -L$(GCCDIR)/mipse/lib \
-lgultra_d -lnustd_d -lkmc
exeGCCのANSIC準拠ライブラリのインクルードファイルを見に行かなくするように
.c.o に -nostdinc -I- というオプションを追加しています。
ROMバージョンを作る時は LDFLAGS を以下のようにして下さい。
LDFLAGS = $(MKDEPOPT) -L$(LIB) -L$(NUSTDLIBDIR) -L$(GCCDIR)/mipse/lib \
-lgultra_rom -lnustd -lkmc
○標準関数ライブラリの再構築について
nustd/src ディレクトリ下でmakeをかけることによりライブラリが再構築できます。
make のみで ROM バージョン(libnustd.a)、 make deb でデバッグバージョン
(libnustd_d.a)のライブラリが出来ます。
(make をかける前には .o と.a を全て消しておくのが無難です。)
Ver1.3 現在での ROM バージョンとデバッグバージョンの違いは、デバッグ情
報が含まれているかいないかと、オプティマイズレベルの違いです。
○ライブラリの検索順について
リンカーは -l オプションで宣言された順に関数の検索を行います。
同じ関数が各ライブラリに含まれている場合、ライブラリの順によりリンクされる
オブジェクトが異なるため注意が必要です。
Ver1.1 以前では、N64OS に含まれている関数と重複している関数が存在して
いましたが、Ver1.3 現在では重複しないように、それらの関数の名前が変更
されています。変更された関数と、変更後の名前の対応は以下の通りです。
sqrtf() --> _nsqrtf()
strchr() --> _nstrchr()
strlen() --> _nstrlen()
memcpy() --> _nmemcpy()
ldiv() --> _nldiv()
sinf() --> _nsinf()
cosf() --> _ncosf()
○標準関数ライブラリの注意事項
・errno は使用できません。
・sin(),cos() などに引数の型の最大に近い値を入れた時の動作の保証はあり
ません。浮動小数の精度の問題もありますし、角度が大きな値にならないよ
うにプログラムして下さい。
・malloc() は複数スレッドからの同時アクセスが発生した場合の対策が行わ
れていません。複数スレッドに対応した malloc() として mt_malloc() が
用意されています。
・malloc() は16バイトアラインです。
・memalign()で確保したエリアは、realloc するとアラインメントの保証は無
くなります。
・setjmp() では、FPUのレジスタの保存は行っていません。