makerom.htm
10.1 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B>makerom(1P)<BR>
</B>
<P>
<B>関数名<BR>
</B>
<P>
makerom
<P>
→ ROMカートリッジイメージとそれに関連したELFオブジェクトファイルの作成。
<BR>
<P>
<B>構文<BR>
</B>
<P>
makerom [-D name[=def]] [-I dir] [-U name] [-d] [-m] [-o]
<P>
[-b bootstrap filename] [-h header filename]
<P>
[-s romsize] [-f filldata] [-C clockrate]
<P>
[-p pif2 bootstrap filename] [-r romfile] specfile <BR>
<P>
<B>説明<BR>
</B>
<P>
<B>makerom</B>プログラムは<A HREF="gload.htm">gload</A>(1P)によってカートリッジROMにダウンロードするためのROMイメージを作成します。<B>makerom</B>は詳細設定ファイルとして'specfile'を用います。'specfile'にはオブジェクトやセグメント内の未処理データファイルの構成が記述されています。<B>makerom</B>は全ての未定義情報を確定するためにリンクエディタをコールし、再配置を実行し、NINTENDO64デバッガ<A HREF="gvd.htm">gvd</A>(1P)の為のELFオブジェクトファイルを生成します。
<BR>
<P>
コマンドラインオプションを使用してデフォルト値を変更していなければ、<B>makerom</B>は強制的にデフォルトブートストラップ、pifブートストラップ、ヘッダーファイルを含む最初の8kバイトをロードします。
<BR>
<P>
以下に、<B>makerom</B>によって識別されるコマンドラインフラグを示します。
<BR>
<P>
<B>-Dname[=def]</B>
<P>
実行時にcpp(1)に渡されます。
<P>
<B>-Idirectory</B>
<P>
実行時にcpp(1)に渡されます。
<P>
<B>-Uname</B>
<P>
実行時にcpp(1)に渡されます。
<P>
<B>-d</B>
<P>
<B>makerom</B>の実行状況を出力し、通常ならば削除される実行時に作成されるテンポラリファイルを保存します。
<P>
<B>-m</B>
<P>
デバッグ用にリンクエディタメモリーマップを標準出力にプリントします。
<P>
<B>-o</B>
<P>
オーバーラップセクションのチェックを無効にします。デフォルトでは、CPUアドレスにダイレクトマップされたセグメントについて基本的な物理メモリマッピングが衝突していないかどうかチェックします。
<P>
<B>-b <bootstrap filename></B>
<P>
デフォルトの"/usr/lib/PR/Boot"ファイルを上書きします。このファイルはCOFFフォーマットで無ければならず、ramromメモリ中に1kbyteがロードさ
れます。
<P>
<B>-h <header filename></B>
<P>
デフォルトのROMヘッダファイル名"/usr/lib/PR/romheader"を上書きします。このファイルはascii形式で、各キャラクタは16進にコンバートされ、ramromメモリの先頭から順次ロードされます。現在は32byteのみ使用されます。
<P>
<B>-s <romsize (Mbits)></B>
<P>
指定されたサイズでROMイメージを作成します。このオプションは実際のゲームカセットを作成する際に必要です。
<P>
<B>-f <filldata (0x0 - 0xff)></B>
<P>
ROMイメージ中の"余白"をパターンで埋めます。引数 'filldata'
は 1byte 16進の定数です。このオプションは、実際にゲームカセットを作成する際に-sオプションと併用して使用します。
<P>
<B>-C <clockrate></B>
<P>
古いバージョンのエミュレータボードで使用するときのためにデフォルトのCPU速度を上書きします。CPU速度のデフォルト値は62.5Mhzです。クロックレートにゼロを指定した場合は、
CPUスピードは60.85Mhzにセットされ、それ以外の場合は`clockrate'がCPU速度として使用されます。
<P>
<B>-p <pif bootstrap file></B>
<P>
pifブートストラップファイル名"/usr/lib/PR/pif2Boot"を上書きします。このファイルはCOFFフォーマットでなければならず、ramromメモリ中に4kbyteがロードされます。
<P>
<B>-r</B>
<P>
ROMイメージファイルを供給します。デフォルトは'rom'です。 <BR>
<P>
<B>makerom</B>はブートストラップ、pifブートストラップ、ROMヘッダファイルの3つの場所を検索します。最初に$(ROOT)/<filename>、次に$(WORKAREA)/<filename>、最後に/<filename>を検索します。ROOTとWORKAREAのシェル環境変数は、SGIマシンの内部変数で使用されます。たとえ同じモジュールが新しいコードの走っている開発マシンにインストールされていたとしてもmakerom'sはこれら変数を使用して開発者個人が持つ開発用ソースディレクトリを作りスイッチモジュールを開発者が使用できるようにします。もしこれらの変数が設定されていなければフルパスでこれらファイルを指定する必要があり<B>makerom</B>の中にデフォルト構造を上書きして下さい。
<BR>
<P>
スペックファイルはC言語プリプロセッサ(cpp)で前処理されるので、ヘッダファイルはソースとの整合性をとるために使用され、#defineはそれを明確にするために使用されます。スペックファイルの記述方法を以下に示します。
<BR>
<P>
<specFile> :<segmentList> <waveList> <BR>
<P>
<segmentList> :<segment>
<P>
|<segmentList> <segment> <BR>
<P>
<segment> :beginseg <segStmtList> endseg <BR>
<P>
<segStmtList> :<segStatement>
<P>
|<segStmtList> <segStatement> <BR>
<P>
<segStatement> :name <segmentName>
<P>
|address <constant>
<P>
|after <segmentName>
<P>
|after max[<segmentName>,<segmentName>]
<P>
|after min[<segmentName>,<segmentName>]
<P>
|include <filename>
<P>
|maxsize <constant>
<P>
|align <constant>
<P>
|flags <flagList>
<P>
|number <constant>
<P>
|entry <symbol>
<P>
|stack <stackValue><BR>
<P>
<flagList> :<flag>
<P>
|<flagList> <flag><BR>
<P>
<flag> :BOOT
<P>
|OBJECT
<P>
|RAW<BR>
<P>
<stackValue> :<constant>
<P>
|<symbol>
<P>
|<symbol> + <constant> <BR>
<P>
<waveList> :<wave>
<P>
|<waveList> <wave><BR>
<P>
<wave> :beginwave <waveStmtList> endwave <BR>
<P>
<waveStmtList> :<waveStatement>
<P>
|<waveStmtList> <waveStatement> <BR>
<P>
<waveStatement> :name <waveName>
<P>
|include <segmentName><BR>
<BR>
<P>
"name"ステートメントがセグメント定義中で指定されている場合、<B>makerom</B>がセグメントを識別するための名前を規定しています。
これは2つの目的で使用されます。一つ目は後述する"waves"にセグメントを対応づけるためであり、もう一つはコードセグメントで参照される定義済のシンボルを作成するためです。
グローバルポインタ相対のデータと解釈されるのを避けるために、これらのシンボルを"extern"宣言する必要があります。以下にこのシンボルと意味を解説します。
<BR>
<P>
<B>_`name'SegmentStart</B>
<P>
セグメントの仮想アドレスもしくはセグメントアドレスの開始位置
<P>
<B>_`name'SegmentEnd</B>
<P>
セグメントの仮想アドレスもしくはセグメントアドレスの終了位置+1
<P>
<B>_`name'SegmentTextStart</B>
<P>
プログラムコード(命令)が含まれている場合、テキストの開始アドレス
<P>
<B>_`name'SegmentTextEnd</B>
<P>
プログラムコード(命令)が含まれている場合、テキストの終了アドレス+1
<P>
<B>_`name'SegmentDataStart</B>
<P>
初期化済のプログラムデータが含まれている場合、このセクションの開始アド
レス
<P>
<B>_`name'SegmentDataEnd</B>
<P>
初期化済のプログラムデータが含まれている場合、このセクションの終了アド
レス+1
<P>
<B>_`name'SegmentBssStart</B>
<P>
未初期化のプログラムデータが含まれている場合、このセクションの開始アド
レス
<P>
<B>_`name'SegmentBssEnd</B>
<P>
未初期化のプログラムデータが含まれている場合、このセクションの終了アド
レス+1 +1
<P>
<B>_`name'SegmentRomStart</B>
<P>
セグメントの開始ROMアドレス
<P>
<B>_`name'SegmentRomEnd </B>
<P>
セグメントの終了ROMアドレス+1 <BR>
<P>
'flags'ステートメントはセグメントについて具体的な情報を提供します。'object'として指定されたセグメントは共用が不可で再配置可能なELFオブジェクトとして構築されます。また、'raw'タイプは解釈が必要ないデータから構成されています。'boot'セグメントと指定されたセグメントは、特別な意味を
持ちます。これは指定ファイル中の最初のセグメントである必要があり、固定アドレスにリンクされます。'entry'ステートメントは、ROMイメージが
<A HREF="gload.htm">gload</A>によってロードされた直後にジャンプするシンボルを指定します。'stack'セグメントはBOOTコードのスタック開始アドレスを指定します。これは仮想アドレスの定数、あるいはプログラムセグメント名にオフセットを加えたものです。プログラムの実行時にスタックが後ろ向き(より小さいアドレスに向かって)に増えるため、後者の方が適当です。
<BR>
<P>
`address'、`number'、`after'ステートメントはオブジェクトセグメントの仮想アドレスの先頭番地を指示する方法です。`address'ステートメントは、主にコードを実行するセグメントに対して指定されます。`number'セグメントによってナンバリングされたセグメントは主にRSPからのアクセスを目的にしています。`after'ステートメントは、他のセグメントのアドレス領域の直後にセグメントを配置するための指定です。これは、アドレス空間内の`断片化'を防ぐのに有効であると同時にセグメントサイズを容易に調整することが可能になります。
<BR>
<P>
セグメント定義内の各`include'ステートメントは、セグメントを構成するファイルを指定します。セグメントが`object'の場合、指定されたファイルは`non_shared'で再配置可能なELFオブジェクトでなければなりません。`raw'の場合はどんなタイプでも指定可能です。
<BR>
<P>
`maxsize'ステートメントは、セグメントサイズ容量の上限を(バイト単位で)指定することができます。
<BR>
<P>
`align'ステートメントは、指定されたバイト数にセグメント境界を合わせるために使用されます。デフォルトではセグメントが16バイト(128ビット)境界に合わせされます。
<BR>
<P>
スペックファイルには、1つ以上の`waves'ステートメントを定義する必要があります。それぞれのウエーブの定義によって、異なったELFオブジェクトファイルが作成されます。複数のウエーブは全く別のシーンの管理やメモリレイアウトの都合によって異なるアドレス空間が必要な場合に使用できます。
<BR>
<P>
ウエーブ定義の`name'ステートメントは、ウエーブに対応するELFオブジェクトのファイル名として使用されます。
ウエーブ定義内の`include'ステートメントで指定されている、定義済みのセグメントはウエーブ内に挿入されます。セグメントのウエーブへの挿入によりウエーブ内のすべてのセグメントに対してシンボルが使用可能になります。
<BR>
<P>
<B>参照<BR>
</B>
<P>
<A HREF="gload.htm">gload</A>(1P)、<A HREF="gvd.htm">gvd</A>(1P)
<BR>
<P>
<B>例<BR>
</B>
<P>
次のスペックファイルはブートプログラムセグメントと静的データセグメントの2つのセグメントをもつアプリケーションを記述しており、一つのELFオブ
ジェクトファイル`rotate'が作成されます。 <BR>
<P>
beginseg
<P>
name "program"
<P>
flags BOOT OBJECT
<P>
entry mainproc
<P>
stack mainThreadStack + 0x1000
<P>
include "rotate.o"
<P>
endseg<BR>
<P>
bbeginseg
<P>
name "static"
<P>
flags OBJECT
<P>
number 1
<P>
include "square.o"
<P>
endseg <BR>
<P>
beginwave
<P>
name "rotate"
<P>
include "program"
<P>
include "static"
<P>
endwave<BR>
</BODY>
</HTML>