void *eventtbl[] = {
init_camera ,
init_player1 ,
init_player2 ,
init_enemyctrl
} ;
void InitGame(){
void **evrdptr ;
EVENT *evptr ;
int cnt ;
slInitEvent() ; /* イベント管理用変数の初期化 */
evrptr = eventtbl ;
for(cnt = sizeof(eventtbl) / sizeof(void *) ; cnt-- > 0 ;){
evptr = slSetEvent(*evrptr++) ;
}
slSetSprTVMode(TV_320x224) ;
}
void Game(){
slExecuteEvent() ; /* イベントの実行 */
slSynch() ; /* ポリゴンデータの出力とビデオ表示同期 */
}
void function(EVENT *evptr){
... /* イベント処理 */
}
アセンブリ言語で書く場合には
_function:
... ; イベント処理
; イベントのポインタは r4レジスタにセットされている
rts
nop
EventTop: ----+
|
| +------------------+
+-->| *work = NULL |
| *before = NULL |
+-- | *next |
| | *exad() |
| | user[] |
| +------------------+
|
| +------------------+ +------------------+
+--> | *work | ---> | *next | -+
| *before | | | |
+-- | *next | | | |
| | *exad() | +------------------+ |
| | user[] | +-------------------------+
| +------------------+ |
| | +------------------+
| +------------------+ +-> | *next = NULL |
EventLast: ---+--> | *work | | |
| *before | | |
| *next = NULL | +------------------+
| *exad() |
| user[] |
+------------------+
typedef struct rob{
FIXED posX , posY , posZ ;
ANGLE angX , angY , angZ ;
PDATA *pat ;
} ROBOT ; /* この構造体は112バイトを越えない様にすること */
void rob_control(EVENT *evptr){
ROBOT *rbptr ;
rbptr = (ROBOT *)evptr->user ;
rbptr->posX = to_fixed(0) ;
rbptr->posY = to_fixed(0) ;
rbptr->posZ = to_fixed(0) ;
rbptr->pat = &PD_Robot ;
}
typedef struct road{
struct road *next ;
FIXED posX , posY , posZ ;
PDATA *pat ;
} ROAD ;
typedef struct rdat{
Sint16 px , py , pz ;
Uint16 pn ;
} ROAD_DAT ;
ROAD_DAT roadtbl[] = {
{ 0 , 0 , 0 , PN_ROAD} ,
{ 0 , 0 , 100 , PN_ROAD} ,
{ 0 , 0 , 200 , PN_ROAD}
} ;
void InitRoadControl(EVENT *evptr){
WORK *wkptr ;
ROAD *rdptr ;
ROAD_DAT *rdtptr ;
int cnt ;
rdptr = (ROAD *)evptr ;
rdtptr = roadtbl ;
for(cnt = sizeof(roadtbl) / sizeof(ROAD_DAT) ; cnt-- > 0 ;){
if((wkptr = slGetWork()) == NULL){
break ;
}
rdptr->next = (ROAD *)wkptr ; /* ひとつめのポインタは */
/* イベントの work に入る */
rdptr = (ROAD *)wkptr ;
rdptr->posX = rdtptr->px << 16 ; /* ポジション */
rdptr->posY = rdtptr->py >> 16 ;
rdptr->posZ = rdtptr->pz >> 16 ;
rdptr->pat = pattbl[rdptr->pn] ; /* パターンデータ */
rdtptr++ ;
}
rdptr->next = NULL ; /* End mark */
evptr->exad = (void *)RoadControl ;
}
/* 3.SGL System Variable Clear */
for( dst = (Uint8 *)SystemWork, i = 0;i < SystemSize; i++) {
*dst = 0;
}
/* 3.SGL System Variable Clear */
for( dst = (Uint8 *)SystemWork, i = 0;i < SystemSize; i++) {
*dst++ = 0;
/* ^^ */
}
0x0010_8000
━━━━ ━━━━
↑ ↑
│ └──小数部
└────────整数部
90.0゜ : 0x4000 45.0゜ : 0x2000 22.5゜ : 0x1000 11.25゜: 0x0800
M00, M01, M02,
M10, M11, M12,
M20, M21, M22,
M30, M31, M32
void main()
{
slInitSystem( TV_320x224, NULL, 1 );
{
slSetLanguage( SMPC_JAPAN );
slSetSoundOutput( SMPC_SOUND_STEREO );
( void )slSetSmpcMemory();
}
{
SmpcDateTime *dt = &( Smpc_Status->rtc );
dt->year = 0x1999;
dt->month = SMPC_FRI | SMPC_DEC;
dt->date = 0x31;
dt->hour = 0x23;
dt->minute = 0x59;
dt->second = 0x59;
( void )slSetDateTime();
}
( void )slResetDisable();
while( TRUE ) {
if( slCheckReset() == SMPC_RES_ON) {
( void )slClearReset();
break;
}
if(Per_Connect1) {
PerDigital *pad;
pad = Smpc_Peripheral + 0;
if( !( pad->data & PER_DGT_ST ) ) break;
}
slSynch();
}
( void )slResetEnable();
( void )slIntBackCancel();
while( TRUE ) slSynch();
}
slNMIRequestWait
slResetDisableWait
slResetEnableWait
slSetDateTimeWait
slSetSmpcMemoryWait
slSetPortDir1,2
slSetPortExt1,2
slSetPortSelect1,2
◆ "slIntBackCancel" 実行後、以下の条件を設定した場合、
"slGetPeripheral" の呼出しで失敗となる。
"slSetPortSelect1,2" でSMPCコントロールモードにしたポートについて
"slSetPortDir1,2" で出力設定にした。
"slSetPortExt1,2" で外部ラッチ入力を許可した。
◆ "slIntBackCancel" 実行後、以下の条件を設定した場合、
"slGetStatus" の呼出しで失敗となる。
"slSetPortSelect1,2" でSMPCコントロールモードにしたポートについて
"slSetPortDir1,2" で出力設定にした。
"slSetPortExt1,2" で外部ラッチ入力を許可した。
☆ 最大キャッシングコマンド数 ... 31個 ☆ 最大ペリフェラルデータサイズ ... 15バイト * 30ポート
.data.l point_tbl ; 頂点座標のテーブル
.data.l NbPoint ; 計算させる頂点の数
.data.l polygon_tbl ; 各ポリゴンの法線ベクトルと頂点番号のテーブル
.data.l NbPolygon ; 計算させるポリゴンの数
.data.l attribute_tbl ; 各ポリゴンのアトリビュートのテーブル
point_tbl:
.data.l X,Y,Z ; 頂点番号0の座標データ
.data.l X,Y,Z ; 頂点番号1の座標データ
...
.data.l X,Y,Z ; 頂点番号 NbPoint - 1 の座標データ
static POINT point_CUBE[] = {
POStoFIXED(-80,-80,-80),
POStoFIXED( 80,-80,-80),
POStoFIXED( 80, 80,-80),
POStoFIXED(-80, 80,-80),
POStoFIXED( 80,-80, 80),
POStoFIXED(-80,-80, 80),
POStoFIXED(-80, 80, 80),
POStoFIXED( 80, 80, 80)
} ;
polygon_tbl:
.data.l Nx,Ny,Nz ; ポリゴン番号0の法線ベクトル
.data.w P0,P1,P2,P3 ; ポリゴン番号0で使用する頂点の番号
(三角形のポリゴンの場合、P2 と P3 が同じ番号になる)
...
.data.l Nx,Ny,Nz ; ポリゴン番号 NbPolygon - 1 の法線ベクトル
.data.w P0,P1,P2,P3 ; ポリゴン番号 NbPolygon - 1 で使用する頂点の
; 番号
static POLYGON polygon_CUBE[] = {
{POStoFIXED( 0 , 0 ,-1) , { 0 , 1 , 2 , 3}} ,
|__ |__
{POStoFIXED( 1 , 0 , 0) , { 1 , 4 , 7 , 2}} ,
{POStoFIXED(-1 , 0 , 0) , { 5 , 0 , 3 , 6}} ,
{POStoFIXED( 0 ,-1 , 0) , { 4 , 1 , 0 , 5}} ,
{POStoFIXED( 0 , 1 , 0) , { 2 , 7 , 6 , 3}} ,
{POStoFIXED( 0 , 0 , 1) , { 4 , 5 , 6 , 7}} ,
} ;
attribute_tbl:
.data.b RevCheck ; 表裏判定により裏側になった面を表示するかどう
かのフラグ
Single_PlaneとDual_Planeのいずれかを指定します。
.data.b SortMode ; ソーティングの基準にする位置の算出方法とオプ
ション機能の使用を宣言します。
SORT_CEN, SORT_MIN, SORT_MAX, SORT_BFR の いずれか
SORT_CEN : 指定された4点のZ位置の平均をソーティングの基準に使用します
SORT_MIN : 4点の内、最も小さいZ位置を使用します
SORT_MAX : 4点の内、最も大きいZ位置を使用します
SORT_BFR : 直前に表示されたポリゴンのZ位置を使用します
直前のポリゴンの常に手前に表示されます
オプションはこれらに加えて指定します
UseTexture, UseLight, UseClip オプションは複数指定す
ることができます。
UseTexture : テクスチャ(変形スプライト)を使用する場合に指定します。
UseLight : 光源ベクトルと法線ベクトルとの内積によりポリゴンのカラーに
オフセットを掛け明暗を表現します。
UseTexture と 同時には使用できません。
UseClip : 大きなポリゴンを使用する場合、表示位置がオーバーフローして
正しく表示できないような時に使用します。
.data.w TextNum ; テクスチャを使用する場合、キャラクタの登録番
号として使用します。
.data.w DispMode ; ポリゴンの表示モードを指定します。
指定できる表示モードには以下のものがあります
MSBon : フレームバッファへの書き込みにおいて最上位ビットのみを1に
します。(スプライトへのシャドウは通常これを使用します)
HSSon : ハイスピードシュリンク有効
HSSoff: ハイスピードシュリンク無効(default)
Window_In : 指定したウィンドウの内側に表示します。
Window_Out : ウィンドウの外側に表示します。
No_Window : (default)ウィンドウに影響されずに表示します。
MESHon : メッシュで表示します。
MESHoff : (default)通常表示をします。
ECdis : テクスチャを使用する時、エンドコードを無効にします。
ECenb : (default)テクスチャを使用する時、エンドコードを有効にします。
SPdis : テクスチャを使用する時、スペースを無効(パレット0のカラーで
表示)にします。
ただし、フレームバッファへの書き込みデータが 0000になる
場合には、表示されませんので、プライオリティ等の値を調整して
0000にならないようにしてください。
SPenb : (default)テクスチャを使用するとき、スペースを有効にします。
CL16Bnk : (default)テクスチャのカラーモードを16色のカラーバンク方式
にします。
CL16Look : テクスチャのカラーモードを16色のルックアップテーブル方式
にします。
CL64Bnk : テクスチャのカラーモードを64色のカラーバンク方式にします。
CL128Bnk : テクスチャのカラーモードを128色のカラーバンク方式にします。
CL256Bnk : テクスチャのカラーモードを256色のカラーバンク方式にします。
CL32KRGB : テクスチャのカラーモードを32000色のRGB方式にします。
CL_Replace : (default)書き換えモードにします。
CL_Trans : 半透明で表示します。
CL_Half : 半輝度で表示します。
CL_Shadow : シャドウ表示にします。
CL_Gouraud : グーローシェーディングを指定します。
表示モードは各グループのいずれかひとつずつを指定します。
.data.w Color ; 表示カラーを指定します。
光源の影響を受ける場合、また、表示モードで CL_Replace 以外を指定する場合に
はRGBモードでなければなりません。
また、テクスチャを使用する場合で、CL32KRGBモードの場合には、ここでの指
定は無視されます。
.data.w GouraudTable ; グーローシェーディングテーブルを指定します。
CL_Gouraud を指定した場合、グーローシェーディングテーブルのオフセット位
置を指示します。オフセット位置はSpriteVRAM(0x25c00000)を0とし、8バイト
ごとに1進む値で指定します。
例えば、0x25c12000にデータがある場合
( 0x25c12000 - 0x25c00000 ) / 0x08 = 0x2400
.data.w Function ; スプライト表示ファンクションを指定します。
ポリゴン、テクスチャ、ポリラインのいずれとして表示するかを指定します。
指定には以下の6つからひとつを選びます。
sprNoflip : テクスチャを表示します。
sprHflip : テクスチャを横方向に反転して表示します。
sprVflip : テクスチャを縦方向に反転して表示します。
sprHVflip : テクスチャを縦、横双方に反転して表示します。
sprPolygon : ポリゴンとして表示します。
sprPolyLine: ポリライン(ポリゴンの輪郭のみ)を表示します。
C言語でテーブルを作成する場合、ATTR型が宣言されており、ATTRIBUTE
マクロを使用することで、上記のデータテーブルを作成することができます。
例)
static ATTR attr_CUBE[] = {
ATTRIBUTE( Single_Plane, SORT_MIN, No_Texture, CD_MediumGreen,
No_Gouraud, Window_In, sprPolygon, UseLight ),
ATTRIBUTE( Single_Plane, SORT_MIN, No_Texture, CD_MediumBlue,
No_Gouraud, Window_In, sprPolygon, UseLight ),
ATTRIBUTE( Single_Plane, SORT_MIN, No_Texture, CD_MediumMagenta,
No_Gouraud, Window_In, sprPolygon, UseLight ),
ATTRIBUTE( Single_Plane, SORT_MIN, No_Texture, CD_MediumWhite,
No_Gouraud, Window_In, sprPolygon, UseLight ),
ATTRIBUTE( Single_Plane, SORT_MIN, No_Texture, CD_MediumYellow,
No_Gouraud, Window_In, sprPolygon, UseLight ),
ATTRIBUTE( Single_Plane, SORT_MIN, No_Texture, CD_MediumRed,
No_Gouraud, Window_In, sprPolygon, UseLight )
};
SPR_ATTR attr_AM2Logo = {
SPR_ATTRIBUTE(PN_AM2_Logo,CL_AM2_Logo,No_Gouraud,Window_In|ECdis,
sprNoflip|_ZmCB)
} ;
_ZmLT _ZmCT _ZmRT
+-------+-------+
| | |
_ZmLC +----_ZmCC------+ _ZmRC
| | |
+-------+-------+
_ZmLB _ZmCB _ZmRB
#define CGtop 0x10000
#define TEXTBL(hs,vs,cga) {hs , vs , (cga)>>3 , ((hs)&0x1f8)>>5|(vs)}
#define AdjCG(cga,hs,vs,col) ((cga + (((hs)*(vs)*4)>>(col)) + 0x1f) & 0x7ffe0)
#define PICTBL(txno,cmod,cga) {txno , cmod , cga}
#define CL_Triangle 0x00
static const Uint16 triangle[] = {
0x0000,0x0001,0x1000,0x0000, /* スプライトのキャラクタデータ */
0x0000,0x0012,0x2100,0x0000,
0x0000,0x0123,0x3210,0x0000,
0x0000,0x1234,0x4321,0x0000,
0x0001,0x2344,0x4432,0x1000,
0x0012,0x3333,0x3333,0x2100,
0x0122,0x2222,0x2222,0x2210,
0x1111,0x1111,0x1111,0x1111
};
enum patn {
PN_Triangle, /* スプライトパターンナンバー */
Max_Texture, /* 総パターン数 */
Max_Picture = Max_Texture /* 総キャラクタ数 */
};
enum cga { /* キャラクタアドレス */
CG_Triangle = CGtop,
CG_Next = AdjCG( CG_Triangle, 16, 8, COL_16 )
};
TEXTURE form_tbl[] = { /* パターンサイズデータ */
TEXTBL( 16, 8, CG_Triangle )
};
PICTURE pic_tbl[] = { /* キャラクタ定義テーブル */
PICTBL( PN_Triangle, COL_16, triangle )
};
static const Sint16 Triangle_Color[] = { /* カラーデータ */
RGB( 0, 0,31), RGB( 0, 0, 29 ), RGB( 0, 0, 27 ),
RGB( 0, 0, 25 ), RGB( 0, 0,23), RGB( 0, 0, 21 ), RGB( 0, 0, 19 ),
RGB( 0, 0, 17 ), RGB( 0, 0,15), RGB( 0, 0, 13 ), RGB( 0, 0, 11 ),
RGB( 0, 0, 9 ), RGB( 0, 0,7), RGB( 0, 0, 5 ), RGB( 0, 0, 3 )
};
typedef struct{ /* カラー定義用構造体 */
Sint16 *src;
void *dst;
Sint16 size;
} COLMAP;
static const COLMAP ctrns_list[] = { /* カラー定義テーブル */
{ Triangle_Color,
( void* )( VDP2_COLRAM + ( CL_Triangle + 1 ) * 2 ),
sizeof( Triangle_Color )
}
};
extern TEXTURE * FormTbl ;
/* */
/* キャラクタデータ転送 */
/* */
void SetTexture( PICTURE *pcptr, Uint32 NbPicture ) {
TEXTURE *txptr;
for( ; NbPicture-- > 0 ; pcptr++ ) {
txptr = FormTbl + pcptr->texno ;
slDMACopy( pcptr->pcsrc,
( void * )( SpriteVRAM + ( ( txptr->CGadr ) >> 3 ) ),
( txptr->Hsize * txptr->Vsize * 4 ) >> ( pcptr->cmode ) );
}
}
/* */
/* カラーデータ転送 */
/* */
void SetColor(){
COLMAP *cmptr ;
Sint16 cnt ;
slTVOff() ;
cmptr= ctrns_list ;
for ( cnt = sizeof( ctrns_list ) / sizeof( COLMAP ) ; cnt-- > 0 ; cmptr++ ){
slDMACopy( cmptr->src, cmptr->dst, cmptr->size );
}
slTVOn();
}
/* サンプルキャラクタ表示位置 */
FIXED tpos[] = { toFIXED(1.0), toFIXED(2.0), toFIXED(2.0), toFIXED(4.0)};
/* | | | |_ 表示スケール*/
/* X位置 Y位置 Y位置 (等倍ならtoFIXED(ORIGINAL)
を指定のこと) */
/* サンプルキャラクタデータ */
SPR_ATTR tattr = SPR_ATTRIBUTE(PN_Triangle,CL_Triangle,No_Gouraud,CL16Bnk,sprNoflip|_ZmCC);
/* | | | | | |__ 回転中心位置 */
/* | | | | |__ キャラクタ反転はなし */
/* | | | |__ 16色カラーバンクモード */
/* | | |___ グーローシェーディングは使用しない */
/* パターンナンバー カラーバンクナンバー */
main() {
ANGLE ang = DEGtoANG (0.0);
*( Uint32 * )( 0x06002500 ) = ( Uint32 )( 0x060007f0 );
/* クロックチェンジ中はサウンド用の68Kがスイッチデータを読み、
ここにセットされたアドレスにデータを用意するらしいのだが、
うまく動いていないようなので、とりあえず押されていないデータ0xFFFFのある
アドレスを入れておく */
slInitSystem( TV_320x224, form_tbl, 1 ); /* システム初期化 */
SetTexture( pic_tbl, Max_Picture ); /* キャラクタデータのセット */
SetColor(); /* カラーデータのセット */
while( -1 ) {
slDispSprite( tpos, &tattr, ang ); /* スプライトの登録 */
ang += DEGtoANG ( 3.0 );
slSynch(); /* 画面表示への同期との
スプライト出力 */
}
}
ATTRIBUTE(Single_Plane, SORT_CEN, 0, 0xffa0, 0xe000,
CL16Look|MESHoff|CL_Gouraud, sprNoflip, UseGouraud )
VECTOR gr_point[] = { /* 頂点法線ベクトルデータ */
toFIXED(-0.873),toFIXED( 0.436),toFIXED( 0.217),
toFIXED(-0.873),toFIXED(-0.436),toFIXED( 0.217),
:
:
};
XPDATA PD_BOX = { /* モデルテーブル指定 */
point_BOX, /* 頂点の位置データ
テーブル */
sizeof( point_BOX ) / sizeof( POINT ), /* 頂点の数 */
polygon_BOX, /* ポリゴン定義テーブル */
sizeof( polygon_BOX ) /sizeof( POLYGON ),/* ポリゴンの数 */
attribute_BOX2, /* ポリゴンの
アトリビュートテーブル */
gr_point /*頂点法線ベクトルデータ */
};
slInitGouraud( ( GOURAUDTBL * )gr_tab, ( Uint32 )300, 0xe000, addr );
slIntFunction( slGouraudTblCopy );
FIXED light[XYZ];
light[X] = toFIXED( 1.0 );
light[Y] = toFIXED( 0.0 );
light[Z] = toFIXED( 0.0 );
slPutPolygonX( &PD_BOXx, ( FIXED * )light );
static GOURAUDTBL gr_tab[300];
void ss_main( void )
{
FIXED light[XYZ];
:
/* リアルタイムグロープログラムの初期化 */
slInitGouraud( ( GOURAUDTBL * )gr_tab, ( Uint32 )300, 0xe000, addr );
slGouraudTblCopy();
slSynch();
:
light[X] = toFIXED( 1.0 );
light[Y] = toFIXED( 0.0 );
light[Z] = toFIXED( 0.0 );
while( 1 )
{
:
slPushMatrix();
{
:
/**/
slPutPolygonX( &PD_BOX, ( FIXED * )light );
}
slPopMatrix();
slSynch();
}
}
ATTRIBUTE( Single_Plane, SORT_CEN, 1, No_Palet, No_Gouraud,
CL32KRGB|MESHoff,sprNoflip, UseNearClip );
<Ver2.1xまでの光源計算方法> 光源と面の角度 →0------45------90-----135-----180 グーローテーブル→31-----16-------0-------0-------0
<Ver3.0 からの光源計算方法> 光源と面の角度 →0------45------90-----135-----180 グーローテーブル→31-----24------16-------8-------0
★SGL User's Manual
★補足マニュアル