uhOpenGame.htm 5.55 KB
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>

<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.03j">
</HEAD>
<BODY>
<P>
<B>uhOpenGame(3P)<BR>
</B>
<P>
<B>関数名<BR>
</B>
<P>
uhOpenGame,uhCloseGame,uhReadGame,uhWriteGame,
<P>
uhReadRamrom, uhWriteRamrom
<P>
→ ホストからゲームへ、ゲームからホストへのデータ転送機能 <BR>
<P>
<B>構文</B>
<P>
#include &lt;ultrahost.h&gt;<BR>
<P>
int uhOpenGame(const char *device);
<P>
int uhReadGame(int fd, void *addr, int nbytes);
<P>
int uhWriteGame(int fd, void *addr, int nbytes);
<P>
int uhReadRamrom(int fd, void *ramrom_addr,void *date,int nbytes);
<P>
int uhWriteRamrom(int fd, void *ramrom_addr,void *date,int nbytes);
<P>
int uhCloseGame(int fd);<BR>
<P>
<B>説明<BR>
</B>
<P>
これら6つのルーチンは、ホストアプリケーション上で、ホストとゲームとの間の生データ転送のための通信チャンネルをセットアップするために使用します。これらは、ゲーム側からコールされる別ルーチンと同調して動作します(ゲーム側からコールする別ルーチンについては<A HREF="../os/osReadHost.htm">osReadHost</A>(3P)を参照して下さい)。
<BR>
<P>
<B>uhOpenGame</B>ルーチンは指定したデバイスの特定ファイルをオープンし、ゲームI/Oイベントから受け取るためにそれを形成します。どのデバイスをオープンするかは、コールするルーチンにより決まります。<B>uhReadGame</B>,<B>uhWriteGame</B>の場合は/dev/u64_dataを、<B>uhReadRamrom</B>,<B>uhWriteRamrom</B>の場合は/dev/u64を、それぞれ<B>uhOpenGame</B><B>
</B>オープンします。以前のリリースではすべて/dev/u64をオープンするようになっていましたので、この点が変更になったことに注意して下さい。デバイスのオープンが成功したら、<B>uhOpenGame</B>から返されたファイル記述子を、<B>uhReadGame</B>,<B>uhWriteGame</B>,
<B>uhReadRamrom</B>,<B>uhWriteRamrom</B>,<B>uhCloseGame</B>に渡して使用します。
<BR>
<P>
<B>uhReadGame</B>ルーチンは、ゲームからnbytesのデータの読み込みを試みて、メモリ領域の開始addrにそのデータをコピーします。正しいオペレーションのためには、ゲーム側で、正確に同じバイト数の<A HREF="../os/osWriteHost.htm">osWriteHost</A>とペアになるべきです。ゲームがwriteを実行する前に、readがホスト側から行われた場合、ホスト処理はブロックするでしょう。逆に、ホストがreadを実行する前に、writeがゲーム側から行われた場合、ゲームスレッドはブロックするでしょう。両サイドが、正確に対応する手順を呼び出す時、転送が発生し、ブロックしている側は続行します。
<BR>
<P>
<B>uhWriteGame</B>ルーチンは、ホスト開始addrからゲームへnbytesのデータコピーを試みます。そのオペレーションは、ゲーム側で、同じバイト回数の<A HREF="../os/osReadHost.htm">osReadHost</A>手順とペアになるべきです。上記のように、ホストあるいはゲームは、ランデブーが完了するまで、ブロックします。
<BR>
<P>
<B>uhReadRamrom</B>ルーチンは、ramromメモリのramrom開始addrからnbytesのデータコピーを試みます。この呼び出しプログラムは、要求されたnbytesを保持するのに十分大きなバッファを供給しなければなりません。以前のリリースでは、<B>uhReadRamrom</B>をコールする際には、ゲーム側で<A HREF="../os/osAckRamromRead.htm">osAckRamromRead</A>をコールする必要がありましたが、これは不要になりました。
<BR>
<P>
<B>uhWriteRamrom</B>ルーチンは、ramromメモリのramrom開始addrからnbytesのデータ書き込みを試みます。以前のリリースでは、<B>uhWriteRamrom</B>をコールする際には、ゲーム側で<A HREF="../os/osAckRamromWrite.htm">osAckRamromWrite</A>をコールする必要がありましたが、これは不要になりました。
<BR>
<P>
<B>uhCloseGame</B>は指定したファイル記述子をクローズします。<BR>
<P>
これらのルーチンはNINTENDO64ホスト側ライブラリlibultrahost.aの一部です。使用する際には、ホストアプリケーションのリンク時に-lultrahostを指定してください。
<BR>
<P>
<B><BR>
</B>
<P>
下記の例は、どのようにしてホストアプリケーションが同じく開始され、転送データとの関係を確立できるかを示します。この特有のシーケンスは、ハンドシェーキングするイベントが失われないことを保証します。ゲームがデータの最初のパケットを送る時までに、ホストデバイスドライバはそれを認識する準備をしています。さらに、ホスト側のアプリケーションは、ブートされる前にデータをゲームに送ろうとはしていません。
<BR>
<P>
main(int argc, char **argv) /* Host side code */
<P>
{
<P>
pid_t pid;
<P>
int fd, status; <BR>
<P>
if ((fd = uhOpenGame(&quot;/dev/u64_data&quot;)) == -1) {
<P>
perror(&quot;uhOpenGame&quot;);
<P>
return(-1);
<P>
}
<P>
if ((pid = fork()) == -1) {
<P>
perror(&quot;fork);
<P>
return(-1);
<P>
} else if (pid == 0) {
<P>
(void)execl(&quot;/usr/sbin/gload&quot;, &quot;/usr/sbin/gload&quot;,
0);
<P>
fprintf(stderr, &quot;host: execl(
<P>
return(-1);
<P>
}<BR>
<P>
if (uhReadGame(fd, hostBuffer, 4) == -1) {
<P>
fprintf(stderr, &quot;uhReadGame %s0, sys_errlist[errno]);
<P>
return(1);
<P>
}<BR>
<P>
if (uhCloseGame(fd) != 0) {
<P>
perror(&quot;uhCloseGame&quot;);
<P>
return(-1);
<P>
}
<P>
if (waitpid(pid, &amp;status, WUNTRACED) == -1) {
<P>
perror(&quot;waitpid&quot;);
<P>
return(-1);
<P>
}
<P>
}<BR>
<P>
mainproc(void *arg) /* Game side code */
<P>
{
<P>
osWriteHost(gameBuffer, 4); <BR>
<P>
osExit();
<P>
}<BR>
<P>
<B>返値<BR>
</B>
<P>
<B>uhOpenGame</B>はオープン成功時にはファイル記述子を返し、失敗時にはerrnoにエラーナンバをセットして-1を返します。
<BR>
<P>
<B>uhReadGame</B>は正常に読み込めたバイト数を返します。<BR>
<P>
<B>uhWriteGame</B>は成功時には実際に書き込めたバイト数を返し、失敗時にはerrnoにエラーナンバをセットして-1を返します。
<BR>
<P>
<B>uhReadRamrom</B>は成功時には0を返し、失敗時にはerrnoにエラーナンバをセットして-1を返します。
<BR>
<P>
<B>uhWriteRamrom</B>は成功時には0を返し、失敗時にはerrnoにエラーナンバをセットして-1を返します。
<BR>
<P>
<B>uhCloseGame</B>は成功時には0を返し、失敗時にはerrnoにエラーナンバをセットして-1を返します。
<BR>
<P>
 
</BODY>
</HTML>