Jo Engine  2023.08.26
Jo Sega Saturn Engine
sgl_prototypes.h
Go to the documentation of this file.
1 /*
2 ** Jo Sega Saturn Engine
3 ** Copyright (c) 2012-2020, 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 enum BooleanLogic /* 論理定数1(偽、真) */
250 {
251  FALSE = 0,
252  TRUE = 1
253 };
254 
255 enum tvsz
256 {
257  TV_320x224, TV_320x240, TV_320x256, TV_dummy1,
258  TV_352x224, TV_352x240, TV_352x256, TV_dummy2,
259  TV_640x224, TV_640x240, TV_640x256, TV_dummy3,
260  TV_704x224, TV_704x240, TV_704x256, TV_dummy4,
261 
262  TV_320x448, TV_320x480, TV_320x512, TV_dummy5,
263  TV_352x448, TV_352x480, TV_352x512, TV_dummy6,
264  TV_640x448, TV_640x480, TV_640x512, TV_dummy7,
265  TV_704x448, TV_704x480, TV_704x512, TV_dummy8
266 } ;
267 
268 #define PNB_2WORD 0
269 #define PNB_1WORD 0x8000
270 #define CN_10BIT 0
271 #define CN_12BIT 0x4000
272 #define COL_TYPE_32768 0x30
273 
274 #define PL_SIZE_1x1 0
275 #define PL_SIZE_2x1 1
276 #define PL_SIZE_2x2 3
277 
278 #define NBG0ON (1<<0)
279 #define NBG1ON (1<<1)
280 
281 #define BM_512x256 0x02
282 #define BM_512x512 0x06
283 #define BM_1024x256 0x0a
284 #define BM_1024x512 0x0e
285 
286 extern void slCurColor(Uint16) ;
287 extern PerDigital* Smpc_Peripheral;
288 extern Uint8 Per_Connect1, Per_Connect2;
289 extern void slPlaneNbg1(Uint16) ;
290 extern void slUnitMatrix(MATRIX) ;
291 extern Bool slDispSprite(FIXED *, SPR_ATTR *attr, ANGLE) ;
292 extern void slScrPosNbg1(FIXED x,FIXED y) ;
293 extern void slZoomNbg1(FIXED x,FIXED y) ;
294 extern void slDMACopy(void *, void *, Uint32) ;
295 extern void slBack1ColSet(void *, Uint16) ;
296 extern void slCharNbg0(Uint16 type,Uint16 size) ;
297 extern void slCharNbg1(Uint16 type,Uint16 size) ;
298 extern void slTVOn(void) ;
299 extern void slPageNbg1(void *,void *,Uint16) ;
300 extern void slMapNbg1(void *,void *,void *,void *) ;
301 extern void slPrint(char *, void *) ;
302 extern void slBitMapNbg1(Uint16, Uint16, void *) ;
303 extern void slTVOff(void) ;
304 extern Bool slScrAutoDisp(Uint32) ;
305 extern void slInitSystem(Uint16, TEXTURE *, Sint8) ;
306 extern void slSynch(void) ;
307 extern void slPriority(Sint16, Uint16) ;
308 extern void *slLocate(Uint16, Uint16) ;
309 #define scnNBG0 1
310 #define scnNBG1 0
311 
312 extern void slLookAt(FIXED *camera, FIXED *target, ANGLE) ;
313 extern void slLight(VECTOR) ;
314 extern Bool slPushMatrix(void) ;
315 extern Bool slPopMatrix(void) ;
316 extern void slRotX(ANGLE) ;
317 extern void slRotY(ANGLE) ;
318 extern void slRotZ(ANGLE) ;
319 extern void slScale(FIXED, FIXED, FIXED) ;
320 extern Bool slPutPolygon(PDATA *) ;
321 extern Bool slWindow(Sint16, Sint16, Sint16, Sint16, Sint16, Sint16, Sint16) ;
322 extern void slPerspective(ANGLE) ;
323 extern void slTranslate(FIXED, FIXED, FIXED) ;
324 extern void slZdspLevel(Uint16) ;
325 
326 extern Bool slRequestCommand(Uint8, Uint8);
327 
328 #define CDC_POS_PTYPE(pos) ((pos)->ptype)
329 #define CDC_POS_FAD(pos) ((pos)->pbody.fad)
330 #define CDC_POS_TNO(pos) ((pos)->pbody.trkidx.tno)
331 #define CDC_POS_IDX(pos) ((pos)->pbody.trkidx.idx)
332 
333 #define CDC_PLY_START(ply) ((ply)->start)
334 #define CDC_PLY_END(ply) ((ply)->end)
335 #define CDC_PLY_PMODE(ply) ((ply)->pmode)
336 
337 #define CDC_PLY_STYPE(ply) CDC_POS_PTYPE(&CDC_PLY_START(ply))
338 #define CDC_PLY_SFAD(ply) CDC_POS_FAD(&CDC_PLY_START(ply))
339 #define CDC_PLY_STNO(ply) CDC_POS_TNO(&CDC_PLY_START(ply))
340 #define CDC_PLY_SIDX(ply) CDC_POS_IDX(&CDC_PLY_START(ply))
341 
342 #define CDC_PLY_ETYPE(ply) CDC_POS_PTYPE(&CDC_PLY_END(ply))
343 #define CDC_PLY_EFAS(ply) CDC_POS_FAD(&CDC_PLY_END(ply))
344 #define CDC_PLY_ETNO(ply) CDC_POS_TNO(&CDC_PLY_END(ply))
345 #define CDC_PLY_EIDX(ply) CDC_POS_IDX(&CDC_PLY_END(ply))
346 
347 #define CDC_SM_EOR 0x01 /* レコード最後のセクタ */
348 #define CDC_SM_VIDEO 0x02 /* ビデオセクタ */
349 #define CDC_SM_AUDIO 0x04 /* オーディオセクタ */
350 #define CDC_SM_DATA 0x08 /* データセクタ */
351 #define CDC_SM_TRIG 0x10 /* トリガON */
352 #define CDC_SM_FORM 0x20 /* フォームビット(1:Form2, 0:Form1)*/
353 #define CDC_SM_RT 0x40 /* リアルタイムセクタ */
354 #define CDC_SM_EOF 0x80 /* ファイル最後のセクタ */
355 
356 #define CDC_PM_DFL 0x00 /* 再生モードの省略値 */
357 
358 /* エラーコード */
359 #define GFS_ERR_OK 0 /* 正常終了 */
360 #define GFS_ERR_CDRD (-1) /* CDリードエラー */
361 #define GFS_ERR_CDNODISC (-2) /* CDがセットされていない */
362 #define GFS_ERR_CDROM (-3) /* ディスクがCD-ROMでない */
363 #define GFS_ERR_DIRTBL (-4) /* ディレクトリ管理テーブルが不正 */
364 #define GFS_ERR_OPENMAX (-5) /* 最大オープン数の値が不正 */
365 #define GFS_ERR_DIR (-6) /* 指定ファイルはディレクトリでない */
366 #define GFS_ERR_CDBFS (-7) /* CDブロックファイルシステムの */
367 
368 #define GFS_ERR_NONAME (-8) /* ファイル名を扱えない */
369 #define GFS_ERR_NEXIST (-9) /* 指定されたファイルは存在しない */
370 #define GFS_ERR_FID (-10) /* 不正なファイル識別子 */
371 #define GFS_ERR_HNDL (-11) /* ファイルハンドルが不正 */
372 #define GFS_ERR_SEEK (-12) /* シーク位置が不正 */
373 #define GFS_ERR_ORG (-13) /* 基準位値が不正 */
374 #define GFS_ERR_NUM (-14) /* バイト数が負 */
375 #define GFS_ERR_OFS (-15) /* オフセットが不正 */
376 #define GFS_ERR_FBUSY (-16) /* 指定ファイルの処理が残っている */
377 #define GFS_ERR_PARA (-17) /* パラメータが不正 */
378 #define GFS_ERR_BUSY (-18) /* ライブラリ関数実行中 */
379 #define GFS_ERR_NOHNDL (-19) /* ファイルハンドルに空きがない */
380 #define GFS_ERR_PUINUSE (-20) /* ピックアップ動作中 */
381 #define GFS_ERR_ALIGN (-21) /* 作業領域が4byte境界にない */
382 #define GFS_ERR_TMOUT (-22) /* タイムアウト */
383 #define GFS_ERR_CDOPEN (-23) /* トレイが開いている */
384 #define GFS_ERR_BFUL (-24) /* バッファフルで読み込み中止 */
385 #define GFS_ERR_FATAL (-25) /* CDがFATAL状態 */
386 
387 
388 /* ステータス */
389 enum CdcStatus
390 {
391  /* ステータスコード(CDドライブ状態) */
392  CDC_ST_BUSY = 0x00, /* 状態遷移中 */
393  CDC_ST_PAUSE = 0x01, /* ポーズ中(一時停止) */
394  CDC_ST_STANDBY = 0x02, /* スタンバイ(ドライブ停止状態) */
395  CDC_ST_PLAY = 0x03, /* CD再生中 */
396  CDC_ST_SEEK = 0x04, /* シーク中 */
397  CDC_ST_SCAN = 0x05, /* スキャン再生中 */
398  CDC_ST_OPEN = 0x06, /* トレイが開いている */
399  CDC_ST_NODISC = 0x07, /* ディスクがない */
400  CDC_ST_RETRY = 0x08, /* リードリトライ処理中 */
401  CDC_ST_ERROR = 0x09, /* リードデータエラーが発生した */
402  CDC_ST_FATAL = 0x0a, /* 致命的エラーが発生した */
403 
404  /* その他 */
405  CDC_ST_PERI = 0x20, /* 定期レスポンス */
406  CDC_ST_TRNS = 0x40, /* データ転送要求あり */
407  CDC_ST_WAIT = 0x80, /* WAIT */
408  CDC_ST_REJECT = 0xff /* REJECT */
409 };
410 
411 /* 転送モード(GFS_SetTmode) */
412 enum GfsTransMode
413 {
414  GFS_TMODE_SCU = 0, /* SCUによりDMA転送 */
415  GFS_TMODE_SDMA0, /* DMAサイクルスチール転送 cn=0 */
416  GFS_TMODE_SDMA1, /* cn=1 */
417  GFS_TMODE_CPU, /* ソフトウェア転送 */
418  GFS_TMODE_STM, /* ストリーム用転送 */
419  GFS_TMODE_END
420 };
421 
422 
423 enum CdcPosType
424 {
425  CDC_PTYPE_DFL, /* 省略値の指定 */
426  CDC_PTYPE_FAD, /* フレームアドレス指定 */
427  CDC_PTYPE_TNO, /* トラック/インデックス指定 */
428  CDC_PTYPE_NOCHG, /* 未変更の指定(設定値を変更しない) */
429 
430  CDC_PTYPE_END
431 };
432 
433 /* CD位置パラメータ */
434 typedef struct
435 {
436  Sint32 ptype; /* 位置タイプ(位置パラメータの種類の指定)*/
437  union
438  {
439  Sint32 fad; /* フレームアドレス、セクタ数 */
440  struct
441  {
442  Uint8 tno; /* トラック番号 */
443  Uint8 idx; /* インデックス番号 */
444  } trkidx;
445  } pbody;
446 } CdcPos;
447 
448 
449 /* CD再生パラメータ */
450 typedef struct
451 {
452  CdcPos start; /* 開始位置 */
453  CdcPos end; /* 終了位置 */
454  Uint8 pmode; /* 再生モード(ピックアップ移動、繰り返し回数)*/
455 } CdcPly;
456 
457 
458 extern void slInitSound(Uint8 *, Uint32, Uint8 *, Uint32) ;
459 extern Bool slCDDAOn(Uint8, Uint8, Sint8, Sint8) ;
460 extern Sint8 slPCMOn(PCM *, void *, Uint32) ;
461 extern Bool slPCMOff(PCM *) ;
462 extern Sint8 slSndPCMNum() ;
463 extern void slSndFlush() ;
464 extern Bool slPCMStat(PCM *) ;
465 extern Bool slSndVolume(Uint8) ;
466 
467 Sint32 CDC_CdPlay(CdcPly *ply);
468 Sint32 CDC_CdSeek(CdcPos *pos);
469 Sint32 CDC_CdInit(Sint32 iflag, Sint32 stnby, Sint32 ecc, Sint32 retry);
470 
471 /* ファイル情報 */
472 typedef struct
473 {
474  Sint32 fad; /* ファイル先頭フレームアドレス */
475  Sint32 size; /* ファイルサイズ(バイト数) */
476  Uint8 unit; /* ファイルユニットサイズ */
477  Uint8 gap; /* ギャップサイズ */
478  Uint8 fn; /* ファイル番号 */
479  Uint8 atr; /* ファイルアトリビュート */
480 } CdcFile;
481 
482 /* サブヘッダ条件 */
483 typedef struct
484 {
485  Uint8 fn; /* ファイル番号 */
486  Uint8 cn; /* チャネル番号 */
487  Uint8 smmsk; /* サブモードのマスクパターン */
488  Uint8 smval; /* サブモードの比較値 */
489  Uint8 cimsk; /* コーディング情報のマスクパターン */
490  Uint8 cival; /* コーディング情報の比較値 */
491 } CdcSubh;
492 
493 
494 enum GfsSeekMode {
495  GFS_SEEK_SET = 0, /* 先頭からシーク */
496  GFS_SEEK_CUR, /* 現在の位置からシーク */
497  GFS_SEEK_END /* 終端からシーク */
498 };
499 
500 typedef Sint32 (*GfsTransFunc)(void *obj, Sint32 nsct);
501 
502 
503 
504 /* ファイル情報 */
505 typedef struct
506 {
507  Sint32 fid; /* ファイル識別子 */
508  CdcFile finfo;
509  Sint32 sctsz; /* セクタ長 */
510  Sint32 nsct; /* セクタ数 */
511  Sint32 lstrm; /* 最終セクタ中の無効データ数 */
512 } GfsFinfo;
513 
514 
515 /* CDバッファの資源管理 */
516 typedef struct
517 {
518  Sint32 bufno; /* バッファ区画番号 */
519  Sint32 sctsz; /* CDバッファのセクタサイズ */
520  Sint32 flt; /* 絞り番号 */
521  CdcSubh subh; /* サブヘッダ */
522  Sint32 fmode; /* 絞りモード */
523  Sint32 puid; /* 取得ピックアップのユーザID */
524  Sint32 filepos; /* 先頭データのファイル上の位置 */
525  Sint32 sctpos; /* 転送位置 */
526  /* 再生範囲 */
527  Sint32 sfad; /* 開始FAD */
528  Sint32 efad; /* 終了FAD */
529 } GfsCdRsrc;
530 
531 
532 /* SCSIファイルの仮想CDバッファ管理 */
533 typedef struct
534 {
535  Sint32 fid; /* SCSIファイル識別子 */
536  Sint32 filepos; /* 先頭データのファイル上の位置 */
537  Sint32 sctpos; /* バッファ上のセクタ位置 */
538  Sint32 sctnum; /* バッファ内のセクタ数 */
539 } GfsScsiRsrc;
540 
541 
542 /* メモリファイルの仮想CDバッファ管理 */
543 typedef struct
544 {
545  void *data; /* データ領域 */
546  Sint32 filepos; /* 先頭データのファイル上の位置 */
547  Sint32 sctpos; /* バッファ上のセクタ位置 */
548  Sint32 sctnum; /* バッファ内のセクタ数 */
549 } GfsMemRsrc;
550 
551 
552 /* 読み込み元管理 */
553 typedef struct
554 {
555  /* 読み込み元管理 */
556  Sint32 ftype; /* ファイル種別 */
557  union
558  {
559  GfsCdRsrc cd; /* CDの資源 */
560  GfsScsiRsrc scsi; /* SCSIファイルの資源 */
561  GfsMemRsrc mem; /* メモリファイルの資源 */
562  } rsrc;
563 } GfsDtsrc;
564 
565 
566 /* CDからの読み込みを管理する */
567 typedef struct
568 {
569  GfsFinfo finfo; /* ファイル情報 */
570  GfsDtsrc dtsrc; /* 読み込み元 */
571  Sint32 gmode; /* 取り出しモード */
572  Sint32 stat; /* 実行状態 */
573  /* flow in管理 */
574  Sint32 sct; /* 読み込みセクタ数 */
575  Sint32 sctcnt; /* 読み込みカウンタ */
576  Sint32 sctmax; /* 読み込み最大セクタ数 */
577 } GfsFlow;
578 
579 
580 /* データパック構造体 */
581 typedef struct
582 {
583  void *data; /* データ領域 */
584  Sint32 adlt; /* アドレスの増加分 */
585  Sint32 len; /* 転送バイト数 */
586  Sint32 nsct; /* 転送セクタ数 */
587  Bool use; /* 使用フラグ */
588 } GfsDataPack;
589 
590 
591 typedef GfsDataPack *GfdpHn;
592 
593 /* 転送管理 */
594 /* CDバッファからの転送を管理する */
595 typedef struct
596 {
597  void *buf; /* 転送先アドレス */
598  Sint32 size; /* データ領域のサイズ */
599  Sint32 wp; /* 書き込みオフセット */
600  /* 転送管理 */
601  GfdpHn dps; /* 転送元のデータパック */
602  GfdpHn dpd; /* 転送先からのデータパック */
603  Sint32 tsctmax; /* 1回の転送の最大セクタ数 */
604  Sint32 tsct; /* 転送目標セクタ数 */
605  Sint32 tsctcnt; /* 現在まで転送セクタ数 */
606  Sint32 tbytcnt; /* セクタ内の転送バイト数 */
607  /* 転送関数 */
608  void *obj; /* 転送関数への第1引数 */
609  GfsTransFunc tfunc; /* 転送関数 */
610  Sint32 unit; /* 転送単位 */
611  Bool active; /* 動作中フラグ */
612  Sint32 stat; /* 状態 */
613  Sint32 mode; /* 転送モード */
614 } GfsTrans;
615 
616 
617 typedef GfsTrans *GftrHn;
618 
619 
620 /* オープンしたファイルを管理する */
621 typedef struct
622 {
623  Bool used; /* この構造体が使用中かどうか */
624  Sint32 amode; /* アクセスモード */
625  Sint32 astat; /* アクセス状態 */
626  GfsFlow flow;
627  GfsTrans trans;
628 } GfsFile;
629 
630 #define GFS_FNAME_LEN 12 /* ファイル名の長さ */
631 
632 
633 
634 /* ディレクトリレコード構造体(ファイル名なし) */
635 typedef struct
636 {
637  CdcFile dirrec;
638 } GfsDirId;
639 
640 
641 /* ディレクトリレコード構造体(ファイル名あり) */
642 typedef struct
643 {
644  CdcFile dirrec;
645  Sint8 fname[GFS_FNAME_LEN]; /* ファイル名 */
646 } GfsDirName;
647 
648 
649 /* ディレクトリ情報管理構造体 */
650 typedef struct
651 {
652  Sint32 type; /* 種別 */
653  Sint32 ndir; /* 最大要素数 */
654  union
655  {
656  GfsDirId *dir_i; /* ファイル名なしディレクトリ情報 */
657  GfsDirName *dir_n; /* ファイル名つきディレクトリ情報 */
658  } dir;
659 } GfsDirTbl;
660 
661 
662 /* ファイルハンドル */
663 typedef GfsFile *GfsHn;
664 
665 #define GFS_FTYPE_NR 3 /* ファイル種別数 */
666 #define GFS_SCTBUF_SIZ 2048 /* セクタバッファの大きさ */
667 #define GFS_OPEN_MAX 24 /* 最大オープンファイル数 */
668 #define GFS_FCONQ_MAX 24 /* 接続コマンドキューの最大長 */
669 
670 /* エラー処理関数 */
671 typedef void (*GfsErrFunc)(void *obj, Sint32 ec);
672 
673 /* エラー状態 */
674 typedef struct
675 {
676  GfsErrFunc func; /* エラー発生時の呼び出し関数 */
677  void *obj; /* 呼び出し関数に渡す第一引数 */
678  Sint32 code; /* エラーコード */
679 } GfsErrStat;
680 
681 #define GFS_CDBBUF_NR 24 /* CDブロックの区画数 */
682 #define GFS_SELQ_MAX 24 /* 絞り設定コマンドキューの最大長 */
683 
684 /* ディレクトリ種別(GFS_LoadDir, GFS_SetDir) */
685 enum GfsDirType
686 {
687  GFS_DIR_ID = 0, /* ファイル名によるアクセス不可 */
688  GFS_DIR_NAME /* ファイル名によるアクセス可 */
689 };
690 
691 enum GfsServerStatus
692 {
693  GFS_SVR_COMPLETED = 0, /* 全ファイルのアクセス終了 */
694  GFS_SVR_BUSY, /* ファイルアクセス中 */
695  GFS_SVR_CDPAUSE, /* CDバッファフルの為一時停止 */
696  GFS_SVR_ERROR /* エラー発生 */
697 };
698 
699 
700 
701 /* 接続コマンドキューの要素(CDブロック管理構造体, GfsCdbMngのメンバ) */
702 typedef struct
703 {
704  Sint32 flt; /* 設定絞り */
705  Sint32 buf; /* 真出力接続バッファ */
706  Sint32 flnout; /* 偽出力接続絞り(負の値を使用) */
707 } GfcdFconQu;
708 
709 
710 /* CDステータス情報(ステータス+CDレポート) */
711 typedef struct
712 {
713  Uint8 status; /* ステータス */
714  struct /* CDレポート */
715  {
716  Uint8 flgrep; /* CDフラグとリピート回数 */
717  Uint8 ctladr; /* CONTROL/ADRバイト */
718  Uint8 tno; /* トラック番号 */
719  Uint8 idx; /* インデックス番号 */
720  Sint32 fad; /* フレームアドレス */
721  } report;
722 } CdcStat;
723 
724 /* 絞り設定コマンドキューの要素(CDブロック管理構造体, GfsCdbMngのメンバ) */
725 typedef struct
726 {
727  Uint8 flt; /* 設定先絞り番号 */
728  Uint8 fmode; /* 絞りモード */
729  CdcSubh subh; /* サブヘッダ */
730  Sint32 fad; /* 開始FAD */
731  Sint32 snum; /* FADセクタ数 */
732 } GfcdSelQu;
733 
734 
735 /* CDブロック管理構造体(管理テーブル, GfsMngのメンバ) */
736 typedef struct
737 {
738  /* 資源管理 */
739  Sint8 use_buf[GFS_CDBBUF_NR]; /* バッファ区画使用状態 */
740  Sint8 use_filt[GFS_CDBBUF_NR]; /* 絞り使用状態 */
741  Bool use_pu; /* ピックアップ使用状態 */
742  Sint32 tr_bufno; /* データ転送中のバッファ区画 */
743  Sint32 puid; /* ピックアップの所有者ID */
744  Sint32 timer; /* タイムアウトカウンタ */
745  CdcStat stat; /* CDブロックの状態 */
746  void (*func)(void *); /* CSCTハンドラ */
747  void *obj; /* CSCTハンドラの引数 */
748  /* GFCD_SetFiltタスク */
749  struct
750  {
751  Sint32 len; /* 絞り設定コマンドキューの長さ */
752  Sint32 stat; /* コマンドキュー先頭の状態 */
753  GfcdSelQu selq[GFS_SELQ_MAX]; /* 絞り設定コマンドキュー */
754  } tsk_setflt;
755  /* GFCD_SetFiltConタスク */
756  struct
757  {
758  Sint32 len; /* 接続コマンドキューの長さ */
759  Sint32 stat; /* タスク終了フラグ */
760  GfcdFconQu fconq[GFS_FCONQ_MAX]; /* 接続コマンドキュー */
761  } tsk_fltcon;
762  /* GFCD_SetConタスク */
763  struct
764  {
765  Sint32 stat; /* タスク終了フラグ */
766  Sint32 flt; /* CD接続先絞り */
767  } tsk_setcon;
768  /* GFCD_GetLenDataタスク */
769  struct
770  {
771  Sint32 stat; /* タスク終了フラグ */
772  Sint32 bufno; /* 対象区画 */
773  Sint32 spos; /* 先頭セクタ位置 */
774  Sint32 usct; /* 要求セクタ数 */
775  Sint32 cnt; /* タスクの実行回数 */
776  Sint32 *nsct; /* 区画内セクタ数格納先 */
777  Sint32 *nbyte; /* 区画内バイト数格納先 */
778  } tsk_getlen;
779  /* GFCD_ReqDataタスク */
780  struct
781  {
782  Sint32 stat; /* タスク終了フラグ */
783  Sint32 bufno; /* 対象区画 */
784  Sint32 sctpos; /* セクタ位置 */
785  Sint32 nsct; /* 要求セクタ数 */
786  } tsk_reqdat;
787  /* GFCD_DelSctDataタスク */
788  struct
789  {
790  Sint32 stat; /* タスク終了フラグ */
791  Sint32 bufno; /* 対象区画 */
792  Sint32 sctpos; /* 削除開始セクタ位置 */
793  Sint32 nsct; /* 削除セクタ数 */
794  } tsk_delsct;
795  /* GFCD_MoveSctDataタスク */
796  struct
797  {
798  Sint32 stat; /* タスク終了フラグ */
799  Sint32 dst; /* 移動先区画 */
800  Sint32 src; /* 移動元区画 */
801  Sint32 spos; /* 移動開始セクタ位置 */
802  Sint32 snum; /* 移動セクタ数 */
803  Sint32 fmode; /* 移動先セレクタの絞りモード保存 */
804  } tsk_movsct;
805  /* GFCD_ChgDirタスク */
806  struct
807  {
808  Sint32 stat; /* タスク終了フラグ */
809  Sint16 fid; /* 設定ファイル識別子 */
810  Sint16 work; /* 作業バッファ */
811  Sint32 *ndir; /* 保持ディレクトリ情報個数 */
812  } tsk_chgdir;
813 } GfsCdbMng;
814 
815 
816 /* アクセスサーバ管理構造体(管理テーブル, GfsMngのメンバ) */
817 typedef struct
818 {
819  GfsHn access_file[GFS_OPEN_MAX]; /* アクセスモード指定済ファイル */
820  Sint32 nfile; /* 登録ファイル数 */
821 } GfsSvr;
822 
823 /* ディレクトリ管理構造体(管理テーブル, GfsMngのメンバ) */
824 typedef struct
825 {
826  GfsDirTbl dirtbl; /* ディレクトリ情報管理 */
827  Sint32 nfile; /* ファイル数 */
828 } GfsDirMng;
829 
830 /* ファイル操作用関数(管理テーブル, GfsMngのメンバ) */
831 typedef struct
832 {
833  Sint32 (*flowin)(GfsFlow *); /* ソースバッファ読み込み関数 */
834  void (*stopin)(GfsFlow *, Bool); /* 読み込み中止関数 */
835  Sint32 (*seek)(GfsFlow *, Sint32); /* アクセスポインタ設定関数 */
836  Sint32 (*tell)(GfsFlow *); /* アクセスポインタ取得関数 */
837 } GfsFileFunc;
838 
839 
840 /* 管理テーブル */
841 typedef struct
842 {
843  Sint32 openmax; /* オープンファイルの最大数 */
844  GfsFileFunc functbl[GFS_FTYPE_NR]; /* ファイル操作用関数 */
845  GfsSvr svr; /* アクセスサーバ */
846  GfsDirMng curdir; /* カレントディレクトリ */
847  GfsHn pickup; /* ピックアップ制御中ファイル */
848  Sint32 sfad; /* 再生範囲:開始FAD */
849  Sint32 efad; /* 再生範囲:終了FAD+1 */
850  GfsHn trans; /* データ転送中ファイル */
851  GfsErrStat error; /* エラー状態 */
852  Uint32 flags; /* デバイス接続情報など */
853  Sint32 timer; /* タイムアウトカウンタ */
854  GfsCdbMng cdb; /* CDブロック管理構造体 */
855  GfsDataPack srcpk; /* 転送元データパック */
856  GfsDataPack dstpk; /* 転送先データパック */
857  Uint8 sect_buf[GFS_SCTBUF_SIZ]; /* 1セクタの読み込み用バッファ */
858  GfsFile file[1]; /* 全ハンドルの配列(可変長) */
859 } GfsMng;
860 
861 #define GFS_WORK_SIZE(open_max) \
862  (sizeof(GfsMng) + ((open_max) - 1) * sizeof(GfsFile))
863 #define GFS_DIRTBL_TYPE(dirtbl) ((dirtbl)->type)
864 #define GFS_DIRTBL_DIRNAME(dirtbl) ((dirtbl)->dir.dir_n)
865 #define GFS_DIRTBL_NDIR(dirtbl) ((dirtbl)->ndir)
866 
867 /* ファイルシステムの初期化 */
868 Sint32 GFS_Init(Sint32 open_max, void *work, GfsDirTbl *dirtbl);
869 /* 即時復帰型読み込み */
870 Sint32 GFS_NwFread(GfsHn gfs, Sint32 nsct, void *buf, Sint32 bsize);
871 /* ファイル単位でのアクセス動作の実行 */
872 Sint32 GFS_NwExecOne(GfsHn gfs);
873 /* 完了復帰型読み込み */
874 Sint32 GFS_Fread(GfsHn gfs, Sint32 nsct, void *buf, Sint32 bsize);
875 /* アクセス状態の取得 */
876 void GFS_NwGetStat(GfsHn gfs, Sint32 *amode, Sint32 *ndata);
877 /* ファイルハンドルの割当て */
878 GfsHn GFS_Open(Sint32 fid);
879 /* ファイルハンドルの割当て解除 */
880 void GFS_Close(GfsHn gfs);
881 void GFS_GetFileSize(GfsHn gfs, Sint32 *sctsz, Sint32 *nsct, Sint32 *lstsz);
882 Sint32 GFS_NwCdRead(GfsHn gfs, Sint32 nsct);
883 Sint32 GFS_SetTransPara(GfsHn gfs, Sint32 tsize);
884 Sint32 GFS_SetReadPara(GfsHn gfs, Sint32 nsct);
885 Sint32 GFS_SetTmode(GfsHn gfs, Sint32 tmode);
886 
887 Sint32 GFS_LoadDir(Sint32 fid, GfsDirTbl *dirtbl);
888 Sint32 GFS_SetDir(GfsDirTbl *dirtbl);
889 Sint32 GFS_NameToId(Sint8 *fname);
890 Sint32 GFS_Load(Sint32 fid, Sint32 ofs, void *buf, Sint32 bsize);
891 Sint32 GFS_Seek(GfsHn gfs, Sint32 ofs, Sint32 org);
892 
893 typedef struct /* RTC時刻 */
894 {
895  Uint16 year; /* 西暦年号 */
896  Uint8 month; /* 曜日・月 */
897  Uint8 date; /* 日 */
898  Uint8 hour; /* 時 */
899  Uint8 minute; /* 分 */
900  Uint8 second; /* 秒 */
901  Uint8 dummy; /* ダミー */
902 } SmpcDateTime;
903 
904 
905 typedef struct /* SMPCステータス */
906 {
907  Uint8 cond; /* 状態ステータス */
908  Uint8 dummy1; /* ダミー1 */
909  Uint16 dummy2; /* ダミー2 */
910  SmpcDateTime rtc; /* RTC時刻 */
911  Uint8 ctg; /* カートリッジコード */
912  Uint8 area; /* エリアコード */
913  Uint16 system; /* システムステータス */
914  Uint32 smem; /* SMPCメモリ保持データ */
915 } SmpcStatus;
916 
917 enum SmpcLanguage /* SMPCメモリ言語番号 */
918 {
919  SMPC_ENGLISH, /* (00) 英語 */
920  SMPC_DEUTSCH, /* (01) ドイツ語 */
921  SMPC_FRANCAIS, /* (02) フランス語 */
922  SMPC_ESPANOL, /* (03) スペイン語 */
923  SMPC_ITALIANO, /* (04) イタリア語 */
924  SMPC_JAPAN /* (05) 日本語 */
925 };
926 
927 extern void slIntFunction(void (*func)()) ;
928 extern Uint8 slGetLanguage(void);
929 
930 extern SmpcStatus* Smpc_Status;
931 #define slGetStatus() slRequestCommand(SMPC_GETSTS, SMPC_NO_WAIT)
932 
933 
934 #define COL_256 (2+0) /* カラーバンク256色モード */
935 #define COL_32K (2-1) /* RGB32K色モード */
936 
937 #define SPR_ATTRIBUTE(t,c,g,a,d) {t,(a)|(((d)>>24)&0xc0),c,g,(d)&0x0f3f}
938 #define FUNC_Sprite 1
939 #define CL256Bnk (4 << 3) /* カラーバンク256色モード */
940 
941 #define SpriteVRAM 0x25c00000
942 
943 #define CGADDRESS 0x10000
944 #define AdjCG(cga,hs,vs,col) ((cga) + (((((hs)*(vs)*4)>>(col))+0x1f) &0x7ffe0))
945 #define TEXTBL(hs,vs,cga) {hs , vs , (cga)>>3 , ((hs)&0x1f8)<<5|(vs)}
946 #define PICTBL(texno,cmode,pcsrc) {(Uint16)(texno),(Uint16)(cmode),(void *)(pcsrc)}
947 
948 /*
949 #include <SGL_CPK.H>
950 */
951 
952 #else /* JO_COMPILE_USING_SGL */
953 
954 #include <SGL.H>
955 #include <SL_DEF.H>
956 #include <SEGA_CDC.H>
957 #include <SEGA_GFS.H>
958 
959 #endif
960 
961 /*
962 #include <SEGA_SYS.H>
963 */
964 void SYS_Exit(Sint32 code);
965 
966 #endif /* !__JO_SGL_PROTOTYPES_H__ */
967 
968 /*
969 ** END OF FILE
970 */
SYS_Exit
void SYS_Exit(Sint32 code)