uhOpenGame.htm
5.55 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
<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 <ultrahost.h><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("/dev/u64_data")) == -1) {
<P>
perror("uhOpenGame");
<P>
return(-1);
<P>
}
<P>
if ((pid = fork()) == -1) {
<P>
perror("fork);
<P>
return(-1);
<P>
} else if (pid == 0) {
<P>
(void)execl("/usr/sbin/gload", "/usr/sbin/gload",
0);
<P>
fprintf(stderr, "host: execl(
<P>
return(-1);
<P>
}<BR>
<P>
if (uhReadGame(fd, hostBuffer, 4) == -1) {
<P>
fprintf(stderr, "uhReadGame %s0, sys_errlist[errno]);
<P>
return(1);
<P>
}<BR>
<P>
if (uhCloseGame(fd) != 0) {
<P>
perror("uhCloseGame");
<P>
return(-1);
<P>
}
<P>
if (waitpid(pid, &status, WUNTRACED) == -1) {
<P>
perror("waitpid");
<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>