タスク管理
//----------------------------------------------------------------------------- // TASKMGR.H //----------------------------------------------------------------------------- #ifndef __TASKMGR_H__ #define __TASKMGR_H__ //----------------------------------------------------------------------------- // include //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // define //----------------------------------------------------------------------------- //----------------------------------------タスク登録最大数 #define MAX_TASK_NUM 64 //----------------------------------------タスク属性 enum{ ATTR_FREE=0, //フリー:初期化用 ATTR_SYSTEM, //システム ATTR_USER, //ユーザー }; //----------------------------------------タスクモード enum{ TASK_MODE_INIT=0, //初期化処理 TASK_MODE_MAIN, //メイン処理 TASK_MODE_EXIT, //終了処理 }; //----------------------------------------タスク状態 enum{ TASK_FREE=0, //フリー:初期化用 TASK_RUN, //実行中 TASK_READY, //実行待ち TASK_WAIT, //待ち TASK_KILL, //削除 TASK_NEW_ENTRY, //新規に登録 TASK_KILL_ENTRY, //自分自身を削除する }; //---------------------------------------- タスク優先 #define PRIO_FREE 0 #define PRIO_FIRST 1 #define PRIO_LAST 10000 //システムタスクで[0-999]、[9001-10000]を予約する //ユーザータスクは、[1000-9000]の間の値を優先順位として指定して下さい #define PRIO_USER_FIRST PRIO_FIRST + 999 #define PRIO_USER_LAST PRIO_LAST - 999 //---------------------------------------- タスクID #define ID_FREE 0 #define ID_FIRST 1 #define ID_LAST 10000 //---------------------------------------- タスクウェイトタイム #define WTIME_ZERO 0 //システムタスクで[1-999]、[9001-10000]を予約する //ユーザータスクは、[1000-9000]の間の値をIDとして指定して下さい #define ID_USER_FIRST ID_FIRST + 999 #define ID_USER_LAST ID_LAST - 999 //---------------------------------------- タスクユーザーワークサイズ #define USER_WORK_SIZE 32 //----------------------------------------------------------------------------- // typdef //----------------------------------------------------------------------------- //---------------------------------------- TASK構造体 typedef struct _TASK{ int (*func)(struct _TASK*); //実行する関数アドレス struct _TASK* prev; //事前に実行されたタスクのアドレス struct _TASK* next; //次に実行予定のタスクのアドレス int mode; //タスクモード int attribute; //タスクの属性 int status; //タスクの状態 int id; //タスク認識のID int priority; //タスクのの優先順番号 int wait_time; //ウェイトタイム(起動待ち) void* buf; //使用するメモリへのアドレス(拡張データ) int user[USER_WORK_SIZE]; //ユーザーワーク char* name; //タスクネーム } TASK; //----------------------------------------------------------------------------- // prototype & extern //----------------------------------------------------------------------------- //---------------------------------------- Local Funcs static int _CheckTaskEmpty(void); static int _CheckTaskFull(void); static TASK* _AllocFreeTask(void); static void _InsertFreeTask(TASK*); static TASK* _InsertTask(TASK*); static void _DeleteTask(TASK*); //---------------------------------------- Global Funcs extern void InitTaskMgr(void); extern TASK* CreateTask(TASK*); extern TASK* RemoveTask(int); extern int ExitTask(int); extern int ChangeTaskMode(int,int); extern TASK* SearchTask(int); extern int WakeupTask(int); extern int SleepTask(int); extern int ExecuteTask(void); //----------------------------------------------------------------------------- // end of TASKMGR.H //----------------------------------------------------------------------------- #endif
//----------------------------------------------------------------------------- // TASKMGR.H write by ssin //----------------------------------------------------------------------------- #ifndef __TASKMGR_H__ #define __TASKMGR_H__ //----------------------------------------------------------------------------- // include //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // define //----------------------------------------------------------------------------- //----------------------------------------タスク登録最大数 #define MAX_TASK_NUM 64 //----------------------------------------タスク属性 enum{ ATTR_FREE=0, //フリー:初期化用 ATTR_SYSTEM, //システム ATTR_USER, //ユーザー }; //----------------------------------------タスクモード enum{ TASK_MODE_INIT=0, //初期化処理 TASK_MODE_MAIN, //メイン処理 TASK_MODE_EXIT, //終了処理 }; //----------------------------------------タスク状態 enum{ TASK_FREE=0, //フリー:初期化用 TASK_RUN, //実行中 TASK_READY, //実行待ち TASK_WAIT, //待ち TASK_KILL, //削除 TASK_NEW_ENTRY, //新規に登録 TASK_KILL_ENTRY, //自分自身を削除する }; //---------------------------------------- タスク優先 #define PRIO_FREE 0 #define PRIO_FIRST 1 #define PRIO_LAST 10000 //システムタスクで[0-999]、[9001-10000]を予約する //ユーザータスクは、[1000-9000]の間の値を優先順位として指定して下さい #define PRIO_USER_FIRST PRIO_FIRST + 999 #define PRIO_USER_LAST PRIO_LAST - 999 //---------------------------------------- タスクID #define ID_FREE 0 #define ID_FIRST 1 #define ID_LAST 10000 //---------------------------------------- タスクウェイトタイム #define WTIME_ZERO 0 //システムタスクで[1-999]、[9001-10000]を予約する //ユーザータスクは、[1000-9000]の間の値をIDとして指定して下さい #define ID_USER_FIRST ID_FIRST + 999 #define ID_USER_LAST ID_LAST - 999 //---------------------------------------- タスクユーザーワークサイズ #define USER_WORK_SIZE 32 //----------------------------------------------------------------------------- // typdef //----------------------------------------------------------------------------- //---------------------------------------- TASK構造体 typedef struct _TASK{ int (*func)(struct _TASK*); //実行する関数アドレス struct _TASK* prev; //事前に実行されたタスクのアドレス struct _TASK* next; //次に実行予定のタスクのアドレス int mode; //タスクモード int attribute; //タスクの属性 int status; //タスクの状態 int id; //タスク認識のID int priority; //タスクのの優先順番号 int wait_time; //ウェイトタイム(起動待ち) void* buf; //使用するメモリへのアドレス(拡張データ) int user[USER_WORK_SIZE]; //ユーザーワーク char* name; //タスクネーム } TASK; //----------------------------------------------------------------------------- // prototype & extern //----------------------------------------------------------------------------- //---------------------------------------- Local Funcs static int _CheckTaskEmpty(void); static int _CheckTaskFull(void); static TASK* _AllocFreeTask(void); static void _InsertFreeTask(TASK*); static TASK* _InsertTask(TASK*); static void _DeleteTask(TASK*); //---------------------------------------- Global Funcs extern void InitTaskMgr(void); extern TASK* CreateTask(TASK*); extern TASK* RemoveTask(int); extern int ExitTask(int); extern int ChangeTaskMode(int,int); extern TASK* SearchTask(int); extern int WakeupTask(int); extern int SleepTask(int); extern int ExecuteTask(void); //----------------------------------------------------------------------------- // end of TASKMGR.H //----------------------------------------------------------------------------- #endif
//----------------------------------------------------------------------------- // SPMGR.h write by ssin //----------------------------------------------------------------------------- #ifndef _SPMGR_H_ #define _SPMGR_H_ //----------------------------------------------------------------------------- // include //----------------------------------------------------------------------------- #include <sys/types.h> //#include <asm.h> //#include <r3000.h> #include <libapi.h> #include <libetc.h> #include <libgte.h> #include <libgpu.h> #include <libgs.h> //----------------------------------------------------------------------------- // define //----------------------------------------------------------------------------- //#define NULL -1 #define TRUE 1 #define FALSE 0 #define MAX_ENTRY_SPRITE_NUM 400 //最大スプライト登録数 #define MAX_DRAW_SPRITE_NUM 256 //最大スプライト描画数 #define SPRITE_USE 1 // 使用中 #define SPRITE_NOUSE 0 // 使用していません #define ENTRY_SPRITE_DATA_END -1 //スプライトテクスチャ登録終了 #define DRAW_SPRITE_OT_NO 3 //OT0へ書き込み //----------------------------------------------------------------------------- // typdef //----------------------------------------------------------------------------- //スプライト登録構造体 typedef struct _ENTRY_SPRITE_DATA{ int No; //テクスチャ番号 int OffSetX; //TIMの中のスプライト左上開始X位置 int OffSetY; //TIMの中のスプライト左上開始Y位置 int Height; //TIMの中のテクスチャの高さ int Width; //TIMの中のテクスチャの幅 int PaletteNo; //TIMの中のテクスチャパレット番号 }ENTRY_SPRITE_DATA; //スプライト構造体 typedef struct _SPRITE_DATA{ int No; //インデックス番号 int PosX; //X位置 int PosY; //Y位置 int PosZ; //優先順位 int ScaleX; //スケールX int ScaleY; //スケールY int Rotate; //回転角 int Reverse; //反転コード }SPRITE_DATA; //----------------------------------------------------------------------------- // class //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // extern //----------------------------------------------------------------------------- extern GsIMAGE TimImg; extern GsIMAGE *TimImgData; extern int Spx; extern int Spy; extern int Sptox; extern int Sptoy; extern int Spsw; extern int Spsh; extern int Sppost; extern int Sppn; extern int Sppri; extern int Spscalex; extern int Spscaley; extern int Sprotate; extern int Sprevers; extern int Sptrans; extern void InitSprite(void); //初期化 extern void EntrySprite(ENTRY_SPRITE_DATA*); //登録 extern int DrawSprite(SPRITE_DATA*); //描画 extern void TransSprite(void); //転送 extern void ReleaseSprite(void); //開放 extern int GetDrawSpriteNum(void); //描画枚数取得 extern int GetEntyrSpriteNum(void); //登録枚数取得 //----------------------------------------------------------------------------- // variable //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // prototype //----------------------------------------------------------------------------- static SPRITE_DATA* AllocSprite(void); //取得 static void SortSprite(SPRITE_DATA *[],int); //ソート void InitSprite(void); //初期化 void EntrySprite(ENTRY_SPRITE_DATA*); //登録 int DrawSprite(SPRITE_DATA*); //描画 void TransSprite(void); //転送 void ReleaseSprite(void); //開放 int GetDrawSpriteNum(void); //描画枚数取得 int GetEntrySpriteNum(void); //登録枚数取得 //----------------------------------------------------------------------------- // end of SPMGR.h //----------------------------------------------------------------------------- #endif
//----------------------------------------------------------------------------- // SPMGR.c write by ssin //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // include //----------------------------------------------------------------------------- #include <sys/file.h> #include <sys/types.h> //#include <asm.h> //#include <r3000.h> #include <libapi.h> #include <libetc.h> #include <libgte.h> #include <libgpu.h> #include <libgs.h> #include <libcd.h> #include <libds.h> #include <stdio.h> // #include "SPCONT.h" #include "SPMGR.h" //----------------------------------------------------------------------------- // define //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // typdef //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // extern //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // variable //----------------------------------------------------------------------------- //------------------登録 static int EntrySpriteNum; //登録枚数 ENTRY_SPRITE_DATA EntrySpriteBuffer[MAX_ENTRY_SPRITE_NUM]; //スプライト登録バッファ //------------------描画 static int DrawSpriteNum; //描画枚数 static SPRITE_DATA* pSpriteBuffer[MAX_DRAW_SPRITE_NUM]; //スプライトバッファポインタ static SPRITE_DATA SpriteBuffer[MAX_DRAW_SPRITE_NUM]; //スプライトバッファ //----------------------------------------------------------------------------- // prototype //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // codes //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // 関数名 :InitSprite // 機能 :スプライト管理初期化 // 注意 :なし //----------------------------------------------------------------------------- void InitSprite( void ) { int i; SPRITE_DATA *pSpData; ENTRY_SPRITE_DATA *pEntrySpData; //----------------描画 //描画バッファデータ初期化 for( i=0,pSpData=SpriteBuffer ; i<MAX_DRAW_SPRITE_NUM ; i++,pSpData++ ) { //描画スプライトバッファの初期化 pSpData->No = -1; //インデックス番号 pSpData->PosX = 0; //X位置 pSpData->PosY = 0; //Y位置 pSpData->PosZ = 0; //優先順位 pSpData->ScaleX = SCALE10; //スケールX pSpData->ScaleY = SCALE10; //スケールY pSpData->Rotate = ROTATE000; //回転角 pSpData->Reverse = NOREVERS; //反転コード //描画スプライトポインタバッファ初期化 pSpriteBuffer[i] = NULL; } //描画枚数クリア DrawSpriteNum = 0; //----------------登録バッファ //登録バッファ初期化 for( i=0,pEntrySpData=EntrySpriteBuffer ; i<MAX_ENTRY_SPRITE_NUM ; i++,pEntrySpData++ ) { pEntrySpData->No = 0; //テクスチャ番号 pEntrySpData->OffSetX = 0; //TIMの中のスプライト左上開始X位置 pEntrySpData->OffSetY = 0; //TIMの中のスプライト左上開始Y位置 pEntrySpData->Height = 0; //TIMの中のテクスチャの高さ pEntrySpData->Width = 0; //TIMの中のテクスチャの幅 pEntrySpData->PaletteNo = 0; //TIMの中のテクスチャパレット番号 } //登録枚数クリア EntrySpriteNum = 0; } //----------------------------------------------------------------------------- // 関数名 :AllocSprite // 機能 :描画スプライトデータの取得チェック // 注意 :なし //----------------------------------------------------------------------------- static SPRITE_DATA *AllocSprite(void) { SPRITE_DATA *pSpData; if( DrawSpriteNum > MAX_DRAW_SPRITE_NUM-1 ) {//空いていない return NULL; } //空いている描画バッファのアドレス pSpData = &(SpriteBuffer[DrawSpriteNum]); //データOK return pSpData; } //----------------------------------------------------------------------------- // 関数名 :SortSprite // 機能 :描画スプライトデータへのポインタをソート // 注意 :PosZに対して昇順にのみ対応 //----------------------------------------------------------------------------- static void SortSprite( SPRITE_DATA *i_pSpDataArr[],int i_num ) { int i,j,k,gap; SPRITE_DATA *ppSpData; // numより小さい範囲で最大のを gap 決める for( gap=1 ; gap<i_num/3 ; gap=3*gap+1 ) ; while( gap>0 ){ for( i=gap ; i<i_num ; i++ ){ for( j=i-gap ; j>=0 ; j=j-gap ){ if( i_pSpDataArr[j]->PosZ > i_pSpDataArr[j+gap]->PosZ ) { ppSpData = i_pSpDataArr[j]; i_pSpDataArr[j] = i_pSpDataArr[j+gap]; i_pSpDataArr[j+gap] = ppSpData; } else { break; } } } gap/=3; } } //----------------------------------------------------------------------------- // 関数名 :DrawSprite // 機能 :スプライト描画(バッファへ登録) // 注意 :PosZの値が小さいほど手前表示されます //----------------------------------------------------------------------------- int DrawSprite( SPRITE_DATA* i_pSpData ) { SPRITE_DATA *pSpData; //登録のチェック if( (pSpData = AllocSprite())==NULL ) { return FALSE; // 表示できない } //セット pSpriteBuffer[DrawSpriteNum]=pSpData; //登録されていない場合はエラー if( EntrySpriteNum ==0) return FALSE; //登録したスプライト数より大きいインデックス値が指定された場合はエラー if( i_pSpData->No > EntrySpriteNum - 1) return FALSE; //取得した情報をスプライトへセットする pSpData->No = i_pSpData->No; //インデックス番号 pSpData->PosX = i_pSpData->PosX; //X位置 pSpData->PosY = i_pSpData->PosY; //Y位置 pSpData->PosZ = i_pSpData->PosZ; //優先順位 (数値大きいほど優先順位は低くなる) pSpData->ScaleX = i_pSpData->ScaleX; //スケールX pSpData->ScaleY = i_pSpData->ScaleY; //スケールY pSpData->Rotate = i_pSpData->Rotate; //回転角 pSpData->Reverse = i_pSpData->Reverse; //反転コード //描画枚数カウント DrawSpriteNum++; return TRUE; } //----------------------------------------------------------------------------- // 関数名 :TransSprite // 機能 :スプライトを転送 // 注意 :なし //----------------------------------------------------------------------------- void TransSprite(void) { int i; SPRITE_DATA **ppSpData; SPRITE_DATA *pSpData; //ソート SortSprite( pSpriteBuffer, DrawSpriteNum ); //転送 for( i=0,ppSpData=pSpriteBuffer ; i<DrawSpriteNum ; i++,ppSpData++ ) { //--------- Spx = (*ppSpData)->PosX; //表示位置X Spy = (*ppSpData)->PosY; //表示位置Y Sptox = EntrySpriteBuffer[(*ppSpData)->No].OffSetX; //TIMの中のスプライト左上開始X位置 Sptoy = EntrySpriteBuffer[(*ppSpData)->No].OffSetY; //TIMの中のスプライト左上開始Y位置 Spsw = EntrySpriteBuffer[(*ppSpData)->No].Width; //TIMの中のテクスチャの幅 Spsh = EntrySpriteBuffer[(*ppSpData)->No].Height; //TIMの中のテクスチャの高さ Sppost = EntrySpriteBuffer[(*ppSpData)->No].No; //テクスチャ番号 Sppn = EntrySpriteBuffer[(*ppSpData)->No].PaletteNo; //パレット番号 // Sppri = (*ppSpData)->PosZ; //優先順位 Sppri = DRAW_SPRITE_OT_NO; //優先順位 Spscalex = (*ppSpData)->ScaleX; //スケールX Spscaley = (*ppSpData)->ScaleY; //スケールY Sprotate = (*ppSpData)->Rotate; //回転各 Sprevers = (*ppSpData)->Reverse; //反転 Sptrans = 0; //透明度フラグ // TimImg.pmode = TimImgData[Sppost].pmode; TimImg.px = TimImgData[Sppost].px; TimImg.py = TimImgData[Sppost].py; TimImg.pw = TimImgData[Sppost].pw; TimImg.ph = TimImgData[Sppost].ph; TimImg.pixel = TimImgData[Sppost].pixel; TimImg.cx = TimImgData[Sppost].cx; TimImg.cy = TimImgData[Sppost].cy; TimImg.cw = TimImgData[Sppost].cw; TimImg.ch = TimImgData[Sppost].ch; TimImg.clut = TimImgData[Sppost].clut; RegisterSP(&TimImg); // バッファとポインタの全てクリアする //バッファクリア pSpData->No = -1; //インデックス番号 pSpData->PosX = 0; //X位置 pSpData->PosY = 0; //Y位置 pSpData->PosZ = 0; //優先順位 pSpData->ScaleX = SCALE10; //スケールX pSpData->ScaleY = SCALE10; //スケールY pSpData->Rotate = ROTATE000; //回転角 pSpData->Reverse = NOREVERS; //反転コード //ポインタクリア pSpriteBuffer[i] = NULL; } //全て転送したので描画枚数をクリア DrawSpriteNum = 0; } //----------------------------------------------------------------------------- // 関数名 :EntrySprite // 機能 :スプライトの登録 // 注意 :なし //----------------------------------------------------------------------------- void EntrySprite(ENTRY_SPRITE_DATA* i_pEntrySpData) { int i; ENTRY_SPRITE_DATA* pEntrySpData; //最大でも MAX_ENTRY_SPRITE_NUM しか登録しない for( i=0,pEntrySpData=i_pEntrySpData ; i<MAX_ENTRY_SPRITE_NUM ; i++,pEntrySpData++ ) { if( pEntrySpData->No == ENTRY_SPRITE_DATA_END ) break; EntrySpriteBuffer[i].No = pEntrySpData->No; //テクスチャー番号 EntrySpriteBuffer[i].OffSetX = pEntrySpData->OffSetX; //TIMの中のスプライト左上開始X位置 EntrySpriteBuffer[i].OffSetY = pEntrySpData->OffSetY; //TIMの中のスプライト左上開始Y位置 EntrySpriteBuffer[i].Height = pEntrySpData->Height; //テクスチャの高さ EntrySpriteBuffer[i].Width = pEntrySpData->Width; //テクスチャの幅 EntrySpriteBuffer[i].PaletteNo = pEntrySpData->PaletteNo; //パレット番号 //登録枚数カウント EntrySpriteNum++; } } //----------------------------------------------------------------------------- // 関数名 :ReleaseSprite // 機能 :スプライトの登録解除 // 注意 :InitSprite関数と同じ:意味合いを変えたいのでこの関数を使用 //----------------------------------------------------------------------------- void ReleaseSprite(void) { int i; ENTRY_SPRITE_DATA *pEntrySpData; //----------------登録バッファ //登録バッファ初期化 for( i=0,pEntrySpData=EntrySpriteBuffer ; i<MAX_ENTRY_SPRITE_NUM ; i++,pEntrySpData++ ) { pEntrySpData->No = 0; //テクスチャ番号 pEntrySpData->OffSetX = 0; //TIMの中のスプライト左上開始X位置 pEntrySpData->OffSetY = 0; //TIMの中のスプライト左上開始Y位置 pEntrySpData->Height = 0; //TIMの中のテクスチャの高さ pEntrySpData->Width = 0; //TIMの中のテクスチャの幅 pEntrySpData->PaletteNo = 0; //TIMの中のテクスチャパレット番号 } //登録枚数クリア EntrySpriteNum = 0; } //----------------------------------------------------------------------------- // 関数名 :GetDrawSpriteNum // 機能 :描画枚数取得 // 注意 :なし //----------------------------------------------------------------------------- int GetDrawSpriteNum(void) { return DrawSpriteNum; } //----------------------------------------------------------------------------- // 関数名 :GetEntrySpriteNum // 機能 :登録枚数取得 // 注意 :なし //----------------------------------------------------------------------------- int GetEntrySpriteNum(void) { return EntrySpriteNum; } //----------------------------------------------------------------------------- // end of SPMGR.c //-----------------------------------------------------------------------------