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