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