Jo Engine  2024.04.28
Jo Sega Saturn Engine
sgl_prototypes.h
Go to the documentation of this file.
1 /*
2 ** Jo Sega Saturn Engine
3 ** Copyright (c) 2012-2024, Johannes Fetz (johannesfetz@gmail.com)
4 ** All rights reserved.
5 **
6 ** Redistribution and use in source and binary forms, with or without
7 ** modification, are permitted provided that the following conditions are met:
8 ** * Redistributions of source code must retain the above copyright
9 ** notice, this list of conditions and the following disclaimer.
10 ** * Redistributions in binary form must reproduce the above copyright
11 ** notice, this list of conditions and the following disclaimer in the
12 ** documentation and/or other materials provided with the distribution.
13 ** * Neither the name of the Johannes Fetz nor the
14 ** names of its contributors may be used to endorse or promote products
15 ** derived from this software without specific prior written permission.
16 **
17 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 ** DISCLAIMED. IN NO EVENT SHALL Johannes Fetz BE LIABLE FOR ANY
21 ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
34 #ifndef __JO_SGL_PROTOTYPES_H__
35 # define __JO_SGL_PROTOTYPES_H__
36 
37 #if !JO_COMPILE_USING_SGL
38 
39 //HACK
40 #define SEGA_XPT_H
41 #define SEGA_GFS_H
42 #define SEGA_CDC_H
43 #define SEGA_BUP_H
44 
45 /*
46 #include <sgl.h>
47 */
48 #define VDP2_VRAM_A0 0x25e00000
49 #define VDP2_VRAM_A1 0x25e20000
50 #define VDP2_VRAM_B0 0x25e40000
51 #define VDP2_VRAM_B1 0x25e60000
52 
53 #define VDP2_COLRAM 0x25f00000
54 #define CHAR_SIZE_1x1 0
55 
56 #define COL_TYPE_256 0x10
57 
58 #define KTBL0_RAM VDP2_VRAM_A1 /* 回転スクロール用係数テーブル */
59 #define BACK_CRAM (KTBL0_RAM + 0x1fffe) /* Back color */
60 
61 #define CL_Half 2 /* 半輝度モード */
62 #define CL_Trans 3 /* 半透明モード */
63 #define CL_Gouraud 4 /* グーローシェーディングモード */
64 
65 #define PER_ID_NotConnect 0xff /* 未接続 */
66 #define PER_ID_StnPad 0x02 /* サターン標準パッド */
67 #define PER_ID_StnMouse 0x23 /* サターンマウス */
68 #define PER_ID_ShuttleMouse 0xe3 /* シャトルマウス */
69 #define PER_ID_ExtKeyBoard 0x30 /* Extended-size keyboard device */
70 #define PER_ID_StnKeyBoard 0x34 /* Saturn keyboard */
71 
72 #define toFIXED(a) ((FIXED)(65536.0 * (a)))
73 #define POStoFIXED(x,y,z) {toFIXED(x),toFIXED(y),toFIXED(z)}
74 #define NORMAL(x,y,z) {POStoFIXED(x,y,z)
75 #define VERTICES(v0,v1,v2,v3) {v0 , v1 , v2 , v3}}
76 #define C_RGB(r,g,b) (((b)&0x1f)<<10|((g)&0x1f)<<5|((r)&0x1f)|0x8000)
77 
78 #define No_Window (0 << 9) /* No sprite clipping */
79 #define Window_In (2 << 9) /* Clip everything outside bounds */
80 #define Window_Out (3 << 9) /* Clip everything inside bounds */
81 #define ECdis (1 << 7) /* エンドコードをパレットのひとつとして使用 */
82 
83 #define SPdis (1 << 6) /* スペースコードをパレットのひとつとして使用 */
84 
85 #define sprPolygon (FUNC_Polygon | ((ECdis | SPdis) << 24))
86 
87 #define FUNC_Texture 2
88 #define FUNC_Polygon 4
89 #define FUNC_PolyLine 5
90 
91 #define MESHon (1 << 8) /* メッシュで表示 */
92 #define CL32KRGB (5 << 3) /* RGB32K色モード */
93 
94 #define UseTexture (1 << 2) /* テクスチャを貼るポリゴン */
95 #define UseLight (1 << 3) /* 光源の影響を受けるポリゴン */
96 #define UsePalette (1 << 5) /* ポリゴンのカラー */
97 
98 #define No_Texture 0 /* テクスチャを使用しない時 */
99 #define No_Option 0 /* オプションを使用しない時 */
100 #define No_Gouraud 0 /* グーローシェーディングを使用しない時 */
101 #define No_Palet 0 /* カラーパレットの指定がいらない時 */
102 
103 #define sprNoflip ((0) | FUNC_Texture | (UseTexture << 16))
104 
105 typedef unsigned char Uint8 ; /* 符号なし1バイト整数 */
106 typedef signed char Sint8 ; /* 符号つき1バイト整数 */
107 typedef unsigned short Uint16 ; /* 符号なし2バイト整数 */
108 typedef signed short Sint16 ; /* 符号つき2バイト整数 */
109 typedef unsigned long Uint32 ; /* 符号なし4バイト整数 */
110 typedef signed long Sint32 ; /* 符号つき4バイト整数 */
111 typedef int Bool ; /* 論理型(論理定数を値にとる) */
112 typedef float Float32 ; /* 4バイト実数 */
113 
114 enum ps {X, Y, Z, XYZ, XYZS, XYZSS, XY = Z, S = XYZ, Sh = S, Sv = XYZS} ;
115 enum base
116 {
117  SORT_BFR, /* 直前に表示したポリゴンの位置を使う */
118  SORT_MIN, /* 4点の内、一番手前の点を使う */
119  SORT_MAX, /* 4点の内一番遠い点を使う */
120  SORT_CEN /* 4点の平均位置を使う */
121 } ;
122 
123 enum pln
124 {
125  Single_Plane, /* 片面ポリゴン */
126  Dual_Plane /* 両面ポリゴン(表裏判定の結果を見ない) */
127 } ;
128 
129 typedef Sint16 ANGLE ;
130 typedef Sint32 FIXED ;
131 typedef FIXED MATRIX[4][3] ; /* マトリクスデータ */
132 typedef FIXED VECTOR[XYZ] ; /* ベクトルデータ */
133 typedef FIXED POINT[XYZ] ; /* 頂点の位置データ */
134 
135 #define _Stereo 0x80
136 #define _Mono 0x00
137 
138 #define _PCM16Bit 0x00
139 #define _PCM8Bit 0x10
140 
141 typedef struct
142 {
143  Uint8 mode ; /* Mode */
144  Uint8 channel ; /* PCM Channel Number */
145  Uint8 level ; /* 0 ~ 127 */
146  Sint8 pan ; /* -128 ~ +127 */
147  Uint16 pitch ;
148  Uint8 eflevelR ; /* Effect level for Right(mono) 0 ~ 7 */
149  Uint8 efselectR ; /* Effect select for Right(mono) 0 ~ 15 */
150  Uint8 eflevelL ; /* Effect level for Left 0 ~ 7 */
151  Uint8 efselectL ; /* Effect select for Left 0 ~ 15 */
152 } PCM ;
153 
154 enum SmpcCommand /* SMPCコマンド番号 */
155 {
156  SMPC_MSHON, /* (00) マスタ SH2 ON */
157  SMPC_SSHON, /* (01) スレーブ SH2 ON */
158  SMPC_SSHOFF, /* (02) スレーブ SH2 OFF */
159  SMPC_SNDON, /* (03) サウンド ON */
160  SMPC_SNDOFF, /* (04) サウンド OFF */
161  SMPC_CDON, /* (05) CD ON */
162  SMPC_CDOFF, /* (06) CD OFF */
163  SMPC_SYSRES, /* (07) システム全体リセット */
164  SMPC_CKC352, /* (08) クロックチェンジ352モード */
165  SMPC_CKC320, /* (09) クロックチェンジ320モード */
166  SMPC_NMIREQ, /* (0a) NMIリクエスト */
167  SMPC_RESENA, /* (0b) リセットイネーブル */
168  SMPC_RESDIS, /* (0c) リセットディスエーブル */
169  SMPC_GETSTS, /* (0d) ステータス取得 */
170  SMPC_GETPER, /* (0e) ペリフェラル取得 */
171  SMPC_SETMEM, /* (0f) SMPCメモリ設定 */
172  SMPC_SETTIM, /* (10) 時刻設定 */
173  SMPC_CMDMAX /* (11) コマンド番号最大値 */
174 };
175 
176 enum SmpcWaitMode /* SMPCコマンド実行モード */
177 {
178  SMPC_NO_WAIT, /* (00) コマンド実行終了待ち無し */
179  SMPC_WAIT /* (01) コマンド実行終了待ち有り */
180 };
181 
182 
183 enum BooleanSwitch /* 論理定数2(スイッチ) */
184 {
185  OFF = 0,
186  ON = 1
187 };
188 
189 typedef struct
190 {
191  Uint16 texno ; /* テクスチャ番号 */
192  Uint16 atrb ; /* アトリビュートデータ(表示モード) */
193  Uint16 colno ; /* カラーナンバー */
194  Uint16 gstb ; /* グーローシェーディングテーブル */
195  Uint16 dir ; /* テクスチャの反転とファンクションナンバー */
196 } SPR_ATTR ;
197 
198 typedef struct
199 {
200  Uint8 flag ; /* 片面か両面かのフラグ */
201  Uint8 sort ; /* ソートの基準位置とオプション設定 */
202  Uint16 texno ; /* テクスチャ番号 */
203  Uint16 atrb ; /* アトリビュートデータ(表示モード) */
204  Uint16 colno ; /* カラーナンバー */
205  Uint16 gstb ; /* グーローシェーディングテーブル */
206  Uint16 dir ; /* テクスチャの反転とファンクションナンバー */
207 } ATTR ;
208 
209 typedef struct
210 {
211  VECTOR norm ; /* 法線ベクトル */
212  Uint16 Vertices[4] ; /* ポリゴンを構成する頂点番号 */
213 } POLYGON ;
214 
215 typedef struct
216 {
217  POINT *pntbl ; /* 頂点の位置データテーブル */
218  Uint32 nbPoint ; /* 頂点の数 */
219  POLYGON *pltbl ; /* ポリゴン定義テーブル */
220  Uint32 nbPolygon ; /* ポリゴンの数 */
221  ATTR *attbl ; /* ポリゴンのアトリビュートテーブル */
222 } PDATA ;
223 
224 typedef struct
225 {
226  Uint16 Hsize ; /* スプライトのHサイズ */
227  Uint16 Vsize ; /* スプライトのVサイズ */
228  Uint16 CGadr ; /* スプライトCGアドレス / 8 */
229  Uint16 HVsize ; /* Hサイズ/8、Vサイズ(ハード用) */
230 } TEXTURE ;
231 
232 typedef struct
233 {
234  Uint16 texno ; /* テクスチャ番号 */
235  Uint16 cmode ; /* カラーモード */
236  void *pcsrc ; /* 元データの所在 */
237 } PICTURE ;
238 
239 typedef struct /* デジタルデバイス */
240 {
241  Uint8 id; /* ペリフェラルID */
242  Uint8 ext; /* 拡張データサイズ */
243  Uint16 data; /* ボタン現在データ */
244  Uint16 push; /* ボタン押下データ */
245  Uint16 pull; /* ボタン引上データ */
246  Uint32 dummy2[4]; /* ダミー2 */
247 } PerDigital;
248 
249 typedef struct { /* Analogue devices */
250  Uint8 id; /* Peripheral ID */
251  Uint8 ext; /* Extended data size */
252  Uint16 data; /* Button current data */
253  Uint16 push; /* Button press data */
254  Uint16 pull; /* Button pull data */
255  Uint8 x; /* Absolute X-axis data value */
256  Uint8 y; /* Absolute value of the Y-axis data */
257  Uint8 z; /* Absolute value of the Z-axis data */
258  Uint8 dummy1; /* Dummy 1 */
259  Uint32 dummy2[3]; /* Dummy 2 */
260 } PerAnalog;
261 
262 enum BooleanLogic /* 論理定数1(偽、真) */
263 {
264  FALSE = 0,
265  TRUE = 1
266 };
267 
268 enum tvsz
269 {
270  TV_320x224, TV_320x240, TV_320x256, TV_dummy1,
271  TV_352x224, TV_352x240, TV_352x256, TV_dummy2,
272  TV_640x224, TV_640x240, TV_640x256, TV_dummy3,
273  TV_704x224, TV_704x240, TV_704x256, TV_dummy4,
274 
275  TV_320x448, TV_320x480, TV_320x512, TV_dummy5,
276  TV_352x448, TV_352x480, TV_352x512, TV_dummy6,
277  TV_640x448, TV_640x480, TV_640x512, TV_dummy7,
278  TV_704x448, TV_704x480, TV_704x512, TV_dummy8
279 } ;
280 
281 #define PNB_2WORD 0
282 #define PNB_1WORD 0x8000
283 #define CN_10BIT 0
284 #define CN_12BIT 0x4000
285 #define COL_TYPE_32768 0x30
286 
287 #define PL_SIZE_1x1 0
288 #define PL_SIZE_2x1 1
289 #define PL_SIZE_2x2 3
290 
291 #define NBG0ON (1<<0)
292 #define NBG1ON (1<<1)
293 
294 #define BM_512x256 0x02
295 #define BM_512x512 0x06
296 #define BM_1024x256 0x0a
297 #define BM_1024x512 0x0e
298 
299 extern void slCurColor(Uint16) ;
300 extern PerDigital* Smpc_Peripheral;
301 extern Uint8 Per_Connect1, Per_Connect2;
302 extern void slPlaneNbg1(Uint16) ;
303 extern void slUnitMatrix(MATRIX) ;
304 extern Bool slDispSprite(FIXED *, SPR_ATTR *attr, ANGLE) ;
305 extern void slScrPosNbg1(FIXED x,FIXED y) ;
306 extern void slZoomNbg1(FIXED x,FIXED y) ;
307 extern void slDMACopy(void *, void *, Uint32) ;
308 extern void slBack1ColSet(void *, Uint16) ;
309 extern void slCharNbg0(Uint16 type,Uint16 size) ;
310 extern void slCharNbg1(Uint16 type,Uint16 size) ;
311 extern void slTVOn(void) ;
312 extern void slPageNbg1(void *,void *,Uint16) ;
313 extern void slMapNbg1(void *,void *,void *,void *) ;
314 extern void slPrint(char *, void *) ;
315 extern void slBitMapNbg1(Uint16, Uint16, void *) ;
316 extern void slTVOff(void) ;
317 extern Bool slScrAutoDisp(Uint32) ;
318 extern void slInitSystem(Uint16, TEXTURE *, Sint8) ;
319 extern void slSynch(void) ;
320 extern void slPriority(Sint16, Uint16) ;
321 extern void *slLocate(Uint16, Uint16) ;
322 #define scnNBG0 1
323 #define scnNBG1 0
324 
325 extern void slLookAt(FIXED *camera, FIXED *target, ANGLE) ;
326 extern void slLight(VECTOR) ;
327 extern Bool slPushMatrix(void) ;
328 extern Bool slPopMatrix(void) ;
329 extern void slRotX(ANGLE) ;
330 extern void slRotY(ANGLE) ;
331 extern void slRotZ(ANGLE) ;
332 extern void slScale(FIXED, FIXED, FIXED) ;
333 extern Bool slPutPolygon(PDATA *) ;
334 extern Bool slWindow(Sint16, Sint16, Sint16, Sint16, Sint16, Sint16, Sint16) ;
335 extern void slPerspective(ANGLE) ;
336 extern void slTranslate(FIXED, FIXED, FIXED) ;
337 extern void slZdspLevel(Uint16) ;
338 
339 extern Bool slRequestCommand(Uint8, Uint8);
340 
341 #define CDC_POS_PTYPE(pos) ((pos)->ptype)
342 #define CDC_POS_FAD(pos) ((pos)->pbody.fad)
343 #define CDC_POS_TNO(pos) ((pos)->pbody.trkidx.tno)
344 #define CDC_POS_IDX(pos) ((pos)->pbody.trkidx.idx)
345 
346 #define CDC_PLY_START(ply) ((ply)->start)
347 #define CDC_PLY_END(ply) ((ply)->end)
348 #define CDC_PLY_PMODE(ply) ((ply)->pmode)
349 
350 #define CDC_PLY_STYPE(ply) CDC_POS_PTYPE(&CDC_PLY_START(ply))
351 #define CDC_PLY_SFAD(ply) CDC_POS_FAD(&CDC_PLY_START(ply))
352 #define CDC_PLY_STNO(ply) CDC_POS_TNO(&CDC_PLY_START(ply))
353 #define CDC_PLY_SIDX(ply) CDC_POS_IDX(&CDC_PLY_START(ply))
354 
355 #define CDC_PLY_ETYPE(ply) CDC_POS_PTYPE(&CDC_PLY_END(ply))
356 #define CDC_PLY_EFAS(ply) CDC_POS_FAD(&CDC_PLY_END(ply))
357 #define CDC_PLY_ETNO(ply) CDC_POS_TNO(&CDC_PLY_END(ply))
358 #define CDC_PLY_EIDX(ply) CDC_POS_IDX(&CDC_PLY_END(ply))
359 
360 #define CDC_SM_EOR 0x01 /* レコード最後のセクタ */
361 #define CDC_SM_VIDEO 0x02 /* ビデオセクタ */
362 #define CDC_SM_AUDIO 0x04 /* オーディオセクタ */
363 #define CDC_SM_DATA 0x08 /* データセクタ */
364 #define CDC_SM_TRIG 0x10 /* トリガON */
365 #define CDC_SM_FORM 0x20 /* フォームビット(1:Form2, 0:Form1)*/
366 #define CDC_SM_RT 0x40 /* リアルタイムセクタ */
367 #define CDC_SM_EOF 0x80 /* ファイル最後のセクタ */
368 
369 #define CDC_PM_DFL 0x00 /* 再生モードの省略値 */
370 
371 /* エラーコード */
372 #define GFS_ERR_OK 0 /* 正常終了 */
373 #define GFS_ERR_CDRD (-1) /* CDリードエラー */
374 #define GFS_ERR_CDNODISC (-2) /* CDがセットされていない */
375 #define GFS_ERR_CDROM (-3) /* ディスクがCD-ROMでない */
376 #define GFS_ERR_DIRTBL (-4) /* ディレクトリ管理テーブルが不正 */
377 #define GFS_ERR_OPENMAX (-5) /* 最大オープン数の値が不正 */
378 #define GFS_ERR_DIR (-6) /* 指定ファイルはディレクトリでない */
379 #define GFS_ERR_CDBFS (-7) /* CDブロックファイルシステムの */
380 
381 #define GFS_ERR_NONAME (-8) /* ファイル名を扱えない */
382 #define GFS_ERR_NEXIST (-9) /* 指定されたファイルは存在しない */
383 #define GFS_ERR_FID (-10) /* 不正なファイル識別子 */
384 #define GFS_ERR_HNDL (-11) /* ファイルハンドルが不正 */
385 #define GFS_ERR_SEEK (-12) /* シーク位置が不正 */
386 #define GFS_ERR_ORG (-13) /* 基準位値が不正 */
387 #define GFS_ERR_NUM (-14) /* バイト数が負 */
388 #define GFS_ERR_OFS (-15) /* オフセットが不正 */
389 #define GFS_ERR_FBUSY (-16) /* 指定ファイルの処理が残っている */
390 #define GFS_ERR_PARA (-17) /* パラメータが不正 */
391 #define GFS_ERR_BUSY (-18) /* ライブラリ関数実行中 */
392 #define GFS_ERR_NOHNDL (-19) /* ファイルハンドルに空きがない */
393 #define GFS_ERR_PUINUSE (-20) /* ピックアップ動作中 */
394 #define GFS_ERR_ALIGN (-21) /* 作業領域が4byte境界にない */
395 #define GFS_ERR_TMOUT (-22) /* タイムアウト */
396 #define GFS_ERR_CDOPEN (-23) /* トレイが開いている */
397 #define GFS_ERR_BFUL (-24) /* バッファフルで読み込み中止 */
398 #define GFS_ERR_FATAL (-25) /* CDがFATAL状態 */
399 
400 
401 /* ステータス */
402 enum CdcStatus
403 {
404  /* ステータスコード(CDドライブ状態) */
405  CDC_ST_BUSY = 0x00, /* 状態遷移中 */
406  CDC_ST_PAUSE = 0x01, /* ポーズ中(一時停止) */
407  CDC_ST_STANDBY = 0x02, /* スタンバイ(ドライブ停止状態) */
408  CDC_ST_PLAY = 0x03, /* CD再生中 */
409  CDC_ST_SEEK = 0x04, /* シーク中 */
410  CDC_ST_SCAN = 0x05, /* スキャン再生中 */
411  CDC_ST_OPEN = 0x06, /* トレイが開いている */
412  CDC_ST_NODISC = 0x07, /* ディスクがない */
413  CDC_ST_RETRY = 0x08, /* リードリトライ処理中 */
414  CDC_ST_ERROR = 0x09, /* リードデータエラーが発生した */
415  CDC_ST_FATAL = 0x0a, /* 致命的エラーが発生した */
416 
417  /* その他 */
418  CDC_ST_PERI = 0x20, /* 定期レスポンス */
419  CDC_ST_TRNS = 0x40, /* データ転送要求あり */
420  CDC_ST_WAIT = 0x80, /* WAIT */
421  CDC_ST_REJECT = 0xff /* REJECT */
422 };
423 
424 /* 転送モード(GFS_SetTmode) */
425 enum GfsTransMode
426 {
427  GFS_TMODE_SCU = 0, /* SCUによりDMA転送 */
428  GFS_TMODE_SDMA0, /* DMAサイクルスチール転送 cn=0 */
429  GFS_TMODE_SDMA1, /* cn=1 */
430  GFS_TMODE_CPU, /* ソフトウェア転送 */
431  GFS_TMODE_STM, /* ストリーム用転送 */
432  GFS_TMODE_END
433 };
434 
435 
436 enum CdcPosType
437 {
438  CDC_PTYPE_DFL, /* 省略値の指定 */
439  CDC_PTYPE_FAD, /* フレームアドレス指定 */
440  CDC_PTYPE_TNO, /* トラック/インデックス指定 */
441  CDC_PTYPE_NOCHG, /* 未変更の指定(設定値を変更しない) */
442 
443  CDC_PTYPE_END
444 };
445 
446 /* CD位置パラメータ */
447 typedef struct
448 {
449  Sint32 ptype; /* 位置タイプ(位置パラメータの種類の指定)*/
450  union
451  {
452  Sint32 fad; /* フレームアドレス、セクタ数 */
453  struct
454  {
455  Uint8 tno; /* トラック番号 */
456  Uint8 idx; /* インデックス番号 */
457  } trkidx;
458  } pbody;
459 } CdcPos;
460 
461 
462 /* CD再生パラメータ */
463 typedef struct
464 {
465  CdcPos start; /* 開始位置 */
466  CdcPos end; /* 終了位置 */
467  Uint8 pmode; /* 再生モード(ピックアップ移動、繰り返し回数)*/
468 } CdcPly;
469 
470 
471 extern void slInitSound(Uint8 *, Uint32, Uint8 *, Uint32) ;
472 extern Bool slCDDAOn(Uint8, Uint8, Sint8, Sint8) ;
473 extern Sint8 slPCMOn(PCM *, void *, Uint32) ;
474 extern Bool slPCMOff(PCM *) ;
475 extern Sint8 slSndPCMNum() ;
476 extern void slSndFlush() ;
477 extern Bool slPCMStat(PCM *) ;
478 extern Bool slSndVolume(Uint8) ;
479 
480 Sint32 CDC_CdPlay(CdcPly *ply);
481 Sint32 CDC_CdSeek(CdcPos *pos);
482 Sint32 CDC_CdInit(Sint32 iflag, Sint32 stnby, Sint32 ecc, Sint32 retry);
483 
484 /* ファイル情報 */
485 typedef struct
486 {
487  Sint32 fad; /* ファイル先頭フレームアドレス */
488  Sint32 size; /* ファイルサイズ(バイト数) */
489  Uint8 unit; /* ファイルユニットサイズ */
490  Uint8 gap; /* ギャップサイズ */
491  Uint8 fn; /* ファイル番号 */
492  Uint8 atr; /* ファイルアトリビュート */
493 } CdcFile;
494 
495 /* サブヘッダ条件 */
496 typedef struct
497 {
498  Uint8 fn; /* ファイル番号 */
499  Uint8 cn; /* チャネル番号 */
500  Uint8 smmsk; /* サブモードのマスクパターン */
501  Uint8 smval; /* サブモードの比較値 */
502  Uint8 cimsk; /* コーディング情報のマスクパターン */
503  Uint8 cival; /* コーディング情報の比較値 */
504 } CdcSubh;
505 
506 
507 enum GfsSeekMode {
508  GFS_SEEK_SET = 0, /* 先頭からシーク */
509  GFS_SEEK_CUR, /* 現在の位置からシーク */
510  GFS_SEEK_END /* 終端からシーク */
511 };
512 
513 typedef Sint32 (*GfsTransFunc)(void *obj, Sint32 nsct);
514 
515 
516 
517 /* ファイル情報 */
518 typedef struct
519 {
520  Sint32 fid; /* ファイル識別子 */
521  CdcFile finfo;
522  Sint32 sctsz; /* セクタ長 */
523  Sint32 nsct; /* セクタ数 */
524  Sint32 lstrm; /* 最終セクタ中の無効データ数 */
525 } GfsFinfo;
526 
527 
528 /* CDバッファの資源管理 */
529 typedef struct
530 {
531  Sint32 bufno; /* バッファ区画番号 */
532  Sint32 sctsz; /* CDバッファのセクタサイズ */
533  Sint32 flt; /* 絞り番号 */
534  CdcSubh subh; /* サブヘッダ */
535  Sint32 fmode; /* 絞りモード */
536  Sint32 puid; /* 取得ピックアップのユーザID */
537  Sint32 filepos; /* 先頭データのファイル上の位置 */
538  Sint32 sctpos; /* 転送位置 */
539  /* 再生範囲 */
540  Sint32 sfad; /* 開始FAD */
541  Sint32 efad; /* 終了FAD */
542 } GfsCdRsrc;
543 
544 
545 /* SCSIファイルの仮想CDバッファ管理 */
546 typedef struct
547 {
548  Sint32 fid; /* SCSIファイル識別子 */
549  Sint32 filepos; /* 先頭データのファイル上の位置 */
550  Sint32 sctpos; /* バッファ上のセクタ位置 */
551  Sint32 sctnum; /* バッファ内のセクタ数 */
552 } GfsScsiRsrc;
553 
554 
555 /* メモリファイルの仮想CDバッファ管理 */
556 typedef struct
557 {
558  void *data; /* データ領域 */
559  Sint32 filepos; /* 先頭データのファイル上の位置 */
560  Sint32 sctpos; /* バッファ上のセクタ位置 */
561  Sint32 sctnum; /* バッファ内のセクタ数 */
562 } GfsMemRsrc;
563 
564 
565 /* 読み込み元管理 */
566 typedef struct
567 {
568  /* 読み込み元管理 */
569  Sint32 ftype; /* ファイル種別 */
570  union
571  {
572  GfsCdRsrc cd; /* CDの資源 */
573  GfsScsiRsrc scsi; /* SCSIファイルの資源 */
574  GfsMemRsrc mem; /* メモリファイルの資源 */
575  } rsrc;
576 } GfsDtsrc;
577 
578 
579 /* CDからの読み込みを管理する */
580 typedef struct
581 {
582  GfsFinfo finfo; /* ファイル情報 */
583  GfsDtsrc dtsrc; /* 読み込み元 */
584  Sint32 gmode; /* 取り出しモード */
585  Sint32 stat; /* 実行状態 */
586  /* flow in管理 */
587  Sint32 sct; /* 読み込みセクタ数 */
588  Sint32 sctcnt; /* 読み込みカウンタ */
589  Sint32 sctmax; /* 読み込み最大セクタ数 */
590 } GfsFlow;
591 
592 
593 /* データパック構造体 */
594 typedef struct
595 {
596  void *data; /* データ領域 */
597  Sint32 adlt; /* アドレスの増加分 */
598  Sint32 len; /* 転送バイト数 */
599  Sint32 nsct; /* 転送セクタ数 */
600  Bool use; /* 使用フラグ */
601 } GfsDataPack;
602 
603 
604 typedef GfsDataPack *GfdpHn;
605 
606 /* 転送管理 */
607 /* CDバッファからの転送を管理する */
608 typedef struct
609 {
610  void *buf; /* 転送先アドレス */
611  Sint32 size; /* データ領域のサイズ */
612  Sint32 wp; /* 書き込みオフセット */
613  /* 転送管理 */
614  GfdpHn dps; /* 転送元のデータパック */
615  GfdpHn dpd; /* 転送先からのデータパック */
616  Sint32 tsctmax; /* 1回の転送の最大セクタ数 */
617  Sint32 tsct; /* 転送目標セクタ数 */
618  Sint32 tsctcnt; /* 現在まで転送セクタ数 */
619  Sint32 tbytcnt; /* セクタ内の転送バイト数 */
620  /* 転送関数 */
621  void *obj; /* 転送関数への第1引数 */
622  GfsTransFunc tfunc; /* 転送関数 */
623  Sint32 unit; /* 転送単位 */
624  Bool active; /* 動作中フラグ */
625  Sint32 stat; /* 状態 */
626  Sint32 mode; /* 転送モード */
627 } GfsTrans;
628 
629 
630 typedef GfsTrans *GftrHn;
631 
632 
633 /* オープンしたファイルを管理する */
634 typedef struct
635 {
636  Bool used; /* この構造体が使用中かどうか */
637  Sint32 amode; /* アクセスモード */
638  Sint32 astat; /* アクセス状態 */
639  GfsFlow flow;
640  GfsTrans trans;
641 } GfsFile;
642 
643 #define GFS_FNAME_LEN 12 /* ファイル名の長さ */
644 
645 
646 
647 /* ディレクトリレコード構造体(ファイル名なし) */
648 typedef struct
649 {
650  CdcFile dirrec;
651 } GfsDirId;
652 
653 
654 /* ディレクトリレコード構造体(ファイル名あり) */
655 typedef struct
656 {
657  CdcFile dirrec;
658  Sint8 fname[GFS_FNAME_LEN]; /* ファイル名 */
659 } GfsDirName;
660 
661 
662 /* ディレクトリ情報管理構造体 */
663 typedef struct
664 {
665  Sint32 type; /* 種別 */
666  Sint32 ndir; /* 最大要素数 */
667  union
668  {
669  GfsDirId *dir_i; /* ファイル名なしディレクトリ情報 */
670  GfsDirName *dir_n; /* ファイル名つきディレクトリ情報 */
671  } dir;
672 } GfsDirTbl;
673 
674 
675 /* ファイルハンドル */
676 typedef GfsFile *GfsHn;
677 
678 #define GFS_FTYPE_NR 3 /* ファイル種別数 */
679 #define GFS_SCTBUF_SIZ 2048 /* セクタバッファの大きさ */
680 #define GFS_OPEN_MAX 24 /* 最大オープンファイル数 */
681 #define GFS_FCONQ_MAX 24 /* 接続コマンドキューの最大長 */
682 
683 /* エラー処理関数 */
684 typedef void (*GfsErrFunc)(void *obj, Sint32 ec);
685 
686 /* エラー状態 */
687 typedef struct
688 {
689  GfsErrFunc func; /* エラー発生時の呼び出し関数 */
690  void *obj; /* 呼び出し関数に渡す第一引数 */
691  Sint32 code; /* エラーコード */
692 } GfsErrStat;
693 
694 #define GFS_CDBBUF_NR 24 /* CDブロックの区画数 */
695 #define GFS_SELQ_MAX 24 /* 絞り設定コマンドキューの最大長 */
696 
697 /* ディレクトリ種別(GFS_LoadDir, GFS_SetDir) */
698 enum GfsDirType
699 {
700  GFS_DIR_ID = 0, /* ファイル名によるアクセス不可 */
701  GFS_DIR_NAME /* ファイル名によるアクセス可 */
702 };
703 
704 enum GfsServerStatus
705 {
706  GFS_SVR_COMPLETED = 0, /* 全ファイルのアクセス終了 */
707  GFS_SVR_BUSY, /* ファイルアクセス中 */
708  GFS_SVR_CDPAUSE, /* CDバッファフルの為一時停止 */
709  GFS_SVR_ERROR /* エラー発生 */
710 };
711 
712 
713 
714 /* 接続コマンドキューの要素(CDブロック管理構造体, GfsCdbMngのメンバ) */
715 typedef struct
716 {
717  Sint32 flt; /* 設定絞り */
718  Sint32 buf; /* 真出力接続バッファ */
719  Sint32 flnout; /* 偽出力接続絞り(負の値を使用) */
720 } GfcdFconQu;
721 
722 
723 /* CDステータス情報(ステータス+CDレポート) */
724 typedef struct
725 {
726  Uint8 status; /* ステータス */
727  struct /* CDレポート */
728  {
729  Uint8 flgrep; /* CDフラグとリピート回数 */
730  Uint8 ctladr; /* CONTROL/ADRバイト */
731  Uint8 tno; /* トラック番号 */
732  Uint8 idx; /* インデックス番号 */
733  Sint32 fad; /* フレームアドレス */
734  } report;
735 } CdcStat;
736 
737 /* 絞り設定コマンドキューの要素(CDブロック管理構造体, GfsCdbMngのメンバ) */
738 typedef struct
739 {
740  Uint8 flt; /* 設定先絞り番号 */
741  Uint8 fmode; /* 絞りモード */
742  CdcSubh subh; /* サブヘッダ */
743  Sint32 fad; /* 開始FAD */
744  Sint32 snum; /* FADセクタ数 */
745 } GfcdSelQu;
746 
747 
748 /* CDブロック管理構造体(管理テーブル, GfsMngのメンバ) */
749 typedef struct
750 {
751  /* 資源管理 */
752  Sint8 use_buf[GFS_CDBBUF_NR]; /* バッファ区画使用状態 */
753  Sint8 use_filt[GFS_CDBBUF_NR]; /* 絞り使用状態 */
754  Bool use_pu; /* ピックアップ使用状態 */
755  Sint32 tr_bufno; /* データ転送中のバッファ区画 */
756  Sint32 puid; /* ピックアップの所有者ID */
757  Sint32 timer; /* タイムアウトカウンタ */
758  CdcStat stat; /* CDブロックの状態 */
759  void (*func)(void *); /* CSCTハンドラ */
760  void *obj; /* CSCTハンドラの引数 */
761  /* GFCD_SetFiltタスク */
762  struct
763  {
764  Sint32 len; /* 絞り設定コマンドキューの長さ */
765  Sint32 stat; /* コマンドキュー先頭の状態 */
766  GfcdSelQu selq[GFS_SELQ_MAX]; /* 絞り設定コマンドキュー */
767  } tsk_setflt;
768  /* GFCD_SetFiltConタスク */
769  struct
770  {
771  Sint32 len; /* 接続コマンドキューの長さ */
772  Sint32 stat; /* タスク終了フラグ */
773  GfcdFconQu fconq[GFS_FCONQ_MAX]; /* 接続コマンドキュー */
774  } tsk_fltcon;
775  /* GFCD_SetConタスク */
776  struct
777  {
778  Sint32 stat; /* タスク終了フラグ */
779  Sint32 flt; /* CD接続先絞り */
780  } tsk_setcon;
781  /* GFCD_GetLenDataタスク */
782  struct
783  {
784  Sint32 stat; /* タスク終了フラグ */
785  Sint32 bufno; /* 対象区画 */
786  Sint32 spos; /* 先頭セクタ位置 */
787  Sint32 usct; /* 要求セクタ数 */
788  Sint32 cnt; /* タスクの実行回数 */
789  Sint32 *nsct; /* 区画内セクタ数格納先 */
790  Sint32 *nbyte; /* 区画内バイト数格納先 */
791  } tsk_getlen;
792  /* GFCD_ReqDataタスク */
793  struct
794  {
795  Sint32 stat; /* タスク終了フラグ */
796  Sint32 bufno; /* 対象区画 */
797  Sint32 sctpos; /* セクタ位置 */
798  Sint32 nsct; /* 要求セクタ数 */
799  } tsk_reqdat;
800  /* GFCD_DelSctDataタスク */
801  struct
802  {
803  Sint32 stat; /* タスク終了フラグ */
804  Sint32 bufno; /* 対象区画 */
805  Sint32 sctpos; /* 削除開始セクタ位置 */
806  Sint32 nsct; /* 削除セクタ数 */
807  } tsk_delsct;
808  /* GFCD_MoveSctDataタスク */
809  struct
810  {
811  Sint32 stat; /* タスク終了フラグ */
812  Sint32 dst; /* 移動先区画 */
813  Sint32 src; /* 移動元区画 */
814  Sint32 spos; /* 移動開始セクタ位置 */
815  Sint32 snum; /* 移動セクタ数 */
816  Sint32 fmode; /* 移動先セレクタの絞りモード保存 */
817  } tsk_movsct;
818  /* GFCD_ChgDirタスク */
819  struct
820  {
821  Sint32 stat; /* タスク終了フラグ */
822  Sint16 fid; /* 設定ファイル識別子 */
823  Sint16 work; /* 作業バッファ */
824  Sint32 *ndir; /* 保持ディレクトリ情報個数 */
825  } tsk_chgdir;
826 } GfsCdbMng;
827 
828 
829 /* アクセスサーバ管理構造体(管理テーブル, GfsMngのメンバ) */
830 typedef struct
831 {
832  GfsHn access_file[GFS_OPEN_MAX]; /* アクセスモード指定済ファイル */
833  Sint32 nfile; /* 登録ファイル数 */
834 } GfsSvr;
835 
836 /* ディレクトリ管理構造体(管理テーブル, GfsMngのメンバ) */
837 typedef struct
838 {
839  GfsDirTbl dirtbl; /* ディレクトリ情報管理 */
840  Sint32 nfile; /* ファイル数 */
841 } GfsDirMng;
842 
843 /* ファイル操作用関数(管理テーブル, GfsMngのメンバ) */
844 typedef struct
845 {
846  Sint32 (*flowin)(GfsFlow *); /* ソースバッファ読み込み関数 */
847  void (*stopin)(GfsFlow *, Bool); /* 読み込み中止関数 */
848  Sint32 (*seek)(GfsFlow *, Sint32); /* アクセスポインタ設定関数 */
849  Sint32 (*tell)(GfsFlow *); /* アクセスポインタ取得関数 */
850 } GfsFileFunc;
851 
852 
853 /* 管理テーブル */
854 typedef struct
855 {
856  Sint32 openmax; /* オープンファイルの最大数 */
857  GfsFileFunc functbl[GFS_FTYPE_NR]; /* ファイル操作用関数 */
858  GfsSvr svr; /* アクセスサーバ */
859  GfsDirMng curdir; /* カレントディレクトリ */
860  GfsHn pickup; /* ピックアップ制御中ファイル */
861  Sint32 sfad; /* 再生範囲:開始FAD */
862  Sint32 efad; /* 再生範囲:終了FAD+1 */
863  GfsHn trans; /* データ転送中ファイル */
864  GfsErrStat error; /* エラー状態 */
865  Uint32 flags; /* デバイス接続情報など */
866  Sint32 timer; /* タイムアウトカウンタ */
867  GfsCdbMng cdb; /* CDブロック管理構造体 */
868  GfsDataPack srcpk; /* 転送元データパック */
869  GfsDataPack dstpk; /* 転送先データパック */
870  Uint8 sect_buf[GFS_SCTBUF_SIZ]; /* 1セクタの読み込み用バッファ */
871  GfsFile file[1]; /* 全ハンドルの配列(可変長) */
872 } GfsMng;
873 
874 #define GFS_WORK_SIZE(open_max) \
875  (sizeof(GfsMng) + ((open_max) - 1) * sizeof(GfsFile))
876 #define GFS_DIRTBL_TYPE(dirtbl) ((dirtbl)->type)
877 #define GFS_DIRTBL_DIRNAME(dirtbl) ((dirtbl)->dir.dir_n)
878 #define GFS_DIRTBL_NDIR(dirtbl) ((dirtbl)->ndir)
879 
880 /* ファイルシステムの初期化 */
881 Sint32 GFS_Init(Sint32 open_max, void *work, GfsDirTbl *dirtbl);
882 /* 即時復帰型読み込み */
883 Sint32 GFS_NwFread(GfsHn gfs, Sint32 nsct, void *buf, Sint32 bsize);
884 /* ファイル単位でのアクセス動作の実行 */
885 Sint32 GFS_NwExecOne(GfsHn gfs);
886 /* 完了復帰型読み込み */
887 Sint32 GFS_Fread(GfsHn gfs, Sint32 nsct, void *buf, Sint32 bsize);
888 /* アクセス状態の取得 */
889 void GFS_NwGetStat(GfsHn gfs, Sint32 *amode, Sint32 *ndata);
890 /* ファイルハンドルの割当て */
891 GfsHn GFS_Open(Sint32 fid);
892 /* ファイルハンドルの割当て解除 */
893 void GFS_Close(GfsHn gfs);
894 void GFS_GetFileSize(GfsHn gfs, Sint32 *sctsz, Sint32 *nsct, Sint32 *lstsz);
895 Sint32 GFS_NwCdRead(GfsHn gfs, Sint32 nsct);
896 Sint32 GFS_SetTransPara(GfsHn gfs, Sint32 tsize);
897 Sint32 GFS_SetReadPara(GfsHn gfs, Sint32 nsct);
898 Sint32 GFS_SetTmode(GfsHn gfs, Sint32 tmode);
899 
900 Sint32 GFS_LoadDir(Sint32 fid, GfsDirTbl *dirtbl);
901 Sint32 GFS_SetDir(GfsDirTbl *dirtbl);
902 Sint32 GFS_NameToId(Sint8 *fname);
903 Sint32 GFS_Load(Sint32 fid, Sint32 ofs, void *buf, Sint32 bsize);
904 Sint32 GFS_Seek(GfsHn gfs, Sint32 ofs, Sint32 org);
905 
906 typedef struct /* RTC時刻 */
907 {
908  Uint16 year; /* 西暦年号 */
909  Uint8 month; /* 曜日・月 */
910  Uint8 date; /* 日 */
911  Uint8 hour; /* 時 */
912  Uint8 minute; /* 分 */
913  Uint8 second; /* 秒 */
914  Uint8 dummy; /* ダミー */
915 } SmpcDateTime;
916 
917 
918 typedef struct /* SMPCステータス */
919 {
920  Uint8 cond; /* 状態ステータス */
921  Uint8 dummy1; /* ダミー1 */
922  Uint16 dummy2; /* ダミー2 */
923  SmpcDateTime rtc; /* RTC時刻 */
924  Uint8 ctg; /* カートリッジコード */
925  Uint8 area; /* エリアコード */
926  Uint16 system; /* システムステータス */
927  Uint32 smem; /* SMPCメモリ保持データ */
928 } SmpcStatus;
929 
930 enum SmpcLanguage /* SMPCメモリ言語番号 */
931 {
932  SMPC_ENGLISH, /* (00) 英語 */
933  SMPC_DEUTSCH, /* (01) ドイツ語 */
934  SMPC_FRANCAIS, /* (02) フランス語 */
935  SMPC_ESPANOL, /* (03) スペイン語 */
936  SMPC_ITALIANO, /* (04) イタリア語 */
937  SMPC_JAPAN /* (05) 日本語 */
938 };
939 
940 extern void slIntFunction(void (*func)()) ;
941 extern Uint8 slGetLanguage(void);
942 
943 extern SmpcStatus* Smpc_Status;
944 #define slGetStatus() slRequestCommand(SMPC_GETSTS, SMPC_NO_WAIT)
945 
946 
947 #define COL_256 (2+0) /* カラーバンク256色モード */
948 #define COL_32K (2-1) /* RGB32K色モード */
949 
950 #define SPR_ATTRIBUTE(t,c,g,a,d) {t,(a)|(((d)>>24)&0xc0),c,g,(d)&0x0f3f}
951 #define FUNC_Sprite 1
952 #define CL256Bnk (4 << 3) /* カラーバンク256色モード */
953 
954 #define SpriteVRAM 0x25c00000
955 
956 #define CGADDRESS 0x10000
957 #define AdjCG(cga,hs,vs,col) ((cga) + (((((hs)*(vs)*4)>>(col))+0x1f) &0x7ffe0))
958 #define TEXTBL(hs,vs,cga) {hs , vs , (cga)>>3 , ((hs)&0x1f8)<<5|(vs)}
959 #define PICTBL(texno,cmode,pcsrc) {(Uint16)(texno),(Uint16)(cmode),(void *)(pcsrc)}
960 
961 /*
962 #include <SGL_CPK.H>
963 */
964 
965 #else /* JO_COMPILE_USING_SGL */
966 
967 #include <SGL.H>
968 #include <SL_DEF.H>
969 #include <SEGA_CDC.H>
970 #include <SEGA_GFS.H>
971 
972 #endif
973 
974 /*
975 #include <SEGA_SYS.H>
976 */
977 void SYS_Exit(Sint32 code);
978 
979 #endif /* !__JO_SGL_PROTOTYPES_H__ */
980 
981 /*
982 ** END OF FILE
983 */
SYS_Exit
void SYS_Exit(Sint32 code)