makerom.htm 10.1 KB
<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 &lt;bootstrap filename&gt;</B>
<P>
デフォルトの&quot;/usr/lib/PR/Boot&quot;ファイルを上書きします。このファイルはCOFFフォーマットで無ければならず、ramromメモリ中に1kbyteがロードさ
れます。
<P>
<B>-h &lt;header filename&gt;</B>
<P>
デフォルトのROMヘッダファイル名&quot;/usr/lib/PR/romheader&quot;を上書きします。このファイルはascii形式で、各キャラクタは16進にコンバートされ、ramromメモリの先頭から順次ロードされます。現在は32byteのみ使用されます。
<P>
<B>-s &lt;romsize (Mbits)&gt;</B>
<P>
指定されたサイズでROMイメージを作成します。このオプションは実際のゲームカセットを作成する際に必要です。
<P>
<B>-f &lt;filldata (0x0 - 0xff)&gt;</B>
<P>
ROMイメージ中の&quot;余白&quot;をパターンで埋めます。引数 'filldata'
は 1byte 16進の定数です。このオプションは、実際にゲームカセットを作成する際に-sオプションと併用して使用します。
<P>
<B>-C &lt;clockrate&gt;</B>
<P>
古いバージョンのエミュレータボードで使用するときのためにデフォルトのCPU速度を上書きします。CPU速度のデフォルト値は62.5Mhzです。クロックレートにゼロを指定した場合は、
CPUスピードは60.85Mhzにセットされ、それ以外の場合は`clockrate'がCPU速度として使用されます。
<P>
<B>-p &lt;pif bootstrap file&gt;</B>
<P>
pifブートストラップファイル名&quot;/usr/lib/PR/pif2Boot&quot;を上書きします。このファイルはCOFFフォーマットでなければならず、ramromメモリ中に4kbyteがロードされます。
<P>
<B>-r</B>
<P>
ROMイメージファイルを供給します。デフォルトは'rom'です。 <BR>

<P>
<B>makerom</B>はブートストラップ、pifブートストラップ、ROMヘッダファイルの3つの場所を検索します。最初に$(ROOT)/&lt;filename&gt;、次に$(WORKAREA)/&lt;filename&gt;、最後に/&lt;filename&gt;を検索します。ROOTとWORKAREAのシェル環境変数は、SGIマシンの内部変数で使用されます。たとえ同じモジュールが新しいコードの走っている開発マシンにインストールされていたとしてもmakerom'sはこれら変数を使用して開発者個人が持つ開発用ソースディレクトリを作りスイッチモジュールを開発者が使用できるようにします。もしこれらの変数が設定されていなければフルパスでこれらファイルを指定する必要があり<B>makerom</B>の中にデフォルト構造を上書きして下さい。
<BR>

<P>
スペックファイルはC言語プリプロセッサ(cpp)で前処理されるので、ヘッダファイルはソースとの整合性をとるために使用され、#defineはそれを明確にするために使用されます。スペックファイルの記述方法を以下に示します。
<BR>

<P>
&lt;specFile&gt; :&lt;segmentList&gt; &lt;waveList&gt; <BR>

<P>
&lt;segmentList&gt; :&lt;segment&gt;
<P>
|&lt;segmentList&gt; &lt;segment&gt; <BR>

<P>
&lt;segment&gt; :beginseg &lt;segStmtList&gt; endseg <BR>

<P>
&lt;segStmtList&gt; :&lt;segStatement&gt;
<P>
|&lt;segStmtList&gt; &lt;segStatement&gt; <BR>

<P>
&lt;segStatement&gt; :name &lt;segmentName&gt;
<P>
|address &lt;constant&gt;
<P>
|after &lt;segmentName&gt;
<P>
|after max[&lt;segmentName&gt;,&lt;segmentName&gt;]
<P>
|after min[&lt;segmentName&gt;,&lt;segmentName&gt;]
<P>
|include &lt;filename&gt;
<P>
|maxsize &lt;constant&gt;
<P>
|align &lt;constant&gt;
<P>
|flags &lt;flagList&gt;
<P>
|number &lt;constant&gt;
<P>
|entry &lt;symbol&gt;
<P>
|stack &lt;stackValue&gt;<BR>

<P>
&lt;flagList&gt; :&lt;flag&gt;
<P>
|&lt;flagList&gt; &lt;flag&gt;<BR>

<P>
&lt;flag&gt; :BOOT
<P>
|OBJECT
<P>
|RAW<BR>

<P>
&lt;stackValue&gt; :&lt;constant&gt;
<P>
|&lt;symbol&gt;
<P>
|&lt;symbol&gt; + &lt;constant&gt; <BR>

<P>
&lt;waveList&gt; :&lt;wave&gt;
<P>
|&lt;waveList&gt; &lt;wave&gt;<BR>

<P>
&lt;wave&gt; :beginwave &lt;waveStmtList&gt; endwave <BR>

<P>
&lt;waveStmtList&gt; :&lt;waveStatement&gt;
<P>
|&lt;waveStmtList&gt; &lt;waveStatement&gt; <BR>

<P>
&lt;waveStatement&gt; :name &lt;waveName&gt;
<P>
|include &lt;segmentName&gt;<BR>
<BR>

<P>
&quot;name&quot;ステートメントがセグメント定義中で指定されている場合、<B>makerom</B>がセグメントを識別するための名前を規定しています。
これは2つの目的で使用されます。一つ目は後述する&quot;waves&quot;にセグメントを対応づけるためであり、もう一つはコードセグメントで参照される定義済のシンボルを作成するためです。
グローバルポインタ相対のデータと解釈されるのを避けるために、これらのシンボルを&quot;extern&quot;宣言する必要があります。以下にこのシンボルと意味を解説します。
<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 &quot;program&quot;
<P>
flags BOOT OBJECT
<P>
entry mainproc
<P>
stack mainThreadStack + 0x1000
<P>
include &quot;rotate.o&quot;
<P>
endseg<BR>

<P>
bbeginseg
<P>
name &quot;static&quot;
<P>
flags OBJECT
<P>
number 1
<P>
include &quot;square.o&quot;
<P>
endseg <BR>

<P>
beginwave
<P>
name &quot;rotate&quot;
<P>
include &quot;program&quot;
<P>
include &quot;static&quot;
<P>
endwave<BR>

</BODY>

</HTML>