/*
//
//	kwgfx.c
//
*/

#include "headers.h"
#include "include/kawano2.h"
#include "RESULT/result.h"
//
// デバッグ関連の #define
//

//#define ROM 0
#define DP_TEST_FLAG 0		/*ドライバーズポイントのテスト用フラグ*/
#define DISP_TEX_BUFF_NUM_SWITCH 0 /* tex_buff使用状況 */
#define DISP_FREE_MEMORY_SWITCH 0 /* 残りfreeメモリ表示 */
#define DISP_GLIST_SIZE_SWITCH 0 /* 残りglistメモリ表示 */
#define DISP_DMA_MELT_TIME_SWITCH 0 /* DMA & 解凍時間表示 */
#define VS_LOSE_ALL_SWITCH 0 /* vsリザルトで全員負けポーズ */
#define TITLE_UNLIMITED_SWITCH 0 /* タイトル画面がボタンを押さない限り続く */
#define DISP_MATRIX_COUNT_SWITCH 0 /* matrix_count使用状況 */
#define ENDING_DEBUG_SWITCH 0 /* ending用デバグスイッチ */
#define CANNOT_GHOST_SAVE_SWITCH 0/* ゴーストのセーブにカーソルが行かない */
//
// システム関連の #define
//

//#define MAX_TEX_BUFF_NUM 580000 //640*480 = 307200
//#define MAX_TEX_BUFF_NUM 227800 //640*480 = 307200
//#define MAX_TEX_BUFF_NUM 286800 //640*480 = 307200
#define MAX_TEX_BUFF_NUM 295000 //640*480 = 307200

//#define MAX_TEX_BUFF_NUM2 12000 //640*480 = 307200
#define MAX_TEX_BUFF_NUM2 37500 //640*480 = 307200
#define SEQ_DATA_MAX 16
#define SEQ_CHANGE_VS_MAX 4
#define OBJ_BLOCK_MAX 32
//#define TEX_BLOCK_PTR_MAX 64
#define TEX_BLOCK_PTR_MAX 200

#define MELT_BUFF_SIZE 0xce00
//#define MELT_BUFF_SIZE 0x9c00
#define MELT_BUFF_SIZE2 0x2800
//#define MELT_BUFF_SIZE2 0x3000

#define KDL_BUFF_SIZE 0x1000
#define KDL_DATA_MAX 8

#define ALL_PALETTE_NUMBER 6	/*文字表示に使いたいパレットの総数*/

//
// 表示位置,タイミングに関する #define
//

#define TITLE_TIME 300
#define DEMO_NUMBER_MAX 6

#define CP_GNOTE_Y 105

#define GSEL_PBOX_X 63
#define GSEL_PBOX_Y 53
#define GSEL_RBOX_X GSEL_PBOX_X
#define GSEL_RBOX_Y 17
#define GSEL_POPBOX_Y 18
#define GSEL_MODE_OFFSET_Y 65
#define MSEL_CUPBOX_X 64
#define MSEL_CUPBOX_Y 39
#define MSEL_BESTBOX_X 100
#define MSEL_BESTBOX_Y 39

#define SEL_OKBOX_X 31
#define SEL_OKBOX_Y 19

/* フォント関連 */
#define FONT_WIDTH_SPACE 7
#define F_SIZE0 15	//標準的な仮名のフォント幅
#define F_SIZE1 14	//標準的なちっさい仮名のフォント幅
#define F_SIZE2 29	//全角数字のフォント幅
#define F_SIZE3 23	//st,rd等の２つで１つ文字のフォント幅

/*ドライバーズポイント*/
#define RT_WAIT_TIME1 90
#define DP_WAIT_TIME1 60
#define DP_WAIT_TIME2 0
#define DP_WAIT_TIME3 30
#define DP_SORT_TIME 5
#define DP_SCROLL_SPEED_NORMAL	16
#define DP_SCROLL_SPEED_SKIP	32
//#define DP_SCROLL_SPEED_NORMAL	8
//#define DP_SCROLL_SPEED_SKIP	16

#define VS_RESULT_WAIT_TIME1 30

#define TA_RESULT_WAIT_TIME1 20

#define GP_ENDING_WAIT_TIME1 30


// external
extern Dynamic *dynamicp;


// for allocatememory
unsigned short *tex_buff;
unsigned int *melt_buff;
unsigned char *k_work;
unsigned char *additional_point;/*リザルトの加算点数バッファ*/
Gfx *kdl_buff;/*ゲーム中につくるディスプレイリスト用のバッファ*/

char d_points[8];
char d_points_rank[8];
char k_skip_flg;/*スキップモードの on/off*/
char k_skip_status;/*スキップするときのキーの状態記憶フラグ*/

OBJBlock obj_block[OBJ_BLOCK_MAX];
SeqData seq_data_block[SEQ_DATA_MAX];
ChangeTexBuff change_tex_buff_block[SEQ_DATA_MAX+1];
ChangeTexBuff_vs change_tex_buff_block_vs[SEQ_CHANGE_VS_MAX+1];

int tex_buff_num;
TexMap tex_block_ptr[TEX_BLOCK_PTR_MAX];
int	all_tex_block_num;

Gfx *kdl_buff_ptr;
int all_kdl_block_num;
KDLBlockBuff kdl_buff_block[KDL_DATA_MAX];

int k_flash_counter;
char fade_flg[5];
unsigned fade_counter[5],fade_counter2[5];
POS_XY old_screen_position[5];
POS_XY old_screen_size[5];
char thunder_flg[4];
unsigned thunder_counter[4];

int vc_color_num[2];
int vc_color_step[2];

char afont_color;
char afont_continuous_flag;

OSPfs pfs_k;
OSPfs pfs_k2;
OSPfsState pfsState[16];
s32 pfsStateRet[16];
s32 pfsFileNumMax,pfsFileNum,pfsFreeBlocks,file_no_kart,file_no_kart2;

EEPROM_DATA_KART eeprom_save_data;

unsigned char rankin_fanfare;
unsigned char ending_message_flg;



POS_XY lgsel_default_positions[] = {
	{ 61, 17},//LOGO
	{ 21, 62},//1P
	{ 92, 62},//2P
	{163, 62},//3P
	{234, 62},//4P
	{266,200},//ok
	{ 21,200},//option
	{ 85,200},//records
	{  0,  0} //dummy
};

POS_XY gsel_popup_positions[] = {
	{GSEL_RBOX_X+1,GSEL_MODE_OFFSET_Y},
	{GSEL_RBOX_X+1,GSEL_MODE_OFFSET_Y+GSEL_POPBOX_Y},
	{GSEL_RBOX_X+1,GSEL_MODE_OFFSET_Y+GSEL_POPBOX_Y*2},
	{GSEL_RBOX_X+1,GSEL_MODE_OFFSET_Y+GSEL_POPBOX_Y*3}
};



POS_XY lpsel_cursor_position[] = {
	{ 24, 63},
	{ 93, 63},
	{162, 63},
	{231, 63},
	{ 24,145},
	{ 93,145},
	{162,145},
	{231,145}
};

POS_XY msel_cupbox_position[] = {
	{ 23, 59},
	{ 93, 59},
	{162, 59},
	{232, 59}
};

POS_XY msel_map4box_position[] = {
	{ 23, 112},
	{ 87, 112},
	{ 23, 151},
	{ 87, 151}
};

POS_XY lpsel_character_ok_position[] = {
	{128, 88},{  0,  0},{  0,  0},{  0,  0},
	{128, 63},{128,145},{  0,  0},{  0,  0},
	{ 90, 88},{166, 88},{  0,  0},{  0,  0},
	{ 90, 63},{166, 63},{ 90,145},{166,145}
};


POS_XY lmsel_circuit_position[] = {
	{157,112},{296,129},
	{157,136},{296,153},
	{157,160},{296,177},
	{157,184},{296,201}
};

POS_XY msel_bestbox_default_position[] = {
	{ -150, 59},
	{ 370, 59}
};

POS_XY msel_bestbox_target_position[] = {
	{ 23, 59},
	{ 297-MSEL_BESTBOX_X, 59},
};

POS_XY msel_cup_positions[] = {
	{  40, 115},
	{  40, 60}
};

POS_XY cp_cursor_position[] = {
	{62,67},{161,67},
	{62,197},{161,197}
};

POS_XY vs_face_start_position[] = {
	{-64,240},{320,240},{-64,-64},{-64,-64},
	{-64,-64},{320,-64},{-64,240},{-64,-64},
	{-64,-64},{320,-64},{-64,240},{320,240}
};

POS_XY vs_face_start_position2 = {320,35};

POS_XY vs_face_target_position[] = {
	{ 80, 35},{176, 35},{0,0},{0,0},
	{ 50, 35},{128, 35},{206, 35},{0,0},
	{ 24, 35},{ 93, 35},{162, 35},{231, 35}
};

POS_XY vs_result_cursor_position[] = {
	{117,167},{117,182},{117,197},{117,212}
};

POS_XY vs_result_winlose_position[] = {
	{35,75},{245,75}
};

POS_XY ta_result_cursor_position[] = {
	{180,142},{180,155},{180,168},{180,181},{180,194},{180,207}
};


POS_XY ta_ghostb_cursor_position[] = {
	{175,164},{175,194}
};

POS_XY ta_ghostc_cursor_position[] = {
	{192,179},{192,194}
};


POS_XY tar_select_cursor_position[] = {
	{108,148},{108,161},{108,174},{108,187},{108,200},{108,213}
};


POS_XY tar_ghostb_cursor_position[] = {
	{102,144},{102,164}
};

POS_XY tar_ghostc_cursor_position[] = {
	{118,149},{118,164}
};


POS_XY tsel_cup_positions[] = {
	{ 23, 10},	{ 93, 10},
	{162, 10},	{232, 10},
	{ 23, 10}
};

POS_XY ending1_messages_start_position[] = {
	{ 330, 50},
	{-160,212},
	{160,270},
	{-160,190},
	{323, 90}
};

POS_XY ending1_messages_target_position[] = {
	{160, 50},
	{155,212},
	{160, 80},
	{155,190},
	{128, 90}
};



P_COLOR psel_cursor_color[] = {
	{0,243,243,255},
	{255,168,195,255},
	{255,254,122,255},
	{123,252,123,255},
	{255,255,0,255}//for tsel_cursor
};

P_COLOR tsel_cursor_color[] = {
	{0,243,243,255},
	{255,168,195,255},
	{255,255,0,255}//for tsel_cursor
};

P_COLOR titleback_color[] = {
	{255,175,175,255},
	{175,255,175,255},
	{175,175,255,255}
};

const short font_width[] = {
	12/*a*/,13/*b*/,11/*c*/,11/*d*/,10/*e*/,
	11/*f*/,11/*g*/,13/*h*/, 7/*i*/,10/*j*/,
	12/*k*/,10/*l*/,18/*m*/,13/*n*/,12/*o*/,
	12/*p*/,12/*q*/,12/*r*/,11/*s*/,13/*t*/,
	12/*u*/,12/*v*/,18/*w*/,12/*x*/,12/*y*/,
	12/*z*/,10/*!*/,10/*-*/,10/*?*/, 6/*'*/,
	30/*pts*/,6/*.*/,
	10/*0*/, 8/*1*/,11/*2*/,12/*3*/,12/*4*/,
	13/*5*/,10/*6*/,11/*7*/,10/*8*/,10/*9*/,
	8/*"*/,28/*..*/,10/*+*/,16/*cc*/,
	F_SIZE0/*，*/,16/*dummy*/,
	F_SIZE0/*あ*/,F_SIZE0/*い*/,F_SIZE0/*う*/,F_SIZE0/*え*/,F_SIZE0/*お*/,
	F_SIZE0/*か*/,F_SIZE0/*が*/,F_SIZE0/*き*/,F_SIZE0/*ぎ*/,F_SIZE0/*く*/,
	F_SIZE0/*ぐ*/,F_SIZE0/*け*/,F_SIZE0/*げ*/,F_SIZE0/*こ*/,F_SIZE0/*ご*/,
	F_SIZE0/*さ*/,F_SIZE0/*ざ*/,F_SIZE0/*し*/,F_SIZE0/*じ*/,F_SIZE0/*す*/,
	F_SIZE0/*ず*/,F_SIZE0/*せ*/,F_SIZE0/*ぜ*/,F_SIZE0/*そ*/,F_SIZE0/*ぞ*/,
	F_SIZE0/*た*/,F_SIZE0/*だ*/,F_SIZE0/*ち*/,F_SIZE0/*ぢ*/,
	F_SIZE1/*っ*/,F_SIZE0/*つ*/,F_SIZE0/*づ*/,
	F_SIZE0/*て*/,F_SIZE0/*で*/,F_SIZE0/*と*/,F_SIZE0/*ど*/,
	F_SIZE0/*な*/,F_SIZE0/*に*/,F_SIZE0/*ぬ*/,F_SIZE0/*ね*/,F_SIZE0/*の*/,
	F_SIZE0/*は*/,F_SIZE0/*ば*/,F_SIZE0/*ぱ*/,F_SIZE0/*ひ*/,F_SIZE0/*び*/,
	F_SIZE0/*ぴ*/,F_SIZE0/*ふ*/,F_SIZE0/*ぶ*/,F_SIZE0/*ぷ*/,F_SIZE0/*へ*/,
	F_SIZE0/*べ*/,F_SIZE0/*ぺ*/,F_SIZE0/*ほ*/,F_SIZE0/*ぼ*/,F_SIZE0/*ぽ*/,
	F_SIZE0/*ま*/,F_SIZE0/*み*/,F_SIZE0/*む*/,F_SIZE0/*め*/,F_SIZE0/*も*/,
	F_SIZE1/*ゃ*/,F_SIZE0/*や*/,F_SIZE1/*ゅ*/,F_SIZE0/*ゆ*/,
	F_SIZE1/*ょ*/,F_SIZE0/*よ*/,
	F_SIZE0/*ら*/,F_SIZE0/*り*/,F_SIZE0/*る*/,F_SIZE0/*れ*/,F_SIZE0/*ろ*/,
	F_SIZE0/*わ*/,F_SIZE0/*を*/,F_SIZE0/*ん*/,
	F_SIZE1/*ぁ*/,F_SIZE1/*ぃ*/,F_SIZE1/*ぅ*/,
	F_SIZE1/*ぇ*/,F_SIZE1/*ぉ*/,
	F_SIZE0/*ア*/,F_SIZE0/*イ*/,F_SIZE0/*ウ*/,F_SIZE0/*エ*/,F_SIZE0/*オ*/,
	F_SIZE0/*カ*/,F_SIZE0/*ガ*/,F_SIZE0/*キ*/,F_SIZE0/*ギ*/,F_SIZE0/*ク*/,
	F_SIZE0/*グ*/,F_SIZE0/*ケ*/,F_SIZE0/*ゲ*/,F_SIZE0/*コ*/,F_SIZE0/*ゴ*/,
	F_SIZE0/*サ*/,F_SIZE0/*ザ*/,F_SIZE0/*シ*/,F_SIZE0/*ジ*/,F_SIZE0/*ス*/,
	F_SIZE0/*ズ*/,F_SIZE0/*セ*/,F_SIZE0/*ゼ*/,F_SIZE0/*ソ*/,F_SIZE0/*ゾ*/,
	F_SIZE0/*タ*/,F_SIZE0/*ダ*/,F_SIZE0/*チ*/,F_SIZE0/*ヂ*/,
	F_SIZE1/*ッ*/,F_SIZE0/*ツ*/,F_SIZE0/*ヅ*/,
	F_SIZE0/*テ*/,F_SIZE0/*デ*/,F_SIZE0/*ト*/,F_SIZE0/*ド*/,
	F_SIZE0/*ナ*/,F_SIZE0/*ニ*/,F_SIZE0/*ヌ*/,F_SIZE0/*ネ*/,F_SIZE0/*ノ*/,
	F_SIZE0/*ハ*/,F_SIZE0/*バ*/,F_SIZE0/*パ*/,F_SIZE0/*ヒ*/,F_SIZE0/*ビ*/,
	F_SIZE0/*ピ*/,F_SIZE0/*フ*/,F_SIZE0/*ブ*/,F_SIZE0/*プ*/,F_SIZE0/*ヘ*/,
	F_SIZE0/*ベ*/,F_SIZE0/*ペ*/,F_SIZE0/*ホ*/,F_SIZE0/*ボ*/,F_SIZE0/*ポ*/,
	F_SIZE0/*マ*/,F_SIZE0/*ミ*/,F_SIZE0/*ム*/,F_SIZE0/*メ*/,F_SIZE0/*モ*/,
	F_SIZE1/*ャ*/,F_SIZE0/*ヤ*/,F_SIZE1/*ュ*/,
	F_SIZE0/*ユ*/,F_SIZE1/*ョ*/,F_SIZE0/*ヨ*/,
	F_SIZE0/*ラ*/,F_SIZE0/*リ*/,F_SIZE0/*ル*/,F_SIZE0/*レ*/,F_SIZE0/*ロ*/,
	F_SIZE0/*ワ*/,F_SIZE0/*ヲ*/,F_SIZE0/*ン*/,
	F_SIZE1/*ァ*/,F_SIZE1/*ィ*/,F_SIZE1/*ゥ*/,
	F_SIZE1/*ェ*/,F_SIZE1/*ォ*/,
	11/*．*/,F_SIZE0/*’*/,F_SIZE0/*”*/,F_SIZE0/*＋*/,F_SIZE0/*ー*/,
	F_SIZE2/*０*/,F_SIZE2/*１*/,F_SIZE2/*２*/,F_SIZE2/*３*/,F_SIZE2/*４*/,
	F_SIZE2/*５*/,F_SIZE2/*６*/,F_SIZE2/*７*/,F_SIZE2/*８*/,F_SIZE2/*９*/,
	F_SIZE0/*Ｄ*/,F_SIZE0/*cc*/,F_SIZE3/*nd*/,F_SIZE0/*pts*/,
	F_SIZE3/*rd*/,F_SIZE3/*st*/,F_SIZE3/*th*/,
	F_SIZE0/*Ｓ*/,F_SIZE0/*Ｖ*/,
	F_SIZE0/*！*/,F_SIZE0/*。*/,F_SIZE0/*，*/,F_SIZE0/*＾*/
};

char *cup_name[] = {
	"kinoko cup",
	"flower cup",
	"star cup",
	"special cup",
	"battle"
};

char *cup_name_j[] = {
	"キノコ カップ",
	"フラワー カップ",
	"スター カップ",
	"スペシャル カップ"
};

char *circuit_name[] = {
	"mario circuit","choco mountain","koopa castle","hyuudoro lake",
	"yoshi valley","frappe snowland","noko noko beach","peach circuit",
	"luigi circuit","moh moh farm","kinopio highway","kara kara desert",
	"sherbet land","rainbow road","wario stadium","block fortress",
	"sky scraper","double deck","donkey jungle park","big doughnut"

};

char *circuit_name_j[] = {
	"マリオサーキット","チョコマウンテン",
	"クッパキャッスル","ヒュ＾ドロいけ",
	"ヨッシーバレー","フラッペスノーランド",
	"ノコノコビーチ","ピーチサーキット",
	"ルイージサーキット","モ＾モ＾ファーム",
	"キノピオハイウェイ","カラカラさばく",
	"シャーベットランド","レインボーロード",
	"ワリオスタジアム","ブロックとりで",
	"まてんろう","ダブルデッキ",
	"ドンキージャングルパーク","ビッグドーナッツ"

};

char *circuit_name_semilong_j[] = {
	"マリオサーキット","チョコマウンテン",
	"クッパキャッスル","ヒュ＾ドロいけ",
	"ヨッシーバレー","フラッペスノーランド",
	"ノコノコビーチ","ピーチサーキット",
	"ルイージサーキット","モ＾モ＾ファーム",
	"キノピオハイウェイ","カラカラさばく",
	"シャーベットランド","レインボーロード",
	"ワリオスタジアム","ブロックとりで",
	"まてんろう","ダブルデッキ",
	"ドンキージャングル","ビッグドーナッツ"

};

char *circuit_name_short[] = {
	"m circuit","mountain","castle","ghost",
	"maze","snow","beach","p circuit",
	"l circuit","farm","highway","desert",
	"sherbet","rainbow","stadium","block",
	"skyscraper","deck","jungle","doughnut"

};

char map2cup_chart[] = {
	FLOWERCUP,FLOWERCUP,STARCUP,SPECIALCUP,
	SPECIALCUP,FLOWERCUP,KINOKOCUP,STARCUP,
	KINOKOCUP,KINOKOCUP,FLOWERCUP,KINOKOCUP,
	STARCUP,SPECIALCUP,STARCUP,4,
	4,4,SPECIALCUP,4
};

const char map2circuit_chart[] = {
	3,2,3,2,
	1,1,2,2,
	0,1,0,3,
	1,3,0,1,
	3,2,0,0
};

const char driver2pselset[8] = {
    0, 1, 4, 3,
    5, 6, 2, 7
};

char *cup_type_names[] = {
	"none","bronze",
	"silver","gold"
};

char *drivers_name[] = {
	"MARIO","LUIGI",
	"YOSHI","KINOPIO",
	"D.KONG","WARIO",
	"PEACH","KOOPA"
};

char *drivers_name_j[] = {
	"マリオ","ルイージ",
	"ヨッシー","キノピオ",
	"Ｄ．コング","ワリオ",
	"ピーチ","クッパ","ーーーー"
};

char *class_name[] = {
	"50(","100(",
	"150("," おまけ"
};

char *class_name_j[] = {
	"50(","100(",
	"150("," おまけ"
};

char *screen_mode_names[] = {
	"1p","2players UD","2players LR",
	"3players","4players"
};

char *sound_mode_name[] = {
	"stereo","head phone",
	"xxx","monaural"
};

char *sound_mode_name_j[] = {
	"ステレオ","ヘッドホン",
	"","モノラル"
};

char *win_lose_j[] = {
	"かち！","まけ！"
};

char *bestrec_j[] = {
	"ベストレコード","ベストラップ","ラップタイム"
};

char *laptime_j[] = {
	"ラップ 1","ラップ 2","ラップ 3","トータル"
};

char *recordtime_j[] = {
	"1 ｓ","2 ｎ","3 ｒ","4 ｔ","5 ｔ"," "
};

char *ta_result_select_j[] = {
	"ゲームをつづける","リトライ","コースチェンジ","ドライバーチェンジ",
	"ゲームをやめる","リプレイ","ゴーストのセーブ"
};

char *vs_result_title_j[] = {
	"ＶＳマッチ ランキング",
	"バトル ランキング"
};

char ta_romghost_message_j[] = "CHALLENGER COMES!!!";

//char no_controller_message[] = "NO CONTOROLLER";
//char no_controller_message[] = "1P のコントローラをせつぞくしてください";
char *no_controller_message[] = {
	"1P のコントローラをせつぞくして",
	"でんげんをいれなおしてください"
};

char *msel_battle_messages_j[] = {
	"バトルゲーム",
	"たいせんプレイヤーのふうせんをとばそう",
	"3つのふうせんがなくなったらマケ！"
};

char tsel_title_j[] = {
	"a ボタン*データをみる  B ボタン*もどる"
};

char dsel_length_j[] = {
	"ぜんちょう"
};

char *dsel_lengthdata_j[] = {
	"567m","687m","777m","747m",
	"772m","734m","691m","1025m",
	"717m","527m","1036m","753m",
	"756m","2000m","1591m","","","","893m",""
};

char *dsel_select1_j[] = {
	"メニューにもどる","このコースのきろくをけす",
	"このコースのゴーストをけす"
};

char *dsel_select2_j[] = {
	"やめる","けす"
};

char *dsel_select2_messages_j[] = {
	"このコースのベストレコードと",
	"ベストラップがきえてしまいますが",
	"よろしいですか?",
	"このコースのゴーストの",
	"データがきえてしまいますが",
	"よろしいですか?"
};

char *dsel_select3_messages_j[] = {
	"ゴーストをけすことが",
	"できませんでした。"
};

char *option_select1_messages_j[] = {
	"ゲームセレクトにもどる",
	"サウンドモード",
	"コントローラパックのコピー",
	"データをすべてけす",
};

char *option_select3_messages_j[] = {
	"カセットにセーブされている",
	"すべてのデータがきえてしまいますが",
	"ほんとうによろしいですか?"
};

char *option_select3e_messages_j[] = {
	"カセットにセーブされている",
	"すべてのデータが",
	"しょうきょされました"
};

char *option_copy_pak1err_messages_j[] = {
	"1P のコントローラパックが",
	"セットされていません",
	"",
	"",
	"1P のコントローラパックの",
	"データをよみこめませんでした",
	"",
	"",
	"1P のコントローラパックに",
	"ゲームノートがつくれません",
	"",
	"",
	"1P のコントローラパックの",
	"のこりページがたりないので",
	"ゴーストをコピーすることが",
	"できません"
	
};

char *option_copy_pak2err_messages_j[] = {
	"2P のコントローラパックには",
	"ゴーストデータはありません",
	"",
	"2P のコントローラパックには",
	"マリオカート64 のゲームノートは",
	"ありません",
	"2P のコントローラパックが",
	"セットされていません",
	"",
	"2P のコントローラパックの",
	"データをよみこめませんでした",
	""
	
};

char *option_copy_copyerr_messages_j[] = {
	"1p のコントローラパックに",
	"データをコピーできませんでした",
	"2p のコントローラパックの",
	"データをよみこめませんでした"
	
};

char *option_copy_pak_j[] = {
	"パック1",
	"パック2"
	
};

char *option_copy_pak2sel_message_j[] = {
	"どのファイルをコピーしますか?",
	"どのファイルにコピーしますか?"
};

char *option_copy_sure_messages_j[] = {
	"まえのデータはきえてしまいますが",
	"よろしいですか?"
};

char *option_copy_sure2_messages_j[] = {
	"やめる",
	"コピーする"
};

char *option_copy_copy_messages_j[] = {
	"データをコピーちゅうです",
	"データのコピーがおわりました"
};

char *gsel_caution_messages_j[] = {
	"コントローラパックがセットされていません。",
	"ゴーストデータをセーブしたいときは,1P の",
	"コントローラにパックをセットしてください。",
	"",

	"コントローラパックのデータを",
	"よみこめませんでした。",
	"",
	"",

	"コントローラパックのデータがこわれているので",
	"ゴーストがでません。あたらしいゴーストを",
	"セーブするか,データがめんでゴーストを",
	"けしてください。",

	"コントローラパックののこりページが",
	"たりません。 このゲームのノートをつくるには",
	"121 ページひつようです。 くわしくは,",
	"せつめいしょをおよみください。",

	"ゴーストをセーブするためには",
	"コントローラ1にコントローラパックを",
	"セットしてください"
};


char *ta_ghosta_messages_j[] = {
	"コントローラパックが",
	"セットされていないので",
	"ゴーストを",
	"セーブすることは",
	"できません。",
	"ゴーストのセーブが",/* パックのハード異常？ */
	"できませんでした",
	"",
	"",
	"",
	"パックいじょう",
	"",
	"",
	"",
	"",
	"コントローラパックの",
	"のこりページが",
	"たりないのでゴーストを",
	"セーブすることが",
	"できません。",
	"ゲームノートが",
	"つくれません。",
	"",
	"",
	"",
	"このゴーストは",
	"すでに",
	"セーブされています。",
	"",
	""
};

char *ta_lost_ghost_message_j[] = {
	"このプレイデータは、",
	"ゴーストには できません"
};

char *ta_ghostb_messages_j[] = {
	"セーブするファイルを",
	"えらんでください",
	"NO DATA"
};

char *ta_ghostb3_messages_j[] = {
	"MARIOKART64 の",
	"ゲームノートを",
	"つくっています",
	"ゲームノートが",
	"つくれません",
	""
};

char *ta_ghostc_messages_j[] = {
	"まえのデータは",
	"きえてしまいますが",
	"よろしいですか?"
};

char *ta_ghostc_select_messages_j[] = {
	"やめる",
	"セーブする"
};

char *ta_ghostd_messages_j[] = {
	"ゴーストを",
	"セーブしています",
	"しばらくおまちください"
};

char *ta_ghostd2_messages_j[] = {
	"ゴーストのセーブが",
	"できませんでした"
};



char *ending_message2[] = {
	"YOU ARE AWARDED THE",
	"GOLD CUP.",
	"SILVER CUP.",
	"BRONZE CUP.",
	"MAYBE NEXT TIME!"
};


char *ending_message3[] = {
	"CONGRATULATIONS!",
	"WHAT A PITY!"
};

char *ending_message4[] = {
	"YOU ARE IN",
	"    st.",
	"    nd.",
	"    rd.",
	"    th.",
	"    th.",
	"    th.",
	"    th.",
	"    th."
};


const char additional_point_defaults[4] = {
	9,6,3,1
};

const char screen_mode2num[12] = {
	0,
	0,1,
	0,1,
	0,1,2,
	0,1,2,3
};

const char thunder_onoff[] = {
	0,1,2,1,2,
	1,2,1,2,0,
	0,1,2,2,1,
	2,2,1,2,2,
	1,2,2,1,2,
	2,1,3,3,3,
	3,3,3,3,3,
	3,3,3,3,3
};
	
P_COLOR k_thunder_color[] = {
	{0,0,0,0},
	{255,255,255,255},
	{0,0,80,255},
	{255,255,255,255}
};

P_COLOR fade_color_bw[] = {
	{0,0,0,255},
	{255,255,255,255}
};

const char start_pause_seq[] = {
	KSEQ_PS_GP1,
	KSEQ_PS_TA1,
	KSEQ_PS_VS1,
	KSEQ_PS_BT1
};

const char bottom_pause_seq[] = {
	KSEQ_PS_GP2,
	KSEQ_PS_TA5,
	KSEQ_PS_VS4,
	KSEQ_PS_BT4
};


#include "tex_list.c"
#include "mathkawano.c"

int ps4expand(unsigned *abuf,unsigned char *ch,unsigned short *bz);

int CheckContPackMenu(void);
void SkipManager(void);
void InitVC_kawano(void);
int GetFontNumber_h(char *moji);
int GetFontNumber_k(char *moji);
int GetFontNumber_j(char *moji);
void SetPalette(int palette_number);
void SetWord2_a(int x,int y,char *moji,int interval,
				 float mulx,float muly);
void kawanoOnlyFade(int num);
void kawanoDraw(int num);
void doNintenLogo(Dynamic *dynamicp,int work);
void doGameSelect(Dynamic *dynamicp);
void doGameSelect10(void);
void TexDataChange(void);
Gfx *FlashRectangle2(Gfx *gdl,unsigned int ulx,unsigned int uly,
					 unsigned int drx,unsigned int dry);
Gfx *FlashRectangle2f(Gfx *gdl,unsigned int ulx,unsigned int uly,
					unsigned int drx,unsigned int dry);
Gfx *FillRect1Color_f(Gfx *gdl,
					  //unsigned int ulx,unsigned int uly,
					  //unsigned int drx,unsigned int dry,
					  int ulx,int uly,
					  int drx,int dry,
					  unsigned int red,unsigned int green,
					  unsigned int blue,unsigned int alpha);
Gfx *AutoTextureRect(Gfx *gdl,char flg_ia,
					 int dsdx,int dtdy,
					 int t_ulx,int t_uly,
					 int t_drx,int t_dry,
					 int disp_x,int disp_y,
					 unsigned short *texp,
					 unsigned int tex_size_x,unsigned int tex_size_y);
Gfx *AutoTextureRect_zoom(Gfx *gdl,char flg_ia,
						  int dsdx,int dtdy,float zoom_x,float zoom_y,
						  int t_ulx,int t_uly,
						  int t_drx,int t_dry,
						  int disp_x,int disp_y,
						  unsigned short *texp,
						  unsigned int tex_size_x,unsigned int tex_size_y);
Gfx *AutoTextureRect_noise(Gfx *gdl,
						   int disp_x,int disp_y,
						   unsigned int size_x,unsigned int size_y);
Gfx *AutoTextureRect_c(Gfx *gdl,char flg_ia,
					   unsigned int t_ulx,unsigned int t_uly,
					   unsigned int t_drx,unsigned int t_dry,
					   int disp_x,int disp_y,
					   unsigned short *texp,
					   unsigned int tex_size_x,unsigned int tex_size_y);
Gfx *AutoTextureRect64(Gfx *gdl,char flg_ia,
					   int disp_x,int disp_y,
					   unsigned short *texp,int width);
Gfx *AutoTextureRect_w(Gfx *gdl,char flg_ia,
					   unsigned int t_ulx,unsigned int t_uly,
					   unsigned int t_drx,unsigned int t_dry,
					   int disp_x,int disp_y,
					   unsigned short *texp,
					   unsigned int tex_size_x,unsigned int tex_size_y,
					   int width);
Gfx *AutoTextureRectSimple(Gfx *gdl,
		     unsigned int t_ulx,unsigned int t_uly,
		     unsigned int t_drx,unsigned int t_dry,
		     unsigned int disp_x,int disp_y,
		     unsigned short *texp,
		     unsigned int tex_size_x,unsigned int tex_size_y);
Gfx *AutoTextureRectR(Gfx *gdl,
		     unsigned int t_ulx,unsigned int t_uly,
		     unsigned int t_drx,unsigned int t_dry,
		     int disp_x,int disp_y,
		     unsigned short *texp,
		     unsigned int tex_size_x,unsigned int tex_size_y);
Gfx *FillRect1Color(Gfx *gdl,
					//unsigned int ulx,unsigned int uly,
					//unsigned int drx,unsigned int dry,
					int ulx,int uly,int drx,int dry,
					unsigned int red,unsigned int green,
					unsigned int blue,unsigned int alpha);
Gfx *FillRectBlack(Gfx *gdl,
				   unsigned int ulx,unsigned int uly,
				   unsigned int drx,unsigned int dry);
void tex_data_Dma(unsigned short *tex_ptr,unsigned int number,
				  unsigned short *tex_buff_ptr);
void tex_data_Dma_s(unsigned short *tex_ptr,unsigned int number,
				  unsigned short *tex_buff_ptr);
void InitTexBuff(void);
TexBlock *GetTBPointer(TexBlock *texlist_ptr);
void TexBuffLoad(TexBlock *texlist_ptr);
void TexBuffLoad_font(TexBlock *texlist_ptr);
void TexBuffLoad_c(TexBlock *texlist_ptr);
void TexBuffLoad_p(TexBlock *texlist_ptr,int nocheck_flg);
void TexBuffLoad_seq(TexBlockSeq *seq_ptr);
void InitChangeTexData(void);
void InitChangeTexData_vs(void);
void SetChangeTexData(TexBlock *tb_ptr,int new_block_num);
void SetChangeTexData_vs(TexBlock *tb_ptr,int num,int buffer_num);
void doChangeTexData(void);
void doChangeTexData_vs(void);
void ChangeTexData(TexBlock *tb_ptr,int new_block_num);
void InitSeqData(void);
int SetSeqData(TexBlockSeq *tbs_ptr);
void ChangeSeqData(int i,int pat,TexBlockSeq *tbs_ptr);
void doSeqData(void);
void doSeqData2(int i,int x,int y,int param);
void doSeqData2_vs(int i,int x,int y,int num,int param);
TexBlock *SelectTex(SeqData *sd_ptr);
TexBlock *SelectTex_vs(SeqData *sd_ptr,int num);
void GrayScale_tex_buff256(unsigned source_num,unsigned dist_num,
						   unsigned pixel,int step);
void GrayScale_tex_buff(unsigned num);
void GrayScale_tex_buff2(unsigned num,unsigned int step);
void GrayScale_tex_buff3(unsigned num,unsigned int step);
void GrayScale_tex_buff_RGB(unsigned num,int size,int red,int green,int blue);
unsigned short *GetTexBuffPointer(unsigned short *tex_ptr);
void InitKDL(void);
Gfx *doTexList(Gfx *gdl,TexBlock *tp,int x,int y);
Gfx *doTexList2(Gfx *gdl,TexBlock *tp,int x,int y,int sp,int param);
Gfx *doTexList3(Gfx *gdl,TexBlock *tp,int x,int y,
				int sp,float param1,float param2);
Gfx *doTexList4(Gfx *gdl,TexBlock *tp,float x,float y,
				int sp,float param1,float param2);
Gfx *doTexList5(Gfx *gdl,TexBlock *tp,int x,int y,int param);
Gfx *doTexList_w(Gfx *gdl,SeqData *sd_ptr,int x,int y,int param);
Gfx *doTexList_vs(Gfx *gdl,SeqData *sd_ptr,int x,int y,int num,int param);
void BeforeFadeMain(void);
void FadeMain(void);
void FadeMain2(int i);
void FadeIn(int num,int cs_flg);
void FadeInWhite(int num,int cs_flg);
void FadeOut_(int num,int cs_flg,int type);
void FadeOut(int num,int cs_flg);
void FadeOutWhite(int num,int cs_flg);
void FadeBlack(int num);
void FadeOut_m(void);
void FadeOut_r(void);
void SetFadeOut_(unsigned count,int type);
void SetFadeOut(unsigned count);
void SetFadeOutWhite(unsigned count);
void SetFadeOut_m(unsigned count);
void SetFadeOut_r(unsigned count);
void SetFadeOut_f(void);
void SetFadeOut_fw(void);
void SetFadeOut_b(void);
void SetFadeOut_d(void);
void ThunderMain(int i);
void k_thunder(int num);
void SetThunder(void);
void SetThunder_(int num);
void InitOBJBlock(void);
void SetOBJBlock(int kind,int x,int y,char pri);
void DispOBJBlock(OBJBlock *ptr);
void DispOB_cp_free(void);
void DispOB_cp_gnote(OBJBlock *ptr);
void DispOB_cp_notecursor(OBJBlock *ptr);
void DispOB_cp_gnote_name(OBJBlock *ptr);
void DispOB_cp_cursor(OBJBlock *ptr,int num);
void DispOB_Sub_gsel1(OBJBlock *ptr,int num);
void DispOB_Sub_gsel_caution(OBJBlock *ptr);
void DispOB_Sub_psel_cursor(OBJBlock *ptr,int num,int alpha);
void DispOB_Sub_psel1(OBJBlock *ptr,TexBlock *tp);
void DispOB_Sub_psel2(OBJBlock *ptr);
void DispOB_Sub_msel1(OBJBlock *ptr,int num);
void DispOB_Sub_msel_map(OBJBlock *ptr);
void DispOB_Sub_tsel1(OBJBlock *ptr);
void DispOB_Sub_tsel_cursor(OBJBlock *ptr);
void DispOB_Sub_dsel_snap(OBJBlock *ptr);
void DispOB_Sub_dsel_mes1(OBJBlock *ptr);
void DispOB_Sub_dsel_sel1(OBJBlock *ptr);
void DispOB_Sub_dsel_sel2(OBJBlock *ptr);
void DispOB_Sub_dsel_sel3(OBJBlock *ptr);
void DispOB_Sub_option_messages(OBJBlock *ptr);
void Cut_ud_sub(OBJBlock *ptr);
void DispOB_result_time(OBJBlock *ptr);
void DispOB_result_point(OBJBlock *ptr);
void DispOB_gp_lose(OBJBlock *ptr);
void DispOB_info_3p(OBJBlock *ptr);
void DispOB_vs_result(OBJBlock *ptr);
void DispOB_vs_ibox_cursor(OBJBlock *ptr,POS_XY *pos_ptr);
void DispOB_vs_point2P(OBJBlock *ptr);
void DispOB_vs_point3P(OBJBlock *ptr);
void DispOB_vs_point4P(OBJBlock *ptr);
void DispOB_bt_point(int num1,int num2,uchar *wc_ptr);
void DispOB_vs_point123(int num1,int num2,uchar *wc_ptr);
void DispOB_ta_lostghost(OBJBlock *ptr);
void DispOB_ending1_halffade(OBJBlock *ptr);
void DispOB_ending1_message1(OBJBlock *ptr);
void DispOB_ending1_message2(OBJBlock *ptr);
void DispOB_ending1_message3(OBJBlock *ptr);
void DispOB_ending1_message4(OBJBlock *ptr);
void DispOB_staffroll_messages(OBJBlock *ptr);
void SortDPRanking(char *b_ptr);
void ResultSub_time(int x,int y,int num,int num2);
void ResultSub_point(OBJBlock *ptr,int x,int y,int num,int num2,char *pts_buf);
void DispOB_timeattack1(OBJBlock *ptr);
void DispOB_timeattack2(OBJBlock *ptr);
void TimeAttack1Sub(int num,int x,int y);
void TimeAttack1Sub2(int num,int x,int y);
void DispOB_timeattack_message1(OBJBlock *ptr);
void DispOB_pause(OBJBlock *ptr);
void DispOB_pause_ta(OBJBlock *ptr);
void DispOB_pause_vs(OBJBlock *ptr);
void DispOB_pause_gp(OBJBlock *ptr);
void DispOB_pause_bt(OBJBlock *ptr);
void DispOB_pause_cursor(void);
void DispOB_ta_replay(OBJBlock *ptr);
void kawano_itoa(int num,char *ptr);
void kawano_itoa_m(int num,char *ptr);
void kawano_itoa_s(int num,char *ptr);
void kawano_itoa_c(int num,char *ptr);
void kawano_itoa2(int num,char *ptr);
void doOBJBlock(int pri_flg);
void doOBJBlock1(void);
void doOBJBlock2(void);
void gsel_sub1(int i,OBJBlock *ptr);
void sel_ok_sub(OBJBlock *ptr);
void msel_bbox_sub(OBJBlock *ptr);
void msel_bbox_sub2(OBJBlock *ptr);
void msel_sub1(int i,OBJBlock *ptr);
void msel_sub2(OBJBlock *ptr);
void msel_sub4(OBJBlock *ptr);
void msel_battle_sub(OBJBlock *ptr);
void DispOB_Sub_msel_cup(OBJBlock *ptr);
void DispOB_Sub_msel_ghost(OBJBlock *ptr);
void tsel_sub1(int i,OBJBlock *ptr);
void DOB_moving1(OBJBlock *ptr,int x,int y);
void DOB_moving1_x(OBJBlock *ptr,int x);
void DOB_moving1_y(OBJBlock *ptr,int y);
void DOB_moving2_x(OBJBlock *ptr,int x);
void DOB_moving2_y(OBJBlock *ptr,int y);
void DOB_moving3_x(OBJBlock *ptr,int x);
void DOB_moving4_x(OBJBlock *ptr,int x,int plusminus);
void DOB_cp_cscolor(OBJBlock *ptr);
void DOB_cp_mes2(OBJBlock *ptr);
void DOB_cp_gnote(OBJBlock *ptr);
//void DOB_gsel_ok(OBJBlock *ptr);
void DOB_sel_ok(OBJBlock *ptr);
void DOB_gsel_number(OBJBlock *ptr);
void DOB_gsel_mode(OBJBlock *ptr);
void DOB_gsel_move(OBJBlock *ptr);
void DOB_gsel_gp(OBJBlock *ptr);
void DOB_gsel_start(OBJBlock *ptr);
void DOB_gsel_caution(OBJBlock *ptr);
void DOB_psel_anime_mario(OBJBlock *ptr,char position);
void DOB_psel_anime_kuppa(OBJBlock *ptr);
void DOB_psel_turn_out(OBJBlock *ptr);
void DOB_psel_turn_in(OBJBlock *ptr);
void DOB_psel_character1(OBJBlock *ptr);
void DOB_psel_cursor1(OBJBlock *ptr);
void DOB_psel_anime_priority(OBJBlock *ptr);
OBJBlock *Get_gsel_cursor_ptr(void);
OBJBlock *Get_psel_character_ptr(int num);
int Get_psel_character_pattern(int num);
void Get_psel_cursor_position(OBJBlock *ptr,int num);
int Get_psel_cursor_number(int num);
void DOB_msel_cup(OBJBlock *ptr);
void DOB_msel_map(OBJBlock *ptr);
void DOB_msel_move(OBJBlock *ptr);
void DOB_msel_name(OBJBlock *ptr);
void DOB_msel_anime_map2(OBJBlock *ptr);
void DOB_msel_anime_mapman(OBJBlock *ptr);
void DOB_msel_bbox(OBJBlock *ptr);
void DOB_msel_cup_gsc(OBJBlock *ptr);
void DOB_tsel_cup(OBJBlock *ptr);
void DOB_tsel_cursor(OBJBlock *ptr);
void DOB_tsel_map(OBJBlock *ptr);
void DOB_game_cup(OBJBlock *ptr);
void DOB_game_cup_mode1(OBJBlock *ptr);
void DOB_game_circuit(OBJBlock *ptr);
void DOB_game_circuit_mode1(OBJBlock *ptr);
void DOB_game_circuit_mode2(OBJBlock *ptr);
void DOB_msel_noise(OBJBlock *ptr);
void DOB_game_time(OBJBlock *ptr);
void DOB_game_point(OBJBlock *ptr);
void DOB_gp_lose(OBJBlock *ptr);
void DOB_info_3p(OBJBlock *ptr);
void DOB_vs_result(OBJBlock *ptr);
void DOB_vs_face(OBJBlock *ptr);
void DOB_game_ta1(OBJBlock *ptr);
void DOB_game_ta2(OBJBlock *ptr);
void DOB_game_pause(OBJBlock *ptr);
void DOB_game_ta_replay(OBJBlock *ptr);
void DOB_game_ta_mes1(OBJBlock *ptr);
void DOB_dsel_snap(OBJBlock *ptr);
void DOB_dsel_sel1(OBJBlock *ptr);
void DOB_dsel_sel2(OBJBlock *ptr);
void DOB_dsel_sel3(OBJBlock *ptr);
void DOB_ta_fanfare(OBJBlock *ptr);
void DOB_ta_lostghost(OBJBlock *ptr);
void DOB_ending1_halffade(OBJBlock *ptr);
void DOB_ending1_message(OBJBlock *ptr);
void DOB_ending1_face(OBJBlock *ptr);
void DOB_staffroll_messages(OBJBlock *ptr);
void DOB_staffroll_type0(OBJBlock *ptr);
void DOB_staffroll_type1(OBJBlock *ptr);

extern MemPtr allocatememory(uint size);


void init_kawano_select(void) 
{
	int i;
	static char first_time_only_flg = 1;
	MemPtr addr;
extern char _LOGOSegmentRomStart[],_LOGOSegmentRomEnd[];

	if (first_time_only_flg){
		first_time_only_flg = 0;
		vs_result_cursor = KSEQ_VS_SELECT0;
		ta_result_cursor = KSEQ_TA_SELECT1;
		bt_result_cursor = KSEQ_VS_SELECT0;
#if 0
		{
			uchar j_words[] = "＾01NKTJあいうえおアイウエオ";

			i = 0;
			while(j_words[i] != NULL){
				//PRINTF("%d,",j_words[i]);
				PRINTF("%x,",j_words[i]);
				i++;
			}
			PRINTF("\n");
		}
#endif

		if (osEepromProbe(&intMesgQueue)){
#if 0
			int i;
			uchar *es_ptr;

			es_ptr = (uchar *)&eeprom_save_data;
			for(i = 0;i < 512;i++){
				*es_ptr++ = i % 0x100;
			}
			osEepromLongWrite(&intMesgQueue,0,(u8 *)&eeprom_save_data,512);
#endif
			CheckEEPRom();
		}
#if ROM==0
		else
			PRINTF("no EEPROM....(kawano)\n");
#endif

#if 0
		for (i = 0;i < 4;i++){
			cup_select = i;
			race_level = 0;
			SaveCupStatus(i);
			race_level = 2;
			SaveCupStatus(i);
		}
#endif

		i = CheckContPackMenu();
		if (i){
			k_bg_number = 9;
		}
#if 0
		PRINTF("OBJBlock:%d\n",sizeof(OBJBlock));
		PRINTF("TexBlock:%d\n",sizeof(TexBlock));
		PRINTF("TexBlockSeq:%d\n",sizeof(TexBlockSeq));
		PRINTF("SeqData:%d\n",sizeof(SeqData));
		PRINTF("ChangeTexBuff:%d\n",sizeof(ChangeTexBuff));
		PRINTF("ChangeTexBuff_vs:%d\n",sizeof(ChangeTexBuff_vs));
		PRINTF("KDLBlockBuff:%d\n",sizeof(KDLBlockBuff));
		PRINTF("TexMap:%d\n",sizeof(TexMap));
		PRINTF("POS_XY:%d\n",sizeof(POS_XY));
		PRINTF("P_COLOR:%d\n",sizeof(P_COLOR));
		PRINTF("EEPROM_DATA_TIME:%d\n",sizeof(EEPROM_DATA_TIME));
		PRINTF("EEPROM_DATA_COURSE:%d\n",sizeof(EEPROM_DATA_COURSE));
		PRINTF("EEPROM_DATA_FLAGS1:%d\n",sizeof(EEPROM_DATA_FLAGS1));
		PRINTF("EEPROM_DATA_COURSE_BAK:%d\n",sizeof(EEPROM_DATA_COURSE_BAK));
		PRINTF("EEPROM_DATA_KART_t:%d\n",sizeof(EEPROM_DATA_KART_t));
		PRINTF("EEPROM_DATA_KART:%d\n",sizeof(EEPROM_DATA_KART));
#endif
	}

#if 0
	for (i = 0;i < 4;i++){
		PRINTF("type=%d,status=%d\n",sdata[i].type,sdata[i].status);
	}
#endif

	if (k_bg_number == 8){
		free_memory_pointer=static_memory_pointer;
		addr=load_press_data(_LOGOSegmentRomStart,_LOGOSegmentRomEnd);
		SetSegment(SEG_COURSE_DATA, addr);
	}
	free_memory_pointer=static_memory_pointer;
	tex_buff=(unsigned short *)allocatememory(MAX_TEX_BUFF_NUM*sizeof(short));
	melt_buff=(unsigned int *)allocatememory(MELT_BUFF_SIZE/**sizeof(int)*/);
	k_work=(unsigned char *)allocatememory(320*240);
	kdl_buff=(Gfx *)allocatememory(KDL_BUFF_SIZE);
	alloc_flagobj();

	fb_clear_flg = 0;
	for(i = 0;i < 5;i++)
		fade_flg[i] = 0;
	for(i = 0;i < 4;i++)
		thunder_flg[i] = 0;
	screen1->posx = 160;
	screen1->posy = 120;
	screen1->widthx = 320;
	screen1->widthy = 240;
	k_bg_change = 1;
	TexDataChange();
	for (i = 0;i < 4;i++){
		Na_PlyEng_Stop(i);//エンジン音ストップ
		//kart_data[i].tire_RL.status = 0;
		//kart_data[i].tire_RR.status = 0;
	}

	for (i = 1;i <= 7;i++)/* 1-7 */
		Na_EnmLevel_Stop(i);

	Setting_SoundOutMode();
	//Na_SoundOutModeSet(sound_output);

    /* The Vi manager was started by scheduler by this point in time */
    osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON);

	//report = FRAMEBUFFERADDRESS/*last_memory_pointer*/ - free_memory_pointer;
	//PRINTF("free=%d\n",report);

}

int CheckContPackMenu(void)
{
	extern u8 pattern;
	u8 pak_pattern;
	int i;
	u8 pak_name[32];
	int name_length;

	if (!pattern)/*コントローラーがささっているか*/
		return(0);
	if (!sdata[0].status & CONT_CARD_ON)/*なんかがつながってるか*/
		return(0);
	if (!(cont1P->status & START_BUTTON))/*スタートボタンが押されているか*/
		return(0);

	/* コントローラーパックがつながっているか */
	osPfsIsPlug(&intMesgQueue,&pak_pattern);
	if (pak_pattern & 1){
#if KAWANO_PAK_BUGFIX_970304
		if( kawano_osPfsInit(&intMesgQueue, &pfs_k, 0 ) )
#else
		if( osPfsInit(&intMesgQueue, &pfs_k, 0 ) )
#endif
			return( 0 );
	}
	else
		return(0);

#if 0
	if (!osPfsGetLabel(&pfs_k,pak_name,&name_length))
		PRINTF("%s \n",pak_name);
#endif

	/* ファイル数取得 */
	if( osPfsNumFiles( &pfs_k, &pfsFileNumMax, &pfsFileNum ) )
		return( 0 );
	
	/* ファイルステータス 取得 */
	for( i = 0 ; i < 16 ; i ++ ) {
		pfsStateRet[i] = osPfsFileState( &pfs_k, i, pfsState+i );
	}

	/* 空きメモリー取得 */
	if( osPfsFreeBlocks( &pfs_k, &pfsFreeBlocks ) )
		return( 0 );
	pfsFreeBlocks >>= 8;

#if 0
	PRINTF( "pfsFileNumMax = %d\n", pfsFileNumMax );
	PRINTF( "pfsFileNum = %d\n", pfsFileNum );
	PRINTF( "pfsFreeBlock = %d\n", pfsFreeBlocks );
	for( i = 0 ; i < 16 ; i ++ ) {
		PRINTF( "pfsStateRet[%d] = %d\n", i, pfsStateRet[i] );
	}
#endif

	return(1);
}

//
// ゴーストのロード(山本さんにコールしてもらう)
//
void InitGhostData(void)
{
	int i;

	init_pak_flg = 0;
	i = initPak();
	if (loading_ghost_flg && !i){
		int map_num;

		map_num = cup_select*4 + circuit_select;
		LoadGameNoteKart_data();
		for(i = 0;i < 2;i++){
			if (pak_ghost[i].e.ghost_flg){
				if (pak_ghost[i].e.ghost_map == map_num){
					LoadGameNoteKart_ghost(i);
					i = 2;
					loading_ghost_flg = 0;
				}
			}
		}
	}
}

void init_kawano_game(void)
{
	int i;
	extern u8 pattern;

#if 0
	wincount4p[0][0] = 94;
	wincount4p[0][1] = 56;
	wincount4p[0][2] = 78;
	battlewincount4p[0] = 93;
	battlewincount4p[1] = 56;
	battlewincount4p[2] = 78;
	battlewincount4p[3] = 12;
#endif
	melt_buff=(unsigned int *)allocatememory(MELT_BUFF_SIZE2);
	tex_buff=(unsigned short *)allocatememory(MAX_TEX_BUFF_NUM2*sizeof(short));
	k_work=(unsigned char *)allocatememory(64*64);
	additional_point=(unsigned char *)allocatememory(4);

	for (i = 0;i < 5;i++)
		fade_flg[i] = 0;
	for (i = 0;i < 4;i++)
		thunder_flg[i] = 0;

	InitTexBuff();
	InitSeqData();
	InitOBJBlock();
	InitVC_kawano();
	//SetOBJBlock(KO_GAME_CUP,100,31,1);
	//SetOBJBlock(KO_GAME_CIRCUIT,100,231,1);
	SetOBJBlock(KO_GAME_CUP,100,36,1);
	SetOBJBlock(KO_GAME_CIRCUIT,100,221,1);
	SetOBJBlock(KO_GAME_CUT_UD,0,0,0);
	SetOBJBlock(KO_GAME_PAUSE,0,0,0);
	if (game_mode == TIMEATTACK){
		SetOBJBlock(KO_GAME_TA_RANK,0,0,0);
		SetOBJBlock(KO_TA_LOSTGHOST,0,0,0);
	}
	if (replay_flag && (game_mode == TIMEATTACK))
		SetOBJBlock(KO_GAME_TA_REP,0,0,0);
	if (!(pattern&0x1) && demo_play_flag)
		SetOBJBlock(KO_NOCONTROLLER,0,0,2);

	initPak();

	//DispResultTime();
	//SetOBJBlock(KO_GAME_TIME,0,0,0);
	//DispMessageRomGhost();
	//DispGPLose();

	//ゲーム中にアニメを出す実験
	//SetOBJBlock(KO_GAME_MA,60,50,8);
	//SetOBJBlock(KO_GAME_LU1,200,50,8);
	//SetOBJBlock(KO_GAME_MA1,60,150,8);
	//SetOBJBlock(KO_GAME_MA1,200,150,8);

}

void SkipManager(void)
{
	int moving_switch;

#if DP_TEST_FLAG
	/*デバッグ用シーケンス進行ボタン*/
	if (cont2P->ontrigger & CONT_L)
		moving_switch = 1;
	else
		moving_switch = 0;
#else
	if (contOR->status)
		moving_switch = 1;
	else
		moving_switch = 0;
#endif
	if (contOR->ontrigger){
		//if (!k_skip_status)
			k_skip_status = 1;
	}
	
	if (moving_switch && k_skip_status)
		k_skip_flg = 1;
	else
		k_skip_flg = 0;
}

void SkipReset(void)
{
	k_skip_status = 0;
}

//
// アイテムボックスカーソルの横の字の色の決定
//
void SetCursorMessageColor(int now_position,int num,int default_color)
{
	if (now_position == num){
		if (FadeChecker())
			SetPalette(frame_counter%3);
		else
			SetPalette(5);
	}
	else{
		SetPalette(default_color);
	}
}

//
// アイテムボックスカーソルの横の字の色の決定
//
void SetCursorMessageColor4option(int now_position,int num,int default_color)
{
	if (now_position == num)
		SetPalette(5);
	else
		SetPalette(default_color);
}

//
// ヴァーテックスカラーチェンジの初期化
//
void InitVC_kawano(void)
{
	int i;

	for (i = 0;i < 2;i++){
		vc_color_num[i] = i;
		vc_color_step[i] = 0;
	}

}

void VCAutoChanger(int num,int *num_ptr,int *step_ptr)
{
	int i,vtx_num,a;
	int r1,r2,g1,g2,b1,b2,a1,a2;
	Vtx *vtx_ptr;

	if ((num < 4)||(num >= ALL_PALETTE_NUMBER))
		return;

	vtx_num = 10+(num-4)*4+(frame_counter%2)*2;

	(*step_ptr) += 16;
	if (*step_ptr >= 256){
		*step_ptr = 0;
		*num_ptr = (*num_ptr+1)%3;
	}

	for (i = 0;i < 3;i++){
		vtx_ptr = GetVAddress(vtx_fonts[i]);

		a = *num_ptr*2+2;
		r1 = (vtx_ptr+a)->v.cn[0]*(256-(*step_ptr));
		g1 = (vtx_ptr+a)->v.cn[1]*(256-(*step_ptr));
		b1 = (vtx_ptr+a)->v.cn[2]*(256-(*step_ptr));
		a1 = (vtx_ptr+a)->v.cn[3]*(256-(*step_ptr));
		a = ((*num_ptr*2+2)%6)+2;
		r2 = (vtx_ptr+a)->v.cn[0]*(*step_ptr);
		g2 = (vtx_ptr+a)->v.cn[1]*(*step_ptr);
		b2 = (vtx_ptr+a)->v.cn[2]*(*step_ptr);
		a2 = (vtx_ptr+a)->v.cn[3]*(*step_ptr);
		(vtx_ptr+vtx_num)->v.cn[0] = (r1+r2)/256;
		(vtx_ptr+vtx_num)->v.cn[1] = (g1+g2)/256;
		(vtx_ptr+vtx_num)->v.cn[2] = (b1+b2)/256;
		(vtx_ptr+vtx_num)->v.cn[3] = (a1+a2)/256;
		(vtx_ptr+vtx_num+1)->v.cn[0] = (r1+r2)/256;
		(vtx_ptr+vtx_num+1)->v.cn[1] = (g1+g2)/256;
		(vtx_ptr+vtx_num+1)->v.cn[2] = (b1+b2)/256;
		(vtx_ptr+vtx_num+1)->v.cn[3] = (a1+a2)/256;
	}

}

void DispResultTime(void)
{
	switch(game_mode){
	case MARIOGP:
		SetOBJBlock(KO_GAME_TIME,0,0,0);
		break;
	case TIMEATTACK:
		SetOBJBlock(KO_GAME_TA1,0,0,0);
	default:
		break;
	}
}	

void DispGPLose(void)
{
	SetOBJBlock(KO_GAME_GPLOSE,0,0,0);
	kwgoal_rank_scroll();
	oga_gp_rose_ErhnamDjinn();
}	

void DispInfo_3P(void)
{
	SetOBJBlock(KO_GAME_INFO3P,0,0,0);
}	

void EraseInfo_3P(void)
{
	OBJBlock *ob_ptr;

	ob_ptr = Get_OBJBlock_ptr(KO_GAME_INFO3P);
	if (ob_ptr->pattern == 2)
		ob_ptr->pattern = 3;
}	

//
// VS,BATTLE 兼用
//
void DispVSResult(void)
{
	SetOBJBlock(KO_GAME_VS_RES,0,0,0);
}	

void DispMessageRomGhost(void)
{
	SetOBJBlock(KO_GAME_TA_MES1,0,0,0);
}	

//
// GP ENDING 時に矢嶋さんにコールしてもらう
//
void StartKawanoResult(void)
{
	SetOBJBlock(KO_END1_FADE,0,0,2);
}

void StartKawanoEnding(void)
{
	switch(ending_counter){
	case 0:
		SetOBJBlock(KO_SR_Q1,0,0,2);
		break;
	case 1:
	default:
		SetOBJBlock(KO_SR_A1,0,0,2);
		SetOBJBlock(KO_SR_A2,0,0,2);
		break;
	case 2:
		SetOBJBlock(KO_SR_B1,0,0,2);
		SetOBJBlock(KO_SR_B2,0,0,2);
		break;
	case 3:
		SetOBJBlock(KO_SR_C1,0,0,2);
		SetOBJBlock(KO_SR_C2,0,0,2);
		break;
	case 4:
		SetOBJBlock(KO_SR_D1,0,0,2);
		SetOBJBlock(KO_SR_D2,0,0,2);
		break;
	case 5:
		SetOBJBlock(KO_SR_E1,0,0,2);
		SetOBJBlock(KO_SR_E2,0,0,2);
		SetOBJBlock(KO_SR_E3,0,0,2);
		SetOBJBlock(KO_SR_E4,0,0,2);
		break;
	case 6:
		SetOBJBlock(KO_SR_E1,0,0,2);
		SetOBJBlock(KO_SR_E5,0,0,2);
		SetOBJBlock(KO_SR_E6,0,0,2);
		SetOBJBlock(KO_SR_E7,0,0,2);
		break;
	case 7:
		SetOBJBlock(KO_SR_F1,0,0,2);
		SetOBJBlock(KO_SR_F2,0,0,2);
		SetOBJBlock(KO_SR_F3,0,0,2);
		SetOBJBlock(KO_SR_F4,0,0,2);
		break;
	case 8:
		SetOBJBlock(KO_SR_G1,0,0,2);
		SetOBJBlock(KO_SR_G2,0,0,2);
		break;
	case 9:
		SetOBJBlock(KO_SR_H1,0,0,2);
		SetOBJBlock(KO_SR_H2,0,0,2);
		SetOBJBlock(KO_SR_H3,0,0,2);
		SetOBJBlock(KO_SR_H4,0,0,2);
		SetOBJBlock(KO_SR_H5,0,0,2);
		break;
	case 10:
		SetOBJBlock(KO_SR_H1,0,0,2);
		SetOBJBlock(KO_SR_H2,0,0,2);
		SetOBJBlock(KO_SR_H6,0,0,2);
		SetOBJBlock(KO_SR_H7,0,0,2);
		SetOBJBlock(KO_SR_H8,0,0,2);
		break;
	case 11:
		SetOBJBlock(KO_SR_I1,0,0,2);
		SetOBJBlock(KO_SR_I2,0,0,2);
		SetOBJBlock(KO_SR_I3,0,0,2);
		SetOBJBlock(KO_SR_I4,0,0,2);
		break;
	case 12:
		SetOBJBlock(KO_SR_J1,0,0,2);
		SetOBJBlock(KO_SR_J2,0,0,2);
		break;
	case 13:
		SetOBJBlock(KO_SR_K1,0,0,2);
		SetOBJBlock(KO_SR_K2,0,0,2);
		SetOBJBlock(KO_SR_K3,0,0,2);
		break;
	case 14:
		SetOBJBlock(KO_SR_L1,0,0,2);
		SetOBJBlock(KO_SR_L2,0,0,2);
		SetOBJBlock(KO_SR_L3,0,0,2);
		SetOBJBlock(KO_SR_L4,0,0,2);
		SetOBJBlock(KO_SR_L5,0,0,2);
		SetOBJBlock(KO_SR_L6,0,0,2);
		SetOBJBlock(KO_SR_L7,0,0,2);
		break;
	case 15:
		SetOBJBlock(KO_SR_M1,0,0,2);
		SetOBJBlock(KO_SR_M2,0,0,2);
		SetOBJBlock(KO_SR_M3,0,0,2);
		SetOBJBlock(KO_SR_M4,0,0,2);
		break;
	case 16:
		SetOBJBlock(KO_SR_N1,0,0,2);
		SetOBJBlock(KO_SR_N2,0,0,2);
		SetOBJBlock(KO_SR_N3,0,0,2);
		break;
	case 17:
		SetOBJBlock(KO_SR_O1,0,0,2);
		SetOBJBlock(KO_SR_O2,0,0,2);
		SetOBJBlock(KO_SR_O3,0,0,2);
		SetOBJBlock(KO_SR_O4,0,0,2);
		SetOBJBlock(KO_SR_O5,0,0,2);
		SetOBJBlock(KO_SR_O6,0,0,2);
		SetOBJBlock(KO_SR_O7,0,0,2);
		SetOBJBlock(KO_SR_O8,0,0,2);
		SetOBJBlock(KO_SR_O9,0,0,2);
		break;
	case 18:
		SetOBJBlock(KO_SR_P1,0,0,2);
		break;
	}
}

//
// この関数が呼ばれたらmessageが動き出す
//
void StaffRoll_kawano1(void)
{
	ending_message_flg = 1;
}


//
// ASCIIコードからフォント番号(河野個人用)に変換する
//
int GetFontNumber(char *moji)
{
	int font_number;

	while(1){
		font_number = 1;
		if ((*moji >= 97)&&(*moji <= 122)){
			font_number = *moji - 97;
			break;
		}
		if ((*moji >= 65)&&(*moji <= 90)){
			font_number = *moji - 65;
			break;
		}
		/*数字*/
		if ((*moji >= 48)&&(*moji <= 57)){
			font_number = *moji - 16;
			break;
		}
		//スペース
		if (*moji == 32){
			font_number = -1;
			break;
		}
		if (*moji < 0){
			switch(*moji){
			case -92:
				font_number = GetFontNumber_h(moji+1);
				break;
			case -91:
				font_number = GetFontNumber_k(moji+1);
				break;
			case -95:
			case -93:
			case -85:
				font_number = GetFontNumber_j(moji);
				break;				
			default:
				break;
			}
			break;
		}
		switch(*moji){
		case 33:/*!*/
			font_number = 26;
			break;
		case 45:/*-*/
			font_number = 27;
			break;
		case 63:/*?*/
			font_number = 28;
			break;
		case 39:/*'*/
			font_number = 29;
			break;
		case 36:/*pts.*/
			font_number = 30;
			break;
		case 46:/*.*/
			font_number = 31;
			break;
		case 34:/*"*/
			font_number = 42;
			break;
		case 42:/*tenten(*)*/
			font_number = 43;
			break;
		case 43:/*+*/
			font_number = 44;
			break;
		case 40:/*cc*/
			font_number = 45;
			break;
		case 44:/*,*/
			font_number = 0x2e;
			break;
		default:
#if ROM==0
			if (*moji >= 0)
				PRINTF("%x,",*moji);
			else
				PRINTF("%x,%x,",*moji,*(moji+1));
#endif
#if ROM==0
			//PRINTF("I don't know this letter'%c'=%d.\n",*moji,*moji);
#endif
			font_number = -2;
			break;
		}
		break;
	}
	return(font_number);
}

//
// 全角カタカナ用 GetFontNumber
//
int GetFontNumber_k(char *moji)
{
	return(GetFontNumber_h(moji) + 0x50);
}

//
// 全角ひらがな用 GetFontNumber
//
int GetFontNumber_h(char *moji)
{
	int font_number;
	uchar p_moji;

	p_moji = *moji + 128;

	while(1){
		font_number = 0;
		/* あーお */
		if ((p_moji >= 0x21)&&(p_moji <= 0x2a)){
			if (p_moji%2){/*ぁぃぅぇぉ*/
				font_number = (p_moji - 0x21)/2 + 0x7b;
				break;
			}
			else{/*あいうえお*/
				font_number = (p_moji - 0x21)/2 + 0x30;
				break;
			}
		}
		/* かーろ */
		if ((p_moji >= 0x2b)&&(p_moji <= 0x6d)){
			font_number = p_moji + 10;
			break;
		}
		switch(p_moji){
		case 0x6f:/*わ*/
			font_number = 0x78;
			break;
		case 0x72:/*を*/
		case 0x73:/*ん*/
			font_number = p_moji + 7;
			break;
		default:
#if ROM==0
			PRINTF("I don't know this letter\n");
#endif
			font_number = -2;
			break;
		}
		break;
	}
	return(font_number);
}

//
// 全角数字その他用 GetFontNumber
//
int GetFontNumber_j(char *moji)
{
	int font_number;
	uchar p_moji;

	p_moji = *(moji+1) + 128;

	font_number = 2;
	switch(*moji){
	case -95:
		switch(p_moji){
		case 0x22:/*，*/
		case 0x24:
			font_number = 0xea;
			break;
		case 0x23:/*。*/
			font_number = 0xe9;
			break;
		case 0x25:/*.*/
			font_number = 0xd0;
			break;
		case 0x2a:/*!*/
			font_number = 0xe8;
			break;
		case 0x30:/*＾(から)*/
			font_number = 0xeb;
			break;
		case 0x47:/*'*/
			font_number = 0xd1;
			break;
		case 0x49:/*"*/
			font_number = 0xd2;
			break;
		case 0x5c:/*+*/
			font_number = 0xd3;
			break;
		case 0x3c:/*-*/
		case 0x3d:
		case 0x5d:
			font_number = 0xd4;
			break;
		}
		break;
	case -93:
		if ((p_moji>= 0x30) && (p_moji <= 0x39)){/*0-9*/
			font_number = p_moji + 0xa5;
			break;
		}
		switch(p_moji){
		case 0x44:/*D*/
			font_number = 0xdf;/*D*/
			break;
		case 0x43:
		case 0x63:/*C,c*/
			font_number = 0xe0;/*cc*/
			break;
		case 0x4e:
		case 0x6e:/*N,n*/
			font_number = 0xe1;/*nd*/
			break;
		case 0x50:
		case 0x70:/*P,p*/
			font_number = 0xe2;/*pts*/
			break;
		case 0x52:
		case 0x72:/*R,r*/
			font_number = 0xe3;/*rd*/
			break;
		case 0x73:/*s*/
			font_number = 0xe4;/*st*/
			break;
		case 0x54:
		case 0x74:/*T,t*/
			font_number = 0xe5;/*th*/
			break;
		case 0x53:/*S*/
			font_number = 0xe6;/*S*/
			break;
		case 0x56:
		case 0x76:/*V,v*/
			font_number = 0xe7;/*V*/
			break;
		}
		break;
	case -85:
		if (p_moji == 0x2e)
			font_number = 0xe0;
		break;
	}
	return(font_number);
}

int GetWordLength(char *moji)
{
	int l,font_number;

	l = 0;
	while(*moji != NULL){
		font_number = GetFontNumber(moji);
		if (font_number >= 0)
			l += font_width[font_number];
		else{
			if (font_number == -1)
				l += FONT_WIDTH_SPACE;
		}
		if (font_number >= 0x30)
			moji += 2;
		else
			moji++;
	}
	return(l);
}

void SetPalette(int palette_number)
{
	afont_color = palette_number;
}

void SetWord(int x,int y,char *moji)
{
	SetPalette(0);
	SetWord2_a(x,y,moji,0,1.0,1.0);
}


//
// 左下を基準に文字を書いていく(4bitアルファ)
//
void SetWord2(int x,int y,char *moji,int interval,
				float mulx,float muly,int type)
{
	int font_number;
	int width_buff;

	width_buff = 0;
	gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_start);
	while(*moji != NULL){
		font_number = GetFontNumber(moji);
		if (font_number >= 0){
			TexBuffLoad(GetTBPointer(TexList_letters_[font_number]));
			graphPtr = doTexList4(graphPtr,
								  GetTBPointer(TexList_letters_[font_number]),
								  x+width_buff*mulx,y,type,mulx,muly);
			width_buff += font_width[font_number] + interval;
			//x = x + (int)((font_width[font_number] + interval)*mulx);
		}
		else{
			switch(font_number){
			case -1:/* スペース*/
				width_buff += FONT_WIDTH_SPACE + interval;
				//x = x + (int)((FONT_WIDTH_SPACE + interval)*mulx);
				break;
			case -2:/*知らない文字*/
			default:
				gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_end);
				return;
			}
		}
		if (font_number >= 0x30)
			moji += 2;
		else
			moji++;
	}
	gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_end);
}

//
// 左下を基準に文字を書いていく(4bitアルファ)
//
void SetWord2_a(int x,int y,char *moji,int interval,
				float mulx,float muly)
{
	SetWord2(x,y,moji,interval,mulx,muly,1);
}

//
// 左下を基準に文字を書いていく(4bitアルファ,primitivealpha)
//
void SetWord2_ap(int x,int y,char *moji,int interval,
				float mulx,float muly)
{
	SetWord2(x,y,moji,interval,mulx,muly,2);
}

//
// 文字列をひとかたまりとしてある地点を基準に文字を書いていく(4bitアルファ)
//
void SetWord3(int x,int y,char *moji,int interval,
			  float mulx,float muly,int type)
{
	int font_number,l;
	char *moji2;
	int dtl_mode;

	moji2 = moji;
	l = 0;
	while(*moji2 != NULL){
		font_number = GetFontNumber(moji2);
		if (font_number >= 0){
			l += (font_width[font_number] + interval)*mulx;
		}
		else{
			switch(font_number){
			case -1:/* スペース*/
				l += (FONT_WIDTH_SPACE + interval)*mulx;
				break;
			case -2:/*知らない文字*/
			default:
				return;
			}
		}
		if (font_number >= 0x30)
			moji2 += 2;
		else
			moji2++;
	}
	switch(type){
	case 1:/* 右下合わせ */
	case 3:
		x -= l;
		break;
	case 2:/* センタリング */
	case 4:
		x -= l/2;
	}
	if (type <= 2)
		dtl_mode = 1;
	else
		dtl_mode = 2;
	//gDPSetTextureLUT(graphPtr++,G_TT_RGBA16);
	gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_start);
	while(*moji != NULL){
		font_number = GetFontNumber(moji);
		if (font_number >= 0){
			TexBuffLoad(GetTBPointer(TexList_letters_[font_number]));
			graphPtr = doTexList4(graphPtr,
								  GetTBPointer(TexList_letters_[font_number]),
								  x,y,dtl_mode,mulx,muly);
			x  = x + (int)((font_width[font_number] + interval)*mulx);
		}
		else{
			switch(font_number){
			case -1:/* スペース*/
				x = x + (int)((FONT_WIDTH_SPACE + interval)*mulx);
				break;
			case -2:/*知らない文字*/
			default:
				gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_end);
				//gDPSetTextureLUT(graphPtr++,G_TT_NONE);
				return;
			}
		}
		if (font_number >= 0x30)
			moji += 2;
		else
			moji++;
	}
	gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_end);
	//gDPSetTextureLUT(graphPtr++,G_TT_NONE);
}

//
// 右下を基準に文字を書いていく(4bitアルファ)
//
void SetWord3_a(int x,int y,char *moji,int interval,float mulx,float muly)
{
	SetWord3(x,y,moji,interval,mulx,muly,1);
}

//
// 真ん中下を基準に文字を書いていく(4bitアルファ)
//
void SetWord3_ac(int x,int y,char *moji,int interval,float mulx,float muly)
{
	SetWord3(x,y,moji,interval,mulx,muly,2);
}

//
// 右下を基準に文字を書いていく(4bitアルファ,primitivealpha)
//
void SetWord3_ap(int x,int y,char *moji,int interval,float mulx,float muly)
{
	SetWord3(x,y,moji,interval,mulx,muly,3);
}

//
// 真ん中下を基準に文字を書いていく(4bitアルファ,primitivealpha)
//
void SetWord3_acp(int x,int y,char *moji,int interval,float mulx,float muly)
{
	SetWord3(x,y,moji,interval,mulx,muly,4);
}

//
// 中央下を基準に文字を書いていく(4bitアルファ)
//
void SetWord4(int x,int y,char *moji,int interval,
			  float mulx,float muly,int type)
{
	int font_number;
	TexBlock *tp;
	int width;

	gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_start);
	while(*moji != NULL){
		font_number = GetFontNumber(moji);
		if (font_number >= 0){
			tp = GetTBPointer(TexList_letters_[font_number]);
			TexBuffLoad(tp);
			graphPtr = doTexList4(graphPtr,tp,
								  x-font_width[font_number]/2,
								  y,type,mulx,muly);
			if ((font_number >= 0xd5)&&(font_number <= 0xdf))
				width = 32;
			else
				width = 12;
			x = x + (int)((width + interval)*mulx);
		}
		else{
			switch(font_number){
			case -1:/* スペース*/
				x = x + (int)((FONT_WIDTH_SPACE + interval)*mulx);
				break;
			case -2:/*知らない文字*/
			default:
				gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_end);
				return;
			}
		}
		if (font_number >= 0x30)
			moji += 2;
		else
			moji++;
	}
	gSPDisplayList(graphPtr++, &kawano_dtl_k_afont_end);
}

//
// 中央下を基準に文字を書いていく(4bitアルファ)
//
void SetWord4_a(int x,int y,char *moji,int interval,float mulx,float muly)
{
	SetWord4(x,y,moji,interval,mulx,muly,1);
}

//
// 中央下を基準に文字を書いていく(4bitアルファ,primitivealpha)
//
void SetWord4_ap(int x,int y,char *moji,int interval,float mulx,float muly)
{
	SetWord4(x,y,moji,interval,mulx,muly,2);
}

void kawanoDrawAfterSky(int mode)
{
	ThunderMain(screen_mode2num[mode]);
}

void kawanoDraw2(int mode)/* mode:kvars.h/l.246参照 */
{
	int i,sc_number;

	if (screen_counter == 0){
		BeforeFadeMain();
	}

	//kawanoDrawAfterSky(mode);
	switch(mode){
	case kw1p:
		kawanoDraw(screen_mode2num[mode]);
		break;
	case kw2p_r:
	case kw2p_u:
	case kw2p_l:
	case kw2p_d:
		if (screen_counter == 0)
			kawanoOnlyFade(screen_mode2num[mode]);
		else
			kawanoDraw(screen_mode2num[mode]);
		break;
	case kw4p_ul:
	case kw4p_ur:
	case kw4p_dl:
	case kw4p_dr:
		if (screen_counter == 3)
			kawanoDraw(screen_mode2num[mode]);
		else
			kawanoOnlyFade(screen_mode2num[mode]);			
		break;
	}
	gDPSetRenderMode(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
}

void kawanoDraw2_backup(int mode)/* 表示関係の問題が解決したら削除する */
{
	int i;

	switch(mode){
	case kw1p:
	case kw2p_r:
	case kw2p_u:
	case kw4p_ul:
		BeforeFadeMain();
		break;
	}
	switch(mode){
	case kw1p:
		kawanoDraw(0);
		break;
	case kw2p_r:
	case kw2p_u:
	case kw4p_ul:
		kawanoOnlyFade(0);
		break;
	case kw2p_l:
	case kw2p_d:
	case kw4p_ur:
		kawanoDraw(1);
		break;
	case kw4p_dl:
		kawanoOnlyFade(2);
		break;
	case kw4p_dr:
		kawanoDraw(3);
		break;
	}
}

void kawanoOnlyFade(int num)
{
	gSPDisplayList(graphPtr++, &kawano_onlyfade_start);

	FadeMain2(num);

	gSPDisplayList(graphPtr++, &kawano_onlyfade_end);
}
 
static float Randomf(void)
{

	float rand = (unsigned short)make_random();
	return(rand/65536.0f);

}


	extern void draw_flag(void);

static void testprog(void)
{

    extern Vtx N_logof_v[];

    uint number= SEGMENT_NUMBER(N_logof_v);
    uint offset= SEGMENT_OFFSET(N_logof_v);
    int i;
 
    Vtx  *vtx=(Vtx *)OS_PHYSICAL_TO_K0(segmentTable[number]+offset);

    for(i=0;i<1092;i++){
	if ( (vtx+i)->n.n[2] < 0 ){
	    //(vtx+i)->n.n[2] = -(80+Randomf()*40);
	    (vtx+i)->n.n[2] = -(80+Randomf()*10);
	    (vtx+i)->n.n[1] = -(120+((vtx+i)->n.n[2]) );
	} else {
	    //(vtx+i)->n.n[2] =  (80+Randomf()*40);	
	    (vtx+i)->n.n[2] =  (80+Randomf()*10);	
	    (vtx+i)->n.n[1] =  (120-((vtx+i)->n.n[2]) );
	}
    }	

}

void kawanoDrawFinal_(int mode)
{
	gSPViewport(graphPtr++, K0_TO_PHYS((u32) &vp));
	guOrtho(&dynamicp->effectmodeling[effectcount],
		0.0F, (float)SCREEN_WD-1,
		(float)SCREEN_HT-1,0.0F, 
		-100.0F, 100.0F, 1.0F);
    gSPMatrix(graphPtr++, /*&dynamicp->effectmodeling[effectcount++],*/ 
			  K0_TO_PHYS((u32) &(dynamicp->effectmodeling[effectcount++])),
			  G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);

	gSPDisplayList(graphPtr++, &kawano_onlyfade_start);

	gDPSetScissor(graphPtr++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
	doOBJBlock2();

	if (mode)
		return;
	DispOB_pause_cursor();/* カーソルを一番手前に持ってきたかったのでここ */
	FadeMain2(4);
	effectcount = 0;/* マトリックスのカウンタの初期化 */
}

void kawanoDrawFinal(void)
{
	kawanoDrawFinal_(0);
}

void kawanoDrawFinal4select(void)
{
	kawanoDrawFinal_(1);
}

void init_kawanoResult(void)
{
	int i;
	
	melt_buff=(unsigned int *)allocatememory(MELT_BUFF_SIZE2);
	tex_buff=(unsigned short *)allocatememory(MAX_TEX_BUFF_NUM2*sizeof(short));
	k_work=(unsigned char *)allocatememory(64*64);
	additional_point=(unsigned char *)allocatememory(4);

	for(i = 0;i < 5;i++)
		fade_flg[i] = 0;
	for (i = 0;i < 4;i++)
		thunder_flg[i] = 0;

	InitTexBuff();
	InitSeqData();
	InitOBJBlock();
	InitVC_kawano();
	ending_message_flg = 0;

#if ENDING_DEBUG_SWITCH
	StartKawanoResult();
#endif
	
}

void kawanoDrawResult(void)
{
	gSPViewport(graphPtr++, K0_TO_PHYS((u32) &vp));
	guOrtho(&dynamicp->effectmodeling[effectcount],
		0.0F, (float)SCREEN_WD-1,
		(float)SCREEN_HT-1,0.0F, 
		-100.0F, 100.0F, 1.0F);
    gSPMatrix(graphPtr++, /*&dynamicp->effectmodeling[effectcount++],*/ 
			  K0_TO_PHYS((u32) &(dynamicp->effectmodeling[effectcount++])),
			  G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);

	gSPDisplayList(graphPtr++, &kawano_onlyfade_start);

	gDPSetScissor(graphPtr++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
	VCAutoChanger(4,&vc_color_num[0],&vc_color_step[0]);
	VCAutoChanger(5,&vc_color_num[1],&vc_color_step[1]);

	BeforeFadeMain();
	InitChangeTexData();
	InitChangeTexData_vs();//vsリザルト表示用

	doOBJBlock1();
	doChangeTexData();
	doChangeTexData_vs();//vsリザルト表示用

	FadeMain();
	//FadeMain2(4);
	
	gSPDisplayList(graphPtr++, &kawano_onlyfade_end);
	//if (sequence_mode == ENDINGSEQUENCE)
		effectcount = 0;/* マトリックスのカウンタの初期化 */
	//if (cont1P->ontrigger & CONT_R)
	//	StaffRoll_kawano1();
}



void kawanoDraw(int num)
{
	float vf1,vf2;
	//extern Dynamic *dynamicp;

	gSPViewport(graphPtr++, K0_TO_PHYS((u32) &vp));
	gDPSetScissor(graphPtr++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
	guOrtho(&dynamicp->effectmodeling[effectcount],
		0.0F, (float)SCREEN_WD-1,
		(float)SCREEN_HT-1,0.0F, 
		-100.0F, 100.0F, 1.0F);
    gSPMatrix(graphPtr++, /*&dynamicp->effectmodeling[effectcount++],*/ 
			  K0_TO_PHYS((u32) &(dynamicp->effectmodeling[effectcount++])),
			  G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);

	gSPDisplayList(graphPtr++, &kawano_onlyfade_start);

	VCAutoChanger(4,&vc_color_num[0],&vc_color_step[0]);
	VCAutoChanger(5,&vc_color_num[1],&vc_color_step[1]);
	SkipManager();
	//BeforeFadeMain();
	InitChangeTexData();
	InitChangeTexData_vs();//vsリザルト表示用

	doOBJBlock1();
	doChangeTexData();
	doChangeTexData_vs();//vsリザルト表示用


#if 0
	//ゲーム画面にノイズ
	graphPtr = AutoTextureRect_noise(graphPtr,0,0,320,240);
#endif
#if 0
	SetPalette(0);
	SetWord2_a(50,140,"oaofoiogowo!o-",0,1.0,1.0);
	SetPalette(1);
	SetWord2_a(100,160,"てすとあぁいぃうぅえぇおぉ",0,1.0,1.0);
	SetPalette(2);
	SetWord2_a(100,120,"テストアァイィウゥエェオォ",0,1.0,1.0);
	SetPalette(3);
	SetWord2_a(100,100,"４３２１０",0,1.0,1.0);
	SetPalette(4);
	SetWord2_a(100,60,"＋ー”ｃｎｐｒｓｔ．’",0,1.0,1.0);
	SetPalette(5);
	SetWord2_a(100,40,"43210",0,1.0,1.0);
#endif

#if 0
	//文字表示（スティックで拡大縮小）
	vf1 = cont1P->stickx/100.0 + 1.0;
	if (cont1P->status & CONT_R)
		vf2 = cont1P->sticky/100.0 + 1.0;
	else
		vf2 = cont1P->stickx/100.0 + 1.0;
	PRINTF("x:%2f,y:%2f\n",vf1,vf2);
	SetPalette(0);
	SetWord2_a(20,50,"+a+f+i+g+w+-+!a'b'c'\".$43210",0,vf1,vf2);
	//SetPalette(1);
	//SetWord2_a(20,75,"rarfrirgrwr-r!98765+(",0,vf1,vf2);
	//SetPalette(2);
	//SetWord2_a(20,100,"abcdefghijklmnmlkjihgfedcba*",0,vf1,vf2);
	//SetPalette(3);
	//SetWord2_a(20,125,"circuit vcscwcvisici titctf",0,vf1,vf2);
	//SetWord2_a(20,150,"opqrstuvwxyz-?!",0,vf1,vf2);
#endif
	
#if 0
	if (cont1P->ontrigger & CONT_L)
		SetFadeOutScreen(0,30);
	if (cont1P->ontrigger & CONT_R)
		SetFadeInScreen(0,30);
	if (cont2P->ontrigger & CONT_L)
		SetFadeOutScreen(1,30);
	if (cont2P->ontrigger & CONT_R)
		SetFadeInScreen(1,30);
#endif
#if 0
	if (cont1P->ontrigger & CONT_L)
		SetThunder_(0);
	if (cont2P->ontrigger & CONT_L)
		SetThunder_(1);
	if (cont3P->ontrigger & CONT_L)
		SetThunder_(2);
	if (cont4P->ontrigger & CONT_L)
		SetThunder_(3);
#endif
#if 0
	if (cont1P->ontrigger & CONT_L){
		enemy_item_number_set(&enemy_item[1],ib_thunder);
	}
#endif

	FadeMain2(num);
	//FadeMain2(4);

	gSPDisplayList(graphPtr++, &kawano_onlyfade_end);
//	effectcount = 0;/* マトリックスのカウンタの初期化 */
	kwreturn_viewport();
#if DISP_FREE_MEMORY_SWITCH
	PRINTF("free=%d\n",report);
#endif
#if DISP_GLIST_SIZE_SWITCH
	{
		extern Dynamic	*dynamicp;
		PRINTF("graphPtr=%x\n",(uint)graphPtr-(uint)&(dynamicp->glist));
	}
#endif
#if DISP_MATRIX_COUNT_SWITCH
	{
		PRINTF("effectcount=%4d ",effectcount);
		//PRINTF("modelingnum=%d\n",modelingnum);
	}
#endif
}

#define	gxDPSetFillColor(gp,r,g,b)	gDPSetFillColor((gp),GPACK_RGBA5551(r,g,b,1) << 16 | GPACK_RGBA5551(r,g,b,1))

/*----------------------------- Delay Logo Program ---------------------------------------*/

#define	DL_KARTLOGO		1
#if 	DL_KARTLOGO

#define	 KARTLOGO_TIME1 	(2+30)
#define	 KARTLOGO_TIME2 	(70+30)
#define	 KARTLOGO_TIME3 	(120+30)

extern Gfx 		gfx_nintendo_waku[];
static float	logo_delay_size = 0.0f;
static float	logo_yang_speed = 3.0f;
static int		logo_timer;
static void 	logo_proc(void)
{

	int		i;
	float	speed;
	Mtx	*matrixp = &dynamicp->objectmodeling[0];

    gSPMatrix(graphPtr++,  &(dynamicp->projection), 
	       G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++, &(dynamicp->viewing), 
	       G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);

	/*---- draw logo  ----*/
	guRotate		( matrixp+0,logo_rot_x, 1.0F, 0.0F, 0.0F );			/* Set Angle X */
	guRotate		( matrixp+1,logo_rot_y, 0.0F, 1.0F, 0.0F );			/* Set Angle Y */
	guScale 		( matrixp+2,            1.0F, 1.0F, logo_scale_z);	/* Set Scale X */
    gSPMatrix		( graphPtr++, matrixp++, G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH	);
    gSPMatrix		( graphPtr++, matrixp++, G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH	);
    gSPMatrix		( graphPtr++, matrixp++, G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH  	);
	gDPSetRenderMode( graphPtr++, G_RM_AA_ZB_OPA_SURF,G_RM_AA_ZB_OPA_SURF2				);
	gDPSetEnvColor	( graphPtr++, 0,0,0,0 );
	gSPDisplayList  ( graphPtr++,kawano_nintenlogo_all);
	gSPPopMatrix	( graphPtr++, G_MTX_MODELVIEW 	);

	/*---- draw delay ----*/
	if ( logo_delay_size > 0 ){
		if ( ( speed = logo_yang_speed ) > 10 ) speed = 10;
		for(i=0;i<12;i++){
			guRotate		( matrixp+0,0.0F 				   				 , 1.0F, 0.0F, 0.0F);
			guRotate		( matrixp+1,logo_delay_size*(i+1)*speed			 , 0.0F, 1.0F, 0.0F);
			guScale 		( matrixp+2,   1.0F,1.0F,2.0F);
		    gSPMatrix		( graphPtr++,  matrixp++, G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH);
		    gSPMatrix		( graphPtr++,  matrixp++, G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
		    gSPMatrix		( graphPtr++,  matrixp++, G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
			gDPSetRenderMode( graphPtr++, G_RM_AA_ZB_XLU_SURF,G_RM_AA_ZB_XLU_SURF2);
			gDPSetEnvColor	( graphPtr++, 0,0,0,	0x10+0x10*(11-i)	);
			gSPDisplayList  ( graphPtr++, gfx_nintendo_waku);
		    gSPPopMatrix	( graphPtr++, G_MTX_MODELVIEW 				);
		}
	}

}
#endif

void doNintenLogo(Dynamic *dynamicp,int work)
{
    u16		   perspNorm;


	StoreSegments();

    gDPSetTexturePersp(graphPtr++,G_TP_PERSP);

	guPerspective(&dynamicp->projection,&perspNorm,
				  45.0,320.0/240.0,100,12800,1.0);
	gSPPerspNormalize(graphPtr++, perspNorm);
	guLookAt(&dynamicp->viewing,
			 0,0,logo_cam_z,   
			 0,0,0,					     						      
			 0,1,0);					     						      

#if DL_KARTLOGO
	logo_proc();
#else
	guRotate(&dynamicp->objectmodeling[0],
			 logo_rot_x, 1.0F, 0.0F, 0.0F);
	guRotate(&dynamicp->objectmodeling[1],
			 logo_rot_y, 0.0F, 1.0F, 0.0F);
	guScale(&dynamicp->objectmodeling[2],
			 1.0F, 1.0F, logo_scale_z);
    gSPMatrix(graphPtr++,  &(dynamicp->projection), 
	       G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++, &(dynamicp->viewing), 
	       G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++,  &(dynamicp->objectmodeling[0]), 
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++,  &(dynamicp->objectmodeling[1]), 
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++,  &(dynamicp->objectmodeling[2]), 
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
	gDPPipeSync(graphPtr++);
	if (!work)
	    testprog();
	gSPDisplayList(graphPtr++,kawano_nintenlogo_all);
#endif

	
#if 0
	kwprintmode_init();
	kwprintd(170,160,"scale_z",logo_scale_z);
	kwprintd(170,170,"camera_z",logo_cam_z);
	kwprintd(170,180,"rot_x",logo_rot_x);
	kwprintd(170,190,"rot_y",logo_rot_y);
	kwprintd(170,200,"rot_z",logo_rot_z);
	kwprintmode_finish();
#endif
    gDPPipeSync(graphPtr++);
	
    gDPSetTexturePersp(graphPtr++,G_TP_NONE);
    gDPSetTextureFilter(graphPtr++,G_TF_BILERP);
	return;
}

void doCheckerFlag(Dynamic *dynamicp,int work)
{
    u16		   perspNorm;


	StoreSegments();


	guPerspective(&dynamicp->projection1,&perspNorm,
				  45.0,320.0/240.0,100,12800,1.0);
	gSPPerspNormalize(graphPtr++, perspNorm);
	guLookAt(&dynamicp->viewing1,
			 0,0,logo_cam_z,   
			 0,0,0,					     						      
			 0,1,0);					     						      

	guRotate(&dynamicp->objectmodeling[0],
			 logo_rot_x, 1.0F, 0.0F, 0.0F);
	guRotate(&dynamicp->objectmodeling[1],
			 logo_rot_y, 0.0F, 1.0F, 0.0F);
	guRotate(&dynamicp->objectmodeling[2],
			 logo_rot_z, 0.0F, 0.0F, 1.0F);
	guScale(&dynamicp->objectmodeling[3],
			logo_scale_z, logo_scale_z, logo_scale_z);
	guTranslate(&dynamicp->objectmodeling[4],
				logo_pos_x,logo_pos_y,logo_pos_z);

    gSPMatrix(graphPtr++,  &(dynamicp->projection1), 
	       G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++, &(dynamicp->viewing1), 
	       G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++,  &(dynamicp->objectmodeling[0]), 
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++,  &(dynamicp->objectmodeling[1]), 
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++,  &(dynamicp->objectmodeling[2]), 
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++,  &(dynamicp->objectmodeling[3]), 
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++,  &(dynamicp->objectmodeling[4]), 
	      G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH);

	gSPDisplayList(graphPtr++,kawano_checkerflag_start);

	draw_flag();
    //gDPSetTextureFilter(graphPtr++,G_TF_POINT);

#if CHECKER_FLAG_TEST
	kwprintmode_init();
	kwprintd(170,140,"scale_z",logo_scale_z);
	kwprintd(170,150,"camera_z",logo_cam_z);
	kwprintd(170,160,"pos_x",logo_pos_x);
	kwprintd(170,170,"pos_y",logo_pos_y);
	kwprintd(170,180,"rot_x",logo_rot_x);
	kwprintd(170,190,"rot_y",logo_rot_y);
	kwprintd(170,200,"rot_z",logo_rot_z);
	kwprintmode_finish();
#endif

	gSPDisplayList(graphPtr++,kawano_init_pattern1);
  
	return;
}


void doGameSelect(Dynamic *dynamicp)
{
    u16		   perspNorm;
    unsigned short *tex_ptr;

	modelingnum = 0;
	effectcount = 0;

	gSPViewport(graphPtr++, K0_TO_PHYS((u32) &vp));
	gDPSetScissor(graphPtr++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
	guOrtho(&dynamicp->projection,
		0.0F, (float)SCREEN_WD-1,
		(float)SCREEN_HT-1,0.0F, 
		-100.0F, 100.0F, 1.0F);
    gSPMatrix(graphPtr++, &dynamicp->projection, 
	       G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);

#if 0
	guOrtho(&dynamicp->projection,
		0.0F, (float)SCREEN_WD-1,
		(float)SCREEN_HT-1,0.0F, 
		-100.0F, 100.0F, 1.0F);
	guRotate(&dynamicp->viewing, 0.0F, 0.0F, 0.0F, 1.0F);

    /* Setup model matrix */
    gSPMatrix(graphPtr++, &dynamicp->projection, 
	       G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
    gSPMatrix(graphPtr++, &dynamicp->viewing, 
	       G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
#endif

	gSPDisplayList(graphPtr++,kawano_init_pattern1);

	TexDataChange();
	VCAutoChanger(4,&vc_color_num[0],&vc_color_step[0]);
	VCAutoChanger(5,&vc_color_num[1],&vc_color_step[1]);
	InitChangeTexData();
	BeforeFadeMain();

	switch(k_bg_number){
	case 10:
		doGameSelect10();
		kawanoDrawFinal4select();
		break;
	case 5:
	case 6:
	case 7:
	case 8:
	case 9:
	case 11:
	case 12:
	case 13:
		doOBJBlock1();
		doChangeTexData();
		break;
	default:
		break;
	}

	FadeMain();
	k_flash_counter++;

#if 0
	if (fb_clear_flg < 3)
		fb_clear_flg++;
#endif

    gDPPipeSync(graphPtr++);

#if 0
    gDPPipeSync(graphPtr++);
    gDPSetRenderMode(graphPtr++,G_RM_XLU_SURF, G_RM_XLU_SURF2);
    gDPSetCombineMode(graphPtr++,G_CC_MODULATERGB_PRIM, G_CC_MODULATERGB_PRIM);
	gDPSetPrimColor(graphPtr++,0,0,64,64,64,200);
#endif

	gSPDisplayList(graphPtr++,kawano_finish_pattern1);

#if DISP_FREE_MEMORY_SWITCH
	report = MKCODE_START/*last_memory_pointer*/ - free_memory_pointer;
	PRINTF("free=%d\n",report);
#endif
}

void TexDataChange(void)
{
	extern u8 pattern;

    if (k_bg_change){
		InitTexBuff();
		InitSeqData();
		InitOBJBlock();
		InitKDL();
		InitVC_kawano();
		initPak();
		initPak2();
		k_var_init(k_bg_number);
		switch(k_bg_number){
		case 0:
			//TexBuffLoad(TexList_titleback);
			//TexBuffLoad(TexList_titlelogo);
			break;
		case 5:
			SetOBJBlock(KO_GSEL_BACK,0,0,2);
			SetOBJBlock(KO_OPT_LOGO,0,0,4);
			SetOBJBlock(KO_OPT_MES,0,0,2);
			break;
		case 6:
			SetOBJBlock(KO_GSEL_BACK,0,0,2);
			//SetOBJBlock(KO_TSEL_KCUP,0,0,8);
			//SetOBJBlock(KO_TSEL_FCUP,0,0,8);
			//SetOBJBlock(KO_TSEL_SCUP,0,0,8);
			//SetOBJBlock(KO_TSEL_SPCUP,0,0,8);
			SetOBJBlock(KO_TSEL_TITLE,0,0,6);
			SetOBJBlock(KO_TSEL_KCUP1,0,0,6);
			SetOBJBlock(KO_TSEL_KCUP2,0,0,6);
			SetOBJBlock(KO_TSEL_KCUP3,0,0,6);
			SetOBJBlock(KO_TSEL_KCUP4,0,0,6);
			SetOBJBlock(KO_TSEL_FCUP1,0,0,6);
			SetOBJBlock(KO_TSEL_FCUP2,0,0,6);
			SetOBJBlock(KO_TSEL_FCUP3,0,0,6);
			SetOBJBlock(KO_TSEL_FCUP4,0,0,6);
			SetOBJBlock(KO_TSEL_SCUP1,0,0,6);
			SetOBJBlock(KO_TSEL_SCUP2,0,0,6);
			SetOBJBlock(KO_TSEL_SCUP3,0,0,6);
			SetOBJBlock(KO_TSEL_SCUP4,0,0,6);
			SetOBJBlock(KO_TSEL_SPCUP1,0,0,6);
			SetOBJBlock(KO_TSEL_SPCUP2,0,0,6);
			SetOBJBlock(KO_TSEL_SPCUP3,0,0,6);
			SetOBJBlock(KO_TSEL_SPCUP4,0,0,6);
			SetOBJBlock(KO_TSEL_CURSOR,0,0,8);
			break;
		case 7:
			SetOBJBlock(KO_DSEL_SNAP,0,0,8);
			SetOBJBlock(KO_DSEL_MES1,0,0,8);
			SetOBJBlock(KO_DSEL_SEL1,0,0,8);
			SetOBJBlock(KO_DSEL_SEL2,0,0,8);
			SetOBJBlock(KO_DSEL_SEL3,0,0,8);
			break;
		case 8:
			SetOBJBlock(KO_NINTEN_LOGO,0,0,0);
			//SetOBJBlock(KO_CHECKER_FLAG,0,0,0);
			break;
		case 9:
			SetOBJBlock(KO_CP_CSCOLOR,0,0,0);
			SetOBJBlock(KO_CP_BG1,0,0,4);
			SetOBJBlock(KO_CP_GNOTE,0,0,6);
			SetOBJBlock(KO_CP_BG2,0,0,8);
			SetOBJBlock(KO_CP_MES1,0,0,10);
			SetOBJBlock(KO_CP_MES2,0,0,10);
			SetOBJBlock(KO_CP_FREE,0,0,10);
			SetOBJBlock(KO_CP_CURSOR1,0,0,10);
			SetOBJBlock(KO_CP_CURSOR2,0,0,10);
			break;
		case 10:
			SetOBJBlock(KO_TITLE2,0,0,4);
			SetOBJBlock(KO_TITLE,0,0,0);
			SetOBJBlock(KO_CHECKER_FLAG,0,0,0);
			//SetOBJBlock(KO_TITLE2,0,0,2);
			if (pattern & 0x1)
				SetOBJBlock(KO_TITLE3,0,0,2);
			else
				SetOBJBlock(KO_NOCONTROLLER,0,0,2);
#if FONT_TEST_ON_TITLE
			SetOBJBlock(KO_TEST_CPFONT,35,50,0);
#endif
#if FINALCHECK==1
			SetOBJBlock(KO_TITLE_TIME,0,0,6);
#endif	
			demo_flag = 0;
			demo_play_flag = 0;
//			GrayScale_tex_buff2(1,100);
//			GrayScale_tex_buff_RGB(0,307200,255,255,51);
			break;
		case 11:
			SetOBJBlock(KO_GSEL_BACK,0,0,2);
			SetOBJBlock(KO_GSEL_LOGO,350,17,6);
			SetOBJBlock(KO_GSEL_4P,350,62,6);
			SetOBJBlock(KO_GSEL_3P,350,62,6);
			SetOBJBlock(KO_GSEL_2P,350,62,6);
			SetOBJBlock(KO_GSEL_1P,350,62,6);
			SetOBJBlock(KO_GSEL_OK,350,200,6);
			SetOBJBlock(KO_GSEL_RECORD,350,200,6);
			SetOBJBlock(KO_GSEL_OPTION,350,200,6);
			if (Check4GoldCup_150cc())
				SetOBJBlock(KO_GSEL_PRO,0,0,6);
			SetOBJBlock(KO_GSEL_150CC,0,0,6);
			SetOBJBlock(KO_GSEL_100CC,0,0,6);
			SetOBJBlock(KO_GSEL_50CC,0,0,6);
			//SetOBJBlock(KO_GSEL_ITEMOFF,0,0,6);
			//SetOBJBlock(KO_GSEL_ITEMON,0,0,6);
			SetOBJBlock(KO_GSEL_DATA,0,0,6);
			//SetOBJBlock(KO_GSEL_GHOST,0,0,6);
			SetOBJBlock(KO_GSEL_TRY,0,0,6);
			//GrayScale_tex_buff2(1,100);
			SetOBJBlock(KO_GSEL_CAUTION,0,0,12);
			
			break;
		case 12:
			SetOBJBlock(KO_PSEL_BACK,0,0,2);
			SetOBJBlock(KO_PSEL_LOGO,0,0,6);
			SetOBJBlock(KO_PSEL_OK,0,0,6);
			SetOBJBlock(KO_PSEL_MA,0,0,8);
			SetOBJBlock(KO_PSEL_LU,0,0,8);
			SetOBJBlock(KO_PSEL_PE,0,0,6);
			SetOBJBlock(KO_PSEL_KI,0,0,6);
			SetOBJBlock(KO_PSEL_YO,0,0,6);
			SetOBJBlock(KO_PSEL_KA,0,0,6);
			SetOBJBlock(KO_PSEL_WA,0,0,6);
			SetOBJBlock(KO_PSEL_KU,0,0,8);
			SetOBJBlock(KO_PSEL_1P,0,0,12);
			SetOBJBlock(KO_PSEL_2P,0,0,12);
			SetOBJBlock(KO_PSEL_3P,0,0,12);
			SetOBJBlock(KO_PSEL_4P,0,0,12);

			break;
		case 13:
			SetOBJBlock(KO_MSEL_BACK,0,0,2);
			SetOBJBlock(KO_MSEL_LOGO,0,0,6);
			if (game_mode != BATTLE){
				SetOBJBlock(KO_MSEL_KCUP,0,0,4);
				SetOBJBlock(KO_MSEL_FCUP,0,0,4);
				SetOBJBlock(KO_MSEL_SCUP,0,0,4);
				SetOBJBlock(KO_MSEL_SPCUP,0,0,4);
				
				SetOBJBlock(KO_MSEL_KNAME,0,0,6);
				SetOBJBlock(KO_MSEL_FNAME,0,0,6);
				SetOBJBlock(KO_MSEL_SNAME,0,0,6);
				SetOBJBlock(KO_MSEL_SPNAME,0,0,6);
			}
			else{
				SetOBJBlock(KO_MSEL_BATTLE,0,0,6);
				SetOBJBlock(KO_MSEL_BTMES,0,0,6);
			}
				
#if 0
			//SetOBJBlock(KO_MSEL_MAP,0,0,6);//現在不要
#endif
			SetOBJBlock(KO_MSEL_MAPMAN,0,0,6);
			SetOBJBlock(KO_MSEL_MAP1,0,0,6);
			SetOBJBlock(KO_MSEL_MAP2,0,0,6);
			SetOBJBlock(KO_MSEL_MAP3,0,0,6);
			SetOBJBlock(KO_MSEL_MAP4,0,0,6);
			SetOBJBlock(KO_MSEL_OK,0,0,6);
			SetOBJBlock(KO_MSEL_NOISE,0,0,8);
			if (game_mode == TIMEATTACK){
				SetOBJBlock(KO_MSEL_BRECORD,0,0,8);
				SetOBJBlock(KO_MSEL_BLAP,0,0,8);
				SetOBJBlock(KO_MSEL_GHOST,0,0,8);
			}
			if (game_mode == MARIOGP){
				SetOBJBlock(KO_MSEL_LEVEL,0,0,8);
				SetOBJBlock(KO_MSEL_CUP,0,0,5);
			}
			break;
		default:
			break;
		}
		//k_var_init(k_bg_number);
		if (k_bg_change != 2)
			SetFadeIn(20);
		else
			SetFadeInWhite(20);
		k_bg_change = 0;
	}

}	

void doGameSelect10(void)
{
	int i;

	if ((fb_clear_flg < 3) ||(fade_flg[4])){
		doOBJBlock1();
	}

	if (title_mode > 1){
		kwprintmode_init();
		kwprint(80,100,"debug_mode");
		switch (title_mode){
		case 2:
			kwprint(70,100,"*");
			break;
		case 3:
			kwprint(70,110,"*");
			break;
		case 4:
			kwprint(70,120,"*");
			break;
		case 5:
			kwprint(70,130,"*");
			break;
		case 6:
			kwprint(70,140,"*");
			break;
		case 7:
			kwprint(70,150,"*");
			break;
		default:
			break;
		}
		if (debug_flag)
		    kwprint(170,100,"on");
		else
		    kwprint(170,100,"off");
		if ((map_number > 19)||(map_number < 0))
			map_number = 0;
		kwprintd(80,110,"map_number",map_number);
		if (map_number < 10)
			i = 0;
		else
			i = 8;
		kwprint(185+i,110,circuit_name_short[map_number]);
		kwprint(80,120,"screen_mode");
		kwprint(170,120,screen_mode_names[screen_mode_status]);
		kwprint(80,130,"player");
		kwprint(170,130,drivers_name[player_driver[0]]);
		kwprint(80,140,"sound mode");
		kwprint(170,140,sound_mode_name[sound_output]);
		if (title_mode == 7)
			kwprint(80,150,"push b to get all goldcup");
		kwprintmode_finish();
	}

	if (title_mode == 1)
	    title_counter++;
	else
	    title_counter = 3;

	if (title_counter == 2)
	    Na_System_Start(SE_ThisIsMarioKart);

#if TITLE_UNLIMITED_SWITCH
	if (title_counter > 5)
		title_counter = 5;
#endif

	if (title_counter > TITLE_TIME){
		SetFadeOut_d();
		Na_SeMute_Title();
	    //Na_Seq_Fadeout(255);
	}

	//GrayScale_tex_buff256(1,0,76800,(frame_counter%64)*4);
	gSPDisplayList(graphPtr++,kawano_finish_pattern2);
}

//-------------------------------------------------
//
// 黒白の点滅する四角(speed可変)
//
//-------------------------------------------------
Gfx *FlashRectangle2_(Gfx *gdl,unsigned int ulx,unsigned int uly,
					  unsigned int drx,unsigned int dry,int speed)
{
	int color;

	color = (k_flash_counter % speed)*512/speed;
	if (color > 256)
		color = 512-color;
	if (color > 255)
		color = 255;

	graphPtr = FillRect1Color(graphPtr,ulx,uly,drx,dry,
							color,color,color,255);
}

//-------------------------------------------------
//
// 黒白のゆっくり点滅する四角
//
//-------------------------------------------------
Gfx *FlashRectangle2(Gfx *gdl,unsigned int ulx,unsigned int uly,
					unsigned int drx,unsigned int dry)
{
	FlashRectangle2_(gdl,ulx,uly,drx,dry,64);
}

//-------------------------------------------------
//
// 黒白のちょっとはやく点滅する四角
//
//-------------------------------------------------
Gfx *FlashRectangle2f(Gfx *gdl,unsigned int ulx,unsigned int uly,
					  unsigned int drx,unsigned int dry)
{
	FlashRectangle2_(gdl,ulx,uly,drx,dry,4);
}

//
//
//
Gfx *SetAfontVertex(Gfx *gdl,Vtx *vtx_ptr)
{
	int num;

	if (afont_color < 4)
		num = afont_color;
	else
		num = 4 + (afont_color-4)*2 + (frame_counter%2);

	if (vtx_ptr == vtx_font26x16){
		gSPDisplayList(gdl++,kawano_dtl_k_afont_v26[num]);
	}
	else{
		if (vtx_ptr == vtx_font16x16){
			gSPDisplayList(gdl++,kawano_dtl_k_afont_v16[num]);
		}
		else{
			if (vtx_ptr == vtx_font30x32)
				gSPDisplayList(gdl++,kawano_dtl_k_afont_v30[num]);
		}
	}

#if 0
    gSPVertex(gdl++,vtx_ptr, 2, 0);
	if (afont_color < 4){
		gSPVertex(gdl++,vtx_ptr+2*(afont_color+1), 2, 2);
	}
	else{
		gSPVertex(gdl++,
				  vtx_ptr+(10+(afont_color-4)*4+(frame_counter%2)*2), 2, 2);
	}
    gSPDisplayList(gdl++,kwsetTile);
	//gSP1Triangle(gdl++,0, 2, 1, 0);
    //gSP1Triangle(gdl++,0, 3, 2, 0);
#endif
	return(gdl);
}



/*----------------------------------------------------------*/
/*		scale trans Program 								*/
/*----------------------------------------------------------*/

typedef struct {
	short integer[4][4];
	short small[4][4];
} SPKpack;
typedef union {
	SPKpack pack;
	long 	all[16];
} SPK;
typedef union {
	long	word;
	short	half[2];
	char	byte[4];	
} SPackData;

static void setmtx_scaletrans(SPK *spk,float x,float y, float zoomx,float zoomy )
{
	SPackData zx,zy;	/* Zoom 	*/
	SPackData px,py;	/* Position */
	int	i;

	for(i=0;i<16;i++) spk->all[i] = 0;

	zx.word	= (long)(zoomx * 65536.0f);
	zy.word	= (long)(zoomy * 65536.0f);
	px.word = (long)(x     * 65536.0f);
	py.word = (long)(y     * 65536.0f);


	spk->pack.integer[0][0] = zx.half[0];
	spk->pack.integer[1][1] = zy.half[0];
	spk->pack.integer[2][2] = 1;
	spk->pack.integer[3][0] = px.half[0];
	spk->pack.integer[3][1] = py.half[0];
	spk->pack.integer[3][3] = 1;

	spk->pack.small[0][0] = zx.half[1]; 
	spk->pack.small[1][1] = zy.half[1];
	spk->pack.small[3][0] = px.half[1];
	spk->pack.small[3][1] = py.half[1];

}


//---------------------------------------------
//
// １色(rgba)の色で四角を描く(ポリゴン)
//
//---------------------------------------------

Gfx *Set_IAFont(Gfx *gdl,unsigned short *texp,
				float x,float y,
				unsigned int w,unsigned int h,
				float zoom_x,float zoom_y)
{
	Vtx *vtx_ptr;
	Mtx *m_ptr;

	if (effectcount < 760-1){
		m_ptr = &dynamicp->effectmodeling[effectcount];
		if (effectcount < 0)
			PRINTF("effectcount < 0 !!!!!!(kawano)\n");
	}
	else{
		PRINTF("MAX effectcount(760) over!!!!(kawano)\n");
		return(gdl);
	}


	//	guScale(m_ptr,
	//			zoom_x, zoom_y, 1.0);
	//	guTranslate(m_ptr+1,x,y,0);
	//	guMtxCatL(m_ptr,m_ptr+1,m_ptr);
	
	setmtx_scaletrans((SPK *)m_ptr,x,y,zoom_x,zoom_y);

	gSPMatrix (gdl++,
			   K0_TO_PHYS((u32) &(dynamicp->effectmodeling[effectcount++])),
			   G_MTX_MODELVIEW|G_MTX_LOAD|G_MTX_NOPUSH);
    gDPLoadTextureTile_4b(gdl++,texp,
					   G_IM_FMT_I,
					   w, h,
					   0, 0, w, h,
					   0,G_TX_WRAP,G_TX_WRAP,
					   0, 0, G_TX_NOLOD, G_TX_NOLOD);
	switch(w){
	case 16:
		vtx_ptr = vtx_font16x16;
		break;
	case 26:
		vtx_ptr = vtx_font26x16;
		break;
	case 30:
		vtx_ptr = vtx_font30x32;
		break;
	default:
#if ROM==0
		PRINTF("font_size error???????(kawano)\n");
#endif
		vtx_ptr = vtx_font16x16;
		break;
	}

	gdl = SetAfontVertex(gdl++,vtx_ptr);

	return(gdl);
}




//------------------------------------------------------
//
// テクスチャデータを適当な大きさに切って貼り付ける
//	画面外に描こうとした時に自動的にクリッピング
//
//-------------------------------------------------------
Gfx *AutoTextureRect(Gfx *gdl,char flg_ia,
					 int dsdx,int dtdy,
					 int t_ulx,int t_uly,
					 int t_drx,int t_dry,
					 int disp_x,int disp_y,
					 unsigned short *texp,
					 unsigned int tex_size_x,unsigned int tex_size_y)
{
    unsigned int x=t_ulx,y=t_uly;
	int disp_x_init;
	unsigned int rect_w,rect_h;
	int tile_w = 1,tile_h;
	int mask_s=0,mask_t=0;
	int a;

	/*最適と思われるタイルのサイズを選択*/
	while(tile_w < tex_size_x)
		tile_w *= 2;
	tile_h = 1024/tile_w;
	while(tile_h/2 > tex_size_y)
		tile_h /= 2;

	/* tile_h,tile_w にあわせて,mask_s,mask_tを設定*/
	a = tile_w;//ワークとして a を使用
	while(a > 1){
		a /= 2;
		mask_s++;
	}
	a = tile_h;
	while(a > 1){
		a /= 2;
		mask_t++;
	}

	/*画面外は最初から描かない*/
	if (disp_x<0){
		t_ulx -= disp_x;
		disp_x = 0;
	}
	else
		if (disp_x+(t_drx-t_ulx) > SCREEN_WD)
			t_drx = SCREEN_WD + t_ulx - disp_x;
	if (disp_y<0){
		t_uly -= disp_y;
		disp_y = 0;
	}
	else
		if (disp_y+(t_dry-t_uly) > SCREEN_HT)
			t_dry = SCREEN_HT + t_uly - disp_y;
	if (t_ulx > t_drx)
		return(gdl);
	if (t_uly > t_dry)
		return(gdl);
	   
	disp_x_init = disp_x;
    for (y = t_uly;y < t_dry;y += tile_h){
		if (y+tile_h > t_dry){
			rect_h = t_dry - y;
			if (!rect_h)
				break;
		}
		else{
			rect_h = tile_h;
		}
		for (x = t_ulx;x < t_drx;x += tile_w){
			if (x+tile_w > t_drx){
				rect_w = t_drx - x;
				if (!rect_w)
					break;
			}
			else
				rect_w = tile_w;
			
			gDPLoadTextureTile(gdl++,texp,
							   flg_ia, G_IM_SIZ_16b,
							   tex_size_x, tex_size_y,
							   x, y, x+rect_w, y+rect_h,
							   0,G_TX_WRAP,G_TX_WRAP,
							   mask_s, mask_t, G_TX_NOLOD, G_TX_NOLOD);
			gSPTextureRectangle(gdl++,disp_x<<2, disp_y<<2,
								(disp_x+rect_w)<<2,
								(disp_y+rect_h)<<2,
								G_TX_RENDERTILE,
								(int)(x*32) & 0xffff,
								(int)(y*32) & 0xffff,
								dsdx, dtdy);
			disp_x += tile_w;
		}
		disp_x = disp_x_init;
		disp_y += tile_h;
	}

    return(gdl);
}

//------------------------------------------------------
//
// テクスチャデータを適当な大きさに切って貼り付ける
//	画面外に描こうとした時に自動的にクリッピング
//
//-------------------------------------------------------
Gfx *AutoTextureRect_zoom(Gfx *gdl,char flg_ia,
						  int dsdx,int dtdy,float zoom_x,float zoom_y,
						  int t_ulx,int t_uly,
						  int t_drx,int t_dry,
						  int disp_x,int disp_y,
						  unsigned short *texp,
						  unsigned int tex_size_x,unsigned int tex_size_y)
{
    unsigned int x=t_ulx,y=t_uly;
	int disp_x_init;
	unsigned int rect_w,rect_h;
	unsigned int disp_size_x,disp_size_y;
	int tile_w = 1,tile_h;
	int mask_s=0,mask_t=0;
	int a;

	/*最適と思われるタイルのサイズを選択*/
	while(tile_w < tex_size_x)
		tile_w *= 2;
	tile_h = 1024/tile_w;
	while(tile_h/2 > tex_size_y)
		tile_h /= 2;

	/* tile_h,tile_w にあわせて,mask_s,mask_tを設定*/
	a = tile_w;//ワークとして a を使用
	while(a > 1){
		a /= 2;
		mask_s++;
	}
	a = tile_h;
	while(a > 1){
		a /= 2;
		mask_t++;
	}

	/*画面外は最初から描かない*/
	if (disp_x<0){
		t_ulx -= disp_x;
		disp_x = 0;
	}
	else{
		if (disp_x+(t_drx-t_ulx)*zoom_x > SCREEN_WD){
			//t_drx = SCREEN_WD + t_ulx - disp_x;
			t_drx = t_drx - (disp_x + (t_drx - t_ulx)*zoom_x - SCREEN_WD);
		}
	}
	if (disp_y<0){
		t_uly -= disp_y;
		disp_y = 0;
	}
	else{
		if (disp_y+(t_dry-t_uly)*zoom_y > SCREEN_HT){
			///t_dry = SCREEN_HT + t_uly - disp_y;
			t_dry = t_dry - (disp_y + (t_dry - t_uly)*zoom_y - SCREEN_HT);
		}
	}
	if (t_ulx > t_drx)
		return(gdl);
	if (t_uly > t_dry)
		return(gdl);

	dsdx = (int)(dsdx/zoom_x);
	dtdy = (int)(dtdy/zoom_y);

	disp_x_init = disp_x;
    for (y = t_uly;y < t_dry;y += tile_h){
		if (y+tile_h > t_dry){
			rect_h = t_dry - y;
			if (!rect_h)
				break;
		}
		else{
			rect_h = tile_h;
		}
		disp_size_y = (unsigned int)(rect_h*zoom_y);
		for (x = t_ulx;x < t_drx;x += tile_w){
			if (x+tile_w > t_drx){
				rect_w = t_drx - x;
				if (!rect_w)
					break;
			}
			else
				rect_w = tile_w;
			disp_size_x = (unsigned int)(rect_w*zoom_x);
			
			gDPLoadTextureTile(gdl++,texp,
							   flg_ia, G_IM_SIZ_16b,
							   tex_size_x, tex_size_y,
							   x, y, x+rect_w, y+rect_h,
							   0,G_TX_WRAP,G_TX_WRAP,
							   mask_s, mask_t, G_TX_NOLOD, G_TX_NOLOD);
			gSPTextureRectangle(gdl++,disp_x<<2, disp_y<<2,
								(disp_x+disp_size_x)<<2,
								(disp_y+disp_size_y)<<2,
								G_TX_RENDERTILE,
								(int)(x*32) & 0xffff,
								(int)(y*32) & 0xffff,
								dsdx, dtdy);
			disp_x += tile_w*zoom_x;
		}
		disp_x = disp_x_init;
		disp_y += tile_h*zoom_y;
	}

    return(gdl);
}

//------------------------------------------------------
//
// テクスチャデータを適当な大きさに切って貼り付ける
//	画面外に描こうとした時に自動的にクリッピング
//
//-------------------------------------------------------
#define MY_MORPH2 TEXEL0,0,PRIMITIVE_ALPHA,0,TEXEL0,0,PRIMITIVE,0
Gfx *AutoTextureRect_noise(Gfx *gdl,
						   int disp_x,int disp_y,
						   unsigned int size_x,unsigned int size_y)
{
    unsigned int x,y;
	int disp_x_init;
	unsigned int rect_w,rect_h;
	int tile_w = 1,tile_h;
	int mask_s=0,mask_t=0;
	int a;

	/*最適と思われるタイルのサイズを選択*/
	while(tile_w < size_x)
		tile_w *= 2;
	tile_h = 1024/tile_w;
	while(tile_h/2 > size_y)
		tile_h /= 2;

	/* tile_h,tile_w にあわせて,mask_s,mask_tを設定*/
	a = tile_w;//ワークとして a を使用
	while(a > 1){
		a /= 2;
		mask_s++;
	}
	a = tile_h;
	while(a > 1){
		a /= 2;
		mask_t++;
	}

	/*画面外は最初から描かない*/
	if (disp_x<0){
		size_x -= disp_x;
		disp_x = 0;
	}
	else
		if (disp_x+size_x > SCREEN_WD)
			size_x = SCREEN_WD - disp_x;
	if (disp_y<0){
		size_y -= disp_y;
		disp_y = 0;
	}
	else
		if (disp_y+size_y > SCREEN_HT)
			size_y = SCREEN_HT - disp_y;
	if (size_x <= 0)
		return(gdl);
	if (size_y <= 0)
		return(gdl);
	   
	a = make_random_limmit(100);
	//a = frame_counter%150;
	gdl = FillRect1Color_f(gdl,disp_x,disp_y,
							  disp_x + size_x,disp_y + size_y,
							0,0,0,a);
	gDPPipeSync(gdl++);
	a += 150;
	gDPSetRenderMode(gdl++,G_RM_XLU_SURF, G_RM_XLU_SURF2);
	gDPSetPrimColor(gdl++,0,0,a,a,a,a);
	//gDPSetCombineMode(gdl++,G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM);
	//gDPSetCombineMode(gdl++,G_CC_MODULATERGB_PRIM, G_CC_MODULATERGB_PRIM);
	gDPSetCombineMode(gdl++,G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
    for (y = disp_y;y < disp_y + size_y;y += tile_h){
		if (y+tile_h > disp_y + size_y){
			rect_h = disp_y + size_y - y;
			if (!rect_h)
				break;
		}
		else{
			rect_h = tile_h;
		}
		for (x = disp_x;x < disp_x + size_x;x += tile_w){
			if (x+tile_w > disp_x + size_x){
				rect_w = disp_x + size_x - x;
				if (!rect_w)
					break;
			}
			else
				rect_w = tile_w;
			
			gDPLoadTextureTile(gdl++,(unsigned short *)(msel_KT2_S
								+make_random_limmit(128)*2),
							   G_IM_FMT_IA, G_IM_SIZ_16b,
							   size_x, size_y,
							   x, y, x + rect_w, y + rect_h,
							   0,G_TX_WRAP,G_TX_WRAP,
							   mask_s, mask_t, G_TX_NOLOD, G_TX_NOLOD);
			gSPTextureRectangle(gdl++,x<<2, y<<2,
								(x+rect_w)<<2,(y+rect_h)<<2,
								G_TX_RENDERTILE,
								(int)(x*32) & 0xffff,
								(int)(y*32) & 0xffff,
								1<<10, 1<<10);
		}
	}

    return(gdl);
}

//------------------------------------------------------
//
// テクスチャデータを適当な大きさに切って貼り付ける
//	画面外に描こうとした時に自動的にクリッピング(2cycleで実験)
//
//-------------------------------------------------------
#define MY_MORPH TEXEL1,TEXEL0,PRIMITIVE_ALPHA,TEXEL0,TEXEL1,TEXEL0,PRIMITIVE,TEXEL0
Gfx *AutoTextureRect_2cyc(Gfx *gdl,char flg_ia,
						  int dsdx,int dtdy,
						  int t_ulx,int t_uly,
						  int t_drx,int t_dry,
						  int disp_x,int disp_y,
						  unsigned short *texp,
						  unsigned int tex_size_x,unsigned int tex_size_y,
						  int param)
{
    unsigned int x=t_ulx,y=t_uly;
	int disp_x_init;
	unsigned int rect_w,rect_h;
	int tile_w = 1,tile_h;
	int mask_s=0,mask_t=0;
	int a;

	gDPPipeSync(gdl++);
	gDPSetCycleType(gdl++,G_CYC_2CYCLE);
	gDPSetTextureLOD(gdl++,G_TL_TILE);
	//gDPSetPrimColor(gdl++,0,0,0,0,0,make_random_limmit(100));
	gDPSetPrimColor(gdl++,0,0,0,0,0,frame_counter%256);
	gDPSetCombineMode(gdl++,MY_MORPH,G_CC_PASS2);
	
	/*最適と思われるタイルのサイズを選択*/
	while(tile_w < tex_size_x)
		tile_w *= 2;
	tile_h = 1024/tile_w;
	while(tile_h/2 > tex_size_y)
		tile_h /= 2;

	/* tile_h,tile_w にあわせて,mask_s,mask_tを設定*/
	a = tile_w;//ワークとして a を使用
	while(a > 1){
		a /= 2;
		mask_s++;
	}
	a = tile_h;
	while(a > 1){
		a /= 2;
		mask_t++;
	}

	/*画面外は最初から描かない*/
	if (disp_x<0){
		t_ulx -= disp_x;
		disp_x = 0;
	}
	else
		if (disp_x+(t_drx-t_ulx) > SCREEN_WD)
			t_drx = SCREEN_WD + t_ulx - disp_x;
	if (disp_y<0){
		t_uly -= disp_y;
		disp_y = 0;
	}
	else
		if (disp_y+(t_dry-t_uly) > SCREEN_HT)
			t_dry = SCREEN_HT + t_uly - disp_y;
	if (t_ulx > t_drx)
		return(gdl);
	if (t_uly > t_dry)
		return(gdl);
	   
	disp_x_init = disp_x;
    for (y = t_uly;y < t_dry;y += tile_h){
		if (y+tile_h > t_dry){
			rect_h = t_dry - y;
			if (!rect_h)
				break;
		}
		else{
			rect_h = tile_h;
		}
		for (x = t_ulx;x < t_drx;x += tile_w){
			if (x+tile_w > t_drx){
				rect_w = t_drx - x;
				if (!rect_w)
					break;
			}
			else
				rect_w = tile_w;
			
			gDPLoadMultiTile(gdl++,texp,0,G_TX_RENDERTILE,
							 flg_ia, G_IM_SIZ_16b,
							 tex_size_x, tex_size_y,
							 x, y, x+rect_w, y+rect_h,
							 0,G_TX_WRAP,G_TX_WRAP,
							 mask_s, mask_t, G_TX_NOLOD, G_TX_NOLOD);
			gDPLoadMultiTile(gdl++,(unsigned short *)(msel_KT2_S
							+make_random_limmit(128)*2),
							 256,G_TX_RENDERTILE+1,
							 flg_ia, G_IM_SIZ_16b,
							 tex_size_x, tex_size_y,
							 x, y, x+rect_w, y+rect_h,
							 0,G_TX_WRAP,G_TX_WRAP,
							 mask_s, mask_t, G_TX_NOLOD, G_TX_NOLOD);
			gSPTextureRectangle(gdl++,disp_x<<2, disp_y<<2,
								(disp_x+rect_w)<<2,
								(disp_y+rect_h)<<2,
								G_TX_RENDERTILE,
								(int)(x*32) & 0xffff,
								(int)(y*32) & 0xffff,
								dsdx, dtdy);
			disp_x += tile_w;
		}
		disp_x = disp_x_init;
		disp_y += tile_h;
	}

	gDPPipeSync(gdl++);
	gDPSetCycleType(gdl++,G_CYC_1CYCLE);
    return(gdl);
}

//------------------------------------------------------
//
// テクスチャデータを適当な大きさに切って貼り付ける
//	画面外に描こうとした時に自動的にクリッピング
//   (copy mode を使用しているのでBGぐらいにしか使えない？)
//
//-------------------------------------------------------
Gfx *AutoTextureRect_c(Gfx *gdl,char flg_ia,
		     unsigned int t_ulx,unsigned int t_uly,
		     unsigned int t_drx,unsigned int t_dry,
		     int disp_x,int disp_y,
		     unsigned short *texp,
		     unsigned int tex_size_x,unsigned int tex_size_y)
{
    unsigned int x=t_ulx,y=t_uly;
	int disp_x_init;
	unsigned int rect_w,rect_h;
	int tile_w = 1,tile_h;
	int mask_s=0,mask_t=0;
	int a;

	/*cycle type の変更*/
	gDPPipeSync(gdl++);
	gDPSetCycleType(gdl++,G_CYC_COPY);

	gdl = AutoTextureRect(gdl,flg_ia,4<<10,1<<10,
						  t_ulx,t_uly,t_drx,t_dry,
						  disp_x,disp_y,texp,
						  tex_size_x,tex_size_y);	

	/*cycle type の変更*/
	gDPPipeSync(gdl++);
	gDPSetCycleType(gdl++,G_CYC_1CYCLE);
    return(gdl);
}

//------------------------------------------------------
//
// テクスチャデータを一気にロードして32x32の四角を貼る
//    64x64専用 横伸縮可能
//
//-------------------------------------------------------
Gfx *AutoTextureRect64(Gfx *gdl,char flg_ia,
		     int disp_x,int disp_y,
		     unsigned short *texp,int width)
{
    unsigned int x,y;
	int disp_x_init,mul;

	/* 32以上の時は画面表示しない*/
	if (width >= 32)
		return(gdl);
	disp_x_init = disp_x;
    for (y = 0;y < 64;y += 32){
		x = 0;
		mul = (32<<10)/(32-width);
		gDPLoadTextureTile(gdl++,texp,
						   flg_ia, G_IM_SIZ_16b,
						   64, 64,x, y, x+32, y+32,
						   0,G_TX_WRAP,G_TX_WRAP,
						   5, 5, G_TX_NOLOD, G_TX_NOLOD);
		gSPTextureRectangle(gdl++,disp_x+width<<2, disp_y<<2,
							(disp_x+32)<<2,(disp_y+32)<<2,
							G_TX_RENDERTILE,
							(int)(0<<5) & 0xffff,
							(int)(0<<5) & 0xffff,
							mul, 1 << 10);
		disp_x += 32;
		gDPLoadTextureTile(gdl++,texp,
						   flg_ia, G_IM_SIZ_16b,
						   64, 64,x+32, y, x+64, y+32,
						   0,G_TX_WRAP,G_TX_WRAP,
						   5, 5, G_TX_NOLOD, G_TX_NOLOD);
		gSPTextureRectangle(gdl++,disp_x<<2, disp_y<<2,
							(disp_x+32-width)<<2,(disp_y+32)<<2,
							G_TX_RENDERTILE,
							(int)(0<<5) & 0xffff,
							(int)(0<<5) & 0xffff,
							mul, 1 << 10);
		disp_x = disp_x_init;
		disp_y += 32;
	}

    return(gdl);
}

//------------------------------------------------------
//
// テクスチャデータをロードして32x32の四角を貼る
//    64xN専用 横伸縮可能
//
//-------------------------------------------------------
Gfx *AutoTextureRect_w(Gfx *gdl,char flg_ia,
						unsigned int t_ulx,unsigned int t_uly,
						unsigned int t_drx,unsigned int t_dry,
						int disp_x,int disp_y,
						unsigned short *texp,
						unsigned int tex_size_x,unsigned int tex_size_y,
						int width)
{
    unsigned int x,y;
	int disp_x_init,mul;
	int rect_h;
	int w_left,w_right;//"w_left = w_right" or "w_left+1 = w_right"
	int tile_h = 32;

	if (width >= 32)
		return(gdl);
	disp_x_init = disp_x;
	w_left = tex_size_x/2;
	w_right = tex_size_x - w_left;
    for (y = t_uly;y < t_dry;y += 32){
		x = 0;
		if (y+tile_h > t_dry){
			rect_h = t_dry - y;
			if (!rect_h)
				break;
		}
		else{
			rect_h = tile_h;
		}

		//mul = (w_left<<10)/(w_left*(32-width)/32);
		mul = ((w_left*32)<<10)/(w_left*(32-width));
		gDPLoadTextureTile(gdl++,texp,
						   flg_ia, G_IM_SIZ_16b,
						   tex_size_x, tex_size_y,
						   x, y, x+w_left, y+rect_h,
						   0,G_TX_WRAP,G_TX_WRAP,
						   5, 5, G_TX_NOLOD, G_TX_NOLOD);
		gSPTextureRectangle(gdl++,(disp_x+w_left*width/32)<<2, disp_y<<2,
							(disp_x+w_left)<<2,(disp_y+rect_h)<<2,
							G_TX_RENDERTILE,
							(int)(0<<5) & 0xffff,
							(int)(y<<5) & 0xffff,
							mul, 1 << 10);
		disp_x += w_left;
		//mul = (w_right<<10)/(w_right*(32-width)/32);
		mul = ((w_right*32)<<10)/(w_right*(32-width));
		gDPLoadTextureTile(gdl++,texp,
						   flg_ia, G_IM_SIZ_16b,
						   tex_size_x,tex_size_y,
						   x+w_left, y, x+tex_size_x, y+rect_h,
						   0,G_TX_WRAP,G_TX_WRAP,
						   5, 5, G_TX_NOLOD, G_TX_NOLOD);
		gSPTextureRectangle(gdl++,disp_x<<2, disp_y<<2,
							(disp_x+w_right*(32-width)/32)<<2,
							(disp_y+rect_h)<<2,
							G_TX_RENDERTILE,
							(int)(w_left<<5) & 0xffff,
							(int)(y<<5) & 0xffff,
							mul, 1 << 10);
		disp_x = disp_x_init;
		disp_y += tile_h;
	}

    return(gdl);
}

//---------------------------------------------------
//
// テクスチャデータを一気にロードして32x32の四角を貼る
//                                (Simple Version.)
//
//---------------------------------------------------
Gfx *AutoTextureRectSimple(Gfx *gdl,
		     unsigned int t_ulx,unsigned int t_uly,
		     unsigned int t_drx,unsigned int t_dry,
		     unsigned int disp_x,int disp_y,
		     unsigned short *texp,
		     unsigned int tex_size_x,unsigned int tex_size_y)
{
    unsigned int x=0,y=0;
	int d_x_init;

	d_x_init = disp_x;
    for (y = t_uly;y < t_dry;y += 32){
		for (x = t_ulx;x < t_drx;x += 32){
			gDPLoadTextureTile(gdl++,tex_buff, G_IM_FMT_RGBA, G_IM_SIZ_16b,
							   tex_size_x, tex_size_y, x, y, x+32, y+32, 0,
							   G_TX_WRAP , G_TX_WRAP ,
							   5, 5, G_TX_NOLOD, G_TX_NOLOD);
			gSPTextureRectangle(gdl++,disp_x<<2, disp_y<<2,
								(disp_x+32)<<2,(disp_y+32)<<2,
								G_TX_RENDERTILE,
								(int)(0*32) & 0xffff, (int)(0*32) & 0xffff,
								1 << 10, 1 << 10);
			disp_x += 32;
		}
		disp_x = d_x_init;
	    disp_y += 32;
	}

    return(gdl);
}

//---------------------------------------------------
//
// テクスチャデータを一気にロードして8x8の四角をxxx貼る
//                                (Simple Version.)
//
//---------------------------------------------------

#define ATRR_SIZE 32
#define K_RAD 20000
Gfx *AutoTextureRectR(Gfx *gdl,
		     unsigned int t_ulx,unsigned int t_uly,
		     unsigned int t_drx,unsigned int t_dry,
		     int disp_x,int disp_y,
		     unsigned short *texp,
		     unsigned int tex_size_x,unsigned int tex_size_y)
{
    int x,y;
	int d_x_init;
	int disp_x2,disp_y2;
	float sin,cos,k;

	if (!fade_counter[0])
		fade_counter[0] = 1;
	sin = sint((K_RAD*fade_counter2[0]/fade_counter[0])%K_RAD);
	cos = cost((K_RAD*fade_counter2[0]/fade_counter[0])%K_RAD);
	k = 1.0+(float)fade_counter2[0]*.5/fade_counter[0];
	//PRINTF("sin=%f %u/4096\n"
	//		 ,sin,(4096*fade_counter2[0]/fade_counter[0])%4096);
	d_x_init = disp_x;
    for (y = t_uly;y < t_dry;y += ATRR_SIZE){
		for (x = t_ulx;x < t_drx;x += ATRR_SIZE){
			gDPLoadTextureTile(gdl++,tex_buff, G_IM_FMT_RGBA, G_IM_SIZ_16b,
							   tex_size_x, tex_size_y, x, y,
							   x+ATRR_SIZE, y+ATRR_SIZE, 0,
							   G_TX_WRAP , G_TX_WRAP ,
							   5, 5, G_TX_NOLOD, G_TX_NOLOD);
			disp_x2 = (cos*(disp_x-160) + sin*(disp_y-120))*k + 160;
			disp_y2 = (-sin*(disp_x-160) + cos*(disp_y-120))*k + 120;
			gSPTextureRectangle(gdl++,disp_x2<<2, disp_y2<<2,
								(disp_x2+ATRR_SIZE)<<2,(disp_y2+ATRR_SIZE)<<2,
								G_TX_RENDERTILE,
								(int)(0*32) & 0xffff, (int)(0*32) & 0xffff,
								1 << 10, 1 << 10);
			disp_x += ATRR_SIZE;
		}
		disp_x = d_x_init;
	    disp_y += ATRR_SIZE;
	}

    return(gdl);
}

//---------------------------------------------------
//
// フレームバッファに直接 指定色を書き込む
//
//---------------------------------------------------
Gfx *FillRect1Color(Gfx *gdl,
					//unsigned int ulx,unsigned int uly,
					//unsigned int drx,unsigned int dry,
					int ulx,int uly,int drx,int dry,
					unsigned int red,unsigned int green,
					unsigned int blue,unsigned int alpha)
{
	unsigned int swap_buf;

	red = (red & 0x00ff);
	green = (green & 0x00ff);
	blue = (blue & 0x00ff);
	alpha = (alpha & 0x00ff);
	if (ulx > drx)
		swapping_uint((uint *)&ulx,(uint *)&drx);
	if (uly > dry)
		swapping_uint((uint *)&uly,(uint *)&dry);
	if ((ulx > SCREEN_WD-1)||(uly > SCREEN_HT-1))
		return(gdl);
	if (ulx < 0)
		ulx = 0;
	if (uly < 0)
		uly = 0;
	if ((drx < 0)||(dry < 0))
		return(gdl);
	if (drx > SCREEN_WD-1)
		drx = SCREEN_WD-1;
	if (dry > SCREEN_HT-1)
		dry = SCREEN_HT-1;
    gSPDisplayList(gdl++,kawano_fillrect1c_start);

	gDPSetFillColor(gdl++, (GPACK_RGBA5551(red, green, blue, alpha) << 16 | 
							   GPACK_RGBA5551(red, green, blue, alpha)));
	gDPFillRectangle(gdl++, ulx, uly, drx, dry);

    gSPDisplayList(gdl++,kawano_fillrect1c_end);

    return(gdl);
}

//---------------------------------------------------
//
// フレームバッファに直接 指定色を書き込む(for Fade)
//
//---------------------------------------------------
Gfx *FillRect1Color_f(Gfx *gdl,
					//unsigned int ulx,unsigned int uly,
					//unsigned int drx,unsigned int dry,
					int ulx,int uly,
					int drx,int dry,
					unsigned int red,unsigned int green,
					unsigned int blue,unsigned int alpha)
{
	red = (red & 0x00ff);
	green = (green & 0x00ff);
	blue = (blue & 0x00ff);
	alpha = (alpha & 0x00ff);
	if (ulx > drx)
		swapping_uint((uint *)&ulx,(uint *)&drx);
	if (uly > dry)
		swapping_uint((uint *)&uly,(uint *)&dry);
	if ((ulx > SCREEN_WD-1)||(uly > SCREEN_HT-1))
		return(gdl);
	if (ulx < 0)
		ulx = 0;
	if (uly < 0)
		uly = 0;
	if ((drx < 0)||(dry < 0))
		return(gdl);
	//if (drx > SCREEN_WD-1)
	//	drx = SCREEN_WD-1;
	//if (dry > SCREEN_HT-1)
	//	dry = SCREEN_HT-1;
	if (drx > SCREEN_WD)
		drx = SCREEN_WD;
	if (dry > SCREEN_HT)
		dry = SCREEN_HT;

	gSPDisplayList(gdl++,kawano_fillrect1cf);
	gDPSetPrimColor(gdl++,0,0,red,green,blue,alpha);
	gDPFillRectangle(gdl++, ulx, uly, drx, dry);
    
    gDPPipeSync(gdl++);
    return(gdl);
}

//---------------------------------------------------
//
// フレームバッファに直接 黒(0,0,0,255)を書き込む
//
//---------------------------------------------------
Gfx *FillRectBlack(Gfx *gdl,
				   unsigned int ulx,unsigned int uly,
				   unsigned int drx,unsigned int dry)
{
	gdl = FillRect1Color(gdl,ulx,uly,drx,dry,0,0,0,255);
    return(gdl);
}

//-----------------------------------------
//
// CソースのデータのDMA転送
//                (tex_dataSegment)
//-----------------------------------------
void tex_data_Dma(unsigned short *tex_ptr,unsigned int number,
				  unsigned short *tex_buff_ptr)
{
    OSIoMesg dmaIoMesgBuf;
    OSMesg dummyMesg;
	
extern OSMesgQueue      dmaMessageQ;
	
	osInvalDCache(tex_buff_ptr,number);
	osPiStartDma(&dmaIoMesgBuf, OS_MESG_PRI_NORMAL, OS_READ,
		     (u32)_tex_dataSegmentRomStart+SEGMENT_OFFSET(tex_ptr),
		     tex_buff_ptr,	number, &dmaMessageQ);
 	(void)osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);

}

//-----------------------------------------
//
// アセンブラソースのデータのDMA転送
//               (stex_dataSegment)
//-----------------------------------------
void tex_data_Dma_s(unsigned short *tex_ptr,unsigned int number,
				  unsigned short *tex_buff_ptr)
{
    OSIoMesg dmaIoMesgBuf;
    OSMesg dummyMesg;
	
extern OSMesgQueue      dmaMessageQ;
	
	osInvalDCache(tex_buff_ptr,number);
	osPiStartDma(&dmaIoMesgBuf, OS_MESG_PRI_NORMAL, OS_READ,
		     (u32)_stex_dataSegmentRomStart+SEGMENT_OFFSET(tex_ptr),
		     tex_buff_ptr,	number, &dmaMessageQ);
 	(void)osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);
}

//----------------------------------------------
//
// テクスチャデータ管理ルーチンの初期化
//
//----------------------------------------------
void InitTexBuff(void)
{
	tex_buff_num = 0;
	all_tex_block_num = 0;
}

//
//
// 
//
//
TexBlock *GetTBPointer(TexBlock *texlist_ptr)
{
    uint number= SEGMENT_NUMBER(texlist_ptr);
    uint offset= SEGMENT_OFFSET(texlist_ptr);

	//PRINTF("number=%d,offset=%x",number,offset);
	//PRINTF("a=%x,b=%x\n",texlist_ptr,(TexBlock *)OS_PHYSICAL_TO_K0(segmentTable[number]+offset));

    return((TexBlock *)OS_PHYSICAL_TO_K0(segmentTable[number]+offset));
	
}

void *GetVAddress(void *p_ptr)
{
    uint number= SEGMENT_NUMBER(p_ptr);
    uint offset= SEGMENT_OFFSET(p_ptr);

	//PRINTF("number=%d,offset=%x",number,offset);
	//PRINTF("a=%x,b=%x\n",p_ptr,(TexBlock *)OS_PHYSICAL_TO_K0(segmentTable[number]+offset));

    return(OS_PHYSICAL_TO_K0(segmentTable[number]+offset));
	
}

//----------------------------------------
//
// テクスチャデータのロード
//
//----------------------------------------
void TexBuffLoad(TexBlock *texlist_ptr)
{
	int i,check;
	unsigned short size;
	TexBlock *tp;
	TexMap *tmp;

	tp = GetTBPointer(texlist_ptr);
	//tp = texlist_ptr;
	tmp = &tex_block_ptr[0];

	while(tp->tex_data_ptr){
		check = 0;
		for (i = 0;i < all_tex_block_num;i++){
			if (tp->tex_data_ptr == (tmp+i)->tex_data_ptr){
				check++;
				break;
			}
		}
		if (!check){
			switch(tp->mode){
			case K_INTA:
				if (tp->dma_size){
					size = tp->dma_size;
				}
				else{
					size = 0x1000;
				}
				if (size%8)
					size = (size/8 + 1)*8;
#if 0
				PRINTF("dma_size=0x%x \n",size);
#endif
				tex_data_Dma(tp->tex_data_ptr,
							   size,(unsigned short *)melt_buff);
#if 0
				PRINTF("%x %x %x %x \n",melt_buff[0],melt_buff[1],melt_buff[2],melt_buff[3]);
				PRINTF("%x %x\n",&melt_buff,&(tp->tex_data_ptr));
#endif
				slidec1((unsigned char *)melt_buff,
						(unsigned char *)&tex_buff[tex_buff_num]);
				break;
			default:
				tex_data_Dma(tp->tex_data_ptr,
							 tp->h*tp->w*2,&tex_buff[tex_buff_num]);
				break;
			}
			(tmp+all_tex_block_num)->tex_data_ptr = tp->tex_data_ptr;
			(tmp+all_tex_block_num)->number = tex_buff_num;
			tex_buff_num += (tp->h*tp->w);
			tex_buff_num = (tex_buff_num/8+1)*8;
			all_tex_block_num++;
#if ROM==0
			if (all_tex_block_num >= TEX_BLOCK_PTR_MAX){
				PRINTF("tex_block_ptr max is over!!!\n");
				while(1);
			}
#endif
		}
#if DISP_TEX_BUFF_NUM_SWITCH
		PRINTF("ptr = %u\n",tex_buff_num);
#endif
#if ROM==0
		{
			int max_size;

			if (sequence_mode == RACESEQUENCE)
				max_size = MAX_TEX_BUFF_NUM2;
			else
				max_size = MAX_TEX_BUFF_NUM;
			if (tex_buff_num > max_size)
				PRINTF("tex_buff size over!!!(kawano)\n");
		}
#endif
		tp++;
	}
}

//----------------------------------------
//
// テクスチャデータ(alpha4_font)のロード
//
//----------------------------------------
void TexBuffLoad_font(TexBlock *texlist_ptr)
{
	int i,check;
	TexBlock *tp;
	TexMap *tmp;

	tp = GetTBPointer(texlist_ptr);
	tmp = &tex_block_ptr[0];

	while(tp->tex_data_ptr){
		check = 0;
		for (i = 0;i < all_tex_block_num;i++){
			if (tp->tex_data_ptr == (tmp+i)->tex_data_ptr){
				check++;
				break;
			}
		}
		if (!check){
			switch(tp->mode){
			case K_AFONT:
				tex_data_Dma(tp->tex_data_ptr,tp->h*tp->w/2,
							 (unsigned short *)&tex_buff[tex_buff_num]);
				break;
			default:
#if ROM==0
				PRINTF("font_data load_error!!!(kawano)\n");
#endif
				break;
			}
			(tmp+all_tex_block_num)->tex_data_ptr = tp->tex_data_ptr;
			(tmp+all_tex_block_num)->number = tex_buff_num;
			tex_buff_num += (tp->h*tp->w);
			tex_buff_num = (tex_buff_num/8+1)*8;
			all_tex_block_num++;
#if ROM==0
			if (all_tex_block_num >= TEX_BLOCK_PTR_MAX){
				PRINTF("tex_block_ptr max is over!!!\n");
				while(1);
			}
#endif
		}
#if DISP_TEX_BUFF_NUM_SWITCH
		PRINTF("ptr = %u\n",tex_buff_num);
#endif
#if ROM==0
		{
			int max_size;

			if (sequence_mode == RACESEQUENCE)
				max_size = MAX_TEX_BUFF_NUM2;
			else
				max_size = MAX_TEX_BUFF_NUM;
			if (tex_buff_num > max_size)
				PRINTF("tex_buff size over!!!(kawano)\n");
		}
#endif
		tp++;
	}
}

//------------------------------------------
//
// (slidecにて解凍する)テクスチャデータのロード
//
//------------------------------------------
void TexBuffLoad_c(TexBlock *texlist_ptr)
{
	int i,check;
	TexBlock *tp;
	TexMap *tmp;

	tp = GetTBPointer(texlist_ptr);
	//tp = texlist_ptr;
	tmp = &tex_block_ptr[0];

	while(tp->tex_data_ptr){
		check = 0;
		for (i = 0;i < all_tex_block_num;i++){
			if (tp->tex_data_ptr == (tmp+i)->tex_data_ptr){
				check++;
				break;
			}
		}
		if (!check){
			tex_data_Dma(tp->tex_data_ptr,
						 0x8000,(unsigned short *)melt_buff);
#if 0
		//PRINTF("%x %x %x %x \n",melt_buff[4],melt_buff[5],melt_buff[6],melt_buff[7]);
		PRINTF("%x %x\n",&melt_buff,&(tp->tex_data_ptr));
#endif
			slidec1((unsigned char *)melt_buff,
				   (unsigned char *)&tex_buff[tex_buff_num]);
			(tmp+all_tex_block_num)->tex_data_ptr = tp->tex_data_ptr;
			(tmp+all_tex_block_num)->number = tex_buff_num;
			tex_buff_num += (tp->h*tp->w);
			tex_buff_num = (tex_buff_num/8+1)*8;
			all_tex_block_num++;
		}
#if DISP_TEX_BUFF_NUM_SWITCH
		PRINTF("ptr = %u\n",tex_buff_num);
#endif
#if ROM==0
		{
			int max_size;

			if (sequence_mode == RACESEQUENCE)
				max_size = MAX_TEX_BUFF_NUM2;
			else
				max_size = MAX_TEX_BUFF_NUM;
			if (tex_buff_num > max_size)
				PRINTF("tex_buff size over!!!(kawano)\n");
		}
#endif
		tp++;
	}
}

//-------------------------------------------------
//
// (ps4expandにて解凍する)テクスチャデータのロード
//   (ただし、ダブルバッファを使用するため、
//    既ロードチェックを省く)
//
//-------------------------------------------------
void TexBuffLoad_pw(TexBlock *texlist_ptr)
{
	TexBuffLoad_p(texlist_ptr,1);
}

//-------------------------------------------------
//
// (ps4expandにて解凍する)テクスチャデータのロード
//   nocheck_flg 0:既ロードチェックあり(asm source)
//               1:チェックなし(c source)
//               2:チェックなし(asm source)
//              -1:既ロードチェックあり(c source)
//-------------------------------------------------
void TexBuffLoad_p(TexBlock *texlist_ptr,int nocheck_flg)
{
	int i,check;
	TexBlock *tp;
	TexMap *tmp;
	unsigned short *ttr;
	unsigned short size;
	unsigned short clear_color;

	tp = GetTBPointer(texlist_ptr);
	//tp = texlist_ptr;
	tmp = &tex_block_ptr[0];

	while(tp->tex_data_ptr){
		check = 0;
		for (i = 0;i < all_tex_block_num;i++){
			if (tp->tex_data_ptr == (tmp+i)->tex_data_ptr){
				check++;
				break;
			}
		}
		if (!check || (nocheck_flg > 0)){
			if (tp->dma_size){
				size = tp->dma_size;
			}
			else{
				size = 0x1000;
			}
			if (size%8)
				size = (size/8 + 1)*8;
#if 0
			PRINTF("dma_size=0x%x \n",size);
#endif
			switch(nocheck_flg){
			case -1:
			case 1:
				tex_data_Dma(tp->tex_data_ptr,
							   size,(unsigned short *)melt_buff);
				break;
			case 0:
			case 2:
				tex_data_Dma_s(tp->tex_data_ptr,
							   size,(unsigned short *)melt_buff);
				break;
			default:
				break;
			}
#if 0
			PRINTF("%x %x %x %x \n",melt_buff[0],melt_buff[1],melt_buff[2],melt_buff[3]);
			PRINTF("%x %x\n",&melt_buff,&(tp->tex_data_ptr));
#endif
			switch(nocheck_flg){
			case -1:
			case 1:
				slidec1((unsigned char *)melt_buff,
						(unsigned char *)&tex_buff[tex_buff_num]);
				break;
			case 0:
			case 2:
				//ps4expand(melt_buff,k_work,&tex_buff[tex_buff_num]);
				if (tp->mode == K_CLEAR){
					clear_color = 0x00be;
				}
				else{
					clear_color = 1;
				}
				ps4decode(melt_buff,k_work,
						  &tex_buff[tex_buff_num],clear_color);
				break;
			default:
				break;
			}

			(tmp+all_tex_block_num)->tex_data_ptr = tp->tex_data_ptr;
			(tmp+all_tex_block_num)->number = tex_buff_num;
			tex_buff_num += (tp->h*tp->w);
			tex_buff_num = (tex_buff_num/8+1)*8;
			all_tex_block_num++;
		}
#if DISP_TEX_BUFF_NUM_SWITCH
		PRINTF("ptr = %u\n",tex_buff_num);
#endif
#if ROM==0
		{
			int max_size;

			if (sequence_mode == RACESEQUENCE)
				max_size = MAX_TEX_BUFF_NUM2;
			else
				max_size = MAX_TEX_BUFF_NUM;
			if (tex_buff_num > max_size)
				PRINTF("tex_buff size over!!!(kawano)\n");
		}
		//if (tex_buff_num > MAX_TEX_BUFF_NUM)
		//	PRINTF("tex_buff size over!!!(kawano)\n");
#endif
		tp++;
	}
}

//-------------------------------------------------
//
// (vsリザルト画面,GP ENDINGに出てくるアニメ専用の)テクスチャデータのロード
//
//   num   : セレクト画面での順番
//   wb_num: ダブルバッファの表(0)裏(1)
//
//-------------------------------------------------
void TexBuffLoad_vs(TexBlock *texlist_ptr,int num,int wb_num)
{
	TexBlock *tp;
	TexMap *tmp;
	unsigned short size;

	tp = GetTBPointer(texlist_ptr);
	//tp = texlist_ptr;
	tmp = &tex_block_ptr[0];

	while(tp->tex_data_ptr){
		if (tp->dma_size){
			size = tp->dma_size;
		}
		else{/* 0x1400 あればどの顔でも足りる */
			size = 0x1400;
		}
		if (size%8)
			size = (size/8 + 1)*8;
		tex_data_Dma(tp->tex_data_ptr,
					 size,(unsigned short *)melt_buff);
#if 0
		PRINTF("%x %x %x %x \n",melt_buff[0],melt_buff[1],melt_buff[2],melt_buff[3]);
		PRINTF("%x %x\n",&melt_buff,&(tp->tex_data_ptr));
#endif
		slidec1((unsigned char *)melt_buff,
				(unsigned char *)&ken_data[wb_num][num/2][0x4000+0x2000*(num%2)]);

		tp++;
	}
}

//------------------------------------------------
//
// テクスチャデータロード用バッファのクリア
//
//------------------------------------------------
void InitChangeTexData(void)
{
	int i;
	ChangeTexBuff *ctb_ptr;

	ctb_ptr = &change_tex_buff_block[0];
	for (i = 0;i < SEQ_DATA_MAX;i++)
		ctb_ptr->tex_block_ptr = (TexBlock *)0;
}

//-----------------------------------------------------
//
// テクスチャデータロード用バッファにデータセット
//
//-----------------------------------------------------
void SetChangeTexData(TexBlock *tb_ptr,int new_block_num)
{
	ChangeTexBuff *ctb_ptr;

	ctb_ptr = &change_tex_buff_block[0];
	while((unsigned int)ctb_ptr->tex_block_ptr){
		ctb_ptr++;
	}
	ctb_ptr->tex_block_ptr = GetTBPointer(tb_ptr);
	//ctb_ptr->tex_block_ptr = tb_ptr;
	ctb_ptr->block_num = new_block_num;
	
}

//-----------------------------------------------------
//
// テクスチャデータロード用バッファを参照して、
//    テクスチャデータのチェンジ
//
//-----------------------------------------------------
void doChangeTexData(void)
{
	char end_check;
	int new_num;
	ChangeTexBuff *ctb_ptr;
	TexBlock *tb_ptr;
	TexMap *tmp;
    OSIoMesg dmaIoMesgBuf;
    OSMesg dummyMesg;
	int size;
	int w_buff_size;
#if DISP_DMA_MELT_TIME_SWITCH
	int time;
#endif
	
extern OSMesgQueue      dmaMessageQ;

	if (sequence_mode == RACESEQUENCE){
		w_buff_size = 0x1400/4;//キャラアニメ最大容量を参考に決定
	}
	else{
		w_buff_size = 0x4000/4;//マップデータ最大容量を参考に決定
	}
	end_check = 0;
	tmp = &tex_block_ptr[0];
	ctb_ptr = &change_tex_buff_block[0];
	tb_ptr = ctb_ptr->tex_block_ptr;
	if (!tb_ptr)
		return;
#if DISP_DMA_MELT_TIME_SWITCH
	time=osGetTime();
#endif
	if (tb_ptr->dma_size){
		size = tb_ptr->dma_size;
	}
	else{
		size = 0x1400;
	}
	if (size%8)
		size = (size/8 + 1)*8;
	osInvalDCache(melt_buff,size);
	osPiStartDma(&dmaIoMesgBuf, OS_MESG_PRI_NORMAL, OS_READ,
				 (u32)_tex_dataSegmentRomStart+
				 SEGMENT_OFFSET(tb_ptr->tex_data_ptr),
				 (unsigned short *)melt_buff,size,&dmaMessageQ);
 	(void)osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);
#if DISP_DMA_MELT_TIME_SWITCH
	time=osGetTime()-time;
	PRINTF("DMA time=%u ",time);
#endif
	while(1){
		if (!(ctb_ptr+1)->tex_block_ptr){
			end_check++;
		}
		else{
			tb_ptr = (ctb_ptr+1)->tex_block_ptr;
			if (tb_ptr->dma_size){
				size = tb_ptr->dma_size;
			}
			else{
				size = 0x1400;
			}
			if (size%8)
				size = (size/8 + 1)*8;
			osInvalDCache(&melt_buff[w_buff_size],size);
			osPiStartDma(&dmaIoMesgBuf, OS_MESG_PRI_NORMAL, OS_READ,
						 (u32)_tex_dataSegmentRomStart+
						 SEGMENT_OFFSET(tb_ptr->tex_data_ptr),
						 (unsigned short *)(&melt_buff[w_buff_size]),
						 size,&dmaMessageQ);
		}
		new_num = (tmp+ctb_ptr->block_num)->number;
#if DISP_DMA_MELT_TIME_SWITCH
		time=osGetTime();
#endif
		//PRINTF("%x,%x\n",melt_buff,&tex_buff[new_num]);
		slidec1((unsigned char *)melt_buff,
				(unsigned char *)&tex_buff[new_num]);
		//ps4decode(melt_buff,k_work,&tex_buff[new_num],1);
#if DISP_DMA_MELT_TIME_SWITCH
		time=osGetTime()-time;
		PRINTF("melt time=%u \n",time);
#endif
		ctb_ptr->tex_block_ptr = (TexBlock *)0;
		ctb_ptr++;
		if (end_check)
			return;
		(void)osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);

		if (!(ctb_ptr+1)->tex_block_ptr){
			end_check++;
		}
		else{
			tb_ptr = (ctb_ptr+1)->tex_block_ptr;
			if (tb_ptr->dma_size){
				size = tb_ptr->dma_size;
			}
			else{
				size = 0x1400;
			}
			if (size%8)
				size = (size/8 + 1)*8;
			osInvalDCache(melt_buff,size);
			osPiStartDma(&dmaIoMesgBuf, OS_MESG_PRI_NORMAL, OS_READ,
						 (u32)_tex_dataSegmentRomStart+
						 SEGMENT_OFFSET(tb_ptr->tex_data_ptr),
						 (unsigned short *)melt_buff,
						 size,&dmaMessageQ);
		}
		new_num = (tmp+ctb_ptr->block_num)->number;
		slidec1((unsigned char *)&melt_buff[w_buff_size],
				(unsigned char *)&tex_buff[new_num]);
		//ps4decode(&melt_buff[2000],k_work,&tex_buff[new_num],1);
		ctb_ptr->tex_block_ptr = (TexBlock *)0;
		ctb_ptr++;
		if (end_check)
			return;
		(void)osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);
	}
		

#if 0
	// ＤＭＡと解凍を同時にしないヴァージョン
	ctb_ptr = &change_tex_buff_block[0];
	while(ctb_ptr->tex_block_ptr){
		ChangeTexData(ctb_ptr->tex_block_ptr,ctb_ptr->block_num);
		ctb_ptr->tex_block_ptr = (TexBlock *)0;
		ctb_ptr++;
	}
#endif
}

//------------------------------------------------
//
// テクスチャデータロード用バッファのクリア
// (vsリザルト表示用)
//------------------------------------------------
void InitChangeTexData_vs(void)
{
	int i;
	ChangeTexBuff_vs *ctb_ptr;

	ctb_ptr = &change_tex_buff_block_vs[0];
	for (i = 0;i < SEQ_CHANGE_VS_MAX;i++)
		ctb_ptr->tex_block_ptr = (TexBlock *)0;
}

//-----------------------------------------------------
//
// テクスチャデータロード用バッファにデータセット
// (vsリザルト表示用)
//-----------------------------------------------------
void SetChangeTexData_vs(TexBlock *tb_ptr,int num,int buffer_num)
{
	ChangeTexBuff_vs *ctb_ptr;

	ctb_ptr = &change_tex_buff_block_vs[0];
	while((unsigned int)ctb_ptr->tex_block_ptr){
		ctb_ptr++;
	}
	ctb_ptr->tex_block_ptr = GetTBPointer(tb_ptr);
	//ctb_ptr->tex_block_ptr = tb_ptr;
	ctb_ptr->num = num;
	ctb_ptr->wb_num = buffer_num;
	
}

//-----------------------------------------------------
//
// テクスチャデータロード用バッファを参照して、
//    テクスチャデータのチェンジ
// (vsリザルト表示用)
//-----------------------------------------------------
void doChangeTexData_vs(void)
{
	char end_check;
	int new_num;
	ChangeTexBuff_vs *ctb_ptr;
	TexBlock *tb_ptr;
	//TexMap *tmp;
    OSIoMesg dmaIoMesgBuf;
    OSMesg dummyMesg;
	int size;
	int w_buff_size;
#if DISP_DMA_MELT_TIME_SWITCH
	int time;
#endif
	
extern OSMesgQueue      dmaMessageQ;

	//if (sequence_mode == RACESEQUENCE){
		w_buff_size = 0x1400/4;//キャラアニメ最大容量を参考に決定
	//}
	//else{
	//	w_buff_size = 0x4000/4;//マップデータ最大容量を参考に決定
	//}
	end_check = 0;
	//tmp = &tex_block_ptr[0];
	ctb_ptr = &change_tex_buff_block_vs[0];
	tb_ptr = ctb_ptr->tex_block_ptr;
	if (!tb_ptr)
		return;
#if DISP_DMA_MELT_TIME_SWITCH
	time=osGetTime();
#endif
	if (tb_ptr->dma_size){
		size = tb_ptr->dma_size;
	}
	else{
		size = 0x1400;
	}
	if (size%8)
		size = (size/8 + 1)*8;
	osInvalDCache(melt_buff,size);
	osPiStartDma(&dmaIoMesgBuf, OS_MESG_PRI_NORMAL, OS_READ,
				 (u32)_tex_dataSegmentRomStart+
				 SEGMENT_OFFSET(tb_ptr->tex_data_ptr),
				 (unsigned short *)melt_buff,size,&dmaMessageQ);
 	(void)osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);
#if DISP_DMA_MELT_TIME_SWITCH
	time=osGetTime()-time;
	PRINTF("DMA time=%u ",time);
#endif
	while(1){
		if (!(ctb_ptr+1)->tex_block_ptr){
			end_check++;
		}
		else{
			tb_ptr = (ctb_ptr+1)->tex_block_ptr;
			if (tb_ptr->dma_size){
				size = tb_ptr->dma_size;
			}
			else{
				size = 0x1400;
			}
			if (size%8)
				size = (size/8 + 1)*8;
			osInvalDCache(&melt_buff[w_buff_size],size);
			osPiStartDma(&dmaIoMesgBuf, OS_MESG_PRI_NORMAL, OS_READ,
						 (u32)_tex_dataSegmentRomStart+
						 SEGMENT_OFFSET(tb_ptr->tex_data_ptr),
						 (unsigned short *)(&melt_buff[w_buff_size]),
						 size,&dmaMessageQ);
		}
		//new_num = (tmp+ctb_ptr->block_num)->number;
#if DISP_DMA_MELT_TIME_SWITCH
		time=osGetTime();
#endif
		//PRINTF("%x,%x\n",melt_buff,&tex_buff[new_num]);
		slidec1((unsigned char *)melt_buff,
				(unsigned char *)&ken_data[ctb_ptr->wb_num][ctb_ptr->num/2]
				[0x4000 + 0x2000*(ctb_ptr->num%2)]);
		//ps4decode(melt_buff,k_work,&tex_buff[new_num],1);
#if DISP_DMA_MELT_TIME_SWITCH
		time=osGetTime()-time;
		PRINTF("melt time=%u \n",time);
#endif
		ctb_ptr->tex_block_ptr = (TexBlock *)0;
		ctb_ptr++;
		if (end_check)
			return;
		(void)osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);

		if (!(ctb_ptr+1)->tex_block_ptr){
			end_check++;
		}
		else{
			tb_ptr = (ctb_ptr+1)->tex_block_ptr;
			if (tb_ptr->dma_size){
				size = tb_ptr->dma_size;
			}
			else{
				size = 0x1400;
			}
			if (size%8)
				size = (size/8 + 1)*8;
			osInvalDCache(melt_buff,size);
			osPiStartDma(&dmaIoMesgBuf, OS_MESG_PRI_NORMAL, OS_READ,
						 (u32)_tex_dataSegmentRomStart+
						 SEGMENT_OFFSET(tb_ptr->tex_data_ptr),
						 (unsigned short *)melt_buff,
						 size,&dmaMessageQ);
		}
		//new_num = (tmp+ctb_ptr->block_num)->number;
		slidec1((unsigned char *)&melt_buff[w_buff_size],
				//(unsigned char *)&tex_buff[new_num]);
				(unsigned char *)&ken_data[ctb_ptr->wb_num][ctb_ptr->num/2]
				[0x4000 + 0x2000*(ctb_ptr->num%2)]);
		//ps4decode(&melt_buff[2000],k_work,&tex_buff[new_num],1);
		ctb_ptr->tex_block_ptr = (TexBlock *)0;
		ctb_ptr++;
		if (end_check)
			return;
		(void)osRecvMesg(&dmaMessageQ, &dummyMesg, OS_MESG_BLOCK);
	}
		

#if 0
	// ＤＭＡと解凍を同時にしないヴァージョン
	ctb_ptr = &change_tex_buff_block[0];
	while(ctb_ptr->tex_block_ptr){
		ChangeTexData(ctb_ptr->tex_block_ptr,ctb_ptr->block_num);
		ctb_ptr->tex_block_ptr = (TexBlock *)0;
		ctb_ptr++;
	}
#endif
}

//------------------------------------------
//
// ダブルバッファの裏バッファに
// テクスチャデータ(ps4expand圧縮)をロード
//
//------------------------------------------
void ChangeTexData(TexBlock *tb_ptr,int new_block_num)
{
	TexMap *tmp;
	int new_num;
	unsigned short *tex_ptr;
	int size;

	tmp = &tex_block_ptr[0];
	new_num = (tmp+new_block_num)->number;
	tex_ptr = tb_ptr->tex_data_ptr;

	size = tb_ptr->dma_size;
	if (size%8)
		size = (size/8 + 1)*8;
	tex_data_Dma_s(tex_ptr,size,(unsigned short *)melt_buff);
	//ps4expand(melt_buff,k_work,&tex_buff[new_num]);
	ps4decode(melt_buff,k_work,&tex_buff[new_num],1);
	(tmp+new_block_num)->tex_data_ptr = tex_ptr;
	return;
}

//---------------------------------------------------------------
//
// シーケンスデータから全テクスチャデータ(ps4expand圧縮)を展開
// (もったいないので今は使ってないみたい)
//---------------------------------------------------------------
void TexBuffLoad_seq(TexBlockSeq *seq_ptr)
{
	TexBlock *tbp;

	seq_ptr = (TexBlockSeq *)GetVAddress(seq_ptr);
	while(tbp = seq_ptr->tex_block_ptr){
		if (tbp){
			TexBuffLoad_p(tbp,0);
		}
		else{
			return;
		}
		seq_ptr++;
	}
}

//----------------------------------------
//
// シーケンスデータ管理ルーチンの初期化
//
//----------------------------------------
void InitSeqData(void)
{
	int i;

	for (i = 0;i < SEQ_DATA_MAX;i++)
		seq_data_block[i].pri = 0;
}

//----------------------------------------------
//
// シーケンスデータのセット(ダブルバッファ使用)
//
//----------------------------------------------
int SetSeqData(TexBlockSeq *tbs_ptr)
{
	int i;
	SeqData *sd_ptr;

	tbs_ptr = (TexBlockSeq *)GetVAddress(tbs_ptr);
	i = 0;
	while(seq_data_block[i].pri){
		i++;
		if (i >= SEQ_DATA_MAX){
#if ROM==0
			PRINTF("seq_data_buff over_flow!!(kawano)\n");
#endif
			while(1);
			return(-1);
		}
	}
	sd_ptr = &seq_data_block[i];
	sd_ptr->seq_ptr = tbs_ptr;
	sd_ptr->pattern = -1;
	sd_ptr->count = 0;
	sd_ptr->pri = 0x80000000;
	sd_ptr->block_num = all_tex_block_num;
	if (tbs_ptr->tex_block_ptr)
		TexBuffLoad_pw(tbs_ptr->tex_block_ptr);//
	if ((tbs_ptr+1)->tex_block_ptr){
		TexBuffLoad_pw((tbs_ptr+1)->tex_block_ptr);
	}
	else{
		TexBuffLoad_pw(tbs_ptr->tex_block_ptr);
	}
	sd_ptr->buffer = 0;
	return(i);
}

//----------------------------------------------
//
// シーケンスデータのセット(ダブルバッファ使用,vsリザルト画面,GP ENDING専用)
//
//----------------------------------------------
int SetSeqData2(TexBlockSeq *tbs_ptr,int num)
{
	int i;
	SeqData *sd_ptr;

	tbs_ptr = (TexBlockSeq *)GetVAddress(tbs_ptr);
	i = 0;
	while(seq_data_block[i].pri){
		i++;
		if (i >= SEQ_DATA_MAX){
#if ROM==0
			PRINTF("seq_data_buff over_flow!!(kawano)\n");
#endif
			while(1);
			return(-1);
		}
	}
	sd_ptr = &seq_data_block[i];
	sd_ptr->seq_ptr = tbs_ptr;
	sd_ptr->pattern = -1;
	sd_ptr->count = 0;
	sd_ptr->pri = 0x80000000;
	sd_ptr->block_num = all_tex_block_num;
	if (tbs_ptr->tex_block_ptr)
		TexBuffLoad_vs(tbs_ptr->tex_block_ptr,num,0);
		//TexBuffLoad_pw(tbs_ptr->tex_block_ptr);//
	if ((tbs_ptr+1)->tex_block_ptr){
		TexBuffLoad_vs((tbs_ptr+1)->tex_block_ptr,num,1);
		//TexBuffLoad_pw((tbs_ptr+1)->tex_block_ptr);
	}
	else{
		TexBuffLoad_vs(tbs_ptr->tex_block_ptr,num,1);
		//TexBuffLoad_pw(tbs_ptr->tex_block_ptr);
	}
	sd_ptr->buffer = 0;
	return(i);
}

//----------------------------------------------
//
// シーケンスデータの変更(ダブルバッファ使用)
//
//----------------------------------------------
void ChangeSeqData(int i,int pat,TexBlockSeq *tbs_ptr)
{
	SeqData *sd_ptr;
	TexBlock *tb_ptr;

#if ROM==0
		if (i >= SEQ_DATA_MAX){
			PRINTF("seq_data_buff number error!!(kawano)\n");
			while(1);
		}
#endif
	tbs_ptr = (TexBlockSeq *)GetVAddress(tbs_ptr);
	sd_ptr = &seq_data_block[i];
	sd_ptr->seq_ptr = tbs_ptr;
	sd_ptr->pattern = pat;
	sd_ptr->count = (tbs_ptr+pat)->count;
	tb_ptr = GetTBPointer(tbs_ptr[sd_ptr->pattern].tex_block_ptr);
	//sd_ptr->block_num = all_tex_block_num;
	if (sd_ptr->buffer){
		SetChangeTexData(tb_ptr,sd_ptr->block_num);
		sd_ptr->buffer = 0;
	}
	else{
		SetChangeTexData(tb_ptr,sd_ptr->block_num+1);
		sd_ptr->buffer = 1;
	}
	return;
}

//----------------------------------------------
//
// シーケンスデータの変更(ダブルバッファ使用)
//
//----------------------------------------------
void ChangeSeqData_vs(int i,int pat,int num,TexBlockSeq *tbs_ptr)
{
	SeqData *sd_ptr;
	TexBlock *tb_ptr;

#if ROM==0
		if (i >= SEQ_DATA_MAX){
			PRINTF("seq_data_buff number error!!(kawano)\n");
			while(1);
		}
#endif
	tbs_ptr = (TexBlockSeq *)GetVAddress(tbs_ptr);
	sd_ptr = &seq_data_block[i];
	sd_ptr->seq_ptr = tbs_ptr;
	sd_ptr->pattern = pat;
	sd_ptr->count = (tbs_ptr+pat)->count;
	tb_ptr = GetTBPointer(tbs_ptr[sd_ptr->pattern].tex_block_ptr);
	//sd_ptr->block_num = all_tex_block_num;
	sd_ptr->buffer ^= 1;
	SetChangeTexData_vs(tb_ptr,num,sd_ptr->buffer);
	return;
}

//-------------------------------------------------
//
// シーケンスデータの処理(ダブルバッファのみ対応)
//
//-------------------------------------------------
void doSeqData(void)
{
	int i,j,z;
	SeqData *sd_ptr;

	//for (j = 0;j < 16;j++){
		for (i = 0;i < SEQ_DATA_MAX;i++){
			sd_ptr = &seq_data_block[i];
			if (!(sd_ptr->pri & 0x80000000))
				continue;
			//if ((sd_ptr->pri & 0x0000000f) == j){
				SelectTex(sd_ptr);
				graphPtr = doTexList_w(graphPtr,sd_ptr,0,0,0);
			//}
		}
	//}
	doChangeTexData();
}

//-------------------------------------------------
//
// 指定シーケンスデータの処理(ダブルバッファのみ対応)
//
//-------------------------------------------------
void doSeqData2(int i,int x,int y,int param)
{
	SeqData *sd_ptr;

	sd_ptr = &seq_data_block[i];
	if (!(sd_ptr->pri & 0x80000000))
		return;
	SelectTex(sd_ptr);
	graphPtr = doTexList_w(graphPtr,sd_ptr,x,y,param);
}

//-------------------------------------------------
//
// 指定シーケンスデータの処理(ダブルバッファのみ対応)
//     (for:vs result,gp ending)
//-------------------------------------------------
void doSeqData2_vs(int i,int x,int y,int num,int param)
{
	SeqData *sd_ptr;

	sd_ptr = &seq_data_block[i];
	if (!(sd_ptr->pri & 0x80000000))
		return;
	SelectTex_vs(sd_ptr,num);
	graphPtr = doTexList_vs(graphPtr,sd_ptr,x,y,num,param);
}

#if 0
//-------------------------------------------------
//
// 指定シーケンスデータの処理(ダブルバッファのみ対応)
//		ーバッファのスワッピングのみー
// (今はもう使っていません)
//-------------------------------------------------
void doSeqData2a(int i,int x,int y,int param)
{
	SeqData *sd_ptr;

	sd_ptr = &seq_data_block[i];
	if (!(sd_ptr->pri & 0x80000000))
		return;
	if (sd_ptr->buffer)
		sd_ptr->buffer = 0;
	else
		sd_ptr->buffer = 1;
	sd_ptr->pattern = 0;
	graphPtr = doTexList_w(graphPtr,sd_ptr,x,y,param);
}
#endif

//-----------------------------------------------
//
// シーケンスデータの処理(主にダブルバッファ管理部分)
//
//-----------------------------------------------
TexBlock *SelectTex(SeqData *sd_ptr)
{
	TexBlockSeq *tbs_ptr;
	TexBlock *tb_ptr;
	unsigned short *t_ptr;

	tbs_ptr = sd_ptr->seq_ptr;

	if (sd_ptr->pattern < 0){
		sd_ptr->pattern = 0;
		sd_ptr->count = 0;// 厳密にはおかしい！！
	}

	sd_ptr->count--;
	if (sd_ptr->count<=0){
		sd_ptr->pattern++;
		if (!tbs_ptr[sd_ptr->pattern].tex_block_ptr)
			sd_ptr->pattern = 0;
		sd_ptr->count = tbs_ptr[sd_ptr->pattern].count;
		tb_ptr = GetTBPointer(tbs_ptr[sd_ptr->pattern].tex_block_ptr);
		//t_ptr =tb_ptr->tex_data_ptr; 
		if (sd_ptr->buffer){
			SetChangeTexData(tb_ptr,sd_ptr->block_num);
			sd_ptr->buffer = 0;
		}
		else{
			SetChangeTexData(tb_ptr,sd_ptr->block_num+1);
			sd_ptr->buffer = 1;
		}
			
	}
	return(sd_ptr->seq_ptr[sd_ptr->pattern].tex_block_ptr);
}	

//-----------------------------------------------
//
// シーケンスデータの処理(主にダブルバッファ管理部分)
// (vsリザルト表示用)
//-----------------------------------------------
TexBlock *SelectTex_vs(SeqData *sd_ptr,int num)
{
	TexBlockSeq *tbs_ptr;
	TexBlock *tb_ptr;
	unsigned short *t_ptr;

	tbs_ptr = sd_ptr->seq_ptr;

	if (sd_ptr->pattern < 0){
		sd_ptr->pattern = 0;
		sd_ptr->count = 0;// 厳密にはおかしい！！
	}

	sd_ptr->count--;
	if (sd_ptr->count<=0){
		sd_ptr->pattern++;
		if (!tbs_ptr[sd_ptr->pattern].tex_block_ptr)
			sd_ptr->pattern = 0;
		sd_ptr->count = tbs_ptr[sd_ptr->pattern].count;
		tb_ptr = GetTBPointer(tbs_ptr[sd_ptr->pattern].tex_block_ptr);
		//t_ptr =tb_ptr->tex_data_ptr; 
		sd_ptr->buffer ^= 1;
			SetChangeTexData_vs(tb_ptr,num,sd_ptr->buffer);
			
	}
	return(sd_ptr->seq_ptr[sd_ptr->pattern].tex_block_ptr);
}	


//--------------------------------------------------
//
// 元テクスチャデータを徐々にグレイスケールに変換して別のところに転送する
//
//--------------------------------------------------
void GrayScale_tex_buff256(unsigned source_num,unsigned dist_num,
						   unsigned pixel,int step)
{
	unsigned short *buf1_ptr,*buf2_ptr;
	int i,r,g,b,a,gray;
	int r2,g2,b2;

	buf1_ptr = &tex_buff[tex_block_ptr[source_num].number];
	buf2_ptr = &tex_buff[tex_block_ptr[dist_num].number];
	for (i = 0;i < pixel;i++){
		r = ((*buf1_ptr & 0xf800)>>11);
		g = ((*buf1_ptr & 0x07c0)>>6);
		b = ((*buf1_ptr & 0x003e)>>1);
		a = *buf1_ptr & 0x0001;
		gray = (r*77+g*150+b*29)>>8;
		r2 = (((gray - r)*step)>>8)+r;
		g2 = (((gray*7/8 - g)*step)>>8)+g;
		b2 = (((gray*6/8 - b)*step)>>8)+b;
		*buf2_ptr = (b2<<1)+(g2<<6)+(r2<<11)+a;
		*buf1_ptr++;
		*buf2_ptr++;
	}

}

void GrayScale_tex_buff(unsigned num)
{
	unsigned short *buf_ptr;
	unsigned i,r,g,b,a,gray;

	buf_ptr = &tex_buff[tex_block_ptr[num].number];
	for (i = 0;i < 307200;i++){
		r = ((*buf_ptr & 0xf800)>>11)*77;
		g = ((*buf_ptr & 0x07c0)>>6)*150;
		b = ((*buf_ptr & 0x003e)>>1)*29;
		a = *buf_ptr & 0x0001;
		gray = (r+g+b)>>8;
		*buf_ptr++ = (gray<<1)+(gray<<6)+(gray<<11)+a;
	}

}

void GrayScale_tex_buff2(unsigned num,unsigned int step)
{
	unsigned short *buf_ptr;
	unsigned i,r,g,b,a,gray,rest,pixel;

	buf_ptr = &tex_buff[tex_block_ptr[num].number];
	pixel = tex_block_ptr[num+1].number-tex_block_ptr[num].number;
	for (i = 0;i < pixel;i++){
		r = ((*buf_ptr & 0xf800)>>11)*77;
		g = ((*buf_ptr & 0x07c0)>>6)*150;
		b = ((*buf_ptr & 0x003e)>>1)*29;
		a = *buf_ptr & 0x0001;
		gray = (r+g+b)>>8;
		rest = 32 - gray;
		rest = rest*step/256;
		gray += rest;
		*buf_ptr++ = (gray<<1)+(gray<<6)+(gray<<11)+a;
	}

}

void GrayScale_tex_buff3(unsigned num,unsigned int step)
{
	unsigned short *buf_ptr;
	unsigned i,r,g,b,a,gray,pixel;
	float power_chart[32];

	for (i = 0;i < 32;i++)
		power_chart[i] = power(i/32.0,0.25+step*1.5/256.0);

	buf_ptr = &tex_buff[tex_block_ptr[num].number];
	pixel = tex_block_ptr[num+1].number-tex_block_ptr[num].number;
	for (i = 0;i < pixel;i++){
		r = ((*buf_ptr & 0xf800)>>11)*85;
		g = ((*buf_ptr & 0x07c0)>>6)*75;
		b = ((*buf_ptr & 0x003e)>>1)*95;
		a = *buf_ptr & 0x0001;
		gray = (r+g+b)>>8;
		gray = power_chart[gray]*32;
		if (gray > 31){
			gray = 31;
#if ROM == 0
			PRINTF("GrayScale_tex_buff3 calc error???\n");
#endif
		}
		*buf_ptr++ = (gray<<1)+(gray<<6)+(gray<<11)+a;
	}

}

//---------------------------------------------------
//
// テクスチャデータをグレイスケールにして 色もつける
//   (red,green,blue:0-255)
//
//---------------------------------------------------
void GrayScale_tex_buff_RGB(unsigned num,int size,int red,int green,int blue)
{
	unsigned short *buf_ptr;
	unsigned i,r,g,b,a,gray;
	

	buf_ptr = &tex_buff[tex_block_ptr[num].number];
	for (i = 0;i < size;i++){
		r = ((*buf_ptr & 0xf800)>>11)*77;
		g = ((*buf_ptr & 0x07c0)>>6)*150;
		b = ((*buf_ptr & 0x003e)>>1)*29;
		a = *buf_ptr & 0x0001;
		gray = (r+g+b)>>8;
		*buf_ptr++ = ((red*gray/256)<<11)+((green*gray/256)<<6)
			 +((blue*gray/256)<<1)+a;
	}

}
//-------------------------------------------------
//
// 任意のテクスチャがどこに展開してあるかを返す関数
//
//-------------------------------------------------
unsigned short *GetTexBuffPointer(unsigned short *tex_ptr)
{
	int check,j,num;

	check = 0;
	for(j = 0;j < all_tex_block_num;j++){
		if (tex_block_ptr[j].tex_data_ptr == tex_ptr){
			num = tex_block_ptr[j].number;
			check++;
			break;
		}
	}
	if (check)
		return(&tex_buff[num]);
	else
		return((unsigned short *)0);
}

#if 0
//----------------------------------------------------------------------
//
// マップセレクト画面のコースマップのテクスチャがあるポインタを返す関数
// (現在不使用)
//----------------------------------------------------------------------
unsigned short *GetMapViewPointer(void)
{
	unsigned short *ptr;
	OBJBlock *ob_ptr;
	SeqData *sd_ptr;
	int num;
	TexMap *tmp;

	tmp = &tex_block_ptr[0];
	ob_ptr = Get_OBJBlock_ptr(KO_MSEL_MAP);
	sd_ptr = &seq_data_block[ob_ptr->sd_number];
	if (sd_ptr->buffer){
		num = (tmp+sd_ptr->block_num+1)->number;
	}
	else{
		num = (tmp+sd_ptr->block_num)->number;
	}
	ptr = &tex_buff[num];
	PRINTF("tex_buff's ptr = 0x%x\n",tex_buff);
	PRINTF("map's ptr = 0x%x\n",ptr);
	return(ptr);
}
#endif

void InitKDL(void)
{
	kdl_buff_ptr = kdl_buff;
	all_kdl_block_num = 0;
}

void KDL_maker1(TexBlock *tp)
{
	kdl_buff_block[all_kdl_block_num].tex_block_ptr = GetTBPointer(tp);
	kdl_buff_block[all_kdl_block_num].gdl_ptr = kdl_buff_ptr;
}

void KDL_maker2(void)
{
	gSPEndDisplayList(kdl_buff_ptr++);
	all_kdl_block_num++;
	//PRINTF("kdl_buff_end=0x%x,kdl_buff_ptr=0x%x\n",
	//	   kdl_buff + KDL_BUFF_SIZE/sizeof(Gfx),kdl_buff_ptr);
#if ROM == 0
	if (kdl_buff_ptr > kdl_buff + KDL_BUFF_SIZE/sizeof(Gfx)){
		PRINTF("KDL_maker2 error1 kdl_buff_ptr=%x,kdl_buff_end=%x(kawano)\n"
			   ,kdl_buff_ptr,kdl_buff + KDL_BUFF_SIZE/sizeof(Gfx));
		while(1);
	}
	if (all_kdl_block_num >= KDL_DATA_MAX){
		PRINTF("KDL_maker2 error2 (kawano)\n");
		while(1);
	}
#endif
}

Gfx *KDL_call(Gfx *gdl,TexBlock *tp)
{
	Gfx *dl_ptr;
	int i,check;

	check = 0;
	for (i = 0;i < KDL_DATA_MAX;i++){
		if (GetTBPointer(tp) == kdl_buff_block[i].tex_block_ptr){
			dl_ptr = kdl_buff_block[i].gdl_ptr;
			check++;
			break;
		}
	}
	if (check){
		gSPDisplayList(gdl++,dl_ptr);
		return(gdl);
	}
#if ROM == 0
	else{
		PRINTF("KDL_call error (kawano)\n");
	}
#endif
}
#define	G_CC_MODULATEIDECALA_ENV	TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, TEXEL0

Gfx *doTexList(Gfx *gdl,TexBlock *tp,int x,int y)
{
	int flg_ia;
	unsigned short *ptr;

	tp = GetTBPointer(tp);
	while(tp->tex_data_ptr){
		flg_ia = G_IM_FMT_RGBA;
//		gSPClearGeometryMode(gdl++,G_SHADE | G_SHADING_SMOOTH);
		switch(tp->mode){
		case K_NORMAL:
			gSPDisplayList(gdl++,kawano_dtl_k_normal);
			break;
		case K_CLEAR:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		case K_GRAYPR:
			gSPDisplayList(gdl++,kawano_dtl_k_graypr);
			break;
		case K_INTA:
			gSPDisplayList(gdl++,kawano_dtl_k_inta);
			flg_ia = G_IM_FMT_IA;
			break;
		case K_MODECAENV:
			gSPDisplayList(gdl++,kawano_dtl_k_modecaenv);
			break;
		default:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		}
		ptr = GetTexBuffPointer((unsigned short *)tp->tex_data_ptr);
		if (ptr){
			if (fade_flg[4] != 4){
				gdl = AutoTextureRect(gdl,flg_ia,1<<10,1<<10,
									  0,0,tp->w,tp->h,
									  x + tp->pos_x,y + tp->pos_y,
									  ptr,tp->w,tp->h);
			}
			else{
				gdl = AutoTextureRectR(gdl,0,0,tp->w,tp->h,
									  x + tp->pos_x,y + tp->pos_y,
									  ptr,tp->w,tp->h);
			}
		}
#if ROM==0
		else{
			PRINTF("LoadError? (kawano)\n");
			return(gdl);
		}
#endif
		tp++;
		}

	return(gdl);
}

//-------------------------------------------------------
//
// 特殊効果用 doTexList
//
//-------------------------------------------------------
Gfx *doTexList2(Gfx *gdl,TexBlock *tp,int x,int y,int sp,int param)
{
	int flg_ia;
	unsigned short *ptr;

	tp = GetTBPointer(tp);
	while(tp->tex_data_ptr){
		flg_ia = G_IM_FMT_RGBA;
		switch(tp->mode){
		case K_NORMAL:
			gSPDisplayList(gdl++,kawano_dtl_k_normal);
			break;
		case K_CLEAR:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		//case K_GRAYPR:
		//	gSPDisplayList(gdl++,kawano_dtl_k_graypr);
		//	break;
		//case K_INTA:
		//	gSPDisplayList(gdl++,kawano_dtl_k_inta);
		//	flg_ia = G_IM_FMT_IA;
		//	break;
		default:
#if ROM == 0
			PRINTF("Unknown doTexList2_type!!!(kawano)\n");
			while(1);
#endif
			break;
		}
		ptr = GetTexBuffPointer((unsigned short *)tp->tex_data_ptr);
		if (ptr){
			switch(sp){
			case 1:
				gdl = AutoTextureRect64(gdl,flg_ia,
										x + tp->pos_x,y + tp->pos_y,
										ptr,param);
				break;
			case 2:
				gdl = AutoTextureRect_w(gdl,flg_ia,
										 0,0,tp->w,tp->h,
										 x + tp->pos_x,y + tp->pos_y,
										 ptr,tp->w,tp->h,param);
				break;
			case 3:
				gdl = AutoTextureRect_c(gdl,flg_ia,
										0,0,tp->w,tp->h,
										x + tp->pos_x,y + tp->pos_y,
										ptr,tp->w,tp->h);
				break;
			case 4:
				gdl = AutoTextureRect_2cyc(gdl,flg_ia,1<<10,1<<10,
										   0,0,tp->w,tp->h,
										   x + tp->pos_x,y + tp->pos_y,
										   ptr,tp->w,tp->h,param);
				break;
			default:
#if ROM == 0
				PRINTF("Unknown doTexList2_type!!!(kawano)\n");
				while(1);
#endif
				break;
			}
		}
#if ROM==0
		else{
			PRINTF("LoadError? (kawano)\n");
			return(gdl);
		}
#endif
		tp++;
		}

	return(gdl);
}


//-------------------------------------------------------
//
// 文字表示(4bitアルファ)用 doTexList(引数が浮動小数点ヴァージョン)
//
//-------------------------------------------------------
//Gfx *doTexList4(Gfx *gdl,TexBlock *tp,int x,int y,
Gfx *doTexList4(Gfx *gdl,TexBlock *tp,float x,float y,
				int sp,float param1,float param2)
{
	unsigned short *ptr;
	float check_x,check_y;
	int check;

	tp = GetTBPointer(tp);
	while(tp->tex_data_ptr){

		check = 0;
		check_x = x + tp->pos_x;
		if (check_x > SCREEN_WD)
			check++;
		check_x += tp->w*param1;
		if (check_x < 0)
			check++;
		check_y = y + tp->pos_y;
		if (check_y < 0)
			check++;
		check_y -= tp->h*param2;/* 文字のへそは左下にあるから */
		if (check_y > SCREEN_HT)
			check++;
		if (check){
			tp++;
			continue;
		}

		ptr = GetTexBuffPointer((unsigned short *)tp->tex_data_ptr);
		if (ptr){
			switch(sp){
			case 1:
				gSPDisplayList(gdl++,kawano_dtl_k_afont_type1);
				gdl = Set_IAFont(gdl,ptr,x + tp->pos_x,y + tp->pos_y,
								 tp->w,tp->h,param1,param2);
				break;
			case 2:
				gSPDisplayList(gdl++,kawano_dtl_k_afont_type2);
				gdl = Set_IAFont(gdl,ptr,x + tp->pos_x,y + tp->pos_y,
								 tp->w,tp->h,param1,param2);
				break;
			default:
#if ROM == 0
				PRINTF("Unknown doTexList4_type!!!(kawano)\n");
				while(1);
#endif
				break;
			}
		}
#if ROM==0
		else{
			PRINTF("LoadError? (kawano)\n");
			return(gdl);
		}
#endif
		tp++;
	}

	return(gdl);
}


//--------------------------------------------------
//
// マップ１/２サイズ表示用 doTexList
//
//--------------------------------------------------
Gfx *doTexList5(Gfx *gdl,TexBlock *tp,int x,int y,int param)
{
	int j,flg_ia;
	unsigned short *ptr;

	tp = GetTBPointer(tp);
	//tmp = &tex_block_ptr[0];
	//tp = GetTBPointer(sd_ptr->seq_ptr[sd_ptr->pattern].tex_block_ptr);
	while(tp->tex_data_ptr){
		flg_ia = G_IM_FMT_RGBA;
//		gSPClearGeometryMode(gdl++,G_SHADE | G_SHADING_SMOOTH);
		switch(tp->mode){
		case K_NORMAL:
			gSPDisplayList(gdl++,kawano_dtl_k_normal);
			break;
		case K_CLEAR:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		//case K_GRAYPR:
		//	gSPDisplayList(gdl++,kawano_dtl_k_graypr);
		//	break;
		case K_INTA:
			gSPDisplayList(gdl++,kawano_dtl_k_inta);
			flg_ia = G_IM_FMT_IA;
			break;
		default:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		}
		ptr = GetTexBuffPointer((unsigned short *)tp->tex_data_ptr);
		//if (sd_ptr->buffer){
		//	num = (tmp+sd_ptr->block_num+1)->number;
		//}
		//else{
		//	num = (tmp+sd_ptr->block_num)->number;
		//}
		//if (param >= 0){
		//	gdl = AutoTextureRect_w(gdl,flg_ia,
		//							0,0,tp->w,tp->h,
		//							x + tp->pos_x,y + tp->pos_y,
		//							&tex_buff[num],tp->w,tp->h,param);
		//}
		//else{
			switch(param){
			case 2:// マップ縮小表示
				gdl = AutoTextureRect_zoom(gdl,flg_ia,1<<10,1<<10,
										   .5,.5,
										   0,0,tp->w,tp->h,
										   x + tp->pos_x,y + tp->pos_y,
										   ptr,tp->w,tp->h);
				break;
			case 3:// マップ名縮小表示
				gdl = AutoTextureRect_zoom(gdl,flg_ia,1<<10,1<<10,
										   .457,.5,
										   //.5,.5,
										   0,0,tp->w,tp->h,
										   x + tp->pos_x,y + tp->pos_y,
										   ptr,tp->w,tp->h);
				break;
			default:
				break;
			}
		//}
		tp++;
	}

	return(gdl);
}



//--------------------------------------------------
//
// ダブルバッファ用 doTexList
//
//--------------------------------------------------
Gfx *doTexList_w(Gfx *gdl,SeqData *sd_ptr,int x,int y,int param)
{
	int j,num,flg_ia;
	TexBlock *tp;
	TexMap *tmp;

	tmp = &tex_block_ptr[0];
	tp = GetTBPointer(sd_ptr->seq_ptr[sd_ptr->pattern].tex_block_ptr);
	while(tp->tex_data_ptr){
		flg_ia = G_IM_FMT_RGBA;
//		gSPClearGeometryMode(gdl++,G_SHADE | G_SHADING_SMOOTH);
		switch(tp->mode){
		case K_NORMAL:
			gSPDisplayList(gdl++,kawano_dtl_k_normal);
			break;
		case K_CLEAR:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		//case K_GRAYPR:
		//	gSPDisplayList(gdl++,kawano_dtl_k_graypr);
		//	break;
		case K_INTA:
			gSPDisplayList(gdl++,kawano_dtl_k_inta);
			flg_ia = G_IM_FMT_IA;
			break;
		default:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		}
		if (sd_ptr->buffer){
			num = (tmp+sd_ptr->block_num+1)->number;
		}
		else{
			num = (tmp+sd_ptr->block_num)->number;
		}
		if (param >= 0){
			gdl = AutoTextureRect_w(gdl,flg_ia,
									0,0,tp->w,tp->h,
									x + tp->pos_x,y + tp->pos_y,
									&tex_buff[num],tp->w,tp->h,param);
		}
		else{
			switch(param){
			case -1:
				gdl = AutoTextureRect(gdl,flg_ia,1<<10,1<<10,0,0,tp->w,tp->h,
									  x + tp->pos_x,y + tp->pos_y,
									  &tex_buff[num],tp->w,tp->h);
				break;
			case -2:// マップ縮小表示
				gdl = AutoTextureRect_zoom(gdl,flg_ia,1<<10,1<<10,
										   .5,.5,
										   0,0,tp->w,tp->h,
										   x + tp->pos_x,y + tp->pos_y,
										   &tex_buff[num],tp->w,tp->h);
				break;
			default:
				break;
			}
		}
		tp++;
	}

	return(gdl);
}

//--------------------------------------------------
//
// ダブルバッファ用 doTexList
// (vsリザルト表示専用)
//--------------------------------------------------
Gfx *doTexList_vs(Gfx *gdl,SeqData *sd_ptr,int x,int y,int num,int param)
{
	int j,flg_ia;
	TexBlock *tp;
	TexMap *tmp;

	tmp = &tex_block_ptr[0];
	tp = GetTBPointer(sd_ptr->seq_ptr[sd_ptr->pattern].tex_block_ptr);
	while(tp->tex_data_ptr){
		flg_ia = G_IM_FMT_RGBA;
//		gSPClearGeometryMode(gdl++,G_SHADE | G_SHADING_SMOOTH);
		switch(tp->mode){
		case K_NORMAL:
			gSPDisplayList(gdl++,kawano_dtl_k_normal);
			break;
		case K_CLEAR:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		case K_GRAYPR:
			gSPDisplayList(gdl++,kawano_dtl_k_graypr);
			break;
		case K_INTA:
			gSPDisplayList(gdl++,kawano_dtl_k_inta);
			flg_ia = G_IM_FMT_IA;
			break;
		default:
			gSPDisplayList(gdl++,kawano_dtl_k_clear);
			break;
		}
		if (param >= 0){
			gdl = AutoTextureRect_w(gdl,flg_ia,
									0,0,tp->w,tp->h,
									x + tp->pos_x,y + tp->pos_y,
									(unsigned short *)&ken_data
									[sd_ptr->buffer][num/2][0x4000 + 0x2000*(num%2)],tp->w,tp->h,param);
		}
		tp++;
	}

	return(gdl);
}

void BeforeFadeMain(void)
{
	int i;
	POS_XY *pos_ptr,*size_ptr;
	SCREEN *scr_ptr;

	for(i = 0;i < 4;i++){
		pos_ptr = &old_screen_position[i];
		size_ptr = &old_screen_size[i];
		scr_ptr = &screen_data[i];

		pos_ptr->x = scr_ptr->posx;
		pos_ptr->y = scr_ptr->posy;
		size_ptr->x = scr_ptr->widthx;
		size_ptr->y = scr_ptr->widthy;
	}

	/* ５番目は全画面消去用 */
	pos_ptr = &old_screen_position[4];
	size_ptr = &old_screen_size[4];

	pos_ptr->x = SCREEN_WD/2;
	pos_ptr->y = SCREEN_HT/2;
	size_ptr->x = SCREEN_WD;
	size_ptr->y = SCREEN_HT;
	
}

void FadeMain(void)
{
	int i;

	for(i = 0;i < 5;i++){
		FadeMain2(i);
#if 0
		PRINTF("%d,%d  %d,%d\n",
			   screen_data[i].widthx,screen_data[i].widthy,
			   screen_data[i].posx,screen_data[i].posy);
#endif
	}
}

//
// 指定スクリーンのみのフェード処理
//
void FadeMain2(int i)
{
	int counter_stop_flag;

	/* 各リザルト処理に入っていたらフェード処理はなし */
	if (i != 4){
		//if (race_control_mode == FINISHRACE)
		//	return;
		if (Get_OBJBlock_ptr2(KO_GAME_TIME))
			return;
		if (Get_OBJBlock_ptr2(KO_GAME_POINT))
			return;
		if (Get_OBJBlock_ptr2(KO_GAME_TA1))
			return;
		if (Get_OBJBlock_ptr2(KO_GAME_TA2))
			return;
		if (Get_OBJBlock_ptr2(KO_GAME_GPLOSE))
			return;
		if (Get_OBJBlock_ptr2(KO_GAME_VS_RES))
			return;
	}
	counter_stop_flag = 0;
	gSPDisplayList(graphPtr++, kwdraw_init);
	//gDPSetRenderMode(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
	if ((i != 4) && (pause_flag))
		counter_stop_flag = 1;
	switch(fade_flg[i]){
	case 0:
		break;
	case 1:
		FadeIn(i,counter_stop_flag);
		break;
	case 2:
		FadeOut(i,counter_stop_flag);
		break;
	case 3:
		FadeOut_m();
		break;
	case 4:
		FadeOut_r();
		break;
	case 5:/*真っ黒状態*/
		FadeBlack(i);
		break;
	case 6:/*クリアな状態*/
		break;
	case 7:
		FadeOutWhite(i,counter_stop_flag);
		break;
	case 8:
		FadeInWhite(i,counter_stop_flag);
		break;
	}

}

void FadeIn_(int num,int cs_flg,int type)
{
	POS_XY *pos_ptr,*size_ptr;
	P_COLOR *col_ptr;
	SCREEN *scr_ptr;
	int x,y,w,h;

	switch(game_mode){
	case MARIOGP:
	case TIMEATTACK:
		pos_ptr = &old_screen_position[num];
		size_ptr = &old_screen_size[num];
		x = pos_ptr->x;
		y = pos_ptr->y;
		w = size_ptr->x;
		h = size_ptr->y;
		break;
	default:
		if (num >= 4){
			pos_ptr = &old_screen_position[num];
			size_ptr = &old_screen_size[num];
			x = pos_ptr->x;
			y = pos_ptr->y;
			w = size_ptr->x;
			h = size_ptr->y;
			break;
		}
		scr_ptr = &screen_data[num];
		x = scr_ptr->posx;
		y = scr_ptr->posy;
		w = scr_ptr->widthx;
		h = scr_ptr->widthy;
		break;
	}

	//gDPPipeSync(graphPtr++);
	col_ptr = &fade_color_bw[type];
	graphPtr = FillRect1Color_f(graphPtr,
								x - w/2,y - h/2,
								x + w/2,y + h/2,
								col_ptr->r,col_ptr->g,col_ptr->b,
								255-fade_counter2[num]*255/fade_counter[num]);
#if 0
	PRINTF("alpha=%u,counter=%u\n",
		   255-fade_counter2[num]*255/fade_counter[num],fade_counter2[num]);
#endif

	if (cs_flg)
		return;

	fade_counter2[num]++;
	if (fade_counter2[num] >= fade_counter[num]){
		if (sequence_mode == RACESEQUENCE){
			fade_flg[num] = 6;
		}
		else{
			fade_flg[num] = 0;
			fb_clear_flg = 0;
		}
	}
}

void FadeIn(int num,int cs_flg)
{
	FadeIn_(num,cs_flg,0);
}

void FadeInWhite(int num,int cs_flg)
{
	FadeIn_(num,cs_flg,1);
}

void Setting_SoundOutMode4multiplayer(void)
{
	if ((sound_output != MONO_MODE) && (player_number > 1))
		Na_SoundOutModeSet(STEREO_MODE);
}

void EndFadeOut(int num)
{
	OBJBlock *ob_ptr;
	int check;
	unsigned char cup_check[3];

	check = 0;
	if (sequence_mode == RESULTSEQUENCE){
		int i;

		switch(race_level){
		case 2:
		case 3:
			if ((resultstat.rank < 3) && (cup_select == 3))
				check = 1;
			break;
		default:
			check = 0;
			break;
		}
		/*150cc,おまけ スペシャルカップで３位以内のとき*/
		if (check){
		//if (1){
			//new_sequence_mode = ENDINGSEQUENCE;
			result_changeseq = ENDINGSEQUENCE;
			ending_map_number = KT9;
		}
		else{
			//new_sequence_mode = GAMESELECTSEQUENCE;
			result_changeseq = GAMESELECTSEQUENCE;
			k_bg_number = 11;
			//goto_gameselect();
		}
		return;
	}
	if (sequence_mode == RACESEQUENCE){
		switch(fade_flg[num]){
#if 0
		case 1:/*FadeIn*/
			fade_flg[num] = 6;
			break;
#endif
		case 2:/*FadeOut*/
			if (num != 4){/* ジュゲムのフェードアウトでは反応しない */
				fade_flg[num] = 5;
				break;
			}
				
			ob_ptr = Get_OBJBlock_ptr2(KO_GAME_VS_RES);
			if (ob_ptr){
				switch(ob_ptr->pattern){
				case KSEQ_VS_SELECT0:
					goto_racing();
					break;
				case KSEQ_VS_SELECT1:
					goto_mapselect();
					//k_bg_number = 13;
					//init_kawano_select();
					break;
				case KSEQ_VS_SELECT2:
					goto_kartselect();
					//k_bg_number = 12;
					//init_kawano_select();
					break;
				case KSEQ_VS_SELECT3:
				default:
					goto_gameselect();
					//goto_title();
					//k_bg_number = 10;
					//init_kawano_select();
					break;
				}
				break;
			}
			ob_ptr = Get_OBJBlock_ptr2(KO_GAME_GPLOSE);
			if (ob_ptr){
				switch(ob_ptr->pattern){
				case KSEQ_GPL_SELECT1:
					//retry_flag = 1;
					goto_racing();
					retry_count = 1;
					break;
				case KSEQ_GPL_SELECT2:
				default:
					goto_gameselect();
					//goto_title();
					break;
				}
				break;
			}
			ob_ptr = Get_OBJBlock_ptr2(KO_GAME_PAUSE);
			if (ob_ptr){
				switch(ob_ptr->pattern){
				case KSEQ_PS_TA2:
					goto_racing();
					check++;
					break;
				case KSEQ_PS_TA3:
				case KSEQ_PS_VS2:
				case KSEQ_PS_BT2:
					goto_mapselect();
					//k_bg_number = 13;
					//init_kawano_select();
					check++;
					break;
				case KSEQ_PS_TA4:
				case KSEQ_PS_VS3:
				case KSEQ_PS_BT3:
					goto_kartselect();
					//k_bg_number = 12;
					//init_kawano_select();
					check++;
					break;
				case KSEQ_PS_TA5:
				case KSEQ_PS_VS4:
				case KSEQ_PS_GP2:
				case KSEQ_PS_BT4:
					goto_gameselect();
					//goto_title();
					//k_bg_number = 10;
					//init_kawano_select();
					check++;
					break;
				default:
					fade_flg[num] = 5;
					break;
				}
				if (check)
					pause_flag = 0;
			}
			ob_ptr = Get_OBJBlock_ptr2(KO_GAME_TA_REP);
			if (ob_ptr){
				//if (num != 4){
				//	fade_flg[num] = 5;
				//}
				//else{
					switch(ob_ptr->pattern){
					case KSEQ_TAR_SEL1:
						retry_flag = 1;
						replay_flag = 0;
						goto_racing();
						break;
					case KSEQ_TAR_SEL2:
						retry_flag = 0;
						replay_flag = 0;
						goto_mapselect();
						//k_bg_number = 13;
						//init_kawano_select();
						break;
					case KSEQ_TAR_SEL3:
						retry_flag = 0;
						replay_flag = 0;
						goto_kartselect();
						//k_bg_number = 12;
						//init_kawano_select();
						break;
					case KSEQ_TAR_SEL4:
						retry_flag = 0;
						replay_flag = 0;
						goto_gameselect();
						//goto_title();
						//k_bg_number = 10;
						//init_kawano_select();
						break;
					case KSEQ_TAR_SEL5:
						retry_flag = 0;
						replay_flag = 1;
						goto_racing();
						break;
					}
					break;
				//}
			}
			else
				fade_flg[num] = 5;
			break;
			
		}
		return;
	}
	fade_flg[num] = 0;
	if (title_mode != 0x40){
		switch(k_bg_number_next){
		case 0:
			if (k_bg_number == 8){
				k_bg_number = 10;
				k_bg_change = 2;/* 白からフェードイン */
			}
			else{
				k_bg_number++;
			}
			break;
		case 1:
			k_bg_number--;
			break;
		case 2://デモ突入
			demo_flag = 1;
			demo_play_flag = 1;
			new_sequence_mode=RACESEQUENCE;
			//Na_Seq_Stop();
			race_level = 1;
			switch(demo_number){
			case 0:
				map_number = 0;
				race_screen_mode = FULL_SCREEN;
				player_number = 1;
				players = 1;
				player_driver[0] = MARIO;
				//cup_level = KINOKOCUP;
				game_mode = MARIOGP;
				break;
			case 1:
				map_number = 1;
				race_screen_mode = UP_DOWN_SCREEN;
				player_number = 2;
				players = 2;
				player_driver[0] = YOSSY;
				player_driver[1] = DONKY;
				//cup_level = STARCUP;
				game_mode = VSBATTLE;
				break;
			case 2:
				map_number = 11;
				race_screen_mode = FULL_SCREEN;
				player_number = 1;
				players = 1;
				player_driver[0] = LUIZI;
				//cup_level = KINOKOCUP;
				game_mode = MARIOGP;
				break;
			case 3:
				map_number = 14;
				race_screen_mode = FOUR_PARTS_SCREEN;
				player_number = 3;
				players = 3;
				player_driver[0] = WARIO;
				player_driver[1] = YOSSY;
				player_driver[2] = KUPPA;
				//cup_level = KINOKOCUP;
				game_mode = VSBATTLE;
				break;
			case 4:
				map_number = 2;
				race_screen_mode = FULL_SCREEN;
				player_number = 1;
				players = 1;
				player_driver[0] = KUPPA;
				//cup_level = KINOKOCUP;
				game_mode = MARIOGP;
				break;
			case 5:
				map_number = 12;
				race_screen_mode = FOUR_PARTS_SCREEN;
				player_number = 4;
				players = 4;
				player_driver[0] = MARIO;
				player_driver[1] = LUIZI;
				player_driver[2] = PEACH;
				player_driver[3] = KINOP;
				//cup_level = STARCUP;
				game_mode = VSBATTLE;
				break;
			default:
				break;
			}
			demo_number++;
			if (demo_number >= DEMO_NUMBER_MAX)
				demo_number = 0;
			cup_level = cup_select = map2cup_chart[map_number];
			circuit_select = map2circuit_chart[map_number];
			//Setting_SoundOutMode4multiplayer();
			break;
		case 3:/* データ画面へいくとき */
			switch(k_bg_number){
			case 11:
				k_bg_number = 6;
				break;
			case 6:
				k_bg_number = 11;
				break;
			}
			break;
		case 4:/* オプション画面へ行くとき */
			switch(k_bg_number){
			case 11:
				k_bg_number = 5;
				break;
			case 5:
				k_bg_number = 11;
				break;
			}
			break;
		}
		if (!k_bg_change)
			k_bg_change = 1;
		if (k_bg_number > 13){
			new_sequence_mode=RACESEQUENCE;
			if (game_mode == TIMEATTACK)
				loading_ghost_flg = 1;
			//Na_Seq_Stop();
			//    k_bg_number = 10;
			Setting_SoundOutMode4multiplayer();
		}
		fb_clear_flg = 0;
	}
	// デバッグモードからゲームに移るときの処理
	else{
		switch(res_seq_flg){
		case 1:
			new_sequence_mode=RESULTSEQUENCE;
			break;
		case 2:
		case 3:
			new_sequence_mode=ENDINGSEQUENCE;
			ending_map_number = KT9;
			break;
		default:
			new_sequence_mode=RACESEQUENCE;
			if (game_mode == TIMEATTACK)
				loading_ghost_flg = 1;
			break;
		}
	    set_rival_car_name();//小川さんのん
		//Na_Seq_Stop();
		if (race_screen_mode == FOUR_PARTS_SCREEN){
			switch(game_mode){
			case GRANDPRIX:
			case TIMEATTACK:
				game_mode = VSBATTLE;
				break;
			}
		}
		switch(map_number){
		case KT16:
		case KT17:
		case KT20:
		case KT18:
			game_mode = BATTLE;
			if (player_number == 1){
				player_number = players = 2;
				race_screen_mode = UP_DOWN_SCREEN;
			}
			break;
		//case KT18:
		//	game_mode = 4;
		//	race_screen_mode = FULL_SCREEN;
		//	break;
		default:
			if (game_mode == BATTLE)
				game_mode = MARIOGP;
			if ((game_mode == VSBATTLE) && (player_number == 1))
				game_mode = MARIOGP;
			break;
		}
		//if (game_mode != BATTLE){
			cup_level = cup_select = map2cup_chart[map_number];
			circuit_select = map2circuit_chart[map_number];
		//}
		//Setting_SoundOutMode4multiplayer();
		switch(res_seq_flg){
		case 1:
			break;
		case 2:
			race_level = 0;
			break;
		case 3:
			race_level = 3;
			break;
		default:
			if (race_level == 3)
				screen_flip = 1;
			else
				screen_flip = 0;
		}
	}
}

void FadeOut_(int num,int cs_flg,int type)
{
	POS_XY *pos_ptr,*size_ptr;
	P_COLOR *col_ptr;
	SCREEN *scr_ptr;
	int brightness;
	int x,y,w,h;

	switch(game_mode){
	case MARIOGP:
	case TIMEATTACK:
		pos_ptr = &old_screen_position[num];
		size_ptr = &old_screen_size[num];
		x = pos_ptr->x;
		y = pos_ptr->y;
		w = size_ptr->x;
		h = size_ptr->y;
		break;
	default:
		if (num >= 4){
			pos_ptr = &old_screen_position[num];
			size_ptr = &old_screen_size[num];
			x = pos_ptr->x;
			y = pos_ptr->y;
			w = size_ptr->x;
			h = size_ptr->y;
			break;
		}
		scr_ptr = &screen_data[num];
		x = scr_ptr->posx;
		y = scr_ptr->posy;
		w = scr_ptr->widthx;
		h = scr_ptr->widthy;
		break;
	}
	brightness = fade_counter2[num]*255/fade_counter[num];
	if (brightness > 255)
		brightness = 255;

	col_ptr = &fade_color_bw[type];
	//gDPPipeSync(graphPtr++);
	graphPtr = FillRect1Color_f(graphPtr,
								x - w/2,y - h/2,
								x + w/2,y + h/2,
								col_ptr->r,col_ptr->g,col_ptr->b,brightness);

	if (cs_flg)
		return;

	fade_counter2[num]++;
	if (fade_counter2[num] > fade_counter[num]+1)
		EndFadeOut(num);
}

void FadeOut(int num,int cs_flg)
{
	FadeOut_(num,cs_flg,0);
}

void FadeOutWhite(int num,int cs_flg)
{
	FadeOut_(num,cs_flg,1);
}

void FadeBlack(int num)
{
	POS_XY *pos_ptr,*size_ptr;
	SCREEN *scr_ptr;
	int x,y,w,h;

	switch(game_mode){
	case MARIOGP:
	case TIMEATTACK:
		pos_ptr = &old_screen_position[num];
		size_ptr = &old_screen_size[num];
		x = pos_ptr->x;
		y = pos_ptr->y;
		w = size_ptr->x;
		h = size_ptr->y;
		break;
	default:
		if (num >= 4){
			pos_ptr = &old_screen_position[num];
			size_ptr = &old_screen_size[num];
			x = pos_ptr->x;
			y = pos_ptr->y;
			w = size_ptr->x;
			h = size_ptr->y;
			break;
		}
		scr_ptr = &screen_data[num];
		x = scr_ptr->posx;
		y = scr_ptr->posy;
		w = scr_ptr->widthx;
		h = scr_ptr->widthy;
		break;
	}
	//gDPPipeSync(graphPtr++);
	graphPtr = FillRect1Color_f(graphPtr,
								x - w/2,y - h/2,
								x + w/2,y + h/2,
								0,0,0,255);
}

void FadeOut_r(void)
{
	int i,counter;
	int x,y;
	int brightness;

	fade_counter2[4]++;
	if (fade_counter2[4] >= fade_counter[4]+1){
			EndFadeOut(4);
	}

    gDPPipeSync(graphPtr++);
	brightness = fade_counter2[4]*255/fade_counter[4];
	if (brightness > 255)
		brightness = 255;
	
	//gDPPipeSync(graphPtr++);
	graphPtr = FillRect1Color_f(graphPtr,0,0,SCREEN_WD,SCREEN_HT,
								0,0,0,brightness);
}

void FadeOut_m(void)
{
	int i,counter;
	int x,y;
	int brightness;

	fade_counter2[4]++;
	if (fade_counter2[4] >= fade_counter[4]){
		if (fade_counter2[4] == fade_counter[4]){
			for (i = 0;i < 1200;i++)
				k_work[i] = 1;
		}
		else{
			EndFadeOut(4);
		}
	}
	else{
		i = 0;
		counter = 0;
		while(counter < 1200/fade_counter[4]){
			if ((!k_work[i])&&(!(make_random_limmit((1200-fade_counter2[4])
													/fade_counter[4])))){
				k_work[i] = 1;
				counter++;
			}
			i++;
			if (i >= 1200)
				i = 0;
		}
	}

	gDPPipeSync(graphPtr++);
	gDPSetRenderMode(graphPtr++,G_RM_XLU_SURF, G_RM_XLU_SURF2);
	gDPSetPrimColor(graphPtr++,0,0,0,0,0,255);
	gDPSetCombineMode(graphPtr++,G_CC_PRIMITIVE, G_CC_PRIMITIVE);
	for (i = 0;i < 1200;i++){
		if (k_work[i]){
			x = (i % 40)*8;
			y = (i / 40)*8;
			gDPFillRectangle(graphPtr++,x,y,x+8,y+8);
		}
	}
    gDPPipeSync(graphPtr++);
	brightness = fade_counter2[4]*255/fade_counter[4];
	if (brightness > 255)
		brightness = 255;
	
	//gDPPipeSync(graphPtr++);
	graphPtr = FillRect1Color_f(graphPtr,0,0,SCREEN_WD,SCREEN_HT,
								0,0,0,brightness);
}

void SetFadeIn_(unsigned count,int type)
{
	if (count <= 0)/*zero divide 対策*/
		count = 1;

	switch(fade_flg[4]){
	case 1:
	case 6:
		break;
	default:
		fade_flg[4] = type;
		fade_counter[4] = count;
		if (fade_counter[4] >255)
			fade_counter[4] = 255;
		fade_counter2[4] = 0;
		break;
	}
}

void SetFadeIn(unsigned count)
{
	SetFadeIn_(count,1);
}

void SetFadeInWhite(unsigned count)
{
	SetFadeIn_(count,8);
}

void SetFadeOut_(unsigned count,int type)
{
	if (count <= 0)/*zero divide 対策*/
		count = 1;

	switch(fade_flg[4]){
	case 2:
	case 5:
		break;
	default:
		fade_flg[4] = type;
		fade_counter[4] = count;
		if (fade_counter[4] >255)
			fade_counter[4] = 255;
		fade_counter2[4] = 0;
		break;
	}
}

void SetFadeOut(unsigned count)
{
	SetFadeOut_(count,2);
}

void SetFadeOutWhite(unsigned count)
{
	SetFadeOut_(count,7);
}

void SetFadeInScreen(unsigned num,unsigned count)
{
	if (count <= 0)/*zero divide 対策*/
		count = 1;

	switch(fade_flg[num]){
	case 1:
	case 6:
		break;
	default:
		fade_flg[num] = 1;
		fade_counter[num] = count;
		if (fade_counter[num] >255)
			fade_counter[num] = 255;
		fade_counter2[num] = 0;
		break;
	}
}

void SetFadeOutScreen(unsigned num,unsigned count)
{
	if (count <= 0)/*zero divide 対策*/
		count = 1;

	switch(fade_flg[num]){
	case 2:
	case 5:
		break;
	default:
		fade_flg[num] = 2;
		fade_counter[num] = count;
		if (fade_counter[num] >255)
			fade_counter[num] = 255;
		fade_counter2[num] = 0;
		break;
	}
}

void SetFadeOut_m(unsigned count)
{
	int i;

	if (fade_flg[4] != 3){
		fade_flg[4] = 3;
		fade_counter[4] = count;
		if (fade_counter[4] >255)
			fade_counter[4] = 255;
		fade_counter2[4] = 0;
		for(i = 0;i < 1200;i++)
			k_work[i] = 0;
	}
}

void SetFadeOut_r(unsigned count)
{
	if (fade_flg[4] != 4){
		fade_flg[4] = 4;
		fade_counter[4] = count;
		if (fade_counter[4] >255)
			fade_counter[4] = 255;
		fade_counter2[4] = 0;
	}
}

void SetFadeOut_f()
{
    SetFadeOut(10);
	k_bg_number_next = 0;
}

void SetFadeOut_fw()
{
    SetFadeOutWhite(10);
	k_bg_number_next = 0;
}

void SetFadeOut_b()
{
    SetFadeOut(10);
	k_bg_number_next = 1;
}

void SetFadeOut_d()
{
    SetFadeOut(10);
	k_bg_number_next = 2;
}

void SetFadeOut_ta_data()
{
    SetFadeOut(10);
	k_bg_number_next = 3;
}

void SetFadeOut_option()
{
    SetFadeOut(10);
	k_bg_number_next = 4;
}

//
// 指定スクリーンのみのカミナリ処理
//
void ThunderMain(int i)
{
	switch(thunder_flg[i]){
	case 0:
		break;
	case 1:
		k_thunder(i);
		break;
	default:
		thunder_flg[i] = 0;
		break;
	}

}

void k_thunder(int num)
{
	POS_XY *pos_ptr,*size_ptr;
	P_COLOR *col_ptr;
	int pattern;
	float wf1;
	int i;

	pos_ptr = &old_screen_position[num];
	size_ptr = &old_screen_size[num];
	pattern = thunder_onoff[thunder_counter[num]];
	if (pattern){
		col_ptr = &k_thunder_color[pattern];
		if (thunder_counter[num]  < 27){
			graphPtr = FillRect1Color_f(graphPtr,
										pos_ptr->x - size_ptr->x/2,
										pos_ptr->y - size_ptr->y/2,
										pos_ptr->x + size_ptr->x/2,
										pos_ptr->y + size_ptr->y/2,
										col_ptr->r,col_ptr->g,
										col_ptr->b,col_ptr->a);
		}
		else{
			wf1 = (38 - thunder_counter[num])/11.0;
			graphPtr = FillRect1Color_f(graphPtr,
										pos_ptr->x - size_ptr->x/2,
										pos_ptr->y - size_ptr->y/2,
										pos_ptr->x + size_ptr->x/2,
										pos_ptr->y + size_ptr->y/2,
										col_ptr->r,col_ptr->g,col_ptr->b,
										(uint)(col_ptr->a*wf1));
		}
		
	}
	thunder_counter[num]++;
	if (thunder_counter[num] >= 38){
		for (i = 0;i < 4;i++)
			thunder_flg[i] = 0;
	}
}
void SetThunder(void)
{
	int i;

	for (i = 0;i < 4;i++)
		SetThunder_(i);
}
void SetThunder_(int num)
{
	thunder_flg[num] = 1;
	thunder_counter[num] = 0;
}

void InitOBJBlock(void)
{
	int i;

	for (i = 0;i < OBJ_BLOCK_MAX;i++){
		obj_block[i].kind = 0;
	}
}

void SetOBJBlock(int kind,int x,int y,char pri)
{
	OBJBlock *ptr;
	P_COLOR *col_ptr;
	int count,a;

	count = 0;
	ptr = obj_block;
	while(1){
		if (!ptr->kind)
			break;
		count++;
		if (count > OBJ_BLOCK_MAX){
#if ROM==0
			PRINTF("OBJ_BLOCK OVER FLOW!!(kawano)\n");
#endif
			while(1);
		}
		ptr++;
	}
	ptr->kind = kind;
	ptr->pattern = 0;
	ptr->pattern2 = 0;
	ptr->disp_x = x;
	ptr->disp_y = y;
	ptr->pri = pri;
	ptr->disp_on = 1;
	ptr->work1 = 0;
	ptr->work2 = 0;

	switch(kind){
	case KO_NINTEN_LOGO:

#if DL_KARTLOGO
		logo_timer = 0;
		logo_delay_size = 0.0f;
		logo_yang_speed = 3.0f;
#endif
		logo_cam_z = 2500;
		logo_rot_x = 0;
		logo_rot_y = -270;
		logo_rot_z = 0;
		logo_pos_x = 0;
		logo_pos_y = 0;
		logo_pos_z = 0;
		logo_scale_z = 3.0;
		ptr->work1 = -1;
		ptr->work2 = 1;
		break;
	case KO_CHECKER_FLAG:
		logo_cam_z = 1800;
		logo_rot_x = -51;
		logo_rot_y = -12;
		logo_rot_z = -18;
		logo_pos_x = -270;
		logo_pos_y = 750;
		logo_pos_z = 0;
		logo_scale_z = 1.0;
		ptr->work1 = -1;
		ptr->work2 = 1;
		break;
#if FONT_TEST_ON_TITLE
	case KO_TEST_CPFONT:
		TexBuffLoad(TexList_cp_font_all);
		break;
#endif
	//case KO_CP_CSCOLOR:
	//	break;
	case KO_CP_BG1:
		TexBuffLoad_p(TexList_cp_bg1,0);
		KDL_maker1(TexList_cp_bg1);
		kdl_buff_ptr = doTexList(kdl_buff_ptr,TexList_cp_bg1,
								 ptr->disp_x,ptr->disp_y);
		KDL_maker2();
		break;
	case KO_CP_BG2:
		TexBuffLoad_p(TexList_cp_bg2,0);
		KDL_maker1(TexList_cp_bg2);
		kdl_buff_ptr = doTexList(kdl_buff_ptr,TexList_cp_bg2,
								 ptr->disp_x,ptr->disp_y);
		KDL_maker2();
		break;
	case KO_CP_GNOTE:
		TexBuffLoad_p(TexList_cp_gnote,0);
		TexBuffLoad(TexList_cp_notecursor);
		ptr->disp_y = CP_GNOTE_Y;
		for (count = 0;count < 133;count++)
			TexBuffLoad(GetTBPointer(TexList_cp_fonts[count]));			
		break;
	case KO_CP_MES1:
		TexBuffLoad(TexList_cp_mes1_shadow);
		KDL_maker1(TexList_cp_mes1_shadow);
		kdl_buff_ptr = doTexList(kdl_buff_ptr,TexList_cp_mes1_shadow,
								 ptr->disp_x,ptr->disp_y);
		gDPLoadTextureBlock(kdl_buff_ptr++,
							GetTexBuffPointer((unsigned short *)jf_waku_3),
							G_IM_FMT_IA,G_IM_SIZ_16b,
							256,5,0,
							G_TX_CLAMP,G_TX_CLAMP,
							G_TX_NOMASK,G_TX_NOMASK,
							G_TX_NOLOD,G_TX_NOLOD);
		gSPTextureRectangle(kdl_buff_ptr++,
							32<<2,176<<2,
							(32+256)<<2,(176+5)<<2,
							G_TX_RENDERTILE,
							0<<5,(5-1)<<5,1<<10,-1<<10);
		KDL_maker2();
		TexBuffLoad(TexList_cp_mes1_red);
		KDL_maker1(TexList_cp_mes1_red);
		kdl_buff_ptr = doTexList(kdl_buff_ptr,TexList_cp_mes1_red,
								 ptr->disp_x,ptr->disp_y);
		KDL_maker2();
		TexBuffLoad(TexList_cp_mes1_green);
		KDL_maker1(TexList_cp_mes1_green);
		kdl_buff_ptr = doTexList(kdl_buff_ptr,TexList_cp_mes1_green,
								 ptr->disp_x,ptr->disp_y);
		KDL_maker2();
		TexBuffLoad(TexList_cp_mes1_yellow);
		KDL_maker1(TexList_cp_mes1_yellow);
		kdl_buff_ptr = doTexList(kdl_buff_ptr,TexList_cp_mes1_yellow,
								 ptr->disp_x,ptr->disp_y);
		KDL_maker2();
		break;
	case KO_CP_MES2:
		ptr->sd_number = SetSeqData((TexBlockSeq *)
									GetVAddress(TBSeq_cp_messages[0]));
		break;
	case KO_CP_FREE:
		for (count = 0;count < 10;count++)
			TexBuffLoad(GetTBPointer(TexList_cp_numbers[count]));
		break;
	case KO_CP_CURSOR1:
	case KO_CP_CURSOR2:
		TexBuffLoad(TexList_cp_cursor);
		break;
	case KO_TITLE:
		//TexBuffLoad_p(TexList_titleback,0);
		TexBuffLoad_p(TexList_titlebacks[Check4GoldCup_150cc()],0);
		break;
	case KO_TITLE2:
		kwmelt_titlelogo();
		tex_buff_num += 131072/2;
		TexBuffLoad(TexList_titlelogo);
		break;
	case KO_TITLE3:
		TexBuffLoad(TexList_titlelogo2);
		break;
	case KO_GSEL_BACK:
	case KO_PSEL_BACK:
	case KO_MSEL_BACK:
		//TexBuffLoad_p(TexList_titleback,0);
		TexBuffLoad_p(TexList_titlebacks[Check4GoldCup_150cc()],0);
		TexBuffLoad_p(TexList_lpsel_ok,0);//dummy for next line
		GrayScale_tex_buff3(0,25);
		col_ptr = &titleback_color[kind - KO_GSEL_BACK];
		GrayScale_tex_buff_RGB(0,76800,col_ptr->r,col_ptr->g,col_ptr->b);
		break;
	case KO_GSEL_OK:
		ptr->work1 = 32;
	case KO_GSEL_LOGO:
	case KO_GSEL_OPTION:
	case KO_GSEL_RECORD:
	case KO_GSEL_50CC:
	case KO_GSEL_100CC:
	case KO_GSEL_150CC:
	case KO_GSEL_PRO:
	case KO_GSEL_ITEMOFF:
	case KO_GSEL_ITEMON:
	case KO_GSEL_TRY:
	//case KO_GSEL_GHOST:
	case KO_GSEL_DATA:
		TexBuffLoad_p(GetTBPointer(TexLists_gsel[kind - KO_GSEL_LOGO]),0);
		break;
	case KO_GSEL_1P:
	case KO_GSEL_2P:
	case KO_GSEL_3P:
	case KO_GSEL_4P:
		TexBuffLoad_p(GetTBPointer(
			TexList_gsel_boxes[(kind - KO_GSEL_1P)*2]),0);
		TexBuffLoad(GetTBPointer(TexList_gsel_boxes[(kind - KO_GSEL_1P)*2+1]));
		break;
	case KO_PSEL_LOGO:
		TexBuffLoad_p(TexList_lpsel_logo,0);
		break;
	case KO_PSEL_OK:
		TexBuffLoad_p(TexList_lpsel_ok,0);
		ptr->work1 = 32;
		break;
	case KO_PSEL_1P:
	case KO_PSEL_2P:
	case KO_PSEL_3P:
	case KO_PSEL_4P:
		TexBuffLoad(GetTBPointer(TexList_psel_cursors[kind - KO_PSEL_1P]));
		break;
	case KO_PSEL_MA:
	case KO_PSEL_LU:
	case KO_PSEL_PE:
	case KO_PSEL_KI:
	case KO_PSEL_YO:
	case KO_PSEL_KA:
	case KO_PSEL_WA:
	case KO_PSEL_KU:
		ptr->sd_number = SetSeqData((TexBlockSeq *)GetVAddress
									(TBSeq_psel[kind - KO_PSEL_MA]));
		TexBuffLoad_p(GetTBPointer(TexList_name_plates[kind - KO_PSEL_MA]),0);
		break;
	case KO_GAME_MA:
	case KO_GAME_LU:
		ptr->sd_number = SetSeqData((TexBlockSeq *)GetVAddress
									(TBSeq_psel[kind - KO_GAME_MA]));
		break;
	case KO_MSEL_OK:
		ptr->work1 = 32;
	case KO_MSEL_LOGO:
	case KO_MSEL_KCUP:
	case KO_MSEL_FCUP:
	case KO_MSEL_SCUP:
	case KO_MSEL_SPCUP:
	case KO_MSEL_KNAME:
	case KO_MSEL_FNAME:
	case KO_MSEL_SNAME:
	case KO_MSEL_SPNAME:
	case KO_MSEL_BATTLE:
		TexBuffLoad_p(GetTBPointer(TexLists_msel[kind - KO_MSEL_LOGO]),0);
		break;
#if 0
	case KO_MSEL_MAP:/* 現在使用されておりません */
		/*とりあえず転送用に２枚分のバッファを確保*/
		ptr->sd_number = SetSeqData(TBSeq_msel_map_dummy);
		break;
#endif
	//case KO_MSEL_MAPMAN:
	//	break;
	case KO_MSEL_MAP1:
	case KO_MSEL_MAP2:
	case KO_MSEL_MAP3:
	case KO_MSEL_MAP4:
		ptr->sd_number = SetSeqData((TexBlockSeq *)GetVAddress(
			TBSeq_msel_map[map_number_chart
			[KINOKOCUP][ptr->kind-KO_MSEL_MAP1]]));
		break;
	case KO_MSEL_NOISE:
		ptr->work2 = make_random_limmit(4) + 2;
		break;
	case KO_MSEL_BRECORD:
	case KO_MSEL_BLAP:
		ptr->disp_x = msel_bestbox_default_position[kind - KO_MSEL_BRECORD].x;
		ptr->disp_y = msel_bestbox_default_position[kind - KO_MSEL_BRECORD].y;
		break;
	case KO_MSEL_CUP:
		ptr->work1 = cup_select;
		ptr->work2 = GetCupStatus(cup_select,race_level);
		ptr->sd_number = SetSeqData((TexBlockSeq *)GetVAddress(
			TBSeq_msel_cups[4*(race_level/2)+(3-ptr->work2)]));
		{
			POS_XY *pos_ptr;

			pos_ptr = &msel_cup_positions[0];
			ptr->disp_x = pos_ptr->x;
			ptr->disp_y = pos_ptr->y;
		}
		break;
	case KO_MSEL_LEVEL:
		TexBuffLoad_p(GetTBPointer(TexList_gsel_pop_gp[race_level]),0);
		ptr->disp_x = 55;
		ptr->disp_y = 195;
		break;
	case KO_MSEL_GHOST:
		TexBuffLoad_p(GetTBPointer(TexList_lgsel_ghost),0);
		if (!CheckPakStatus()){
			LoadGameNoteKart_data();
		}
		else{/* パックデータがうまくロードできなかったとき... */
			pak_ghost[0].e.ghost_flg = 0;
			pak_ghost[1].e.ghost_flg = 0;
		}
		break;
	case KO_TSEL_KCUP:
	case KO_TSEL_FCUP:
	case KO_TSEL_SCUP:
	case KO_TSEL_SPCUP:
		TexBuffLoad_p(GetTBPointer(TexLists_tsels[kind - KO_TSEL_KCUP]),0);
		break;
	case KO_TSEL_TITLE:/* ここでパックデータを読ましてもらう */
		TexBuffLoad_p(GetTBPointer(TexList_lgsel_data),0);
		if (!CheckPakStatus()){
			LoadGameNoteKart_data();
		}
		else{/* パックデータがうまくロードできなかったとき... */
			pak_ghost[0].e.ghost_flg = 0;
			pak_ghost[1].e.ghost_flg = 0;
		}
			
		break;
	case KO_TSEL_CURSOR:
		TexBuffLoad(GetTBPointer(TexList_tsel_cursor));
		break;
	case KO_TSEL_KCUP1:
	case KO_TSEL_KCUP2:
	case KO_TSEL_KCUP3:
	case KO_TSEL_KCUP4:
	case KO_TSEL_FCUP1:
	case KO_TSEL_FCUP2:
	case KO_TSEL_FCUP3:
	case KO_TSEL_FCUP4:
	case KO_TSEL_SCUP1:
	case KO_TSEL_SCUP2:
	case KO_TSEL_SCUP3:
	case KO_TSEL_SCUP4:
	case KO_TSEL_SPCUP1:
	case KO_TSEL_SPCUP2:
	case KO_TSEL_SPCUP3:
	case KO_TSEL_SPCUP4:
		TexBuffLoad_p(GetTBPointer(TexList_msel_maps[map_number_chart
			[(ptr->kind-KO_TSEL_KCUP1)/4][(ptr->kind-KO_TSEL_KCUP1)%4]]),-1);
		TexBuffLoad_p(GetTBPointer(TexList_msel_mapnames[map_number_chart
			[(ptr->kind-KO_TSEL_KCUP1)/4][(ptr->kind-KO_TSEL_KCUP1)%4]]),0);
		TexBuffLoad_p(GetTBPointer(TexList_lgsel_ghost),0);
		break;
	case KO_GAME_VS_1P:
	case KO_GAME_VS_2P:
	case KO_GAME_VS_3P:
	case KO_GAME_VS_4P:
		{
			int loser_flg,b;
			TexBlockSeq *ts_ptr;

			b = kind - KO_GAME_VS_1P;
			a = driver2pselset[player_driver[b]];
			
			loser_flg = 0;
			switch(game_mode){
			case VSBATTLE:
				if (ogawa_rank[kind - KO_GAME_VS_1P])
					loser_flg = 1;
				break;
			case BATTLE:
				if (win_kart != kind - KO_GAME_VS_1P)
					loser_flg = 1;
				break;
			}
#if VS_LOSE_ALL_SWITCH
			loser_flg = 1;
#endif
			if (loser_flg)
				ts_ptr = TBSeq_psel_p6[a];
			else
				ts_ptr = TBSeq_psel[a];
			
			ptr->sd_number = SetSeqData2((TexBlockSeq *)GetVAddress(ts_ptr),b);
		}
		TexBuffLoad_p(GetTBPointer(TexList_name_plates[a]),0);
		TexBuffLoad(GetTBPointer(TexList_psel_cursors[kind - KO_GAME_VS_1P]));
		break;
	case KO_GAME_TA_SORT:/* コースデータのバックアップに関する処理 */
		//kwlap[0].laptimebuf[0] = 1230;
		//kwlap[0].laptimebuf[1] = 1230;
		ptr->work1 = SaveCourseRecord(kwlap[0].totaltime,player_driver[0]);
		ptr->work2 = SaveCourseLapRecord();
		if (ghost_status != GHOST_STOP)
		{
			extern int make_press_ghost(void);
			if (make_press_ghost() > 15360)
				ghost_status = GHOST_STOP;
		}


		/* 一位を出したときはバックアップデータも更新 */
		if ((!ptr->work1)||(ptr->work2))
			SetEEPRomCourseData_bak(cup_select*4 + circuit_select);
		break;
	case KO_DSEL_SNAP:
		ptr->sd_number = SetSeqData((TexBlockSeq *)GetVAddress(
			TBSeq_msel_map[map_number_chart[tsel_cursor/4][tsel_cursor%4]]));
		ptr->work1 = tsel_cursor;
		TexBuffLoad_p(GetTBPointer(TexList_lgsel_ghost),0);
		kwmelt_kawanoroadmap();
		if (!CheckPakStatus()){
			LoadGameNoteKart_data();
		}
		else{/* パックデータがうまくロードできなかったとき... */
			pak_ghost[0].e.ghost_flg = 0;
			pak_ghost[1].e.ghost_flg = 0;
		}
		break;
	case KO_OPT_MES:
		ptr->pattern = sound_output;
		break;
	case KO_OPT_LOGO:
		TexBuffLoad_p(GetTBPointer(TexList_option_logo),0);
		break;
	case KO_GAME_TA_RANK:/* タイムアタック５位以内に入ったときファンファーレ */
		rankin_fanfare = 0;
		break;
	case KO_END1_FACE:
		{
			int loser_flg,b;
			TexBlockSeq *ts_ptr;

			//b = 0;/* とりあえず１Pということで */
			a = driver2pselset[resultstat.driver];

			if (resultstat.rank >= 3)
				loser_flg = 1;
			else
				loser_flg = 0;

			if (loser_flg)
				ts_ptr = TBSeq_psel_p6[a];
			else
				ts_ptr = TBSeq_psel[a];
			
			ptr->sd_number = SetSeqData2((TexBlockSeq *)GetVAddress(ts_ptr),0);
		}
		TexBuffLoad_p(GetTBPointer(TexList_name_plates[a]),0);
		//TexBuffLoad(GetTBPointer(TexList_psel_cursors[kind-KO_GAME_VS_1P]));
		break;
	case KO_SR_A1:
	case KO_SR_A2:
	case KO_SR_B1:
	case KO_SR_B2:
	case KO_SR_C1:
	case KO_SR_C2:
	case KO_SR_D1:
	case KO_SR_D2:
	case KO_SR_E1:
	case KO_SR_E2:
	case KO_SR_E3:
	case KO_SR_E4:
	case KO_SR_E5:
	case KO_SR_E6:
	case KO_SR_E7:
	case KO_SR_F1:
	case KO_SR_F2:
	case KO_SR_F3:
	case KO_SR_F4:
	case KO_SR_G1:
	case KO_SR_G2:
	case KO_SR_H1:
	case KO_SR_H2:
	case KO_SR_H3:
	case KO_SR_H4:
	case KO_SR_H5:
	case KO_SR_H6:
	case KO_SR_H7:
	case KO_SR_H8:
	case KO_SR_I1:
	case KO_SR_I2:
	case KO_SR_I3:
	case KO_SR_I4:
	case KO_SR_J1:
	case KO_SR_J2:
	case KO_SR_K1:
	case KO_SR_K2:
	case KO_SR_K3:
	case KO_SR_L1:
	case KO_SR_L2:
	case KO_SR_L3:
	case KO_SR_L4:
	case KO_SR_L5:
	case KO_SR_L6:
	case KO_SR_L7:
	case KO_SR_M1:
	case KO_SR_M2:
	case KO_SR_M3:
	case KO_SR_M4:
	case KO_SR_N1:
	case KO_SR_N2:
	case KO_SR_N3:
	case KO_SR_O1:
	case KO_SR_O2:
	case KO_SR_O3:
	case KO_SR_O4:
	case KO_SR_O5:
	case KO_SR_O6:
	case KO_SR_O7:
	case KO_SR_O8:
	case KO_SR_O9:
	case KO_SR_P1:
	case KO_SR_Q1:
		break;
		/*以下、特に何を設定するという事はなし*/
	//case KO_GAME_CUP:
	//case KO_NOCONTROLLER:
	//case KO_GAME_CIRCUIT:
	//case KO_GAME_CUT_UD:
	//case KO_GAME_TIME:
	//case KO_GAME_POINT:
	//case KO_GAME_GPLOSE:
	//case KO_GAME_INFO3P:
	//case KO_GAME_VS_RES:
	//case KO_GAME_TA1:
	//case KO_GAME_TA2:
	//case KO_GAME_TA_MES1:
	//case KO_GAME_PAUSE:
	//case KO_GAME_TA_REP:
	//case KO_MSEL_BTMES:
	//case KO_DSEL_SEL1:
	//case KO_DSEL_SEL2:
	//case KO_DSEL_SEL3:
	//case KO_GSEL_CAUTION:
	//case KO_TA_LOSTGHOST:
	//case KO_END1_FADE:
	//case KO_END1_MES1:
	//case KO_END1_MES2:
	//case KO_END1_MES3:
	//case KO_END1_MES4:
	//case KO_TITLE_TIME:
	default:
		break;
	}
		
}

void DispOBJBlock(OBJBlock *ptr)
{
	int a,b;
	P_COLOR *col_ptr;
	POS_XY *pos_ptr;
	TexBlock *tb_ptr;

	if (!ptr->disp_on)
		return;
	gDPPipeSync(graphPtr++);
	switch(ptr->kind){
	case KO_NINTEN_LOGO:
		doNintenLogo(dynamicp,ptr->work1);
		break;
	case KO_CHECKER_FLAG:
		doCheckerFlag(dynamicp,ptr->work1);
		break;
#if FONT_TEST_ON_TITLE
	case KO_TEST_CPFONT:
		graphPtr = FillRect1Color(graphPtr,
								  ptr->disp_x,ptr->disp_y,
								  56+ptr->disp_x,152+ptr->disp_y,
								  1,1,1,255);
		graphPtr = doTexList(graphPtr,TexList_cp_font_all,
							 ptr->disp_x,ptr->disp_y);
		break;
#endif
	//case KO_CP_CSCOLOR:
	//	break;
	case KO_CP_BG1:
		graphPtr = KDL_call(graphPtr,TexList_cp_bg1);
		break;
	case KO_CP_BG2:
		graphPtr = KDL_call(graphPtr,TexList_cp_bg2);
		break;
	case KO_CP_GNOTE:
		DispOB_cp_gnote(ptr);
		DispOB_cp_notecursor(ptr);
		DispOB_cp_gnote_name(ptr);
		break;
	case KO_CP_MES1:
		gDPSetPrimColor(graphPtr++,0,0, 0,0,0,255);
		graphPtr = KDL_call(graphPtr,TexList_cp_mes1_shadow);
		gDPSetPrimColor(graphPtr++,0,0, 50,0,0,255);
		graphPtr = KDL_call(graphPtr,TexList_cp_mes1_red);
		gDPSetPrimColor(graphPtr++,0,0, 0,50,0,255);
		graphPtr = KDL_call(graphPtr,TexList_cp_mes1_green);
		gDPSetPrimColor(graphPtr++,0,0, 50,50,0,255);
		graphPtr = KDL_call(graphPtr,TexList_cp_mes1_yellow);
		break;
	case KO_CP_MES2:
		doSeqData2(ptr->sd_number,ptr->disp_x,ptr->disp_y,-1);
		break;
	case KO_CP_FREE:
		DispOB_cp_free();
		break;
	case KO_CP_CURSOR1:
	case KO_CP_CURSOR2:
		DispOB_cp_cursor(ptr,ptr->kind - KO_CP_CURSOR1);
		break;
	case KO_TITLE:
		/*graphPtr = doTexList(graphPtr,TexList_titleback,*/
		graphPtr = doTexList(graphPtr,
							 TexList_titlebacks[Check4GoldCup_150cc()],
							 ptr->disp_x,ptr->disp_y);
		break;
	case KO_TITLE2:
		kwdisplay_titlelogo(ptr->disp_x+160,ptr->disp_y+71);
		graphPtr = doTexList(graphPtr,TexList_titlelogo,
							 ptr->disp_x,ptr->disp_y);
		break;
	case KO_TITLE3:
		if ((frame_counter/8)%3){
			graphPtr = doTexList(graphPtr,TexList_titlelogo2,
								 ptr->disp_x,ptr->disp_y);
		}
		//PRINTF("x:%d,y:%d\n",ptr->disp_x,ptr->disp_y);
		break;
	case KO_TITLE_TIME:
		{
			char let[5];
			int time,x,y;
			int w;
			float mul1;

			mul1 = 0.9;
			w = (GetWordLength(circuit_name_j[0])+5)*mul1;
			x = 160;
			y = 140;
			graphPtr = FillRect1Color_f(graphPtr,
										x-w/2,y-17,
										x+w/2,y+24,
										0,0,0,150);
			SetPalette(1);
			SetWord3_ac(160,140,circuit_name_j[0],0,mul1,mul1);

			mul1 = 1.0;
			x = 80;
			y = 160;
			time = GetRecordTime3(0,7) & 0x000fffff;
			if (time < 7850)
				SetPalette((frame_counter % 2));
			else{
				if (time <= 9000)
					SetPalette(frame_counter % 3);
				else
					SetPalette(3);
			}					
			kawano_itoa_m(time,let);
			SetWord4_a(x+39,y,let,0,mul1,mul1);
			SetWord2_a(x+59,y,"'",0,mul1,mul1);
			kawano_itoa_s(time,let);
			SetWord4_a(x+68,y,let,0,mul1,mul1);
			SetWord2_a(x+87,y,"\"",0,mul1,mul1);
			kawano_itoa_c(time,let);
			SetWord4_a(x+100,y,let,0,mul1,mul1);
		}
			
		break;
	case KO_NOCONTROLLER:
		{
			int box_x,box_y,box_w,box_h;
			int l_1,l_2;
			float mul1;

			mul1 = 0.8;
			l_1 = GetWordLength(no_controller_message[0]);
			l_2 = GetWordLength(no_controller_message[1]);
			if (l_1 < l_2)
				l_1 = l_2;
			box_x = 160;
			box_y = 180;
			box_w = (l_1+30)*mul1;
			box_h = 16*(mul1*2+0.5);
			graphPtr = FillRect1Color_f(graphPtr,
										box_x-box_w/2,box_y-box_h/2+2,
										box_x+box_w/2,box_y+box_h/2+2,
										0,0,0,150);
			SetPalette(4);
			for (l_1 = 0;l_1 < 2;l_1++)
				SetWord3_ac(box_x-3*mul1,box_y+18*l_1*mul1,
							no_controller_message[l_1],0,mul1,mul1);
		}
		break;
	case KO_GSEL_BACK:
	case KO_PSEL_BACK:
	case KO_MSEL_BACK:
		graphPtr = doTexList2(graphPtr,
							  TexList_titlebacks[Check4GoldCup_150cc()],
							  ptr->disp_x,ptr->disp_y,3,0);
		break;
	case KO_GSEL_LOGO:
		graphPtr = doTexList(graphPtr,TexList_lgsel_logo,
							 ptr->disp_x,ptr->disp_y);
		break;
	case KO_GSEL_1P:
	case KO_GSEL_2P:
	case KO_GSEL_3P:
	case KO_GSEL_4P:
		a = ptr->kind - KO_GSEL_1P;
		gsel_sub1(a,ptr);
		DispOB_Sub_gsel1(ptr,a);
		break;
	case KO_GSEL_OK:
		sel_ok_sub(ptr);
		graphPtr = doTexList2(graphPtr,TexList_lgsel_ok,
							 ptr->disp_x,ptr->disp_y,2,ptr->work1);
		break;
	case KO_GSEL_OPTION:
	case KO_GSEL_RECORD:
		a = ptr->kind - KO_GSEL_OPTION + 1;
		if (ptr->work1 < 32){
			b = (57+1)*ptr->work1/64;
			if (gsel_mode == a){
				graphPtr = FlashRectangle2f(graphPtr,
										   ptr->disp_x+b,ptr->disp_y,
										   57+ptr->disp_x-b,18+ptr->disp_y);
			}
			else{
				graphPtr = FillRect1Color(graphPtr,
										  ptr->disp_x+b,ptr->disp_y,
										  57+ptr->disp_x-b,18+ptr->disp_y,
										  1,1,1,255);
			}
		}
		b = ptr->kind - KO_GSEL_LOGO;
		graphPtr = doTexList2(graphPtr,TexLists_gsel[b],
							  ptr->disp_x,ptr->disp_y,2,ptr->work1);
		break;
	case KO_GSEL_50CC:
	case KO_GSEL_100CC:
	case KO_GSEL_150CC:
	case KO_GSEL_PRO:
	case KO_GSEL_ITEMOFF:
	case KO_GSEL_ITEMON:
	case KO_GSEL_TRY:
	//case KO_GSEL_GHOST:
	case KO_GSEL_DATA:
		a = popup_status[players-1][play_mode[players-1]];
		b = game_mode_chart[players-1][play_mode[players-1]];
		switch(ptr->kind){
		case KO_GSEL_50CC:
		case KO_GSEL_100CC:
		case KO_GSEL_150CC:
		case KO_GSEL_PRO:
			switch(b){
			case GRANDPRIX:
			case VSBATTLE:
				break;
			default:
				a = -1;
				break;
			}
			b = KO_GSEL_50CC;
			tb_ptr = GetTBPointer(TexList_gsel_pop_gp
								  [ptr->kind - KO_GSEL_50CC]);
			break;
		case KO_GSEL_ITEMOFF:
		case KO_GSEL_ITEMON:
			if (b != VSBATTLE){
				a = -1;
				break;
			}
			b = KO_GSEL_ITEMON;
			tb_ptr = GetTBPointer(TexList_gsel_pop_vs
								  [ptr->kind - KO_GSEL_ITEMON]);
			break;
		case KO_GSEL_TRY:
		//case KO_GSEL_GHOST:
		case KO_GSEL_DATA:
			if (b != TIMEATTACK){
				a = -1;
				break;
			}
			b = KO_GSEL_TRY;
			tb_ptr = GetTBPointer(TexList_gsel_pop_time_attack
								  [ptr->kind - KO_GSEL_TRY]);
			break;
		default:
			break;
		}
		if (a == -1)
			break;
		if ((gsel_mode >= GSEL_POPUP)&&(a == ptr->kind - b)){
			if (gsel_mode > GSEL_POPUP)
				graphPtr = FillRect1Color(graphPtr,
										  ptr->disp_x,ptr->disp_y,
										  63+ptr->disp_x,17+ptr->disp_y,
										  255,249,220,255);
			else
				graphPtr = FlashRectangle2(graphPtr,
										   ptr->disp_x,ptr->disp_y,
										   63+ptr->disp_x,17+ptr->disp_y);
		}
		else{
			graphPtr = FillRect1Color(graphPtr,
									  ptr->disp_x,ptr->disp_y,
									  63+ptr->disp_x,17+ptr->disp_y,
									  1,1,1,255);
		}
		graphPtr = doTexList(graphPtr,tb_ptr,
							 ptr->disp_x,ptr->disp_y);
		break;
	case KO_GSEL_CAUTION:
		DispOB_Sub_gsel_caution(ptr);
		break;
	case KO_PSEL_LOGO:
		graphPtr = doTexList(graphPtr,TexList_lpsel_logo,
							 ptr->disp_x,ptr->disp_y);
		break;
	case KO_PSEL_1P:
	case KO_PSEL_2P:
	case KO_PSEL_3P:
	case KO_PSEL_4P:
		b = ptr->kind - KO_PSEL_1P;
		if (player_cursor[b]){
			if (!player_cursor_set_flg[b])
				a = 255;
			else{
				a = frame_counter%16;
				if (a > 7)
					a = (16-a) * 8;
				else
					a = a * 8;
				a += 191;
			}
			DispOB_Sub_psel_cursor(ptr,b,a);
		}
		break;
	case KO_PSEL_OK:
		sel_ok_sub(ptr);
		graphPtr = doTexList2(graphPtr,TexList_lpsel_ok,
							  ptr->disp_x,ptr->disp_y,2,ptr->work1);
		break;
	case KO_PSEL_MA:
	case KO_PSEL_LU:
	case KO_PSEL_PE:
	case KO_PSEL_KI:
	case KO_PSEL_YO:
	case KO_PSEL_KA:
	case KO_PSEL_WA:
	case KO_PSEL_KU:
		DispOB_Sub_psel1(ptr,
						 GetTBPointer(TexList_name_plates
									  [ptr->kind - KO_PSEL_MA]));
	case KO_GAME_MA:
	case KO_GAME_LU:
		doSeqData2(ptr->sd_number,ptr->disp_x,ptr->disp_y,ptr->work1);
		//DispOB_Sub_psel2(ptr);/* 選んでないところを暗くする */
		break;
#if 0
	case KO_MSEL_KNAME:
		msel_sub2(ptr);
		graphPtr = doTexList2(graphPtr,
							  GetTBPointer(TexLists_msel
										   [ptr->kind - KO_MSEL_LOGO]),
							  ptr->disp_x,ptr->disp_y,4,frame_counter%32);
		break;
#else
		case KO_MSEL_KNAME:
#endif
	case KO_MSEL_FNAME:
	case KO_MSEL_SNAME:
	case KO_MSEL_SPNAME:
	case KO_MSEL_BATTLE:
		msel_sub2(ptr);
		graphPtr = doTexList(graphPtr,
							 GetTBPointer(TexLists_msel
										  [ptr->kind - KO_MSEL_LOGO]),
							 ptr->disp_x,ptr->disp_y);
		//msel_sub3(ptr);
		msel_sub4(ptr);
		break;
	case KO_MSEL_LOGO:
		graphPtr = doTexList(graphPtr,
							 GetTBPointer(TexLists_msel
										  [ptr->kind - KO_MSEL_LOGO]),
							 ptr->disp_x,ptr->disp_y);
		break;
#if 0
	case KO_MSEL_MAP:/* 現在不使用 */
		doSeqData2a(ptr->sd_number,23,112,-1);
		break;
#endif
	//case KO_MSEL_MAPMAN:
	//	break;
	case KO_MSEL_MAP1:
	case KO_MSEL_MAP2:
	case KO_MSEL_MAP3:
	case KO_MSEL_MAP4:
		//if ((msel_mode == MSEL_OK) && (game_mode == MARIOGP)){
		//	pos_ptr = &msel_map4box_position[ptr->kind - KO_MSEL_MAP1];
		//	doSeqData2(ptr->sd_number,pos_ptr->x,pos_ptr->y,-2);
		//}
		//else
		//	doSeqData2(ptr->sd_number,23,112,-1);
		DispOB_Sub_msel_map(ptr);
		break;
	case KO_MSEL_KCUP:
	case KO_MSEL_FCUP:
	case KO_MSEL_SCUP:
	case KO_MSEL_SPCUP:
		a = ptr->kind - KO_MSEL_KCUP;
		msel_sub1(a,ptr);
		DispOB_Sub_msel1(ptr,a);
		break;
	case KO_MSEL_OK:
		sel_ok_sub(ptr);
		graphPtr = doTexList2(graphPtr,TexList_lmsel_ok,
							  ptr->disp_x,ptr->disp_y,2,ptr->work1);
		break;
	case KO_MSEL_BRECORD:
	case KO_MSEL_BLAP:
		msel_bbox_sub(ptr);
		SetPalette(3);
		SetWord2_a(ptr->disp_x+8,ptr->disp_y+16,
					bestrec_j[ptr->kind - KO_MSEL_BRECORD],0,0.8,0.8);
		msel_bbox_sub2(ptr); 
		break;
	case KO_MSEL_BTMES:
		msel_battle_sub(ptr);
		break;
	case KO_MSEL_CUP:
		DispOB_Sub_msel_cup(ptr);
		break;
	case KO_MSEL_LEVEL:
		graphPtr = FillRect1Color(graphPtr,
								  ptr->disp_x,ptr->disp_y,
								  63+ptr->disp_x,17+ptr->disp_y,
								  1,1,1,255);
		graphPtr = doTexList(graphPtr,
							 GetTBPointer(TexList_gsel_pop_gp[race_level]),
							 ptr->disp_x,ptr->disp_y);
		break;
	case KO_MSEL_GHOST:
		DispOB_Sub_msel_ghost(ptr);
		break;
	case KO_TSEL_KCUP:
	case KO_TSEL_FCUP:
	case KO_TSEL_SCUP:
	case KO_TSEL_SPCUP:
		a = ptr->kind - KO_TSEL_KCUP;
		tsel_sub1(a,ptr);
		DispOB_Sub_msel1(ptr,a);
		break;
	case KO_TSEL_TITLE:
		if ((gsel_mode >= GSEL_POPUP)&&(a == ptr->kind - b)){
			if (gsel_mode > GSEL_POPUP)
				graphPtr = FillRect1Color(graphPtr,
										  ptr->disp_x,ptr->disp_y,
										  63+ptr->disp_x,17+ptr->disp_y,
										  255,249,220,255);
			else
				graphPtr = FlashRectangle2(graphPtr,
										   ptr->disp_x,ptr->disp_y,
										   63+ptr->disp_x,17+ptr->disp_y);
		}
		else{
			graphPtr = FillRect1Color(graphPtr,
									  ptr->disp_x,ptr->disp_y,
									  63+ptr->disp_x,17+ptr->disp_y,
									  1,1,1,255);
		}
		graphPtr = doTexList(graphPtr,TexList_lgsel_data,
							 ptr->disp_x,ptr->disp_y);
		SetPalette(3);
		SetWord3_a(296,28,tsel_title_j,0,.65,.65);
		break;
	case KO_TSEL_CURSOR:
		DispOB_Sub_tsel_cursor(ptr);
		break;	
	case KO_TSEL_KCUP1:
	case KO_TSEL_KCUP2:
	case KO_TSEL_KCUP3:
	case KO_TSEL_KCUP4:
	case KO_TSEL_FCUP1:
	case KO_TSEL_FCUP2:
	case KO_TSEL_FCUP3:
	case KO_TSEL_FCUP4:
	case KO_TSEL_SCUP1:
	case KO_TSEL_SCUP2:
	case KO_TSEL_SCUP3:
	case KO_TSEL_SCUP4:
	case KO_TSEL_SPCUP1:
	case KO_TSEL_SPCUP2:
	case KO_TSEL_SPCUP3:
	case KO_TSEL_SPCUP4:
		DispOB_Sub_tsel1(ptr);
		break;
	case KO_GAME_CUP:
		SetPalette(4);
		SetWord3_a(ptr->disp_x,ptr->disp_y,cup_name[cup_level],ptr->work1,
				   ptr->workf1,1.0);
		break;
	case KO_GAME_CIRCUIT:
		SetPalette(5);
		SetWord2_a(ptr->disp_x,ptr->disp_y,
					circuit_name[map_number],ptr->work1,
					ptr->workf1,1.0);
		break;
	case KO_GAME_CUT_UD:
		Cut_ud_sub(ptr);
		break;
	case KO_MSEL_NOISE:
		graphPtr = AutoTextureRect_noise(graphPtr,25,114,124,74);
		break;
	case KO_GAME_TIME:
		DispOB_result_time(ptr);
		break;
	case KO_GAME_POINT:
	    //if (contOR->status & CONT_L)
			DispOB_result_point(ptr);
		break;
	case KO_GAME_GPLOSE:
		DispOB_gp_lose(ptr);
		break;
	case KO_GAME_INFO3P:
		DispOB_info_3p(ptr);
		break;
	case KO_GAME_VS_RES:
		DispOB_vs_result(ptr);
		break;
	case KO_GAME_VS_1P:
	case KO_GAME_VS_2P:
	case KO_GAME_VS_3P:
	case KO_GAME_VS_4P:
		if (!ptr->pattern)/* 1フレーム目は表示しない */
			break;
		b = ptr->kind - KO_GAME_VS_1P;
		a = driver2pselset[player_driver[b]];
		graphPtr = doTexList(graphPtr,GetTBPointer(TexList_name_plates[a]),
							 ptr->disp_x,ptr->disp_y);
		doSeqData2_vs(ptr->sd_number,ptr->disp_x,ptr->disp_y,b,ptr->work1);
		DispOB_Sub_psel_cursor(ptr,b,255);
		break;
	case KO_GAME_TA1:
		DispOB_timeattack1(ptr);
		break;
	case KO_GAME_TA2:
		DispOB_timeattack2(ptr);
		break;
	case KO_GAME_TA_MES1:
		DispOB_timeattack_message1(ptr);
		break;
	case KO_GAME_PAUSE:
		DispOB_pause(ptr);
		break;
	case KO_GAME_TA_REP:
		DispOB_ta_replay(ptr);
		break;
	case KO_DSEL_SNAP:
		DispOB_Sub_dsel_snap(ptr);
		break;
	case KO_DSEL_MES1:
		DispOB_Sub_dsel_mes1(ptr);
		break;
	case KO_DSEL_SEL1:
		DispOB_Sub_dsel_sel1(ptr);
		break;
	case KO_DSEL_SEL2:
		DispOB_Sub_dsel_sel2(ptr);
		break;
	case KO_DSEL_SEL3:
		DispOB_Sub_dsel_sel3(ptr);
		break;
	case KO_OPT_MES:
		DispOB_Sub_option_messages(ptr);
		break;
	case KO_OPT_LOGO:
		graphPtr = doTexList(graphPtr,TexList_option_logo,
							 ptr->disp_x,ptr->disp_y);
		break;
	case KO_TA_LOSTGHOST:
		DispOB_ta_lostghost(ptr);
		break;
	case KO_END1_FADE:
		DispOB_ending1_halffade(ptr);
		break;
	case KO_END1_MES1:
		DispOB_ending1_message1(ptr);
		break;
	case KO_END1_MES2:
		DispOB_ending1_message2(ptr);
		break;
	case KO_END1_MES3:
		DispOB_ending1_message3(ptr);
		break;
	case KO_END1_MES4:
		DispOB_ending1_message4(ptr);
		break;
	case KO_END1_FACE:
		if (!ptr->pattern)/* 1フレーム目は表示しない */
			break;
		b = 0;
		a = driver2pselset[resultstat.driver];
		graphPtr = doTexList(graphPtr,GetTBPointer(TexList_name_plates[a]),
							 ptr->disp_x,ptr->disp_y);
		doSeqData2_vs(ptr->sd_number,ptr->disp_x,ptr->disp_y,b,ptr->work1);
		//DispOB_Sub_psel_cursor(ptr,b,255);
		break;
	case KO_SR_A1:
	case KO_SR_A2:
	case KO_SR_B1:
	case KO_SR_B2:
	case KO_SR_C1:
	case KO_SR_C2:
	case KO_SR_D1:
	case KO_SR_D2:
	case KO_SR_E1:
	case KO_SR_E2:
	case KO_SR_E3:
	case KO_SR_E4:
	case KO_SR_E5:
	case KO_SR_E6:
	case KO_SR_E7:
	case KO_SR_F1:
	case KO_SR_F2:
	case KO_SR_F3:
	case KO_SR_F4:
	case KO_SR_G1:
	case KO_SR_G2:
	case KO_SR_H1:
	case KO_SR_H2:
	case KO_SR_H3:
	case KO_SR_H4:
	case KO_SR_H5:
	case KO_SR_H6:
	case KO_SR_H7:
	case KO_SR_H8:
	case KO_SR_I1:
	case KO_SR_I2:
	case KO_SR_I3:
	case KO_SR_I4:
	case KO_SR_J1:
	case KO_SR_J2:
	case KO_SR_K1:
	case KO_SR_K2:
	case KO_SR_K3:
	case KO_SR_L1:
	case KO_SR_L2:
	case KO_SR_L3:
	case KO_SR_L4:
	case KO_SR_L5:
	case KO_SR_L6:
	case KO_SR_L7:
	case KO_SR_M1:
	case KO_SR_M2:
	case KO_SR_M3:
	case KO_SR_M4:
	case KO_SR_N1:
	case KO_SR_N2:
	case KO_SR_N3:
	case KO_SR_O1:
	case KO_SR_O2:
	case KO_SR_O3:
	case KO_SR_O4:
	case KO_SR_O5:
	case KO_SR_O6:
	case KO_SR_O7:
	case KO_SR_O8:
	case KO_SR_O9:
	case KO_SR_P1:
	case KO_SR_Q1:
		DispOB_staffroll_messages(ptr);
		break;
	//case KO_GAME_TA_SORT:
	//case KO_GAME_TA_RANK:
	default:
		break;
	}
}

void Set_cp_font(uchar code,int x,int y)
{
	if (code < 0x10)
		return;

	code -= 0x10;
	if (code > 132)
		return;
	graphPtr = doTexList(graphPtr,GetTBPointer(TexList_cp_fonts[code]),x,y);
	
}

int Set_cp_gnote_name(char *str,int str_length,int x,int y)
{
	int name_length,disp_x;

	name_length = 0;
	disp_x = x;

	while(str_length){
		if (*str)
			name_length++;
		Set_cp_font((uchar)*str++,disp_x,y);
		disp_x += 8;
		str_length--;
	}
	
	return(name_length);
}

void DispOB_cp_gnote(OBJBlock *ptr)
{
	int i;

	gDPSetScissor(graphPtr++,G_SC_NON_INTERLACE,0,0,319,CP_GNOTE_Y+10*9-1);
	for (i = 0;i < 9;i ++){
		if (!cp_gnote_scroll_req && (i == 0||i == 8))
			continue;
		graphPtr = doTexList(graphPtr,TexList_cp_gnote,
							 32,i*10 + ptr->disp_y);
	}
		
}

void DispOB_cp_notecursor(OBJBlock *ptr)
{
	OBJBlock *ptr2;

	ptr2 = Get_OBJBlock_ptr(KO_CP_CSCOLOR);

	switch(cp_mode){
	case CP_MENU_SELECT:
	case CP_MENU_END:
		break;
	default:
		gDPSetPrimColor(graphPtr++,0,0, 255,ptr2->work2,0,255);
		graphPtr = doTexList(graphPtr,TexList_cp_notecursor,
							 36,cp_gnote_cursor*10 + 124);
		break;
	}
	
}

void DispOB_cp_gnote_name(OBJBlock *ptr)
{
	int i,num,wx,wy;
	char *gnote_num_ptr;
	char test_buff[16];
	OSPfsState *pfs_state_ptr;

	gDPSetPrimColor(graphPtr++,0,0, 0,0,50,255);

	for (i = 0,gnote_num_ptr = cp_gnote_number;i < 9;i++,gnote_num_ptr++){
		if (!(*gnote_num_ptr))
			continue;

		num = *gnote_num_ptr;
		if (num < 10)
			Set_cp_font(num + 0x10,32+18,ptr->disp_y + 10*i + 1);
		else{
			num %= 10;
			Set_cp_font(num + 0x10,32+18+3,ptr->disp_y + 10*i + 1);
			Set_cp_font(0x11      ,32+18-3,ptr->disp_y + 10*i + 1);
		}

		wy = ptr->disp_y + 10*i + 1;
#if FONT_TEST_ON_CPACK
		if (cont1P->status & CONT_R){
			for(num = 0;num < 16;num++)
				test_buff[num] = 0x10 + num + ((*gnote_num_ptr)-1)*0x10;
			Set_cp_gnote_name(test_buff,16,32+47,wy);
		}
		else
#endif
		{
			if (!pfsStateRet[(*gnote_num_ptr)-1]){
				pfs_state_ptr = &pfsState[(*gnote_num_ptr)-1];
				num = Set_cp_gnote_name(pfs_state_ptr->game_name,16,32+47,wy);
				if (pfs_state_ptr->ext_name[0]){
					Set_cp_font(0x3c,32+47+8*num,wy);
					Set_cp_font(pfs_state_ptr->ext_name[0],32+47+8*(num+1),wy);
				}
				num = (int)((pfs_state_ptr->file_size + 255)>>8);
				wx = 16;
				do{
					Set_cp_font((num%10)+0x10,32+221+wx,wy);
					num /= 10;
					wx -= 8;
				}while(num);
			}
		}
	}

	gDPSetScissor(graphPtr++,G_SC_NON_INTERLACE,0,0,319,239);
}

void DispOB_cp_free(void)
{
	int number,disp_number,x,y;

	number = pfsFreeBlocks;
	x = 272;
	y = 184;

	do{
		disp_number = number % 10;
		number /= 10;
		graphPtr = doTexList(graphPtr,
							 GetTBPointer(TexList_cp_numbers[disp_number]),
							 x,y);
		x -= 9;		
	}while(number);
}

void DispOB_cp_cursor(OBJBlock *ptr,int num)
{
	int i;
	POS_XY *pos_ptr;
	OBJBlock *ptr2;

	ptr2 = Get_OBJBlock_ptr(KO_CP_CSCOLOR);

	if (num == 0){
		if (cp_mode == CP_MENU_END)
			i = 1;
		else
			i = 0;
	}
	else{
		switch(cp_mode){
		case CP_MENU_OK:
		case CP_MENU_CANCEL:
			i = num*2 + cp_mode - CP_MENU_OK;
			break;
		default:
			return;
		}
	}
	pos_ptr = &cp_cursor_position[i];

	//PRINTF("work=%d\n",ptr2->work2);
	gDPSetPrimColor(graphPtr++,0,0, 255,ptr2->work2,0,255);
	graphPtr = doTexList(graphPtr,TexList_cp_cursor,pos_ptr->x,pos_ptr->y);
	
}

void DispOB_Sub_gsel1(OBJBlock *ptr,int num)
{
	switch(ptr->pattern){
	case 0:
	case 2:
	case 3:
		graphPtr = doTexList(graphPtr,
							 GetTBPointer(TexList_gsel_boxes[num*2]),
							 ptr->disp_x,ptr->disp_y);
		graphPtr = doTexList(graphPtr,
							 GetTBPointer(TexList_gsel_boxes[num*2+1]),
							 ptr->disp_x,ptr->disp_y);
		break;
	case 1:
	case 4:
		graphPtr = doTexList2(graphPtr,
							  GetTBPointer(TexList_gsel_boxes[num*2]),
							  ptr->disp_x,ptr->disp_y,2,ptr->work1);
		graphPtr = doTexList2(graphPtr,
							  GetTBPointer(TexList_gsel_boxes[num*2+1]),
							  ptr->disp_x,ptr->disp_y,2,ptr->work1);
		break;
	}
}

void DispOB_Sub_gsel_caution(OBJBlock *ptr)
{
	int a,i;
	float mul1;
#if CANNOT_GHOST_SAVE_SWITCH
	/* ゴーストがセーブできるようになるまではメッセージは表示しない */
	return;
#endif
	switch(ptr->pattern){
	case KSEQ_GCAU_MES1:
	case KSEQ_GCAU_MES2:
	case KSEQ_GCAU_MES3:
	case KSEQ_GCAU_MES4:
		graphPtr = FillRect1Color(graphPtr,
								  160-130,50,160+130,110,
								  0,0,0,255);

		mul1 = 0.75;
		a = ptr->pattern - KSEQ_GCAU_MES1;
		SetPalette(3);
		for (i = 0;i < 4;i++){
			SetWord2_a(35,65+i*13,
					   gsel_caution_messages_j[a*4 + i],0,
					   mul1,mul1);
		}
		break;
	}
}

void DispOB_Sub_psel_cursor(OBJBlock *ptr,int num,int alpha)
{
	P_COLOR *col_ptr;

	col_ptr = &psel_cursor_color[num];
	gDPSetPrimColor(graphPtr++,0,0,
					col_ptr->r,col_ptr->g,
					col_ptr->b,col_ptr->a);
	gDPSetEnvColor(graphPtr++,alpha,alpha,alpha,0);
	graphPtr = doTexList(graphPtr,
						 GetTBPointer(TexList_psel_cursors[num]),
						 ptr->disp_x,ptr->disp_y);
}



void DispOB_Sub_psel1(OBJBlock *ptr,TexBlock *tp)
{
	switch(ptr->pattern){
	case 0:
	case 2:
	case 4:
		graphPtr = doTexList(graphPtr,tp,ptr->disp_x,ptr->disp_y);
		break;
	case 1:
	case 3:
		//graphPtr = doTexList2(graphPtr,tp,
		//					  ptr->disp_x,ptr->disp_y,1,ptr->work1);
		graphPtr = doTexList2(graphPtr,tp,
							  ptr->disp_x,ptr->disp_y,2,ptr->work1);
		break;
	}
}

void DispOB_Sub_psel2(OBJBlock *ptr)
{
	int i;

	if (Get_psel_cursor_number(ptr->kind - KO_PSEL_MA) >= 0)
		return;
	switch(ptr->pattern){
	case 0:
	case 2:
	case 4:
		graphPtr = FillRect1Color_f(graphPtr,
									ptr->disp_x,ptr->disp_y,
									ptr->disp_x+64,ptr->disp_y+76/*64*/,
									0,0,0,100);
		break;
	case 1:
	case 3:
		i = ptr->work1;
		graphPtr = FillRect1Color_f(graphPtr,
									ptr->disp_x+i,ptr->disp_y,
									ptr->disp_x+64-i,ptr->disp_y+76/*64*/,
									0,0,0,100);
		break;
	}
}

void DispOB_Sub_msel1(OBJBlock *ptr,int num)
{
	switch(ptr->pattern){
	case 0:
	case 2:
	case 3:
		graphPtr = doTexList(graphPtr,
							 GetTBPointer(TexLists_msel[num+1]),
							 ptr->disp_x,ptr->disp_y);
		break;
	case 1:
	case 4:
		graphPtr = doTexList2(graphPtr,
							  GetTBPointer(TexLists_msel[num+1]),
							  ptr->disp_x,ptr->disp_y,2,ptr->work1);
		break;
	}
}

void DispOB_Sub_msel_map(OBJBlock *ptr)
{
	OBJBlock *ptr2;
	POS_XY *pos_ptr;
	int stat;

	stat = 0;
	ptr2 = Get_OBJBlock_ptr(KO_MSEL_MAPMAN);
	switch(ptr2->pattern){
	case 0:
	case 1:
		stat = 0;
		break;
	case 2:
		if (ptr2->work1%4 == ptr->kind - KO_MSEL_MAP1)
			stat = 0;
		else
			stat = 1;
		break;
	case 3:
		stat = 1;
		break;
	default:
		break;
	}
	switch(stat){
	case 0:
		doSeqData2(ptr->sd_number,23,112,-1);
		break;
	case 1:
		pos_ptr = &msel_map4box_position[ptr->kind - KO_MSEL_MAP1];
		doSeqData2(ptr->sd_number,pos_ptr->x,pos_ptr->y,-2);
		break;
	}
}

void DispOB_Sub_tsel1(OBJBlock *ptr)
{
	int num;

	num = map_number_chart
		[(ptr->kind-KO_TSEL_KCUP1)/4][(ptr->kind-KO_TSEL_KCUP1)%4];
	graphPtr = doTexList5(graphPtr,
						  GetTBPointer(TexList_msel_maps[num]),
						  ptr->disp_x,ptr->disp_y,2);
	graphPtr = FillRect1Color_f(graphPtr,
								ptr->disp_x,ptr->disp_y+39,
								ptr->disp_x+64,ptr->disp_y+39+9,
								0,0,0,255);
	graphPtr = doTexList5(graphPtr,
						  GetTBPointer(TexList_msel_mapnames[num]),
						  ptr->disp_x,ptr->disp_y+39,3);
	if (CheckSameMap2(ptr->kind - KO_TSEL_KCUP1) >= 0){
		graphPtr = FlashRectangle2(graphPtr,
								   ptr->disp_x+32,ptr->disp_y,
								   ptr->disp_x+63,9+ptr->disp_y);
		graphPtr = doTexList5(graphPtr,
							 GetTBPointer(TexList_lgsel_ghost),
							 ptr->disp_x+32,ptr->disp_y,2);
	}
}

//
// tsel用カーソル
//
void DispOB_Sub_tsel_cursor(OBJBlock *ptr)
{
	P_COLOR *col_ptr1,*col_ptr2;
	int r,g,b,a;
	int w;

	col_ptr1 = &tsel_cursor_color[ptr->work2];
	col_ptr2 = &tsel_cursor_color[(ptr->work2+1)%3];
	w = 256-ptr->work1;
	r = (col_ptr1->r*w + col_ptr2->r*ptr->work1)/256;
	g = (col_ptr1->g*w + col_ptr2->g*ptr->work1)/256;
	b = (col_ptr1->b*w + col_ptr2->b*ptr->work1)/256;
	a = (col_ptr1->a*w + col_ptr2->a*ptr->work1)/256;
	gDPSetPrimColor(graphPtr++,0,0,r,g,b,a);
	graphPtr = doTexList(graphPtr,
						 GetTBPointer(TexList_tsel_cursor),
						 ptr->disp_x,ptr->disp_y);
}



void DispOB_Sub_dsel_snap(OBJBlock *ptr)
{
	int x,y;

	x = 23;
	y = 132;
	doSeqData2(ptr->sd_number,x,y,-1);
	if (CheckSameMap2(tsel_cursor) >= 0){
		graphPtr = FlashRectangle2(graphPtr,
								   x+64,y,x+127,17+y);
		graphPtr = doTexList(graphPtr,TexList_lgsel_ghost,
							 x+64,y);
	}
	kwdisplay_kawanoradarmap(map_number_chart[tsel_cursor/4][tsel_cursor%4]);
    gDPSetTextureFilter(graphPtr++,G_TF_BILERP);	
}

void DispOB_Sub_dsel_mes1(OBJBlock *ptr)
{
	float mul1;
	extern short rank_to_num[];
	char let[5];
	int i,c;
	int map_num;

	map_num = map_number_chart[tsel_cursor/4][tsel_cursor%4];
	ptr->disp_x = 20;

	mul1 = 0.75;
	SetPalette(4);
	SetWord3_ac(90,ptr->disp_y+25,
				circuit_name_j[map_num],0,mul1,mul1);

	SetPalette(2);
	SetWord2_a(35,ptr->disp_y+40,dsel_length_j,0,mul1,mul1);
	SetWord3_a(145,ptr->disp_y+40,dsel_lengthdata_j[map_num],
		   1,mul1,mul1);

	SetPalette(3);
	SetWord2_a(160,ptr->disp_y+134,bestrec_j[0],0,mul1,mul1);
	for (i = 0;i < 5;i++){
		SetPalette(2);
		TimeAttack1Sub2(i,150,ptr->disp_y+i*13+146);
	}
	SetPalette(3);
	SetWord2_a(160,ptr->disp_y+213,bestrec_j[1],0,mul1,mul1);
	TimeAttack1Sub2(5,150,ptr->disp_y+225);
}



void DispOB_Sub_dsel_sel1(OBJBlock *ptr)
{
	int i,c;
	float mul1;
	POS_XY *pos_ptr;
	POS_XY pos_buf;
	int x,y;
	int check;
    EEPROM_DATA_COURSE *eep_ptr;

	x = 37;
	y = 70;
	mul1 = 0.75;
	eep_ptr = &eeprom_save_data.e.course[tsel_cursor/4][tsel_cursor%4];
	for (i = 0;i < 3;i++){
		check = 0;
		if (i == dsel_cursor1)
			c = 5;
		else{
			c = 1;
			switch(i){
			case 1:
				if (eep_ptr->init_flg == 0)
					check++;
				break;
			case 2:
				if (CheckSameMap2(tsel_cursor) < 0)
					check++;
				break;
			default:
				break;
			}
		}
		if (check){
			SetPalette(0);
			gDPSetPrimColor(graphPtr++,0,0, 0,0,0,150);
			SetWord2_ap(x,y+i*13,dsel_select1_j[i],0,mul1,mul1);
		}
		else{
			SetPalette(c);
			SetWord2_a(x,y+i*13,dsel_select1_j[i],0,mul1,mul1);
		}
	}

	pos_buf.x = x - 8;
	pos_buf.y = y - 8 + dsel_cursor1*13;
	DispOB_vs_ibox_cursor(ptr,&pos_buf);
}



void DispOB_Sub_dsel_sel2(OBJBlock *ptr)
{
	int i,c;
	float mul1;
	POS_XY *pos_ptr;
	POS_XY pos_buf;
	int x,y;
	char *words;

	x = 67;
	y = 110;
	mul1 = 0.75;

	SetPalette(1);
	for (i = 0;i < 3;i++)
		SetWord2_a(x-40,y-50+i*13,
				   dsel_select2_messages_j[(dsel_cursor1-1)*3+i],
				   0,mul1,mul1);

	for (i = 0;i < 2;i++){
		if (i == dsel_cursor2)
			c = 5;
		else
			c = 1;		
		SetPalette(c);
		SetWord2_a(x,y+i*13,dsel_select2_j[i],0,mul1,mul1);
	}

	pos_buf.x = x - 8;
	pos_buf.y = y - 8 + dsel_cursor2*13;
	DispOB_vs_ibox_cursor(ptr,&pos_buf);
}

void DispOB_Sub_dsel_sel3(OBJBlock *ptr)
{
	int i,c;
	float mul1;
	POS_XY *pos_ptr;
	POS_XY pos_buf;
	int x,y;
	char *words;

	x = 67;
	y = 110;
	mul1 = 0.75;

	SetPalette(1);
	for (i = 0;i < 2;i++)
		SetWord2_a(x-40,y-50+i*13,
				   dsel_select3_messages_j[i],
				   0,mul1,mul1);

}

void DispOB_Sub_option_messages(OBJBlock *ptr)
{
	POS_XY pos_buf;
	POS_XY *pos_ptr;
	float mul1;
	int i,j,x,y,a,b;

	graphPtr = FillRect1Color_f(graphPtr,0,0,320,240,
								0,0,0,100);

	switch(msel_mode){
    case OPT_SELECT1:
    case OPT_SELECT2:
    case OPT_SELECT3:
    case OPT_SELECT4:
		mul1 = 1.0;
		for (i = 0;i < 4;i++){
			SetCursorMessageColor4option(msel_mode - OPT_SELECT1,i,3);
			x = 70;
			y = 85+i*35;
			SetWord2_a(x,y,option_select1_messages_j[i],0,mul1,mul1);
			if (i == msel_mode - OPT_SELECT1){
				pos_buf.x = x;
				pos_buf.y = y;
			}
		}
		SetPalette(1);
		SetWord3_ac(230,120,sound_mode_name_j[sound_output],0,mul1,mul1);
		break;
	case OPT_ERASE1:
	case OPT_ERASE2:
		mul1 = 1.0;
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(30,85+i*20,option_select3_messages_j[i],0,mul1,mul1);
		for (i = 0;i < 2;i++){
			SetCursorMessageColor4option(msel_mode - OPT_ERASE1,i,1);
			x = 150;
			y = 150+i*25;
			SetWord2_a(x,y,dsel_select2_j[i],0,mul1,mul1);
			if (i == msel_mode - OPT_ERASE1){
				pos_buf.x = x;
				pos_buf.y = y;
			}
		}
		break;
	case OPT_ERASE3:
		mul1 = 1.0;
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(50,85+i*20,option_select3e_messages_j[i],0,mul1,mul1);
		break;
	case OPT_PAK2_ERR1:
	case OPT_PAK2_ERR2:
	case OPT_PAK2_ERR3:
	case OPT_PAK2_ERR4:
		mul1 = 1.0;
		SetPalette(2);
		x = msel_mode-OPT_PAK2_ERR1;
		for (i = 0;i < 3;i++)
			SetWord2_a(50,85+i*20,
					   option_copy_pak2err_messages_j[x*3 + i],0,mul1,mul1);
		break;
	case OPT_PAK1_ERR1:
	case OPT_PAK1_ERR2:
	case OPT_PAK1_ERR3:
	case OPT_PAK1_ERR4:
		mul1 = 1.0;
		SetPalette(2);
		x = msel_mode-OPT_PAK1_ERR1;
		for (i = 0;i < 4;i++)
			SetWord2_a(65,85+i*20,
					   option_copy_pak1err_messages_j[x*4 + i],0,mul1,mul1);
		break;
	case OPT_COPY_ERR1:
	case OPT_COPY_ERR2:
		mul1 = 1.0;
		SetPalette(2);
		x = msel_mode-OPT_COPY_ERR1;
		for (i = 0;i < 2;i++)
			SetWord2_a(50,85+i*20,
					   option_copy_copyerr_messages_j[x*2 + i],0,mul1,mul1);
		break;
	case OPT_PAK1_NOGN1:
	case OPT_PAK1_NOGN2:
		mul1 = 1.0;
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(80,85+i*20,
					   ta_ghostb3_messages_j[i],0,mul1,mul1);
		break;
	case OPT_PAK2_SEL1:
	case OPT_PAK2_SEL2:
	case OPT_PAK1_SEL1:
	case OPT_PAK1_SEL2:
		mul1 = 1.0;
		switch(msel_mode){
		case OPT_PAK2_SEL1:
		case OPT_PAK2_SEL2:
			a = OPT_PAK2_SEL1;
			b = 0;
			break;
		case OPT_PAK1_SEL1:
		case OPT_PAK1_SEL2:
			a = OPT_PAK1_SEL1;
			b = 1;
			break;
		}
		SetPalette(1+b);
		SetWord3_ac(160,85,option_copy_pak2sel_message_j[b],0,mul1,mul1);
		for (i = 0;i < 2;i++){
			mul1 = 1.0;
			SetPalette(3);
			SetWord3_ac(100 + i*120,125,option_copy_pak_j[i],0,mul1,mul1);
			for (j = 0;j < 2;j++){
				char let[5];
				PAK_GHOST *pak_ptr;

				mul1 = 0.75;
				x = 35+i*135;
				y = 150+j*30;
				if (i != b){
					SetCursorMessageColor(msel_mode - a,j,1);
					if (msel_mode - a == j){
						pos_buf.x = x;
						pos_buf.y = y;
					}
				}
				else{
					if (b && (ptr->work2 == j))
						SetPalette(frame_counter%3);
					else
						SetPalette(1);
				}
				kawano_itoa(j+1,let);
				SetWord2_a(x,y,let+1,0,mul1,mul1);
				if (!i)
					pak_ptr = &pak_ghost[j];
				else
					pak_ptr = ((PAK_GHOST *)kdl_buff) + j;
				if (!pak_ptr->e.ghost_flg){
					SetWord2_a(x+15,y,
							   ta_ghostb_messages_j[2],0,mul1,mul1);
				}
				else{
					int a;

					a = pak_ptr->e.ghost_map;
					SetWord2_a(x+15,y,
							   circuit_name_semilong_j
							   [map_number_chart[a/4][a%4]],
							   0,mul1,mul1);
				}
			}
		}
		break;
	case OPT_SURE1:
	case OPT_SURE2:
		mul1 = 1.0;
		a = OPT_SURE1;
		//b = 0;
		SetPalette(2);
		for (i = 0;i < 2;i++)
			SetWord3_ac(160,77+i*20,option_copy_sure_messages_j[i],
						0,mul1,mul1);
		for (i = 0;i < 2;i++){
			mul1 = 1.0;
			SetPalette(3);
			SetWord3_ac(100 + i*120,125,option_copy_pak_j[i],0,mul1,mul1);
			for (j = 0;j < 2;j++){
				char let[5];
				PAK_GHOST *pak_ptr;

				mul1 = 0.75;
				x = 35+i*135;
				y = 150+j*30;
				if (!i){/* パック１ */
					if (ptr->work1 == j)
						SetPalette(frame_counter%3);/* 選択側 */
					else
						SetPalette(1);/* 非選択側 */
				}
				else{
					if (ptr->work2 == j)
						SetPalette(frame_counter%3);/* 選択側 */
					else
						SetPalette(1);/* 非選択側 */
				}
						
				kawano_itoa(j+1,let);
				SetWord2_a(x,y,let+1,0,mul1,mul1);
				if (!i)
					pak_ptr = &pak_ghost[j];
				else
					pak_ptr = ((PAK_GHOST *)kdl_buff) + j;
				if (!pak_ptr->e.ghost_flg){
					SetWord2_a(x+15,y,
							   ta_ghostb_messages_j[2],0,mul1,mul1);
				}
				else{
					int a;

					a = pak_ptr->e.ghost_map;
					SetWord2_a(x+15,y,
							   circuit_name_semilong_j
							   [map_number_chart[a/4][a%4]],
							   0,mul1,mul1);
				}
			}
		}

		for (i = 0;i < 2;i++){
			x = 110 + i*50;
			y = 210;
			if (i == msel_mode - a){
				pos_buf.x = x;
				pos_buf.y = y;
			}
			SetCursorMessageColor(msel_mode - a,j,3);
			SetWord2_a(x,y,option_copy_sure2_messages_j[i],0,mul1,mul1);
		}
		break;
	case OPT_COPY1:
	case OPT_COPY2:
	case OPT_COPY3:
		mul1 = 1.0;
		a = (msel_mode - OPT_COPY1)/2;
		SetPalette(2);
		SetWord3_ac(160,85,option_copy_copy_messages_j[a],
					0,mul1,mul1);
		for (i = 0;i < 2;i++){
			mul1 = 1.0;
			SetPalette(3);
			SetWord3_ac(100 + i*120,125,option_copy_pak_j[i],0,mul1,mul1);
			for (j = 0;j < 2;j++){
				char let[5];
				PAK_GHOST *pak_ptr;

				mul1 = 0.75;
				x = 35+i*135;
				y = 150+j*30;
				if (!i){/* パック１ */
					if (ptr->work1 == j){/* 選択側 */
						if (!a)
							SetPalette(2);
						else
							SetPalette(frame_counter%3);
					}
					else
						SetPalette(1);/* 非選択側 */
				}
				else{/* パック2 */
					if (ptr->work2 == j)
						SetPalette(2);/* 選択側 */
					else
						SetPalette(1);/* 非選択側 */
				}
						
				kawano_itoa(j+1,let);
				SetWord2_a(x,y,let+1,0,mul1,mul1);
				if (!i)
					pak_ptr = &pak_ghost[j];
				else
					pak_ptr = ((PAK_GHOST *)kdl_buff) + j;
				if (!pak_ptr->e.ghost_flg){
					SetWord2_a(x+15,y,
							   ta_ghostb_messages_j[2],0,mul1,mul1);
				}
				else{
					int a;

					a = pak_ptr->e.ghost_map;
					SetWord2_a(x+15,y,
							   circuit_name_semilong_j
							   [map_number_chart[a/4][a%4]],
							   0,mul1,mul1);
				}
			}
		}
		break;
	default:
		break;
	}

	/* アイテムボックスカーソルの表示 */
	switch(msel_mode){
	case OPT_PAK2_SEL1:
	case OPT_PAK2_SEL2:
	case OPT_PAK1_SEL1:
	case OPT_PAK1_SEL2:
	case OPT_SURE1:
	case OPT_SURE2:
		pos_buf.x -= 5;
		pos_buf.y -= 6;
		break;
	default:
		pos_buf.x -= 10;
		pos_buf.y -= 8;
		break;
	}
	DispOB_vs_ibox_cursor(ptr,&pos_buf);
}



void Cut_ud_sub(OBJBlock *ptr)
{
	switch(opening_flag){
	case OPENING_ROLLING_SET:
		graphPtr = FillRectBlack(graphPtr,0,0,319,40);
		graphPtr = FillRectBlack(graphPtr,0,199,319,239);
		ptr->work1 = 40;
		break;
	case OPENING_STOP_SET:
		ptr->work1-=2;
		if (ptr->work1 > 0){
			graphPtr = FillRectBlack(graphPtr,0,0,
									 319,ptr->work1);
			graphPtr = FillRectBlack(graphPtr,0,239-ptr->work1,
									 319,239);
		}
		else
			ptr->kind = 0;
		break;
	default:
		if ((game_mode != MARIOGP)||(player_number != 1)||(demo_play_flag))
			ptr->kind = 0;
		else{
			ptr->work1-=2;
			if (ptr->work1 > 0){
				graphPtr = FillRectBlack(graphPtr,0,0,
										 319,ptr->work1);
				graphPtr = FillRectBlack(graphPtr,0,239-ptr->work1,
										 319,239);
			}
			else
				ptr->kind = 0;
		}
		break;
	}
}

void DispOB_result_time(OBJBlock *ptr)
{
	extern short rank_to_num[];
	char ranking_name[8];
	char let[5];
	int i,c;

	for (i = 0;i < 8;i++){
		ranking_name[i] = kart_data[rank_to_num[i]].kart;
#if 0
		c = i;
		while(c > 0){/*同じキャラが二人いたりするのは？*/
			if (ranking_name[i] == ranking_name[c-1])
				PRINTF("誰の仕業？\n");
			if (rank_to_num[i] == rank_to_num[c-1])
				PRINTF("小川さんの仕業？\n");
			c--;
		}
#endif
	}

	SetPalette(4);
	SetWord2_a(ptr->disp_x+37,ptr->disp_y+25,"result",0,1.0,1.0);
	SetPalette(5);
	SetWord2_a(ptr->disp_x+44,ptr->disp_y+40,"round",0,0.7,0.7);
	kawano_itoa(circuit_select+1,let);
	SetWord2_a(ptr->disp_x+87,ptr->disp_y+40,let+1,0,0.7,0.7);

	for (i = 0;i < 4;i++){
		if (rank_to_num[i] < players/*player_number*/)
			c = frame_counter % 3;
		else
			c = 3;
		SetPalette(c);
		ResultSub_time(ptr->disp_x+7,ptr->disp_y+56+i*16,
					   ranking_name[i],i);
	}
	for (i = 4;i < 8;i++){
		if (rank_to_num[i] < players/*player_number*/)
			c = frame_counter % 3;
		else
			c = 3;
		SetPalette(c);
		ResultSub_time(190-ptr->disp_x,ptr->disp_y+90+i*16,
					   ranking_name[i],i);
	}
	SetPalette(5);
	SetWord2_a(195-ptr->disp_x,ptr->disp_y+225,
				cup_name[cup_level],0,0.7,0.7);
	SetWord2_a(275-ptr->disp_x,ptr->disp_y+225,
				class_name[popup_status[players-1][play_mode[players-1]]],
				0,0.7,0.7);
}

void ResultSub_time(int x,int y,int num,int num2)
{
	float mul1,ftime;
	int time1,time2,time3;
	char let[5];

	mul1 = 0.7;
	ftime = goalintime[rank_to_num[num2]];
	time1 = ftime/60;
	time2 = ((int)ftime)%60;
	time3 = (int)(ftime*100.0)%100;
	kawano_itoa(num2+1,let);
	let[2] = '.';
	let[3] = '\0';
	SetWord4_a(x-1,y,let+1,-4,mul1,mul1);
	SetWord2_a(x+10,y,drivers_name_j[num],0,mul1,mul1);
	kawano_itoa(time1,let);
	SetWord4_a(x+66,y,let,0,mul1,mul1);
	kawano_itoa(time2,let);
	SetWord2_a(x+78,y,"'",0,mul1,mul1);
	SetWord4_a(x+86,y,let,0,mul1,mul1);
	kawano_itoa(time3,let);
	SetWord2_a(x+98,y,"\"",0,mul1,mul1);
	SetWord4_a(x+106,y,let,0,mul1,mul1);
}

void DispOB_result_point(OBJBlock *ptr)
{
	extern short rank_to_num[];
	extern short name_to_num[];
	char ranking_name[8];
	char let[5];
	int i,c,check,dx;

	if (ptr->pattern == KSEQ_GPP_INIT)/*まだ初期化の段階だから？*/
		return;
	if (ptr->pattern <= KSEQ_GPP_NAMEOFF){
		for (i = 0;i < 8;i++)
			ranking_name[i] = kart_data[rank_to_num[i]].kart;
	}
	else{
		SortDPRanking(ranking_name);//そのうちこのへんを直しましょう
		SortDPRanking(d_points_rank);
	}

	SetPalette(4);
	SetWord2_a(ptr->disp_x+30,-ptr->disp_y+25,"driver's point",0,0.8,0.8);
	SetPalette(5);
	SetWord2_a(ptr->disp_x+54,-ptr->disp_y+40,"round",0,0.7,0.7);
	kawano_itoa(circuit_select+1,let);
	SetWord2_a(ptr->disp_x+97,-ptr->disp_y+40,let+1,0,0.7,0.7);
	
	for (i = 0;i < 4;i++){
		switch(ptr->pattern){
		case KSEQ_GPP_NAMEOFF:
		case KSEQ_GPP_NAMEON:
			if (i*DP_SORT_TIME < ptr->work1)
				check = 1;
			else
				check = 0;
			break;
		default:
			check = 0;
			break;
		}
		if (check)
			continue;

		if (ptr->pattern <= KSEQ_GPP_NAMEOFF){
			check = rank_to_num[i];
			dx = 0;
		}
		else{
			check = name_to_num[ranking_name[i]];
			dx = 13;
		}
		if (check < players/*player_number*/)
			c = frame_counter % 3;
		else
			c = 3;
		SetPalette(c);
		ResultSub_point(ptr,ptr->disp_x+dx+28,-ptr->disp_y+56+i*16,
						ranking_name[i],i,ranking_name);
	}
	for (i = 4;i < 8;i++){
		switch(ptr->pattern){
		case KSEQ_GPP_NAMEOFF:
		case KSEQ_GPP_NAMEON:
			if (i*DP_SORT_TIME < ptr->work1)
				check = 1;
			else
				check = 0;
			break;
		default:
			check = 0;
			break;
		}
		if (check)
			continue;

		if (ptr->pattern <= KSEQ_GPP_NAMEOFF)
			check = rank_to_num[i];
		else
			check = name_to_num[ranking_name[i]];
		if (check < players/*player_number*/)
			c = frame_counter % 3;
		else
			c = 3;
		SetPalette(c);
		ResultSub_point(ptr,190-ptr->disp_x,ptr->disp_y+90+i*16,
					   ranking_name[i],i,ranking_name);
	}
	SetPalette(5);
	SetWord2_a(150+25-ptr->disp_x,ptr->disp_y+225,
				cup_name[cup_level],0,0.7,0.7);
	SetWord2_a(150+110-ptr->disp_x,ptr->disp_y+225,
				class_name[popup_status[players-1][play_mode[players-1]]],
				0,0.7,0.7);
}

void SortDPRanking(char *b_ptr)
{
	extern short name_to_num[];
	int i,j,k,swap_buf;

	for (i = 0;i < 8;i++){
		*(b_ptr+i) = i;
		j = i;
		while(j > 0){
			if (d_points[*(b_ptr+j)]>d_points[*(b_ptr+j-1)]){
				swap_buf = *(b_ptr+j);
				*(b_ptr+j) = *(b_ptr+j-1);
				*(b_ptr+j-1) = swap_buf;
			}
			else{/*プレーヤーキャラを上に持っていく*/
				if ((d_points[*(b_ptr+j)] == d_points[*(b_ptr+j-1)])
					&& (name_to_num[*(b_ptr+j)] < players/*player_number*/)
					&& (name_to_num[*(b_ptr+j)] < name_to_num[*(b_ptr+j-1)])){
					swap_buf = *(b_ptr+j);
					*(b_ptr+j) = *(b_ptr+j-1);
					*(b_ptr+j-1) = swap_buf;
				}
				else					
					break;
			}
			j--;
		}
	}
}

void ResultSub_point(OBJBlock *ptr,int x,int y,int num,int num2,char *pts_buf)
{
	float mul1;
	char let[5];
	int i;

	mul1 = 0.7;
	if (ptr->pattern <= KSEQ_GPP_NAMEOFF)
		kawano_itoa(num2+1,let);
	else{
		i = num2;
		while(i > 0){
			if (d_points[*(pts_buf+i)] == d_points[*(pts_buf+i-1)])
				i--;
			else
				break;
		}
		kawano_itoa(i+1,let);
	}
	let[2] = '.';
	let[3] = '\0';
	SetWord4_a(x,y,let+1,-4,mul1,mul1);
	SetWord2_a(x+10,y,drivers_name_j[num],0,mul1,mul1);
	kawano_itoa(d_points[num],let);
	SetWord4_a(x+71,y,let,0,mul1,mul1);
	if ((num2 < 4)&&(ptr->pattern <= KSEQ_GPP_NAMEOFF)){
		kawano_itoa(*(additional_point+num2),let);
		let[0] = '+';
		SetWord2_a(x+90,y,let,0,mul1,mul1);
	}
}

void DispOB_timeattack1(OBJBlock *ptr)
{
	float mul1;
	extern short rank_to_num[];
	char let[5];
	int i,c;

	mul1 = 0.75;
	SetPalette(4);
	SetWord3_ac(ptr->disp_x+70,ptr->disp_y+25,
				circuit_name_j[map_number_chart[cup_select][circuit_select]],
				0,mul1,mul1);
	SetPalette(3);
	SetWord3_ac(ptr->disp_x+70,ptr->disp_y+40,
				bestrec_j[2],0,mul1,mul1);
	for (i = 0;i < 4;i++)
		TimeAttack1Sub(i,ptr->disp_x+23,ptr->disp_y+i*15+55);

	SetPalette(3);
	SetWord2_a(180-ptr->disp_x,ptr->disp_y+134,bestrec_j[0],0,mul1,mul1);
	for (i = 0;i < 5;i++){
		SetPalette(2);
		TimeAttack1Sub2(i,170-ptr->disp_x,ptr->disp_y+i*13+146);
	}
	SetPalette(3);
	SetWord2_a(180-ptr->disp_x,ptr->disp_y+213,bestrec_j[1],0,mul1,mul1);
	TimeAttack1Sub2(5,170-ptr->disp_x,ptr->disp_y+225);
}

void DispOB_timeattack2(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	POS_XY pos_buf;
	PAK_GHOST *pak_ptr;
	float mul1;
	extern short rank_to_num[];
	char let[5];
	int i,j;

	switch(ptr->pattern){
	case KSEQ_TA_INIT:
	case KSEQ_TA_END2:
		return;
	}
	mul1 = 0.75;
	SetPalette(4);
	SetWord3_ac(ptr->disp_x+85,-ptr->disp_y+25,
				circuit_name_j[map_number_chart[cup_select][circuit_select]],
				0,mul1,mul1);
	SetPalette(3);
	SetWord3_ac(ptr->disp_x+85,-ptr->disp_y+40,
				bestrec_j[2],0,mul1,mul1);
	for (i = 0;i < 4;i++)
		TimeAttack1Sub(i,ptr->disp_x+38,-ptr->disp_y+i*15+55);

	switch(ptr->pattern){
	case KSEQ_TA_MOVING:
	case KSEQ_TA_SELECT1:
	case KSEQ_TA_SELECT2:
	case KSEQ_TA_SELECT3:
	case KSEQ_TA_SELECT4:
	case KSEQ_TA_SELECT5:
	case KSEQ_TA_SELECT6:
	case KSEQ_TA_END:
		for (i = 0;i < 6;i++){
			j = 0;
			SetCursorMessageColor(ptr->pattern - KSEQ_TA_SELECT1,i,1);
			switch(i){
			case 4:
				if (lost_ghost == LOST_GHOST)/* リプレイ選択不可 */
					j = 1;
				break;
			case 5:
				if (ghost_status != GHOST_DRIVE)
					j = 2;
				break;
			//default:
			//	break;
			}

			if (j){
					SetPalette(0);
					gDPSetPrimColor(graphPtr++,0,0, 0,0,0,150);
					SetWord2_ap(185-ptr->disp_x,ptr->disp_y+147+i*13,
								ta_result_select_j[i+1],0,mul1,mul1);
			}
			else{
				SetWord2_a(185-ptr->disp_x,ptr->disp_y+147+i*13,
						   ta_result_select_j[i+1],0,mul1,mul1);
			}
		}
		break;
	case KSEQ_TA_GHOSTA1:
	case KSEQ_TA_GHOSTA2:
	case KSEQ_TA_GHOSTA3:
	case KSEQ_TA_GHOSTA4:
	case KSEQ_TA_GHOSTA5:
	case KSEQ_TA_GHOSTA6:
		SetPalette(3);
		j = ptr->pattern-KSEQ_TA_GHOSTA1;
		for(i = 0;i < 5;i++)
			SetWord2_a(170,147+i*13,ta_ghosta_messages_j[j*5 + i],
					   0,mul1,mul1);		
		break;
	case KSEQ_TA_GHOSTB1:
	case KSEQ_TA_GHOSTB2:
		SetPalette(1);
		for (i = 0;i < 2;i++)
			SetWord2_a(170,ptr->disp_y+140+i*13,
					   ta_ghostb_messages_j[i],0,mul1,mul1);
		for (i = 0;i < 2;i++){
			char let[5];
			SetCursorMessageColor(ptr->pattern - KSEQ_TA_GHOSTB1,i,1);
			kawano_itoa(i+1,let);
			SetWord2_a(180-ptr->disp_x,170+i*30,let+1,0,mul1,mul1);
			pak_ptr = &pak_ghost[i];
			if (!pak_ptr->e.ghost_flg){
				mul1 = 0.75;
				SetWord2_a(195-ptr->disp_x,170+i*30,ta_ghostb_messages_j[2],
						   0,mul1,mul1);
			}
			else{
				int a;

				mul1 = 0.7;
				a = pak_ptr->e.ghost_map;
				SetWord2_a(195-ptr->disp_x,170+i*30,
						   circuit_name_semilong_j[map_number_chart[a/4][a%4]],
						   0,mul1,mul1);
			}
		}
		break;
	case KSEQ_TA_GHOSTB3:
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(170,147+i*13,ta_ghostb3_messages_j[i],
					   0,mul1,mul1);		
		break;
	case KSEQ_TA_GHOSTC1:
	case KSEQ_TA_GHOSTC2:
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(175,ptr->disp_y+140+i*13,
					   ta_ghostc_messages_j[i],0,mul1,mul1);
		for (i = 0;i < 2;i++){
			SetCursorMessageColor(ptr->pattern - KSEQ_TA_GHOSTC1,i,1);
			SetWord2_a(200-ptr->disp_x,185+i*15,ta_ghostc_select_messages_j[i],
					   0,mul1,mul1);
		}
		break;
	case KSEQ_TA_GHOSTD:
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(170,147+i*13,ta_ghostd_messages_j[i],
					   0,mul1,mul1);		
		break;
	case KSEQ_TA_GHOSTD2:
		SetPalette(3);
		for (i = 0;i < 2;i++)
			SetWord2_a(170,147+i*13,ta_ghostd2_messages_j[i],
					   0,mul1,mul1);		
		break;
	default:
		break;
	}

	switch(ptr->pattern){
	case KSEQ_TA_SELECT1:
	case KSEQ_TA_SELECT2:
	case KSEQ_TA_SELECT3:
	case KSEQ_TA_SELECT4:
	case KSEQ_TA_SELECT5:
	case KSEQ_TA_SELECT6:
		pos_ptr = &ta_result_cursor_position[ptr->pattern - KSEQ_TA_SELECT1];
		break;
	case KSEQ_TA_GHOSTB1:
	case KSEQ_TA_GHOSTB2:
		pos_ptr = &ta_ghostb_cursor_position[ptr->pattern - KSEQ_TA_GHOSTB1];
		break;
	case KSEQ_TA_GHOSTC1:
	case KSEQ_TA_GHOSTC2:
		pos_ptr = &ta_ghostc_cursor_position[ptr->pattern - KSEQ_TA_GHOSTC1];
		break;
	case KSEQ_TA_END:
		pos_ptr = &ta_result_cursor_position[ptr->work1 - KSEQ_TA_SELECT1];
		break;
	default:
		return;
	}
	pos_buf.x = pos_ptr->x - ptr->disp_x;
	pos_buf.y = pos_ptr->y + ptr->disp_y;
	DispOB_vs_ibox_cursor(ptr,&pos_buf);

}

void TimeAttack1Sub(int num,int x,int y)
{
	float mul1;
	uint time;
	int c;
	char let[5];
	OBJBlock *ptr;

	if (num < 3){
		time = kwlap[0].laptimebuf[num];
		SetPalette(2);
	}
	else{
		time = kwlap[0].totaltime;
		SetPalette(1);
	}
	mul1 = 0.7;
	SetWord3_a(x+33,y,laptime_j[num],0,mul1,mul1);

	ptr = Get_OBJBlock_ptr(KO_GAME_TA_SORT);
	if (num < 3){
		if (ptr->work2 & (1<<num))
			c = frame_counter % 3;
		else
			c = 3;
	}
	else{
		if (ptr->work1 >= 0)
			c = frame_counter % 3;
		else
			c = 3;
	}
	SetPalette(c);

	kawano_itoa_m(time,let);
	SetWord4_a(x+44,y,let,0,mul1,mul1);
	SetWord2_a(x+55,y,"'",0,mul1,mul1);
	kawano_itoa_s(time,let);
	SetWord4_a(x+64,y,let,0,mul1,mul1);
	SetWord2_a(x+75,y,"\"",0,mul1,mul1);
	kawano_itoa_c(time,let);
	SetWord4_a(x+85,y,let,0,mul1,mul1);
}

//
// タイムアタックのリザルト,データ画面兼用
//
void TimeAttack1Sub2(int num,int x,int y)
{
    //EEPROM_DATA_COURSE *eep_ptr;
	float mul1;
	uint time,time_only;
	int c;
	char let[5];
	OBJBlock *ptr;
	int mode;

	if (sequence_mode == RACESEQUENCE)
		mode = 0;
	else
		mode = 1;

    //eep_ptr = &eeprom_save_data.e.course[cup_select][circuit_select];
	if (num < 5){
		if (!mode)
			time = GetRecordTime2(num);
		else
			time = GetRecordTime3(num,tsel_cursor);
		SetPalette(1);
	}
	else{
		if (!mode)
			time = GetRecordLapTime();
		else
			time = GetRecordLapTime3(tsel_cursor);
		//SetPalette(1);
	}
	time_only = time & 0x000fffff;
	mul1 = 0.65;
	SetWord4_a(x+20,y,recordtime_j[num],2,mul1,mul1);

	if (!mode){
		ptr = Get_OBJBlock_ptr(KO_GAME_TA_SORT);
		if (num < 5){
			if (ptr->work1 == num)
				c = frame_counter % 3;
			else
				c = 3;
		}
		else{
			if (ptr->work2)
				c = frame_counter % 3;
			else
				c = 3;
		}
	}
	else
		c = 3;
	SetPalette(c);

	kawano_itoa_m(time_only,let);
	SetWord4_a(x+39,y,let,0,mul1,mul1);
	SetWord2_a(x+50,y,"'",0,mul1,mul1);
	kawano_itoa_s(time_only,let);
	SetWord4_a(x+59,y,let,0,mul1,mul1);
	SetWord2_a(x+70,y,"\"",0,mul1,mul1);
	kawano_itoa_c(time_only,let);
	SetWord4_a(x+80,y,let,0,mul1,mul1);
	if (time_only < 600000)
		c = time>>20;
	else
		c = 8;
	SetWord3_ac(x+120,y,drivers_name_j[c],0,mul1,mul1);
}

void DispOB_timeattack_message1(OBJBlock *ptr)
{
	float mul1;
	int box_x,box_y,box_w,box_h;

	mul1 = 1.0;

	box_x = SCREEN_WD - ptr->disp_x;
	//box_y = SCREEN_HT - ptr->disp_y;
	box_y = ptr->disp_y;
	box_w = GetWordLength(ta_romghost_message_j)+30;
	box_h = 16*(mul1+0.5);
	graphPtr = FillRect1Color_f(graphPtr,
								box_x-box_w/2,box_y-box_h+4,
								box_x+box_w/2,box_y+4,
								0,0,0,100);

	SetPalette(4);
	SetWord3_ac(ptr->disp_x-3,ptr->disp_y,ta_romghost_message_j,0,mul1,mul1);

	
}

void DispOB_pause(OBJBlock *ptr)
{
	if (pause_flag){
		switch(game_mode){
		case TIMEATTACK:
			DispOB_pause_ta(ptr);
			break;
		case VSBATTLE:
			DispOB_pause_vs(ptr);
			break;
		case MARIOGP:
			DispOB_pause_gp(ptr);
			break;
		case BATTLE:
			DispOB_pause_bt(ptr);
			break;
		}
	}
}

POS_XY ta_pause_message_positions[] = {
	{115,155}
};

void DispOB_pause_ta(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	float mul1;
	char let[5];
	uint time,time_only;
	int i;

	graphPtr = FillRect1Color_f(graphPtr,
								0,0,SCREEN_WD-1,SCREEN_HT-1,
								0,0,0,140);
	mul1 = 1.0;
	SetPalette(3);
	SetWord3_ac(160,80,
				circuit_name_j[map_number_chart[cup_select][circuit_select]],
				0,mul1,mul1);
	
	mul1 = 0.8;
	SetPalette(2);
	SetWord3_ac(160,96,bestrec_j[0],0,mul1,mul1);
	time = GetRecordTime2(0);
	time_only = time & 0x000fffff;
	kawano_itoa_m(time_only,let);
	SetWord4_a(127,109,let,0,mul1,mul1);
	SetWord2_a(142,109,"'",0,mul1,mul1);
	kawano_itoa_s(time_only,let);
	SetWord4_a(152,109,let,0,mul1,mul1);
	SetWord2_a(167,109,"\"",0,mul1,mul1);
	kawano_itoa_c(time_only,let);
	SetWord4_a(179,109,let,0,mul1,mul1);

	SetWord3_ac(160,124,bestrec_j[1],0,mul1,mul1);
	time = GetRecordLapTime();
	time_only = time & 0x000fffff;
	kawano_itoa_m(time_only,let);
	SetWord4_a(127,137,let,0,mul1,mul1);
	SetWord2_a(142,137,"'",0,mul1,mul1);
	kawano_itoa_s(time_only,let);
	SetWord4_a(152,137,let,0,mul1,mul1);
	SetWord2_a(167,137,"\"",0,mul1,mul1);
	kawano_itoa_c(time_only,let);
	SetWord4_a(179,137,let,0,mul1,mul1);

	pos_ptr = &ta_pause_message_positions[0];

	mul1 = 0.75;
	for (i = 0;i < 5;i++){
		SetCursorMessageColor(ptr->pattern - KSEQ_PS_TA1,i,1);
		SetWord2_a(pos_ptr->x,pos_ptr->y+i*13,
				   ta_result_select_j[i],0,mul1,mul1);
	}

}

POS_XY vs_pause_message_positions[] = {
	{130,100},{130,100},{130,100},{130,100},
	{120, 40},{120,160},{120, 40},{120,160},
	{ 43,100},{188,100},{ 43,100},{188,100},
	{ 43, 40},{188, 40},{ 43,160},{188,160}
};

void DispOB_pause_vs(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	float mul1;
	char let[5];
	uint time,time_only;
	int i,i2;
	SCREEN *scr_ptr;
	int x,y,w,h;
	
	scr_ptr = &screen_data[pause_flag-1];

	x = scr_ptr->posx;
	y = scr_ptr->posy;
	w = scr_ptr->widthx/2;
	h = scr_ptr->widthy/2;
	graphPtr = FillRect1Color_f(graphPtr,
								x - w,y - h,x + w,y + h,
								0,0,0,140);
	pos_ptr = &vs_pause_message_positions[race_screen_mode*4 + pause_flag-1];

	mul1 = 0.75;
	for (i = 0;i < 4;i++){
		if (i > 0)
			i2 = i + 1;
		else
			i2 = i;
		SetCursorMessageColor(ptr->pattern - KSEQ_PS_VS1,i,3);
		SetWord2_a(pos_ptr->x,pos_ptr->y+i*13,
				   ta_result_select_j[i2],0,mul1,mul1);
	}
}

POS_XY gp_pause_message_positions[] = {
	{120,140},{120,100},{120,100},{120,100},
	{120, 85},{120,205},{120, 40},{120,160}
//	{ 50,100},{195,100},{ 50,100},{195,100},
//	{ 50, 40},{195, 40},{ 50,160},{195,160}
};


void DispOB_pause_gp(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	float mul1;
	int l_1,l_2;
	int i;
	SCREEN *scr_ptr;
	int x,y,w,h;
	
	scr_ptr = &screen_data[pause_flag-1];

	x = scr_ptr->posx;
	y = scr_ptr->posy;
	w = scr_ptr->widthx/2;
	h = scr_ptr->widthy/2;
	graphPtr = FillRect1Color_f(graphPtr,
								x - w,y - h,x + w,y + h,
								0,0,0,140);

	pos_ptr = &gp_pause_message_positions[race_screen_mode*4 + pause_flag-1];

	mul1 = 1.0;
	l_1 = (GetWordLength(cup_name[cup_select])*mul1+10)/2;
	l_2 = (GetWordLength(class_name[race_level])*mul1+10)/2;
	SetPalette(3);
	SetWord3_ac(160-l_2,pos_ptr->y-50,cup_name[cup_select],
				0,mul1,mul1);
	SetPalette(3);
	SetWord3_ac(160+l_1,pos_ptr->y-50,class_name[race_level],
				0,mul1,mul1);
	SetPalette(3);
	SetWord3_ac(160,pos_ptr->y-30,
				circuit_name_j[map_number_chart[cup_select][circuit_select]],
				0,mul1,mul1);
	

	mul1 = 0.75;
	for (i = 0;i < 2;i++){
		SetCursorMessageColor(ptr->pattern - KSEQ_PS_GP1,i,3);
		SetWord2_a(pos_ptr->x,pos_ptr->y+i*13,
				   ta_result_select_j[i*4],0,mul1,mul1);
	}
	

}


POS_XY bt_pause_message_positions[] = {
	{120,100},{120,100},{120,100},{120,100},
	{120, 40},{120,160},{120, 40},{120,160},
	{ 43,100},{188,100},{ 43,100},{188,100},
	{ 43, 40},{188, 40},{ 43,160},{188,160}
};


void DispOB_pause_bt(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	float mul1;
	char let[5];
	uint time,time_only;
	int i,i2;
	SCREEN *scr_ptr;
	int x,y,w,h;
	
	scr_ptr = &screen_data[pause_flag-1];

	x = scr_ptr->posx;
	y = scr_ptr->posy;
	w = scr_ptr->widthx/2;
	h = scr_ptr->widthy/2;
	graphPtr = FillRect1Color_f(graphPtr,
								x - w,y - h,x + w,y + h,
								0,0,0,140);

	pos_ptr = &bt_pause_message_positions[race_screen_mode*4 + pause_flag-1];

	mul1 = 0.75;
	for (i = 0;i < 4;i++){
		if (i > 0)
			i2 = i + 1;
		else
			i2 = i;
		SetCursorMessageColor(ptr->pattern - KSEQ_PS_BT1,i,3);
		SetWord2_a(pos_ptr->x,pos_ptr->y+i*13,
				   ta_result_select_j[i2],0,mul1,mul1);
	}
	
}

void DispOB_pause_cursor(void)
{
	POS_XY pos_buf;
	POS_XY *pos_ptr;
	OBJBlock *ptr;
	int defaults_position;
	int dummy_game_mode;
	int check;

	check = 0;
	//switch(game_mode){
	//case TIMEATTACK:
	//	ptr = Get_OBJBlock_ptr2(KO_GAME_TA_REP);
	//	if (ptr){/* タイムアタックのリプレイ時に...... */
	//		if (ptr->pattern >= KSEQ_TAR_SEL1){
	//			dummy_game_mode = game_mode;
	//			check++;
	//		}
	//	}
	//	break;
	//}
	if (!check){
		if (!pause_flag){
			return;
		}
		dummy_game_mode = game_mode;
		ptr = Get_OBJBlock_ptr2(KO_GAME_PAUSE);
	}
	gSPViewport(graphPtr++, K0_TO_PHYS((u32) &vp));
	//gDPSetScissor(graphPtr++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
	guOrtho(&dynamicp->effectmodeling[effectcount],
		0.0F, (float)SCREEN_WD-1,
		(float)SCREEN_HT-1,0.0F, 
		-100.0F, 100.0F, 1.0F);
    gSPMatrix(graphPtr++, /*&dynamicp->effectmodeling[effectcount++],*/ 
			  K0_TO_PHYS((u32) &(dynamicp->effectmodeling[effectcount++])),
			  G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);

	//gSPDisplayList(graphPtr++, &kawano_onlyfade_start);

	switch(dummy_game_mode){
	case TIMEATTACK:
		pos_ptr = &ta_pause_message_positions[0];
		break;
	case VSBATTLE:
		pos_ptr = &vs_pause_message_positions[race_screen_mode*4+pause_flag-1];
		break;
	case MARIOGP:
		pos_ptr = &gp_pause_message_positions[race_screen_mode*4+pause_flag-1];
		break;
	case BATTLE:
		pos_ptr = &bt_pause_message_positions[race_screen_mode*4+pause_flag-1];
		break;
	}
	if (!check)
		defaults_position = start_pause_seq[dummy_game_mode];
	else
		defaults_position = KSEQ_TAR_SEL1;

	pos_buf.x = pos_ptr->x-8;
	pos_buf.y = pos_ptr->y-8 + 13*(ptr->pattern - defaults_position);
	DispOB_vs_ibox_cursor(ptr,&pos_buf);
}


void DispOB_ta_replay(OBJBlock *ptr)
{
	POS_XY pos_buf;
	POS_XY *pos_ptr;
	PAK_GHOST *pak_ptr;
	float mul1;
	char let[5];
	uint time,time_only;
	int i,j,a;

	if (ptr->pattern == KSEQ_TAR_OFF){
		if (ptr->work1 < 30)
			return;
		if ((frame_counter/16)%2){
			int x,y;

			x = 195;
			y = 48;
			mul1 = 0.8;
			j = GetWordLength(ta_result_select_j[5])*mul1;
			graphPtr = FillRect1Color_f(graphPtr,
										x-3,y-14,x+j+3,y+3,
										0,0,0,150);
			SetPalette(1);
			SetWord2_a(x,y,ta_result_select_j[5],0,mul1,mul1);
		}
		return;
	}

	if (ptr->pattern == KSEQ_TAR_FADEHF){
		i = ptr->work1;
		a = i*255/140;
	}
	else{
		i = 140;
		a = 255;
	}
	graphPtr = FillRect1Color_f(graphPtr,
								0,0,SCREEN_WD-1,SCREEN_HT-1,
								0,0,0,i);

	mul1 = 1.0;
	gDPSetPrimColor(graphPtr++,0,0, 0,0,0,a);

	SetPalette(3);
	SetWord3_acp(160,80,
				circuit_name_j[map_number_chart[cup_select][circuit_select]],
				0,mul1,mul1);

	mul1 = 0.8;
	switch(ptr->pattern){
	case KSEQ_TAR_FADEHF:
	case KSEQ_TAR_SEL1:
	case KSEQ_TAR_SEL2:
	case KSEQ_TAR_SEL3:
	case KSEQ_TAR_SEL4:
	case KSEQ_TAR_SEL5:
	case KSEQ_TAR_SEL6:
		mul1 = 0.8;
		SetPalette(2);
		SetWord3_acp(160,96,bestrec_j[0],0,mul1,mul1);
		time = GetRecordTime2(0);
		time_only = time & 0x000fffff;
		kawano_itoa_m(time_only,let);
		SetWord4_ap(127,109,let,0,mul1,mul1);
		SetWord2_ap(142,109,"'",0,mul1,mul1);
		kawano_itoa_s(time_only,let);
		SetWord4_ap(152,109,let,0,mul1,mul1);
		SetWord2_ap(167,109,"\"",0,mul1,mul1);
		kawano_itoa_c(time_only,let);
		SetWord4_ap(179,109,let,0,mul1,mul1);

		SetWord3_acp(160,124,bestrec_j[1],0,mul1,mul1);
		time = GetRecordLapTime();
		time_only = time & 0x000fffff;
		kawano_itoa_m(time_only,let);
		SetWord4_ap(127,137,let,0,mul1,mul1);
		SetWord2_ap(142,137,"'",0,mul1,mul1);
		kawano_itoa_s(time_only,let);
		SetWord4_ap(152,137,let,0,mul1,mul1);
		SetWord2_ap(167,137,"\"",0,mul1,mul1);
		kawano_itoa_c(time_only,let);
		SetWord4_ap(179,137,let,0,mul1,mul1);

		pos_ptr = &ta_pause_message_positions[0];

		mul1 = 0.75;
		for (i = 0;i < 6;i++){
			SetCursorMessageColor(ptr->pattern - KSEQ_PS_TA1,i,1);
			SetWord2_ap(pos_ptr->x,pos_ptr->y+i*13,
						ta_result_select_j[i+1],0,mul1,mul1);
		}
		break;
	case KSEQ_TAR_G_A1:
	case KSEQ_TAR_G_A2:
	case KSEQ_TAR_G_A3:
	case KSEQ_TAR_G_A4:
	case KSEQ_TAR_G_A5:
	case KSEQ_TAR_G_A6:
		SetPalette(3);
		j = ptr->pattern-KSEQ_TAR_G_A1;
		for(i = 0;i < 5;i++)
			SetWord2_a(100,110+i*13,ta_ghosta_messages_j[j*5 + i],
					   0,mul1,mul1);		
		break;
	case KSEQ_TAR_G_B1:
	case KSEQ_TAR_G_B2:
		SetPalette(1);
		for (i = 0;i < 2;i++)
			SetWord2_a(100,ptr->disp_y+110+i*13,
					   ta_ghostb_messages_j[i],0,mul1,mul1);
		for (i = 0;i < 2;i++){
			char let[5];
			SetCursorMessageColor(ptr->pattern - KSEQ_TAR_G_B1,i,1);
			kawano_itoa(i+1,let);
			SetWord2_a(110-ptr->disp_x,150+i*20,let+1,0,mul1,mul1);
			pak_ptr = &pak_ghost[i];
			if (!pak_ptr->e.ghost_flg){
				mul1 = 0.75;
				SetWord2_a(125-ptr->disp_x,150+i*20,ta_ghostb_messages_j[2],
						   0,mul1,mul1);
			}
			else{
				int a;

				mul1 = 0.75;
				a = pak_ptr->e.ghost_map;
				SetWord2_a(125-ptr->disp_x,150+i*20,
						   circuit_name_semilong_j[map_number_chart[a/4][a%4]],
						   0,mul1,mul1);
			}
		}
		break;
	case KSEQ_TAR_G_B3:
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(100,110+i*13,ta_ghostb3_messages_j[i],
					   0,mul1,mul1);		
		break;
	case KSEQ_TAR_G_C1:
	case KSEQ_TAR_G_C2:
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(100,ptr->disp_y+110+i*13,
					   ta_ghostc_messages_j[i],0,mul1,mul1);
		for (i = 0;i < 2;i++){
			SetCursorMessageColor(ptr->pattern - KSEQ_TAR_G_C1,i,1);
			SetWord2_a(125-ptr->disp_x,155+i*15,ta_ghostc_select_messages_j[i],
					   0,mul1,mul1);
		}
		break;
	case KSEQ_TAR_G_D:
		SetPalette(3);
		for (i = 0;i < 3;i++)
			SetWord2_a(100,110+i*13,ta_ghostd_messages_j[i],
					   0,mul1,mul1);		
		break;
	case KSEQ_TAR_G_D2:
		SetPalette(3);
		for (i = 0;i < 2;i++)
			SetWord2_a(100,110+i*13,ta_ghostd2_messages_j[i],
					   0,mul1,mul1);		
		break;
	default:
		break;
	}

	/* アイテムボックスカーソルの表示 */
	switch(ptr->pattern){
	case KSEQ_TAR_SEL1:
	case KSEQ_TAR_SEL2:
	case KSEQ_TAR_SEL3:
	case KSEQ_TAR_SEL4:
	case KSEQ_TAR_SEL5:
	case KSEQ_TAR_SEL6:
		pos_ptr = &tar_select_cursor_position[ptr->pattern - KSEQ_TAR_SEL1];
		break;
	case KSEQ_TAR_G_B1:
	case KSEQ_TAR_G_B2:
		pos_ptr = &tar_ghostb_cursor_position[ptr->pattern - KSEQ_TAR_G_B1];
		break;
	case KSEQ_TAR_G_C1:
	case KSEQ_TAR_G_C2:
		pos_ptr = &tar_ghostc_cursor_position[ptr->pattern - KSEQ_TAR_G_C1];
		break;
	default:
		return;
	}
	pos_buf.x = pos_ptr->x;
	pos_buf.y = pos_ptr->y;
	DispOB_vs_ibox_cursor(ptr,&pos_buf);

}


void DispOB_info_3p(OBJBlock *ptr)
{
	char *moji;

	if (kwradarsw == 1)
		return;
	gDPSetPrimColor(graphPtr++,0,0,	0,0,0,ptr->work1);
	moji = cup_name[cup_level];
	SetPalette(5);
	SetWord2_ap(ptr->disp_x+70-GetWordLength(moji)/2,ptr->disp_y+160,
				moji,0,1.0,1.0);

	moji = circuit_name[map_number];
	SetPalette(map_number%4);
	SetWord2_ap(ptr->disp_x+70-GetWordLength(moji)*.65/2,ptr->disp_y+195,
				moji,0,0.65,0.85);

	//SetPalette(race_level%4);
	//SetWord2_a(ptr->disp_x+50,ptr->disp_y+215,
	//			class_name[popup_status[players-1][play_mode[players-1]]],
	//			0,0.8,0.8);
}

void DispOB_gp_lose(OBJBlock *ptr)
{
	float mul1;
	int i;
	POS_XY *pos_ptr;
	POS_XY pos_buf;
	int x,y;

	x = 140;
	y = 150;
	mul1 = 1.0;
	if (!ptr->pattern){
		graphPtr = FillRect1Color_f(graphPtr,
									0,0,SCREEN_WD-1,SCREEN_HT-1,
									0,0,0,ptr->work1);
		SetPalette(3);
		gDPSetPrimColor(graphPtr++,0,0, 0,0,0,ptr->work1*255/100);
		for (i = 0;i < 2;i++)
			SetWord2_ap(x,y+i*20,ta_result_select_j[i*3+1],0,mul1,mul1);
	}
	else{
		graphPtr = FillRect1Color_f(graphPtr,
									0,0,SCREEN_WD-1,SCREEN_HT-1,
									0,0,0,100);
		for (i = 0;i < 2;i++){
			SetCursorMessageColor(ptr->pattern - KSEQ_GPL_SELECT1,i,3);
			SetWord2_a(x,y+i*20,ta_result_select_j[i*3+1],0,mul1,mul1);
		}
	}

	if (ptr->pattern >= KSEQ_GPL_SELECT1){
		//pos_ptr = &vs_result_cursor_position[ptr->pattern - KSEQ_GPL_SELECT1];
		pos_buf.x = x - 8;
		pos_buf.y = y - 8 + (ptr->pattern - KSEQ_GPL_SELECT1)*20;
		DispOB_vs_ibox_cursor(ptr,&pos_buf);
	}
	if (ptr->work2 > 0){
		graphPtr = FillRectBlack(graphPtr,0,0,319,ptr->work2);
		graphPtr = FillRectBlack(graphPtr,0,239-ptr->work2,319,239);
	}
}

void DispOB_vs_result(OBJBlock *ptr)
{
	char *moji;
	float mul1;
	int a,i;
	POS_XY *pos_ptr;

	if (!ptr->pattern){
		graphPtr = FillRect1Color_f(graphPtr,
									0,0,SCREEN_WD-1,SCREEN_HT-1,
									0,0,0,ptr->work1);
		SetPalette(5);
		gDPSetPrimColor(graphPtr++,0,0, 0,0,0,ptr->work1*255/100);
		SetWord3_acp(160/*ptr->disp_x+80*/,ptr->disp_y+30,
					vs_result_title_j[game_mode/3],0,1.0,1.0);
	}
	else{
		graphPtr = FillRect1Color_f(graphPtr,
									0,0,SCREEN_WD-1,SCREEN_HT-1,
									0,0,0,100);
		SetPalette(5);
		SetWord3_ac(160/*ptr->disp_x+80*/,ptr->disp_y+30,
					vs_result_title_j[game_mode/3],0,1.0,1.0);
	}

	switch(ptr->pattern){
	case KSEQ_VS_FADEIN:
	case KSEQ_VS_FACEIN:
		a = 0;
		break;
	case KSEQ_VS_POINTIN:
		a = ptr->work1;
		break;
	default:
		a = 255;
		break;
	}
	gDPSetPrimColor(graphPtr++,0,0, 0,0,0,a);
		
	switch(players){
	case 2:
		DispOB_vs_point2P(ptr);
		break;
	case 3:
		DispOB_vs_point3P(ptr);
		break;
	case 4:
		DispOB_vs_point4P(ptr);
		break;
	default:
		break;
	}

	if (ptr->pattern >= KSEQ_VS_SELECT0){
		mul1 = 0.8;
		for (i = 0;i < 4;i++){
			SetCursorMessageColor(ptr->pattern - KSEQ_VS_SELECT0,i,1);
			SetWord2_a(130,174 + i*15,ta_result_select_j[i+1],0,mul1,mul1);
		}
		pos_ptr = &vs_result_cursor_position[ptr->pattern - KSEQ_VS_SELECT0];
		//SetWord2_a(pos_ptr->x,pos_ptr->y,"+",0,mul1,mul1);		
		DispOB_vs_ibox_cursor(ptr,pos_ptr);
	}
}

void DispOB_vs_ibox_cursor(OBJBlock *ptr,POS_XY *pos_ptr)
{
	Mtx *m_ptr;
	float fbuf;
	static float ib_rot_x,ib_rot_y,ib_rot_z;
	static float ib_rot_dx,ib_rot_dy,ib_rot_dz;

	m_ptr = &dynamicp->effectmodeling[effectcount];
	if (ptr->workf1 > 1.5)
		ptr->workf1 *= 0.95;
	else
		ptr->workf1 = 1.5;
	fbuf = ptr->workf1;
	ib_rot_dx = fbuf*3*ptr->pattern2;
	ib_rot_dy = fbuf*4;
	ib_rot_dz = fbuf*2;

	ib_rot_x += ib_rot_dx;
	ib_rot_y += ib_rot_dy;
	ib_rot_z += ib_rot_dz;
	if (ib_rot_x > 360)
		ib_rot_x - 360;
	if (ib_rot_y > 360)
		ib_rot_y - 360;
	if (ib_rot_z > 360)
		ib_rot_z - 360;
	fbuf = 1.2;
	guScale(m_ptr,
			fbuf, fbuf, fbuf);
	guRotate(m_ptr+1,ib_rot_y,0,1,0);
	guMtxCatL(m_ptr,m_ptr+1,m_ptr);
	guRotate(m_ptr+1,ib_rot_z,0,0,1);
	guMtxCatL(m_ptr,m_ptr+1,m_ptr);
	guRotate(m_ptr+1,ib_rot_x,1,0,0);
	guMtxCatL(m_ptr,m_ptr+1,m_ptr);

	guTranslate(m_ptr+1,pos_ptr->x,pos_ptr->y,0);
	guMtxCatL(m_ptr,m_ptr+1,m_ptr);

	gSPMatrix (graphPtr++,
			   K0_TO_PHYS((u32) &(dynamicp->effectmodeling[effectcount++])),
			   G_MTX_MODELVIEW|G_MTX_LOAD|G_MTX_NOPUSH);
	gSPClearGeometryMode(graphPtr++,G_LIGHTING/*|G_ZBUFFER*/);
	gDPSetCombineMode(graphPtr++,G_CC_MODULATERGBA, G_CC_MODULATERGBA);
	gDPSetBlendMask(graphPtr++,0xff);
 	//gDPSetRenderMode(graphPtr++,G_RM_ZB_CLD_SURF,G_RM_ZB_CLD_SURF2);
 	gDPSetRenderMode(graphPtr++,G_RM_CLD_SURF,G_RM_CLD_SURF2);
	gSPDisplayList(graphPtr++,itembox_grp_box);
}

void DispOB_vs_point2P(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	int i;
	float mul1;
	char let[5];
	char *wl_ptr;
	int loser_flg;
	unsigned char *wc;

	mul1 = 1.0;
	for (i = 0;i < players;i++){
		pos_ptr = &vs_face_target_position[/*(players-2)*4 +*/ i];
		loser_flg = 0;
		switch(game_mode){
		case VSBATTLE:
			if (ogawa_rank[i])
				loser_flg = 1;
			wc = &wincount2p[i];
			break;
		case BATTLE:
			if (win_kart != i)
				loser_flg = 1;
			wc = &battlewincount2p[i];
			break;
		}
		wl_ptr = win_lose_j[loser_flg];
		if (loser_flg)
			SetPalette(0);
		else
			SetPalette(frame_counter%3);
			
		kawano_itoa2(*wc,let);
		SetWord4_ap(pos_ptr->x+16,pos_ptr->y + 117,let,0,mul1,mul1);

		pos_ptr = &vs_result_winlose_position[i];
		//SetPalette(2);
		SetWord2_ap(pos_ptr->x,pos_ptr->y,wl_ptr,0,mul1,mul1);	
	}
	mul1 = 1.0;
	pos_ptr = &vs_face_target_position[0];
	SetPalette(0);
	SetWord4_ap(158,pos_ptr->y + 109,"ー",0,mul1,mul1);
		
}

void DispOB_vs_point3P(OBJBlock *ptr)
{
	int i;

	for (i = 0;i < players;i++){
		switch(game_mode){
		case VSBATTLE:
			DispOB_vs_point123(3,i,wincount3p);
			break;
		case BATTLE:
			DispOB_bt_point(3,i,battlewincount3p);
			break;
		}
	}
}

void DispOB_vs_point4P(OBJBlock *ptr)
{
	int i;

	for (i = 0;i < players;i++){
		switch(game_mode){
		case VSBATTLE:
			DispOB_vs_point123(4,i,wincount4p);
			break;
		case BATTLE:
			DispOB_bt_point(4,i,battlewincount4p);
			break;
		}
	}
}

void DispOB_bt_point(int num1,int num2,uchar *wc_ptr)
{
	POS_XY *pos_ptr;
	float mul1;
	char let[5];
	int i;
	int loser_flg;
	int wc;

	pos_ptr = &vs_face_target_position[(num1-2)*4 + num2];
	loser_flg = 0;
	if (win_kart != num2)
		loser_flg = 1;
	wc = *(wc_ptr+num2);

	if (loser_flg)
		SetPalette(0);
	else
		SetPalette(frame_counter%3);

	//mul1 = 1.0;
	mul1 = 0.75;
	kawano_itoa2(wc,let);
	SetWord4_ap(pos_ptr->x+32-32*mul1/2,pos_ptr->y + 117,let,0,mul1,mul1);

}

void DispOB_vs_point123(int num1,int num2,uchar *wc_ptr)
{
	POS_XY *pos_ptr;
	float mul1;
	char let[5];
	int my_ranking,i;

	mul1 = 0.8;
	pos_ptr = &vs_face_target_position[(num1-2)*4 + num2];
	my_ranking = ogawa_rank[num2];
	i = 0;

	if (i == my_ranking)
		SetPalette(frame_counter%3);
	else
		SetPalette(3);
	SetWord4_ap(pos_ptr->x + 4,pos_ptr->y + 90,"1 ｓ ー",0,mul1,mul1);
	kawano_itoa(*(wc_ptr+3*num2),let);
	SetWord4_ap(pos_ptr->x+45,pos_ptr->y + 90,let,0,mul1,mul1);

	i++;
	if (i == my_ranking)
		SetPalette(frame_counter%3);
	else
		SetPalette(0);
	SetWord4_ap(pos_ptr->x + 4,pos_ptr->y + 105,"2 ｎ ー",0,mul1,mul1);
	kawano_itoa(*(wc_ptr+3*num2+1),let);
	SetWord4_ap(pos_ptr->x+45,pos_ptr->y + 105,let,0,mul1,mul1);

	i++;
	if (i == my_ranking)
		SetPalette(frame_counter%3);
	else
		SetPalette(2);
	SetWord4_ap(pos_ptr->x + 4,pos_ptr->y + 120,"3 ｒ ー",0,mul1,mul1);
	kawano_itoa(*(wc_ptr+3*num2+2),let);
	SetWord4_ap(pos_ptr->x+45,pos_ptr->y + 120,let,0,mul1,mul1);

}

void DispOB_ta_lostghost(OBJBlock *ptr)
{
	int i,step;
	float mul1;
	int l_1,l_2;
	int x,y;

	mul1 = 0.5;
	x = 195;
	y = 44;

	switch(ptr->pattern){
	case 1:
		l_1 = GetWordLength(ta_lost_ghost_message_j[0])*mul1;
		l_2 = GetWordLength(ta_lost_ghost_message_j[1])*mul1;
		if (l_1 < l_2)
			l_1 = l_2;
		graphPtr = FillRect1Color_f(graphPtr,
									x-3,y-10,x+l_1+3,y+13,
									0,0,0,150);
		//if ((ptr->work1/16)%4){
			step = 384 - (ptr->work1%32)*8;
			if (step > 255)
				step = 255;
			gDPSetPrimColor(graphPtr++,0,0, 0,0,0,step);
			SetPalette(2);
			for (i = 0;i < 2;i++)
				//SetWord2_a(x,y+i*10,ta_lost_ghost_message_j[i],0,mul1,mul1);
				SetWord2_ap(x,y+i*10,ta_lost_ghost_message_j[i],0,mul1,mul1);
		//}
		break;
	default:
		break;
	}
}

void DispOB_ending1_halffade(OBJBlock *ptr)
{
	if (!ptr->pattern)
		graphPtr = FillRect1Color_f(graphPtr,
									0,0,SCREEN_WD-1,SCREEN_HT-1,
									0,0,0,ptr->work1);
	else
		graphPtr = FillRect1Color_f(graphPtr,
									0,0,SCREEN_WD-1,SCREEN_HT-1,
									0,0,0,100);
}

void DispOB_ending1_message1(OBJBlock *ptr)
{
	float mul1;
	int l_1,l_2;

	mul1 = 1.0;
	l_1 = (GetWordLength(cup_name[cup_select])*mul1+10)/2;
	l_2 = (GetWordLength(class_name[race_level])*mul1+10)/2;
	SetPalette(3);
	SetWord3_ac(ptr->disp_x-l_2,ptr->disp_y,cup_name[cup_select],
				0,mul1,mul1);
	SetPalette(3);
	SetWord3_ac(ptr->disp_x+l_1,ptr->disp_y,class_name_j[race_level],
				0,mul1,mul1);

	
}

void DispOB_ending1_message2(OBJBlock *ptr)
{
	float mul1;
	int l_1,l_2;
	int num;

	num = resultstat.rank;
	mul1 = 0.75;
	if (num > 2){
		SetPalette(3);
		SetWord3_ac(ptr->disp_x,ptr->disp_y,ending_message2[4],
					0,mul1,mul1);
	}
	else{
		l_1 = ((GetWordLength(ending_message2[0])+5)*mul1)/2;
		l_2 = ((GetWordLength(ending_message2[num+1])+5)*mul1)/2;
		SetPalette(3);
		SetWord3_ac(ptr->disp_x-l_2,ptr->disp_y,ending_message2[0],
					0,mul1,mul1);
		SetPalette(3);
		SetWord3_ac(ptr->disp_x+l_1,ptr->disp_y,ending_message2[num+1],
					0,mul1,mul1);
	}


	
}

void DispOB_ending1_message3(OBJBlock *ptr)
{
	float mul1;
	int i;

	mul1 = 1.3;
	if (resultstat.rank < 3)
		i = 0;
	else
		i = 1;

	SetPalette(4);
	SetWord3_ac(ptr->disp_x,ptr->disp_y,ending_message3[i],0,mul1,mul1);

	
}

void DispOB_ending1_message4(OBJBlock *ptr)
{
	float mul1;
	int l_1,l_2;
	char let[5];
	int num;

	num = resultstat.rank+1;
	mul1 = 1.2;
	kawano_itoa2(resultstat.rank+1,let);
	l_1 = ((GetWordLength(ending_message4[0])+5)*mul1)/2;
	l_2 = ((GetWordLength(ending_message4[num])+5)*mul1)/2;
	SetPalette(5);
	SetWord3_ac(ptr->disp_x-l_2,ptr->disp_y,ending_message4[0],0,mul1,mul1);
	
	SetPalette(frame_counter % 3);
	SetWord3_ac(ptr->disp_x+l_1,ptr->disp_y,ending_message4[num],0,mul1,mul1);
	kawano_itoa(num,let);
	mul1 = 2.0;
	SetWord4_a(ptr->disp_x+l_1-24,ptr->disp_y,let+1,0,mul1,mul1);

	
}

void DispOB_staffroll_messages(OBJBlock *ptr)
{
	ENDING_DATA *e_ptr;
	int num;
	char **c_ptr;

	num = ptr->kind - KO_SR_A1;
	e_ptr = &ending_data[num];
	if (race_level == 3)
		c_ptr = &ending_names_kana[num];
	else
		c_ptr = &ending_names[num];

	SetPalette(e_ptr->color);
	switch(e_ptr->type){
	case 0:
	default:
		SetWord3_a(ptr->disp_x,ptr->disp_y,*c_ptr,
				   ptr->work1*e_ptr->mul,ptr->workf1*e_ptr->mul,e_ptr->mul);
		break;
	case 1:
		SetWord2_a(ptr->disp_x,ptr->disp_y,*c_ptr,
				   ptr->work1*e_ptr->mul,ptr->workf1*e_ptr->mul,e_ptr->mul);
		break;
	}
}










//
//小さい文字用itoa
//
void kawano_itoa(int num,char *ptr)
{
	int a;
	a = num/10;
	*ptr = 48 + a;
	a = num%10;
	*(ptr+1) = 48 + a;
	*(ptr+2) = '\0';
}

void kawano_itoa_nodata(char *ptr)
{
	*ptr = '-';
	*(ptr+1) = '-';
	*(ptr+2) = '\0';
}

//
//タイム変換用itoa(分)
//
void kawano_itoa_m(int num,char *ptr)
{
	if (num >= 600000)
		kawano_itoa_nodata(ptr);
	else
		kawano_itoa(num/6000,ptr);
}

//
//タイム変換用itoa(秒)
//
void kawano_itoa_s(int num,char *ptr)
{
	if (num >= 600000)
		kawano_itoa_nodata(ptr);
	else
		kawano_itoa((num/100)%60,ptr);
}

//
//タイム変換用itoa(1/100秒)
//
void kawano_itoa_c(int num,char *ptr)
{
	if (num >= 600000)
		kawano_itoa_nodata(ptr);
	else
		kawano_itoa(num%100,ptr);
}

//
//大きい文字用itoa
//
void kawano_itoa2(int num,char *ptr)
{
	int a;
	a = num/10;
	*ptr = -93;
	*(ptr+1) = 0x30 + a - 128;
	a = num%10;
	*(ptr+2) = -93;
	*(ptr+3) = 0x30 + a - 128;
	*(ptr+4) = '\0';
}

void doOBJBlock(int pri_flg)
{
	OBJBlock *ptr;
	int i,j;
	int operate_flg;

	for (i = 0;i < OBJ_BLOCK_MAX;i++){
		ptr = &obj_block[i];
		operate_flg = 0;
		switch(ptr->kind){/* 最前面とそれ以外の処理に分ける */
		case KO_GAME_PAUSE:
		case KO_NOCONTROLLER:
		case KO_TITLE_TIME:
			if (pri_flg)
				operate_flg = 1;
			break;
		default:
			if (!pri_flg)
				operate_flg = 1;
			break;
		}
		if (!operate_flg)
			continue;
		switch(ptr->kind){
		case 0:
			break;
		case KO_NINTEN_LOGO:
#if DL_KARTLOGO
			if      ( logo_timer < 80 )  logo_yang_speed = 3; 
			else if ( logo_timer < 90 ){ if ( logo_delay_size < 1.0 ) logo_delay_size += 0.1; logo_yang_speed += 0.1; }
			else if ( logo_timer < 160 )  logo_yang_speed += 0.1;
			else if ( logo_timer < 400 )  logo_yang_speed += 0.3;
			logo_rot_y -= logo_yang_speed;
			logo_timer++;
#else
			logo_rot_y -= 3;
#endif
			if (logo_rot_y < -360)
				logo_rot_y += 360;
			ptr->work1++;
			if (ptr->work1 == 180){
			    SetFadeOutWhite(40);
				Na_SE_Fadeout(100);
			    k_bg_number_next = 0;
			}
			if (ptr->work2 && (ptr->work1 > 2)){
				ptr->work2 = 0;
				Na_System_Start(SE_LOGO);
			}
			break;
		case KO_CHECKER_FLAG:
			break;
		case KO_CP_CSCOLOR:
			DOB_cp_cscolor(ptr);
			break;
		case KO_CP_MES2:
			DOB_cp_mes2(ptr);
			break;
		case KO_CP_GNOTE:
			DOB_cp_gnote(ptr);
			break;
		case KO_TITLE:
			//DOB_Title();
			break;
		case KO_TITLE2:
		case KO_TITLE3:
			break;
		case KO_TITLE_TIME:
			switch(ptr->pattern){
			case 0:
				if (contOR->status & CONT_R){
					ptr->pattern = 1;
					Na_System_Start(SE_MAP_CHANGE);
				}
				else
					ptr->disp_on = 0;
				break;
			case 1:
			default:
				ptr->disp_on = 1;
				break;
			}
			break;
		case KO_NOCONTROLLER:
			break;
		case KO_GSEL_BACK:
			break;
		case KO_GSEL_LOGO:
			DOB_gsel_start(ptr);
			break;
		case KO_GSEL_OPTION:
		case KO_GSEL_RECORD:
			switch(gsel_mode){
			case GSEL_NUMBER:
			case GSEL_OPTION:
			case GSEL_RECORD:
				DOB_gsel_number(ptr);
				break;
			case GSEL_MODE_SELECT:
			case GSEL_POPUP:
			case GSEL_POPUP2:
			case GSEL_OK:
			case GSEL_OK2:
				DOB_gsel_mode(ptr);
				break;
			default:
				break;
			}
			break;
		case KO_GSEL_OK:
			DOB_gsel_start(ptr);
			DOB_sel_ok(ptr);
			break;
		case KO_GSEL_1P:
		case KO_GSEL_2P:
		case KO_GSEL_3P:
		case KO_GSEL_4P:
			switch(gsel_mode){
			case GSEL_NUMBER:
			case GSEL_OPTION:
			case GSEL_RECORD:
				DOB_gsel_number(ptr);
				break;
			case GSEL_MODE_SELECT:
			case GSEL_POPUP:
			case GSEL_POPUP2:
			case GSEL_OK:
			case GSEL_OK2:
			//case GSEL_OPTION:
			//case GSEL_RECORD:
				DOB_gsel_mode(ptr);
				break;
			default:
				break;
			}
			DOB_gsel_move(ptr);
			break;
		case KO_GSEL_50CC:
		case KO_GSEL_100CC:
		case KO_GSEL_150CC:
		case KO_GSEL_PRO:
		case KO_GSEL_ITEMOFF:
		case KO_GSEL_ITEMON:
		case KO_GSEL_TRY:
		//case KO_GSEL_GHOST:
		case KO_GSEL_DATA:
			DOB_gsel_gp(ptr);
			break;
		case KO_GSEL_CAUTION:
			DOB_gsel_caution(ptr);
			break;
		case KO_PSEL_1P:
		case KO_PSEL_2P:
		case KO_PSEL_3P:
		case KO_PSEL_4P:
			DOB_psel_cursor1(ptr);
			break;
		case KO_PSEL_MA:
		case KO_PSEL_LU:
		case KO_PSEL_PE:
		case KO_PSEL_KI:
		case KO_PSEL_YO:
		case KO_PSEL_KA:
		case KO_PSEL_WA:
		case KO_PSEL_KU:
			DOB_psel_character1(ptr);
			switch(ptr->kind){
			//case KO_PSEL_MA:
			//case KO_PSEL_LU:
			//case KO_PSEL_KI:
			//	DOB_psel_anime_mario(ptr,ptr->kind - KO_PSEL_MA);
			//	break;
			case KO_PSEL_MA:
			case KO_PSEL_LU:
			case KO_PSEL_PE:
			case KO_PSEL_KI:
			case KO_PSEL_YO:
			case KO_PSEL_KA:
			case KO_PSEL_WA:
			case KO_PSEL_KU:
				DOB_psel_anime_kuppa(ptr);
				break;
			}
			switch(psel_mode){
			case PSEL_SELECT:
				DOB_psel_turn_in(ptr);
				break;
			case PSEL_OK:
			case PSEL_OK2:
				DOB_psel_turn_out(ptr);
				break;
			}
			DOB_psel_anime_priority(ptr);
			break;
		case KO_MSEL_OK:
		case KO_PSEL_OK:
			DOB_sel_ok(ptr);
			break;
		case KO_MSEL_KCUP:
		case KO_MSEL_FCUP:
		case KO_MSEL_SCUP:
		case KO_MSEL_SPCUP:
			DOB_msel_move(ptr);
			switch(msel_mode){
			case MSEL_CUP:
				DOB_msel_cup(ptr);
				break;
			case MSEL_MAP:
			case MSEL_OK:
				DOB_msel_map(ptr);
				break;
			default:
				break;
			}
			//DOB_msel_move(ptr);
			break;
		case KO_MSEL_KNAME:
		case KO_MSEL_FNAME:
		case KO_MSEL_SNAME:
		case KO_MSEL_SPNAME:
		//case KO_MSEL_BATTLE:
			DOB_msel_name(ptr);
			break;
#if 0
		case KO_MSEL_MAP:/* 現在不使用 */
			//DOB_msel_anime_map(ptr);
			break;
#endif
		case KO_MSEL_MAPMAN:
			DOB_msel_anime_mapman(ptr);
			break;
		case KO_MSEL_MAP1:
		case KO_MSEL_MAP2:
		case KO_MSEL_MAP3:
		case KO_MSEL_MAP4:
			DOB_msel_anime_map2(ptr);
			break;
		case KO_MSEL_BRECORD:
		case KO_MSEL_BLAP:
			DOB_msel_bbox(ptr);
			break;
		case KO_MSEL_CUP:
			DOB_msel_cup_gsc(ptr);
			break;
		case KO_TSEL_KCUP:
		case KO_TSEL_FCUP:
		case KO_TSEL_SCUP:
		case KO_TSEL_SPCUP:
		case KO_TSEL_TITLE:
			DOB_tsel_cup(ptr);
			break;
		case KO_TSEL_CURSOR:
			DOB_tsel_cursor(ptr);
			break;
		case KO_TSEL_KCUP1:
		case KO_TSEL_KCUP2:
		case KO_TSEL_KCUP3:
		case KO_TSEL_KCUP4:
		case KO_TSEL_FCUP1:
		case KO_TSEL_FCUP2:
		case KO_TSEL_FCUP3:
		case KO_TSEL_FCUP4:
		case KO_TSEL_SCUP1:
		case KO_TSEL_SCUP2:
		case KO_TSEL_SCUP3:
		case KO_TSEL_SCUP4:
		case KO_TSEL_SPCUP1:
		case KO_TSEL_SPCUP2:
		case KO_TSEL_SPCUP3:
		case KO_TSEL_SPCUP4:
			DOB_tsel_map(ptr);
			break;
		case KO_GAME_CUP:
			DOB_game_cup(ptr);
			break;
		case KO_GAME_CIRCUIT:
			DOB_game_circuit(ptr);
			break;
		case KO_MSEL_NOISE:
			DOB_msel_noise(ptr);
			break;
		case KO_GAME_TIME:
			DOB_game_time(ptr);
			break;
		case KO_GAME_POINT:
			DOB_game_point(ptr);
			break;
		case KO_GAME_GPLOSE:
			DOB_gp_lose(ptr);
			break;
		case KO_GAME_INFO3P:
			DOB_info_3p(ptr);
			break;
		case KO_GAME_VS_RES:
			DOB_vs_result(ptr);
			break;
		case KO_GAME_VS_1P:
		case KO_GAME_VS_2P:
		case KO_GAME_VS_3P:
		case KO_GAME_VS_4P:
			DOB_vs_face(ptr);
			break;
		case KO_GAME_TA1:
			DOB_game_ta1(ptr);
			break;
		case KO_GAME_TA2:
			DOB_game_ta2(ptr);
			break;
		case KO_GAME_TA_MES1:
			DOB_game_ta_mes1(ptr);
			break;
		case KO_GAME_PAUSE:
			DOB_game_pause(ptr);
			break;
		case KO_GAME_TA_REP:
			DOB_game_ta_replay(ptr);
			break;
		case KO_DSEL_SNAP:
			DOB_dsel_snap(ptr);
			break;
		case KO_DSEL_SEL1:
			DOB_dsel_sel1(ptr);
			break;
		case KO_DSEL_SEL2:
			DOB_dsel_sel2(ptr);
			break;
		case KO_DSEL_SEL3:
			DOB_dsel_sel3(ptr);
			break;
		case KO_GAME_TA_RANK:/* ＴＡ５位以内に入ったときファンファーレ */
			DOB_ta_fanfare(ptr);
			break;
		case KO_TA_LOSTGHOST:
			DOB_ta_lostghost(ptr);
			break;
		case KO_END1_FADE:
			DOB_ending1_halffade(ptr);
			break;
		case KO_END1_MES1:
		case KO_END1_MES2:
		case KO_END1_MES3:
		case KO_END1_MES4:
			DOB_ending1_message(ptr);
			break;
		case KO_END1_FACE:
			DOB_ending1_face(ptr);
			break;
		case KO_SR_A1:
		case KO_SR_A2:
		case KO_SR_B1:
		case KO_SR_B2:
		case KO_SR_C1:
		case KO_SR_C2:
		case KO_SR_D1:
		case KO_SR_D2:
		case KO_SR_E1:
		case KO_SR_E2:
		case KO_SR_E3:
		case KO_SR_E4:
		case KO_SR_E5:
		case KO_SR_E6:
		case KO_SR_E7:
		case KO_SR_F1:
		case KO_SR_F2:
		case KO_SR_F3:
		case KO_SR_F4:
		case KO_SR_G1:
		case KO_SR_G2:
		case KO_SR_H1:
		case KO_SR_H2:
		case KO_SR_H3:
		case KO_SR_H4:
		case KO_SR_H5:
		case KO_SR_H6:
		case KO_SR_H7:
		case KO_SR_H8:
		case KO_SR_I1:
		case KO_SR_I2:
		case KO_SR_I3:
		case KO_SR_I4:
		case KO_SR_J1:
		case KO_SR_J2:
		case KO_SR_K1:
		case KO_SR_K2:
		case KO_SR_K3:
		case KO_SR_L1:
		case KO_SR_L2:
		case KO_SR_L3:
		case KO_SR_L4:
		case KO_SR_L5:
		case KO_SR_L6:
		case KO_SR_L7:
		case KO_SR_M1:
		case KO_SR_M2:
		case KO_SR_M3:
		case KO_SR_M4:
		case KO_SR_N1:
		case KO_SR_N2:
		case KO_SR_N3:
		case KO_SR_O1:
		case KO_SR_O2:
		case KO_SR_O3:
		case KO_SR_O4:
		case KO_SR_O5:
		case KO_SR_O6:
		case KO_SR_O7:
		case KO_SR_O8:
		case KO_SR_O9:
		case KO_SR_P1:
		case KO_SR_Q1:
		    DOB_staffroll_messages(ptr);
			break;
		//case KO_GAME_TA_SORT:
		//case KO_MSEL_GHOST:
		//case KO_MSEL_BTMES:
		//case KO_OPT_MES:
		default:
			break;
		}
	}

	for (j = 0;j < 16;j++){
		for (i = 0;i < OBJ_BLOCK_MAX;i++){
			ptr = &obj_block[i];
			operate_flg = 0;
			switch(ptr->kind){
			case KO_GAME_PAUSE:
			case KO_NOCONTROLLER:
			case KO_TITLE_TIME:
				if (pri_flg)
					operate_flg = 1;
				break;
			default:
				if (!pri_flg)
					operate_flg = 1;
				break;
			}
			if (!operate_flg)
				continue;
			if (j == ptr->pri)
				DispOBJBlock(ptr);
		}
	}
}

void doOBJBlock1(void)/* 通常の doOBJBlock の処理 */
{
	doOBJBlock(0);
}

void doOBJBlock2(void)/* 一番手前に表示するためのdoOBJBlock */
{
	doOBJBlock(1);
}


void gsel_sub1(int i,OBJBlock *ptr)
{
	int j,dx,dy;
	int x1;

	if (ptr->work1 >= 32)
		return;
	x1 = (GSEL_PBOX_X+1)*ptr->work1/64;
	dx = ptr->disp_x;
	dy = ptr->disp_y;
	gDPPipeSync(graphPtr++);
	gDPSetRenderMode(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
	gDPSetCombineMode(graphPtr++,G_CC_DECALRGBA, G_CC_DECALRGBA);

	if (i == players-1){
		switch(gsel_mode){
		case GSEL_NUMBER:
		case GSEL_OPTION:
		case GSEL_RECORD:
			graphPtr = FlashRectangle2(graphPtr,dx+x1,dy,
									   GSEL_PBOX_X+dx-x1,GSEL_PBOX_Y+dy);
			break;
		default:
			graphPtr = FillRect1Color(graphPtr,dx+x1,dy,
									  GSEL_PBOX_X+dx-x1,GSEL_PBOX_Y+dy,
									  255,249,220,255);
			break;
		}
	}
	else{
		graphPtr = FillRectBlack(graphPtr,dx+x1,dy,
								 GSEL_PBOX_X+dx-x1,GSEL_PBOX_Y+dy);
	}

	dy += GSEL_MODE_OFFSET_Y;
	for (j = 0;j <= play_mode_max[i];j++){
		if ((play_mode[i] == j)&&(i+1 == players)&&(gsel_mode > GSEL_NUMBER)){
			if (gsel_mode == GSEL_MODE_SELECT){
				graphPtr = FlashRectangle2(graphPtr,dx+x1,dy,
										   GSEL_RBOX_X+dx-x1,GSEL_RBOX_Y+dy);
			}
			else{
				graphPtr = FillRect1Color(graphPtr,dx+x1,dy,
										  GSEL_RBOX_X+dx-x1,GSEL_RBOX_Y+dy,
										  255,249,220,255);
			}
		}
		else{
			graphPtr = FillRect1Color(graphPtr,dx+x1,dy,
									  GSEL_RBOX_X+dx-x1,GSEL_RBOX_Y+dy,
									  1,1,1,255);
		}
		dy += GSEL_RBOX_Y+1;
	}

}
void sel_ok_sub(OBJBlock *ptr)
{
	int i,check;
	int x1,y1;
	TexBlock *tb_ptr;

	check = 0;
	switch(ptr->kind){
	case KO_GSEL_OK:
		tb_ptr = TexList_lgsel_ok;
		switch(gsel_mode){
		case GSEL_OK:
		case GSEL_OK2:
			check = 1;
			break;
		}
		break;
	case KO_PSEL_OK:
		tb_ptr = TexList_lpsel_ok;
		switch(psel_mode){
		case PSEL_OK:
		case PSEL_OK2:
			check = 1;
			break;
		}
		break;
	case KO_MSEL_OK:
		tb_ptr = TexList_lmsel_ok;
		if (msel_mode == MSEL_OK)
			check = 1;
		break;
	default:
		return;
	}
	if (ptr->work1 >= 32)
		return;
	i = (SEL_OKBOX_X+1)*ptr->work1/64;
	tb_ptr = GetTBPointer(tb_ptr);
	x1 = ptr->disp_x + tb_ptr->pos_x;
	y1 = ptr->disp_y + tb_ptr->pos_y;
	if (check){
		graphPtr = FlashRectangle2(graphPtr,x1+i,y1,
								   x1+(SEL_OKBOX_X-1)-i,
								   y1+(SEL_OKBOX_Y-1));
	}
	else{
		graphPtr = FillRect1Color(graphPtr,x1+i,y1,
								  x1+(SEL_OKBOX_X-1)-i,
								  y1+(SEL_OKBOX_Y-1),
								  1,1,1,255);
	}
}

void msel_bbox_sub(OBJBlock *ptr)
{
	graphPtr = FillRect1Color(graphPtr,ptr->disp_x,ptr->disp_y,
							  ptr->disp_x+MSEL_BESTBOX_X,
							  ptr->disp_y+MSEL_BESTBOX_Y,
							  1,1,1,255);
}

void msel_bbox_sub2(OBJBlock *ptr)
{
	char let[5];
	uint a,time_only;
	float mul1,mul2;

	mul1 = 0.6;
	mul2 = 0.65;
	SetPalette(1);
	if (ptr->kind == KO_MSEL_BRECORD)
		a = GetRecordTime2(0);
	else
		a = GetRecordLapTime();
	time_only = a  & 0x000fffff;
	kawano_itoa_m(time_only,let);
	SetWord4_ap(ptr->disp_x+5,ptr->disp_y + 33,let,0,mul1,mul2);
	SetWord2_a(ptr->disp_x+14,ptr->disp_y+33,"'",0,mul1,mul2);
	kawano_itoa_s(time_only,let);
	SetWord4_ap(ptr->disp_x+22,ptr->disp_y + 33,let,0,mul1,mul2);
	SetWord2_a(ptr->disp_x+32,ptr->disp_y+33,"\"",0,mul1,mul2);
	kawano_itoa_c(time_only,let);
	SetWord4_ap(ptr->disp_x+41,ptr->disp_y + 33,let,0,mul1,mul2);
	if (time_only < 600000)
		a >>= 20;
	else
		a = 8;
	SetWord3_a(ptr->disp_x+MSEL_BESTBOX_X-2,ptr->disp_y+33,
			   drivers_name_j[a],0,mul1,mul2);
}

void msel_sub1(int i,OBJBlock *ptr)
{
	int dx,dy;
	int x1;

	if (ptr->work1 >= 32)
		return;
	x1 = (MSEL_CUPBOX_X+1)*ptr->work1/64;
	dx = ptr->disp_x;
	dy = ptr->disp_y;
	gDPPipeSync(graphPtr++);
	gDPSetRenderMode(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
	gDPSetCombineMode(graphPtr++,G_CC_DECALRGBA, G_CC_DECALRGBA);

	if (i == cup_select){
		if (msel_mode == MSEL_CUP){
			graphPtr = FlashRectangle2(graphPtr,dx+x1,dy,
									   dx+MSEL_CUPBOX_X-x1,dy+MSEL_CUPBOX_Y);
		}
		else{
			graphPtr = FillRect1Color(graphPtr,dx+x1,dy,
									  dx+MSEL_CUPBOX_X-x1,dy+MSEL_CUPBOX_Y,
									  255,249,220,255);
		}
	}
	else{
		graphPtr = FillRect1Color(graphPtr,dx+x1,dy,
								  dx+MSEL_CUPBOX_X-x1,dy+MSEL_CUPBOX_Y,
								  1,1,1,255);
	}
}

void msel_sub2(OBJBlock *ptr)
{
	int i,dx,dy;

	dx = ptr->disp_x;
	dy = ptr->disp_y;
	gDPPipeSync(graphPtr++);
	gDPSetRenderMode(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
	gDPSetCombineMode(graphPtr++,G_CC_DECALRGBA, G_CC_DECALRGBA);

	for (i = 0;i < 4;i++){
		if ((i == circuit_select) && (msel_mode > MSEL_CUP)
			&&(game_mode != MARIOGP)){
			if ((msel_mode == MSEL_MAP)||(msel_mode == MSEL_BATTLEMAP)){
				graphPtr = FlashRectangle2(graphPtr,
										   lmsel_circuit_position[i*2].x+dx,
										   lmsel_circuit_position[i*2].y+dy,
										   lmsel_circuit_position[i*2+1].x+dx,
										   lmsel_circuit_position[i*2+1].y+dy);
			}
			else{
				graphPtr = FillRect1Color(graphPtr,
										  lmsel_circuit_position[i*2].x+dx,
										  lmsel_circuit_position[i*2].y+dy,
										  lmsel_circuit_position[i*2+1].x+dx,
										  lmsel_circuit_position[i*2+1].y+dy,
										  255,249,220,255);
			}
		}
		else{
			graphPtr = FillRect1Color(graphPtr,
									  lmsel_circuit_position[i*2].x+dx,
									  lmsel_circuit_position[i*2].y+dy,
									  lmsel_circuit_position[i*2+1].x+dx,
									  lmsel_circuit_position[i*2+1].y+dy,
									  1,1,1,255);
		}	
	}
}

#if 0
//
//マップセレクト面でのマップ名暗くするルーチン
// (現在不使用)
void msel_sub3(OBJBlock *ptr)
{
	int i,dx,dy;
	OBJBlock *ptr2;

	ptr2 = Get_OBJBlock_ptr(KO_MSEL_MAP);
	dx = ptr->disp_x;
	dy = ptr->disp_y;
	gDPPipeSync(graphPtr++);
	gDPSetRenderMode(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
	gDPSetCombineMode(graphPtr++,G_CC_DECALRGBA, G_CC_DECALRGBA);

	if (game_mode == MARIOGP){
		for (i = 0;i < 4;i++){
			if (map2circuit_chart[ptr2->work1] != i)
				graphPtr = FillRect1Color_f(graphPtr,
										  lmsel_circuit_position[i*2].x+dx,
										  lmsel_circuit_position[i*2].y+dy,
										  lmsel_circuit_position[i*2+1].x+dx,
										  lmsel_circuit_position[i*2+1].y+dy,
										  0,0,0,100);
		}
	}
}
#endif

//
//マップセレクト面でのマップ名暗くするルーチン
//
void msel_sub4(OBJBlock *ptr)
{
	int i,dx,dy;
	OBJBlock *ptr2;

	ptr2 = Get_OBJBlock_ptr(KO_MSEL_MAPMAN);
	dx = ptr->disp_x;
	dy = ptr->disp_y;
	gDPPipeSync(graphPtr++);
	gDPSetRenderMode(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
	gDPSetCombineMode(graphPtr++,G_CC_DECALRGBA, G_CC_DECALRGBA);

	if ((game_mode == MARIOGP)&&(msel_mode != MSEL_OK)){
		for (i = 0;i < 4;i++){
			if ((ptr2->work1%4) != i)
				graphPtr = FillRect1Color_f(graphPtr,
										  lmsel_circuit_position[i*2].x+dx,
										  lmsel_circuit_position[i*2].y+dy,
										  lmsel_circuit_position[i*2+1].x+dx,
										  lmsel_circuit_position[i*2+1].y+dy,
										  0,0,0,100);
		}
	}
}

void msel_battle_sub(OBJBlock *ptr)
{
	float mul1;

	mul1 = 1.0;
	SetPalette(3);
	SetWord3_ac(160,68,msel_battle_messages_j[0],0,mul1,mul1);
	mul1 = 0.95;
	SetWord2_a(26,88,msel_battle_messages_j[1],0,mul1,mul1);
	SetWord4_a(30,106,msel_battle_messages_j[2],4,mul1,mul1);
}

void DispOB_Sub_msel_cup(OBJBlock *ptr)
{
	float mul1;

	mul1 = 0.7;
	if (!ptr->work2)
		return;
	doSeqData2(ptr->sd_number,ptr->disp_x,ptr->disp_y,-1);
	SetPalette(3);
	SetWord2_a(ptr->disp_x + 32,ptr->disp_y + 40,
			   cup_type_names[ptr->work2],0,mul1,mul1);
}

void DispOB_Sub_msel_ghost(OBJBlock *ptr)
{
	float mul1;
	int x,y,i;
	POS_XY *pos_ptr;


	switch(msel_mode){
	case MSEL_CUP:
		for (i = 0;i < 4;i++){
			if (CheckSameMap2(cup_select*4 + i) >= 0){
				pos_ptr = &msel_map4box_position[i];
				x = pos_ptr->x;
				y = pos_ptr->y;
				graphPtr = FillRectBlack(graphPtr,
										 x+32,y,x+63,9+y);
				graphPtr = doTexList5(graphPtr,
									  GetTBPointer(TexList_lgsel_ghost),
									  x+32,y,2);
			}
		}
		break;
	case MSEL_MAP:
	default:
		x = 23;
		y = 112;
		if (CheckSameMap2(cup_select*4 + circuit_select) >= 0){
			graphPtr = FillRectBlack(graphPtr,
									 x+64,y,x+127,17+y);
			graphPtr = doTexList(graphPtr,TexList_lgsel_ghost,
								 x+64,y);
		}
		break;
	}
}

void tsel_sub1(int i,OBJBlock *ptr)
{
	int dx,dy;
	int x1;

	if (ptr->work1 >= 32)
		return;
	x1 = (MSEL_CUPBOX_X+1)*ptr->work1/64;
	dx = ptr->disp_x;
	dy = ptr->disp_y;
	gDPPipeSync(graphPtr++);
	gDPSetRenderMode(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
	gDPSetCombineMode(graphPtr++,G_CC_DECALRGBA, G_CC_DECALRGBA);

#if 0
	if (i == cup_select){
		if (msel_mode == MSEL_CUP){
			graphPtr = FlashRectangle2(graphPtr,dx+x1,dy,
									   dx+MSEL_CUPBOX_X-x1,dy+MSEL_CUPBOX_Y);
		}
		else{
			graphPtr = FillRect1Color(graphPtr,dx+x1,dy,
									  dx+MSEL_CUPBOX_X-x1,dy+MSEL_CUPBOX_Y,
									  255,249,220,255);
		}
	}
#endif
//	else{
		graphPtr = FillRect1Color(graphPtr,dx+x1,dy,
								  dx+MSEL_CUPBOX_X-x1,dy+MSEL_CUPBOX_Y,
								  1,1,1,255);
//	}
}

//------------------------------------
//
// ptrのOBJを(x,y)にゆっくり近づける
//
//------------------------------------
void DOB_moving1(OBJBlock *ptr,int x,int y)
{
	DOB_moving1_x(ptr,x);
	DOB_moving1_y(ptr,y);

}

void DOB_moving1_x(OBJBlock *ptr,int x)
{
	int dx;

	dx = x-ptr->disp_x;
	if (dx){
		if (dx > 0){
			dx = dx/4+1;
			if (dx>16)
				dx = 16;
		}
		else{
			dx = dx/4-1;
			if (dx<-16)
				dx = -16;
		}
	}
	ptr->disp_x += dx;
}

void DOB_moving1_y(OBJBlock *ptr,int y)
{
	int dy;

	dy = y-ptr->disp_y;
	if (dy){
		if (dy > 0){
			dy = dy/4+1;
			if (dy>16)
				dy = 16;
		}
		else{
			dy = dy/4-1;
			if (dy<-16)
				dy = -16;
		}
	}
	ptr->disp_y += dy;
}

void DOB_moving2_x(OBJBlock *ptr,int x)
{
	int dx;

	dx = x-ptr->disp_x;
	if (dx){
		if (dx > 0){
			dx = dx/4+1;
			if (dx>16)
				dx = 16;
			if (dx<8)
				dx = 8;
			ptr->disp_x += dx;
			if (ptr->disp_x > x)
				ptr->disp_x = x;
		}
		else{
			dx = dx/4-1;
			if (dx<-16)
				dx = -16;
			if (dx<-8)
				dx = -8;
			ptr->disp_x += dx;
			if (ptr->disp_x < x)
				ptr->disp_x = x;
		}
	}
}

void DOB_moving2_y(OBJBlock *ptr,int y)
{
	int dy;

	dy = y-ptr->disp_y;
	if (dy){
		if (dy > 0){
			dy = dy/4+1;
			if (dy>16)
				dy = 16;
		}
		else{
			dy = dy/4-1;
			if (dy<-16)
				dy = -16;
		}
	}
	ptr->disp_y += dy;
}

void DOB_moving3_x(OBJBlock *ptr,int x)
{
	int dx;

	dx = x-ptr->disp_x;
	if (dx){
		dx = 200/dx;
		if (dx > 0){
			if (dx > 24)
				dx = 24;
			if (dx < 16)
				dx = 16;
			ptr->disp_x += dx;
			if (ptr->disp_x > x)
				ptr->disp_x = x;
		}
		else{
			if (dx < -24)
				dx = -24;
			if (dx > -16)
				dx = -16;
			ptr->disp_x += dx;
			if (ptr->disp_x < x)
				ptr->disp_x = x;
		}
	}
}

//
// 指定のxから徐々にはなしていく
//
void DOB_moving4_x(OBJBlock *ptr,int x,int plusminus)
{
	int dx;

	if (ptr->disp_x == x){
		ptr->disp_x += plusminus;
		return;
	}

	dx = x-ptr->disp_x;
	if (dx){
		if (dx > 0){
			dx = dx/4+1;
			if (dx>16)
				dx = 16;
		}
		else{
			dx = dx/4-1;
			if (dx<-16)
				dx = -16;
		}
	}
	ptr->disp_x -= dx;
}

//
// CP画面のカーソルカラーの決定
//
void DOB_cp_cscolor(OBJBlock *ptr)
{
	if (!ptr->pattern)
		ptr->work2 = (uint)(128.0f + 127.0f * (float)(12 - ptr->work1)/12);
	else
		ptr->work2 = (uint)(128.0f + 127.0 * (float)ptr->work1 / (float)12);

	ptr->work1++;
	if (ptr->work1 >= 12){
		ptr->work1 = 0;
		ptr->pattern ^= 1;
	}
}

//
// CP画面のメッセージ処理
//
void DOB_cp_mes2(OBJBlock *ptr)
{
	int number;

	switch(cp_mode){
	case CP_MENU_OK:
	case CP_MENU_CANCEL:
		number = 1;
		break;
	case CP_MENU_DELETE:
	case CP_MENU_DELETE2:
		number = 5;
		break;
	case CP_MENU_ERROR1:
		number = 2;
		break;
	case CP_MENU_ERROR2:
		number = 3;
		break;
	case CP_MENU_ERROR3:
		number = 4;
		break;
	default:
		number = 0;
		break;
	}
	if (number != ptr->pattern){
		ptr->pattern = number;
		ChangeSeqData(ptr->sd_number,0,
					  (TexBlockSeq *)GetVAddress(TBSeq_cp_messages[number]));
	}
}

//
// CP画面のゲームノートに関する処理
//
void DOB_cp_gnote(OBJBlock *ptr)
{
	int i;

	switch(cp_gnote_scroll_req){
	case 1:
		ptr->disp_y -= 2;
		if (ptr->disp_y <= CP_GNOTE_Y - 10){
			ptr->disp_y = CP_GNOTE_Y;
			cp_gnote_scroll_req = 0;
			for (i = 0;i < 8;i++){
				if (i < 7)
					cp_gnote_number[i] = cp_gnote_number[i+1];
				else{
					if (cp_gnote_number[i-1] == 16 || (!cp_gnote_number[i-1]))
						cp_gnote_number[i] = 0;
					else
						cp_gnote_number[i] = cp_gnote_number[i-1]+1;
				}
			}
			cp_gnote_number[0] = cp_gnote_number[8] = 0;
		}
		break;
	case 2:
		ptr->disp_y += 2;
		if (ptr->disp_y >= CP_GNOTE_Y + 10){
			ptr->disp_y = CP_GNOTE_Y;
			cp_gnote_scroll_req = 0;
			for (i = 8;i > 0;i--){
				if (i > 1)
					cp_gnote_number[i] = cp_gnote_number[i-1];
				else{
					if (cp_gnote_number[i+1] == 1 || (!cp_gnote_number[i+1]))
						cp_gnote_number[i] = 0;
					else
						cp_gnote_number[i] = cp_gnote_number[i+1] - 1;
				}
			}
			cp_gnote_number[0] = cp_gnote_number[8] = 0;
		}
		break;
	default:
		cp_gnote_scroll_req = 0;
		break;
	}
}

//
// 使ってないみたい
//
#if 0
void DOB_gsel_ok(OBJBlock *ptr)
{
	switch(gsel_mode){
	case GSEL_OK2:
		ptr->work1 = 0;
		break;
	case GSEL_NUMBER:
	case GSEL_POPUP2:
		ptr->work1 = 32;
		break;
	case GSEL_OK:
		if (ptr->work1>0){
			ptr->work1-=ptr->work1/12+2;
			if (ptr->work1 < 0)
				ptr->work1 = 0;
		}
		break;
	default:
		if (ptr->work1<32){
			//ptr->work1+=ptr->work1/12+2;
			ptr->work1+=2;
			if (ptr->work1 >= 32)
				ptr->work1 = 32;
		}
		break;
	}
}
#endif


const char gsel_mode_to_ok_mode[8] = {
	3,3,3,2,0,2,2,1
};
const char psel_mode_to_ok_mode[3] = {
	3,2,0
};
const char msel_mode_to_ok_mode[3] = {
	3,3,2
};
void DOB_sel_ok(OBJBlock *ptr)
{
	int mode;

	switch(ptr->kind){
	case KO_GSEL_OK:
		mode = gsel_mode_to_ok_mode[gsel_mode-1];
		break;
	case KO_MSEL_OK:
		mode = msel_mode_to_ok_mode[msel_mode-1];
		break;
	case KO_PSEL_OK:
		mode = psel_mode_to_ok_mode[psel_mode-1];
		break;
	}
				
	switch(mode){
	case 0:/*戻ってきたとき 全表示*/
		ptr->work1 = 0;
		break;
	case 1:/*順方向に進むとき 全消去（GSEL_POPUP2で使用）*/
		ptr->work1 = 32;
		break;
	case 2:/*徐々に表示*/
		if (ptr->work1>0){
			ptr->work1-=ptr->work1/12+2;
			if (ptr->work1 < 0)
				ptr->work1 = 0;
		}
		break;
	case 3:/*徐々に消去*/
		if (ptr->work1<32){
			//ptr->work1+=ptr->work1/12+2;
			ptr->work1+=2;
			if (ptr->work1 >= 32)
				ptr->work1 = 32;
		}
		break;
	}
}


void DOB_gsel_number(OBJBlock *ptr)
{
	switch(ptr->pattern){
	case 0:/* default位置へ */
		DOB_gsel_start(ptr);
		break;
	case 1:/* 回って消えていた途中でキャンセルされ,,, */
		DOB_gsel_start(ptr);
		ptr->pattern = 4;
	case 4:/* ,,,また回って現れる */
		if (ptr->work1>0){
			ptr->work1-=ptr->work1/12+2;
			if (ptr->work1 < 0)
				ptr->work1 = 0;
		}
		else{
			ptr->work1 = 0;
			ptr->pattern = 0;
		}
		break;
	case 2:/* 真ん中にいたけどdefault位置に戻る */
		ptr->pattern = 3;
		break;
	case 3:/* default位置に戻ってきてる */
		break;
	default:
		break;
	}
}

void DOB_gsel_mode(OBJBlock *ptr)
{
	int target_x,target_y;

	switch(ptr->pattern){
	case 0:/* default位置にいるときに(行く前に)選択されたとき */
		DOB_gsel_start(ptr);
		if (players-1 == ptr->kind - KO_GSEL_1P){
			ptr->pattern = 2;
		}
		else
			ptr->pattern = 1;
		break;
	case 4:/* 回って現れる途中に選択されたので、、、、 */
		if (players-1 == ptr->kind - KO_GSEL_1P){
			ptr->pattern = 2;
			ptr->work1 = 0;
			break;
		}
		else
			ptr->pattern = 1;
	case 1:/* 選択されなかったので回って消える */
		DOB_gsel_start(ptr);
		switch(gsel_mode){
		case GSEL_POPUP2:
		case GSEL_OK2:
			ptr->work1 = 32;
			break;
		default:
			if (ptr->work1<32){
				//ptr->work1+=ptr->work1/12+2;
				ptr->work1+=2;
				if (ptr->work1 >= 32)
					ptr->work1 = 32;
			}
			break;
		}
		break;
	case 2:/* 選択されているので真ん中へ移動 */
		break;
	case 3:/* default位置に戻る途中に選択されたとき、、、 */
		if (players-1 == ptr->kind - KO_GSEL_1P)
			ptr->pattern = 2;
		break;
	default:
		break;
	}
}

void DOB_gsel_move(OBJBlock *ptr)
{
	POS_XY *pos_ptr;

	if (players-1 == ptr->kind - KO_GSEL_1P)
		ptr->pri = 10;
	else
		ptr->pri = 6;

	switch(ptr->pattern){
	case 0:
		break;
	case 1:
	case 4:
		break;
	case 2:/* 選択されたので真ん中に向かって移動 */
		switch(gsel_mode){
		case GSEL_POPUP2:
		case GSEL_OK2:
			ptr->disp_x = 128;
			ptr->disp_y = 62;
			break;
		default:
			DOB_moving1(ptr,128,62);
			break;
		}
		break;
	case 3:/* キャンセルされたのでdefault位置に戻る */
		pos_ptr = &lgsel_default_positions[ptr->kind - KO_GSEL_LOGO];
		DOB_moving1(ptr,pos_ptr->x,pos_ptr->y);
		if ((ptr->disp_x ==pos_ptr->x)&&(ptr->disp_y ==pos_ptr->y)){
			ptr->pattern = 0;
		}
		break;
	default:
		break;
	}
}

void DOB_gsel_gp(OBJBlock *ptr)
{
	OBJBlock *target_ptr;
	POS_XY *pos_ptr;
	int a,b,c,mode;

	switch(ptr->kind){
	case KO_GSEL_50CC:
	case KO_GSEL_100CC:
	case KO_GSEL_150CC:
	case KO_GSEL_PRO:
		a = KO_GSEL_50CC;
		b = GRANDPRIX;
		c = VSBATTLE;
		break;
	case KO_GSEL_ITEMOFF:
	case KO_GSEL_ITEMON:
		a = KO_GSEL_ITEMON;
		b = VSBATTLE;
		c = VSBATTLE;
		break;
	case KO_GSEL_TRY:
	//case KO_GSEL_GHOST:
	case KO_GSEL_DATA:
		a = KO_GSEL_TRY;
		b = TIMEATTACK;
		c = TIMEATTACK;
		break;
	}

	mode = game_mode_chart[players-1][play_mode[players-1]];
	switch(ptr->pattern){
	case 0:
		if ((mode != b) && (mode != c)){
			ptr->disp_on = 0;
			break;
		}
		else{
			ptr->work2 = play_mode[players-1];
			switch(gsel_mode){
			case GSEL_MODE_SELECT:
			case GSEL_POPUP:
			case GSEL_OK:
				ptr->disp_on = 1;
				target_ptr = Get_gsel_cursor_ptr();
				ptr->disp_x = target_ptr->disp_x;
				ptr->disp_y = target_ptr->disp_y + GSEL_MODE_OFFSET_Y
					+ GSEL_POPBOX_Y * play_mode[players-1];
				ptr->work1 = 0;
				ptr->pattern = 1;
				break;
			case GSEL_POPUP2:
			case GSEL_OK2:
				target_ptr = Get_gsel_cursor_ptr();
				pos_ptr = &gsel_popup_positions[ptr->kind - a];
				ptr->disp_x = target_ptr->disp_x + pos_ptr->x;
				ptr->disp_y = target_ptr->disp_y + pos_ptr->y
					+ GSEL_POPBOX_Y * play_mode[players-1];					
				ptr->work1 = ptr->disp_y - target_ptr->disp_y;
				ptr->disp_on = 1;
				ptr->pattern = 2;
				break;
			default:
				ptr->disp_on = 0;
				break;
			}
		}
		break;
	case 1:
		switch(gsel_mode){
		case GSEL_MODE_SELECT:
		case GSEL_POPUP:
		case GSEL_POPUP2:
		case GSEL_OK:
		case GSEL_OK2:
			if ((mode != b) && (mode != c)){
				ptr->disp_on = 0;
				ptr->pattern = 0;
				break;
			}
			if (play_mode[players-1] != ptr->work2)
				ptr->pattern = 0;
			target_ptr = Get_gsel_cursor_ptr();
			ptr->disp_x = target_ptr->disp_x + ptr->work1;
			pos_ptr = &gsel_popup_positions[ptr->kind - a];
			//DOB_moving1(ptr,target_ptr->disp_x+pos_ptr->x,ptr->disp_y);
			DOB_moving2_x(ptr,target_ptr->disp_x+pos_ptr->x);
			ptr->work1 = ptr->disp_x - target_ptr->disp_x;
			if (ptr->work1 == pos_ptr->x){
				ptr->pattern = 2;
				ptr->work1 = ptr->disp_y - target_ptr->disp_y;
			}
			break;
		//case GSEL_NUMBER:
		//case GSEL_OPTION:
		//case GSEL_RECORD:
		default:
			ptr->disp_on = 0;
			ptr->pattern = 0;
			break;
		}
		break;
	case 2:
		switch(gsel_mode){
		case GSEL_MODE_SELECT:
		case GSEL_POPUP:
		case GSEL_POPUP2:
		case GSEL_OK:
		case GSEL_OK2:
			if ((mode != b) && (mode != c)){
				ptr->disp_on = 0;
				ptr->pattern = 0;
				break;
			}
			if (play_mode[players-1] != ptr->work2)
				ptr->pattern = 0;
			target_ptr = Get_gsel_cursor_ptr();
			pos_ptr = &gsel_popup_positions[ptr->kind - a];
			ptr->disp_x = target_ptr->disp_x + pos_ptr->x;
			ptr->disp_y = target_ptr->disp_y + ptr->work1;
			DOB_moving1(ptr,ptr->disp_x,target_ptr->disp_y+pos_ptr->y
						+ GSEL_POPBOX_Y * play_mode[players-1]);
			ptr->work1 = ptr->disp_y - target_ptr->disp_y;
			//if (ptr->work1 == target_x)
			//	ptr->pattern = 2;
			break;
		//case GSEL_NUMBER:
		//case GSEL_OPTION:
		//case GSEL_RECORD:
		default:
			ptr->disp_on = 0;
			ptr->pattern = 0;
			break;
		}
		break;
	default:
		break;
	}
}

void DOB_gsel_start(OBJBlock *ptr)
{
	POS_XY *pos_ptr;

	pos_ptr = &lgsel_default_positions[ptr->kind - KO_GSEL_LOGO];
	switch(gsel_mode){
	case GSEL_POPUP2:
	case GSEL_OK2:
		ptr->disp_x = pos_ptr->x;
		ptr->disp_y = pos_ptr->y;
		break;
	default:
		DOB_moving1(ptr,pos_ptr->x,pos_ptr->y);
		break;
	}
}

void DOB_gsel_caution(OBJBlock *ptr)
{
	int a;
	int check;

	check = 0;

	switch(gsel_mode){
	case GSEL_OPTION:
	case GSEL_RECORD:
	case GSEL_NUMBER:
	case GSEL_MODE_SELECT:
		ptr->pattern = KSEQ_GCAU_OFF;
		break;
	case GSEL_POPUP:
	case GSEL_OK:
	case GSEL_OK2:
	case GSEL_POPUP2:
		if (ptr->pattern == KSEQ_GCAU_OFF){
			if ((players != 1)||(play_mode[players-1] != TIMEATTACK))
				break;

			/* パックの状態のチェック */
			//PRINTF("a ");

			if (init_pak_flg){
				a = osPfsFindFile(&pfs_k,company_code_kart,game_code_kart,
								   (u8 *)game_name_kart,(u8 *)ext_name_kart,
								   &file_no_kart);
				switch(a){
				case 0:/* 問題なし */
					ptr->pattern = KSEQ_GCAU_NOMES;
					check = 1;
				case PFS_ERR_INVALID:/* カートのゲームノートはなかった */
					break;
				case PFS_ERR_NEW_PACK:
					init_pak_flg = 0;
					break;
				default:
					init_pak_flg = 0;/* とりあえず初期化のやり直し */
					break;
				}
			}
			if (check)
				break;
			if (!init_pak_flg){
				if (!getExistPak(0)){/* コントローラパックがささっていない */
					ptr->pattern = KSEQ_GCAU_MES1;
					break;
				}
				//PRINTF("c ");
#if KAWANO_PAK_BUGFIX_970304
				a = kawano_osPfsInit(&intMesgQueue, &pfs_k, 0 );
#else
				a = osPfsInit(&intMesgQueue, &pfs_k, 0 );
#endif
				//PRINTF("d ");
				if (a){
					switch(a){
					case PFS_ERR_NOPACK:/*コントローラパックがささっていない */
					case PFS_ERR_DEVICE:/* コントローラパックではない */
						ptr->pattern = KSEQ_GCAU_MES1;
						break;
					case PFS_ERR_ID_FATAL:/* コントローラパックが壊れている */
						ptr->pattern = KSEQ_GCAU_MES2;
						break;
					case PFS_ERR_CONTRFAIL:/* エラー */
					default:
						ptr->pattern = KSEQ_GCAU_MES2;
						break;
					}
					break;
				}
				else
					init_pak_flg = 1;

				/* すでにゲームノートを作っていないか */
				//PRINTF("e ");
				if (!osPfsFindFile(&pfs_k,company_code_kart,game_code_kart,
								   (u8 *)game_name_kart,(u8 *)ext_name_kart,
								   &file_no_kart)){
					ptr->pattern = KSEQ_GCAU_NOMES;
					break;/* ゲームノートがあるので表示なし */
				}
			
				/* ファイル数取得 */
				//PRINTF("f ");
				if (osPfsNumFiles( &pfs_k, &pfsFileNumMax, &pfsFileNum )){
					ptr->pattern = KSEQ_GCAU_MES2;/* エラー */
					break;
				}
				/* 空きメモリー取得 */
				if (osPfsFreeBlocks( &pfs_k, &pfsFreeBlocks )){
					ptr->pattern = KSEQ_GCAU_MES2;/* エラー */
					break;
				}
				pfsFreeBlocks >>= 8;
			}
			
			//PRINTF("b2 ");
			if (pfsFileNum >= pfsFileNumMax){
				ptr->pattern = KSEQ_GCAU_MES4;/* ファイルがいっぱい */
				break;
			}

			//PRINTF("c2 ");
			if (pfsFreeBlocks >= 121){
				//PRINTF("d2 ");
				ptr->pattern = KSEQ_GCAU_NOMES;
				break;/* ゲームノートはないけどスペースはある */
			}
			else{
				//PRINTF("e2 ");
				ptr->pattern = KSEQ_GCAU_MES4;
				break;/* ゲームノートをつくるスペースがない */
			}
		}
		break;
	default:
		break;
	}
}
		
//
// マリオ,ルイージのアニメ処理
//
void DOB_psel_anime_mario(OBJBlock *ptr,char position)
{
	int number;

	number = ptr->kind - KO_PSEL_MA;
	switch(ptr->pattern2){
	case 0:
		if (Get_psel_cursor_number(position) >= 0){
			ptr->pattern2 = 2;
			ChangeSeqData(ptr->sd_number,0,(TexBlockSeq *)GetVAddress
						  (TBSeq_psel_return[number]));
		}
		break;
	case 2:
		if (Get_psel_cursor_number(position) < 0){
			ptr->pattern2 = 0;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel[number]));
		}
		break;
	}
}

//
// クッパアニメ用処理
//
void DOB_psel_anime_kuppa(OBJBlock *ptr)
{
	int pat_change_flg,cursor_number,cursor_flg;
	int number,a;

	number = ptr->kind - KO_PSEL_MA;
	pat_change_flg = 0;
	cursor_number = Get_psel_cursor_number(ptr->kind - KO_PSEL_MA);
	if (cursor_number >= 0)
		cursor_flg = 1;
	else
		cursor_flg = 0;
	switch(ptr->pattern2){
	case 0:
		if (player_cursor_set_flg[cursor_number] && cursor_flg){
			ptr->pattern2 = 1;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p1[number]));
			break;
		}
		a = make_random_limmit(200);
		if (a > 197){
			ptr->pattern2 = 4;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p4[number]));
			break;
		}
		if (a > 196){
			ptr->pattern2 = 5;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p5[number]));
			break;
		}
		break;
	case 1:
		if ((seq_data_block+ptr->sd_number)->pattern >= p1_pat_num[number]){
			ptr->pattern2 = 2;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p2[number]));
			break;
		}
		if (!player_cursor_set_flg[cursor_number] && cursor_flg){
			ptr->pattern2 = 3;
			ChangeSeqData(ptr->sd_number,
						  p3_pat_num[number]
						  -(seq_data_block+ptr->sd_number)->pattern,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p3[number]));
		}
		break;
	case 2:
		if (!player_cursor_set_flg[cursor_number] && cursor_flg){
			ptr->pattern2 = 3;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p3[number]));
		}
		break;
	case 3:
		if ((seq_data_block+ptr->sd_number)->pattern >= p3_pat_num[number]){
			ptr->pattern2 = 0;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p0[number]));
			break;
		}
		if (player_cursor_set_flg[cursor_number] && cursor_flg){
			ptr->pattern2 = 1;
			ChangeSeqData(ptr->sd_number,
						  p3_pat_num[number]
						  -(seq_data_block+ptr->sd_number)->pattern,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p1[number]));
		}
		break;
	case 4:
	case 5:
		if (player_cursor_set_flg[cursor_number] && cursor_flg){
			ptr->pattern2 = 1;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p1[number]));
			break;
		}
		if (ptr->pattern2 == 4)
			a = p4_pat_num[number];
		else
			a = p5_pat_num[number];
		if ((seq_data_block+ptr->sd_number)->pattern >= a){
			ptr->pattern2 = 0;
			ChangeSeqData(ptr->sd_number,0,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p0[number]));
			break;
		}
		break;
	default:
		break;
	}
}

//
// プレーヤーセレクト画面での,"ok?"時のそれぞれの動き
//
void DOB_psel_turn_out(OBJBlock *ptr)
{
	switch(ptr->pattern){
	case 3:
		ptr->pattern = 1;
	case 1://回って消える
		switch(psel_mode){
		case PSEL_OK2:
			ptr->work1 = 32;
			break;
		default:
			if (ptr->work1<32){
				ptr->work1+=ptr->work1/12+2;
				if (ptr->work1 >= 32)
					ptr->work1 = 32;
			}
			break;
		}
	case 0:
		if (Get_psel_cursor_number(ptr->kind - KO_PSEL_MA) >= 0){
			ptr->pattern = 2;
			ptr->work1 = 0;
		}
		else
			ptr->pattern = 1;
		break;
	case 2://画面中央へ行く
		//if (ptr->work1>0){
		//	ptr->work1-=ptr->work1/12+2;
		//	if (ptr->work1 < 0)
		//		ptr->work1 = 0;
		//}
		//ptr->work1 = 0;
		break;
	case 4:
		if (Get_psel_cursor_number(ptr->kind - KO_PSEL_MA) >= 0){
			ptr->pattern = 2;
			ptr->work1 = 0;
		}
		break;
	}
}

//
// プレーヤーセレクト画面での,キャラ選択時のそれぞれの動き
//
void DOB_psel_turn_in(OBJBlock *ptr)
{
	int i;

	switch(ptr->pattern){
	case 0:
		break;
	case 1://回って消える
		if (ptr->work1>0){
			ptr->pattern = 3;
		}
		break;
	case 2://中心へ移動
		//ptr->pattern = 0;
		ptr->pattern = 4;
		break;
	case 3://回って現れる
		if (ptr->work1>0){
			ptr->work1-=ptr->work1/12+2;
			if (ptr->work1 < 0)
				ptr->work1 = 0;
		}
		else{
			ptr->work1 = 0;
			ptr->pattern = 0;
		}
				break;
	case 4://中心から移動
		break;
	}
}

//
// プレーヤーセレクト画面でのそれぞれの座標等の処理
//
void DOB_psel_character1(OBJBlock *ptr)
{
	int dx,dy;
	int position,i,check;
	POS_XY *pos_ptr;

	position = ptr->kind - KO_PSEL_MA;

	switch(ptr->pattern){
	case 0:
		if (psel_mode == PSEL_OK2){
			i = Get_psel_cursor_number(position);
			if (i >= 0){
				pos_ptr = &lpsel_character_ok_position[race_screen_mode*4+i];
				ptr->disp_x = pos_ptr->x;
				ptr->disp_y = pos_ptr->y;
				ptr->pattern = 2;
				ptr->pattern2 = 2;
				ChangeSeqData(ptr->sd_number,0,(TexBlockSeq *)GetVAddress
							  (TBSeq_psel_return[position]));
			}
			break;
		}
	case 1:
	case 3:
		ptr->disp_x = lpsel_cursor_position[position].x;
		ptr->disp_y = lpsel_cursor_position[position].y;
		break;
	case 2:
	case 4:
		if (ptr->pattern == 2){
			i = Get_psel_cursor_number(position);
			if (i >= 0){
				pos_ptr = &lpsel_character_ok_position[race_screen_mode*4+i];
			}
#if ROM==0
			else{
				PRINTF("Cannot get cursor position!!!(kawano)\n");
				while(1);
			}
#endif
		}
		else{
			pos_ptr = &lpsel_cursor_position[position];
			if ((pos_ptr->x == ptr->disp_x)&&(pos_ptr->y == ptr->disp_y)){
				ptr->pattern = 0;
				break;
			}
		}

		if ((ptr->pattern == 2) && (ptr->pattern2 == 1))
			break;
		DOB_moving1(ptr,pos_ptr->x,pos_ptr->y);
		break;
	}
}

//
// カーソルの座標決定(PSEL)
//
void DOB_psel_cursor1(OBJBlock *ptr)
{
	int a,c_num;

	c_num = ptr->kind - KO_PSEL_1P;
	a = player_cursor[c_num];
	ptr->pri = 14 - c_num*2;
	Get_psel_cursor_position(ptr,a-1);
}

//
// プレーヤーセレクト時のアニメの優先順位
//
void DOB_psel_anime_priority(OBJBlock *ptr)
{
	int i;
	
	i = Get_psel_cursor_number(ptr->kind - KO_PSEL_MA);
	if (i >= 0)
		ptr->pri = 14 - i*2;
	else
		ptr->pri = 6;
}

//----------------------------------------------------------------
//
// ゲームセレクト画面において,カーソルのあるOBJのptrを返す
//
//----------------------------------------------------------------
OBJBlock *Get_gsel_cursor_ptr(void)
{
	OBJBlock *target_ptr;

	target_ptr = obj_block;
	while(1){
		if (target_ptr->kind - KO_GSEL_1P == players-1)
			break;
		target_ptr++;
		if (target_ptr > &obj_block[OBJ_BLOCK_MAX]){
#if ROM==0
			PRINTF("Cannot Get Character Pointer!!(kawano)\n");
#endif
			while(1);
		}
	}
	return(target_ptr);
}

//----------------------------------------------------------------
//
// プレーヤーセレクト画面において,任意のアニメキャラ(0-7)のptrを返す
//
//----------------------------------------------------------------
OBJBlock *Get_psel_character_ptr(int num)
{
	OBJBlock *target_ptr;

	target_ptr = obj_block;
	while(1){
		if (target_ptr->kind - KO_PSEL_MA == num)
			break;
		target_ptr++;
		if (target_ptr > &obj_block[OBJ_BLOCK_MAX]){
#if ROM==0
			PRINTF("Cannot Get Character Pointer!!(kawano)\n");
#endif
			while(1);
		}
	}
	return(target_ptr);
}

//----------------------------------------------------------------
//
// 任意のOBJBlockのポインタを見つける
//
//----------------------------------------------------------------
OBJBlock *Get_OBJBlock_ptr(int kind)
{
	OBJBlock *target_ptr;

	target_ptr = obj_block;
	while(1){
		if (target_ptr->kind == kind)
			break;
		target_ptr++;
		if (target_ptr > &obj_block[OBJ_BLOCK_MAX]){
#if ROM==0
			PRINTF("Cannot Get Character Pointer!!(kawano)\n");
#endif
			while(1);
		}
	}
	return(target_ptr);
}

//----------------------------------------------------------------
//
// 任意のOBJBlockのポインタを見つける(見つけられなかったら０を返す)
//
//----------------------------------------------------------------
OBJBlock *Get_OBJBlock_ptr2(int kind)
{
	OBJBlock *target_ptr;

	target_ptr = obj_block;
	while(1){
		if (target_ptr->kind == kind)
			break;
		target_ptr++;
		if (target_ptr > &obj_block[OBJ_BLOCK_MAX])
			return((OBJBlock *)0);
	}
	return(target_ptr);
}

//----------------------------------------------------------------
//
// プレーヤーセレクト画面において,任意のキャラ(0-7)のpatternを返す
//
//----------------------------------------------------------------
int Get_psel_character_pattern(int num)
{
	OBJBlock *target_ptr;

	target_ptr = Get_psel_character_ptr(num);
	return(target_ptr->pattern);
}
//------------------------------------------------------------------------
//
// プレーヤーセレクト画面において,任意のキャラのxy座標を現在のポインタに返す
//
//------------------------------------------------------------------------
void Get_psel_cursor_position(OBJBlock *ptr,int num)
{
	OBJBlock *target_ptr;

	target_ptr = Get_psel_character_ptr(num);
	ptr->disp_x = target_ptr->disp_x;
	ptr->disp_y = target_ptr->disp_y;
}

//------------------------------------------------------------
//
// その場所(0-7)にカーソルがあるか、またそのカーソルの番号(0-3)を返す
//
//------------------------------------------------------------
int Get_psel_cursor_number(int num)
{
	int i,check;

	i = 0;
	check = 0;
	while(1){
		if (player_cursor[i] == num + 1){
			check++;
			break;
		}
		i++;
		if (i > 3)
			break;
	}
	if (check)
		return(i);
	else
		return(-1);
}

void DOB_msel_cup(OBJBlock *ptr)
{
	POS_XY *pos_ptr;

	switch(ptr->pattern){
	case 1:
		ptr->pattern = 4;
	case 4:
		if (ptr->work1>0){
			ptr->work1-=ptr->work1/12+2;
			if (ptr->work1 < 0)
				ptr->work1 = 0;
		}
		else{
			ptr->work1 = 0;
			ptr->pattern = 0;
		}
		break;
	case 2:
		ptr->pattern = 3;
		break;
	case 3:
	case 0:
	default:
		break;
	}
}

void DOB_msel_map(OBJBlock *ptr)
{
	POS_XY *pos_ptr;

	switch(ptr->pattern){
	case 0:
		if (cup_select == ptr->kind - KO_MSEL_KCUP)
			ptr->pattern = 2;
		else
			ptr->pattern = 1;
		break;
	case 4:
		if (cup_select == ptr->kind - KO_MSEL_KCUP){
			ptr->pattern = 2;
			ptr->work1 = 0;
			break;
		}
		else
			ptr->pattern = 1;
	case 1:
		if (ptr->work1<32){
			//ptr->work1+=ptr->work1/12+2;
			ptr->work1+=2;
			if (ptr->work1 >= 32)
				ptr->work1 = 32;
		}
		break;
	case 2:
		break;
	case 3:
		if (cup_select == ptr->kind - KO_MSEL_KCUP)
			ptr->pattern = 2;
	default:
		break;
	}
}

void DOB_msel_move(OBJBlock *ptr)
{
	POS_XY *pos_ptr;

	if (cup_select == ptr->kind - KO_MSEL_KCUP)
		ptr->pri = 10;
	else
		ptr->pri = 4;

	switch(ptr->pattern){
	case 0:
		pos_ptr = &msel_cupbox_position[ptr->kind - KO_MSEL_KCUP];
		ptr->disp_x = pos_ptr->x;
		ptr->disp_y = pos_ptr->y;
		break;
	case 1:
	case 4:
		break;
	case 2:
		DOB_moving1(ptr,128,59);
		break;
	case 3:
		pos_ptr = &msel_cupbox_position[ptr->kind - KO_MSEL_KCUP];
		DOB_moving1(ptr,pos_ptr->x,pos_ptr->y);
		if ((ptr->disp_x ==pos_ptr->x)&&(ptr->disp_y ==pos_ptr->y)){
			ptr->pattern = 0;
		}
		break;
	default:
		break;
	}
}

void DOB_msel_name(OBJBlock *ptr)
{
	int i;

	i = ptr->kind - KO_MSEL_KNAME;
	if (cup_select == i)
		ptr->disp_on = 1;
	else
		ptr->disp_on = 0;

}

#if 0
//
// 現在不使用のマップ表示関連の関数
//
void DOB_msel_anime_map(OBJBlock *ptr)
{
	int change_switch,change_map_number;

	change_switch = 0;
	switch(ptr->pattern){
	case 0://通常表示モード
		if (map_number != ptr->work1){
			change_switch = 1;
			change_map_number = map_number;
			break;
		}
		if (game_mode == MARIOGP)
			ptr->work2++;
		if (ptr->work2 > 50){
			ptr->pattern = 1;
			ptr->work2 = 0;
			change_switch = 1;
			change_map_number = map_number_chart[cup_select][1];
			break;
		}
		break;
	case 1://GP４コース紹介モード
		if (cup_select != map2cup_chart[ptr->work1]){
			change_switch = 1;
			change_map_number = map_number_chart[cup_select][0];
			ptr->pattern = 0;
			ptr->work2 = 0;
			break;
		}
		ptr->work2++;
		if (ptr->work2 > 30){
			ptr->work2 = 0;
			change_switch = 1;
			change_map_number = map_number_chart[cup_select]
				[(map2circuit_chart[ptr->work1]+1)%4];
			break;
		}
		
		break;
	default:
		break;
	}
	if (change_switch){
		ptr->work1 = change_map_number;
		ChangeSeqData(ptr->sd_number,0,
					  (TexBlockSeq *)GetVAddress(
						  TBSeq_msel_map[change_map_number]));
		//SetOBJBlock(KO_MSEL_NOISE,0,0,8);
	}
		
}
#endif

void DOB_msel_anime_map2(OBJBlock *ptr)
{
	if (ptr->work1 != cup_select){
		ptr->work1 = cup_select;
		ChangeSeqData(ptr->sd_number,0,
					  (TexBlockSeq *)GetVAddress(
						  TBSeq_msel_map[map_number_chart
					  [cup_select][ptr->kind - KO_MSEL_MAP1]]));
	}
}

void DOB_msel_anime_mapman(OBJBlock *ptr)
{
	int i,change_switch,change_map_number;
	OBJBlock *mapptr[4];

	change_switch = 0;
	for(i = 0;i < 4;i++)
		mapptr[i] = Get_OBJBlock_ptr(KO_MSEL_MAP1 + i);

	if (game_mode != MARIOGP){
		if (msel_mode != MSEL_CUP){
			ptr->pattern = 0;
			ptr->work2 = 0;
			for(i = 0;i < 4;i++){
				if (i == circuit_select){
					mapptr[i]->disp_on = 1;
					if (ptr->work1 != i){
						ptr->work1 = i;
						change_switch = 1;
					}
				}
				else
					mapptr[i]->disp_on = 0;
			}
		}
		else{/* カップ選択時は */
			ptr->pattern = 3;/*４分割表示モード*/
			for(i = 0;i < 4;i++){
				mapptr[i]->disp_on = 1;
				mapptr[i]->pri = 6;
			}
		}
	}
	else{
		switch(ptr->pattern){
		case 0:/*通常表示モード*/
			if (cup_select == ptr->work1/4){
				ptr->work2++;
				if (ptr->work2 > 50){
					ptr->pattern = 1;
					ptr->work2 = 0;
					ptr->work1 = cup_select*4 + 1;
					change_switch = 1;
				}
			}
			else{
				ptr->work2 = 0;
				ptr->work1 = cup_select*4;
				change_switch = 1;
			}
			if (msel_mode == MSEL_OK){
				ptr->pattern = 2;
				ptr->work2 = 0;
				//ptr->work1 = cup_select*4;
			}
			break;
		case 1://GP４コース紹介モード
			if (cup_select != ptr->work1/4){
				ptr->pattern = 0;
				ptr->work2 = 0;
				ptr->work1 = 0;
				change_switch = 1;
				break;
			}
			ptr->work2++;
			if (ptr->work2 > 30){
				ptr->work2 = 0;
				ptr->work1 = cup_select*4 + (((ptr->work1%4)+1)%4);
				change_switch = 1;
				break;
			}
			if (msel_mode == MSEL_OK){
				ptr->pattern = 2;
				ptr->work2 = 0;
				//ptr->work1 = cup_select*4 + (((ptr->work1%4)+1)%4);
			}
			break;
		case 2:/*４分割表示移行モード*/
			ptr->work2++;
			if (ptr->work2 > 25){
				ptr->pattern = 3;
				ptr->work2 = 0;
			}
			if (msel_mode != MSEL_OK){
				ptr->pattern = 0;
				ptr->work2 = 0;
				ptr->work1 = 0;
				change_switch = 1;
			}
			break;
		case 3:/*４分割表示モード*/
			if (msel_mode != MSEL_OK){
				ptr->pattern = 0;
				ptr->work2 = 0;
				ptr->work1 = 0;
				change_switch = 1;
			}
			break;
		default:
			break;
		}
		switch(ptr->pattern){
		case 0:
		case 1:
			//if (msel_mode != MSEL_OK){
				for(i = 0;i < 4;i++){
					if (i == ptr->work1%4)
						mapptr[i]->disp_on = 1;
					else
						mapptr[i]->disp_on = 0;
					mapptr[i]->pri = 6;
				}
			//}
			break;
		case 2:
			for(i = 0;i < 4;i++){
				if (i == ptr->work1%4)
					mapptr[i]->pri = 6;
				else{
					if (i*5 > ptr->work2)
						mapptr[i]->pri = 4;
					else
						mapptr[i]->pri = 8;
				}
				mapptr[i]->disp_on = 1;
			}
			break;
		case 3:
			for(i = 0;i < 4;i++){
				mapptr[i]->disp_on = 1;
				mapptr[i]->pri = 6;
			}
			break;
		default:
			//for(i = 0;i < 4;i++){
			//	mapptr[i]->disp_on = 1;
			//	mapptr[i]->pri = 6;
			//}
			break;
		}
		//if (change_switch)
		//	SetOBJBlock(KO_MSEL_NOISE,0,0,8);
	}
}

void DOB_msel_bbox(OBJBlock *ptr)
{
	POS_XY *pos_ptr;

	switch(msel_mode){
	case MSEL_CUP:
		pos_ptr = &msel_bestbox_default_position[ptr->kind - KO_MSEL_BRECORD];
		if (ptr->disp_x != pos_ptr->x)
			DOB_moving1_x(ptr,pos_ptr->x);
		break;
	case MSEL_MAP:
	case MSEL_OK:
		pos_ptr = &msel_bestbox_target_position[ptr->kind - KO_MSEL_BRECORD];
		if (ptr->disp_x != pos_ptr->x)
			DOB_moving1_x(ptr,pos_ptr->x);
		break;
	}
}

void DOB_msel_cup_gsc(OBJBlock *ptr)
{
	POS_XY *pos_ptr;

	if (ptr->work1 != cup_select){/* カーソルを左右に動かすごとに... */
		ptr->work1 = cup_select;
		ptr->work2 = GetCupStatus(cup_select,race_level);
		ChangeSeqData(ptr->sd_number,0,(TexBlockSeq *)GetVAddress(
			TBSeq_msel_cups[4*(race_level/2)+(3-ptr->work2)]));
		pos_ptr = &msel_cup_positions[0];
		ptr->disp_x = pos_ptr->x;
		ptr->disp_y = pos_ptr->y;
		//ptr->pattern = 0;
	}
	pos_ptr = &msel_cup_positions[ptr->pattern];
	switch(ptr->pattern){
	case 0:/* default位置へ */
		DOB_moving1(ptr,pos_ptr->x,pos_ptr->y);
		if (msel_mode == MSEL_OK)
			ptr->pattern = 1;
		break;
	case 1:
		DOB_moving1(ptr,pos_ptr->x,pos_ptr->y);
		if (msel_mode == MSEL_CUP)
			ptr->pattern = 0;
		break;
	default:
		break;
	}
}

void DOB_tsel_cup(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	int num;

	if (ptr->kind == KO_TSEL_TITLE)
		num = 4;
	else
		num = ptr->kind - KO_TSEL_KCUP;

	pos_ptr = &tsel_cup_positions[num];
	ptr->disp_x = pos_ptr->x;
	ptr->disp_y = pos_ptr->y;
}

void DOB_tsel_cursor(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	int num;
	
	num = tsel_cursor;

	pos_ptr = &tsel_cup_positions[num/4];
	ptr->disp_x = pos_ptr->x - 2;
	ptr->disp_y = pos_ptr->y + (num%4)*50 +19;

	ptr->work1 += 16;
	if (ptr->work1 >= 256){
		ptr->work1 -= 256;
		ptr->work2 = (ptr->work2+1)%3;
	}
}

void DOB_tsel_map(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	int num;

	num = ptr->kind - KO_TSEL_KCUP1;

	pos_ptr = &tsel_cup_positions[num/4];
	ptr->disp_x = pos_ptr->x;
	ptr->disp_y = pos_ptr->y+20 + (num%4)*50;
}

void DOB_game_cup(OBJBlock *ptr)
{
	DOB_game_cup_mode1(ptr);

	switch(opening_flag){
	case OPENING_ROLLING_SET:
		ptr->disp_on = 1;
		break;
	case OPENING_STOP_SET:
		if (ptr->disp_y > -20)
			ptr->disp_y -= 2;
		else
			ptr->kind = 0;
		break;
	default:
		if ((game_mode != MARIOGP)||(player_number != 1)||(demo_play_flag))
			ptr->kind = 0;
		else{
			if (ptr->disp_y > -20){
				ptr->disp_y -= 2;
			}
			else{
				ptr->kind = 0;
			}
		}
		break;
	}
		
}

void DOB_game_cup_mode1(OBJBlock *ptr)
{
	switch(ptr->pattern){
	case 0:
		ptr->disp_x = 0;
		ptr->pattern = 1;
		ptr->work2 = 160+GetWordLength(cup_name[cup_level])/2;/*目標の設定*/
		//break;
	case 1:
		DOB_moving1_x(ptr,ptr->work2);
		ptr->work1 = (ptr->work2 - ptr->disp_x)/4;/*字間の設定*/
		if (ptr->work1 > 8)
			ptr->work1 = 8;
		ptr->workf1 = 1.0 + 0.05*ptr->work1;/*横倍率の設定*/
		if (ptr->disp_x >= ptr->work2 - 20){
			ptr->pattern = 2;
			ptr->sd_number = 0;/*汎用カウンタとして使用*/
		}
		break;
	case 2:
		DOB_moving1_x(ptr,ptr->work2);
		ptr->work1 = (ptr->work2 - ptr->disp_x)/4;
		ptr->sd_number++;
		//ptr->workf1 = 0.8 + 0.007*(ptr->sd_number - 8)*(ptr->sd_number - 8);
		ptr->workf1 = 0.4 + 0.0085*(ptr->sd_number - 10)*(ptr->sd_number - 10);
		if ((ptr->sd_number > 8)&&(ptr->workf1 > 1.0))
			ptr->workf1 = 1.0;
		break;
	default:
		break;
	}
}

void DOB_game_circuit(OBJBlock *ptr)
{
	DOB_game_circuit_mode1(ptr);
	//DOB_game_circuit_mode2(ptr);

	switch(opening_flag){
	case OPENING_ROLLING_SET:
		ptr->disp_on = 1;
		break;
	case OPENING_STOP_SET:
		if (ptr->disp_y < 260)
			ptr->disp_y += 2;
		else
			ptr->kind = 0;
		break;
	default:
		if ((game_mode != MARIOGP)||(player_number != 1)||(demo_play_flag))
			ptr->kind = 0;
		else{
			if (ptr->disp_y < 260){
				ptr->disp_y += 2;
			}
			else{
				ptr->kind = 0;
			}
		}
		break;
	}
}

//
// サーキット名伸び縮みその１
//
void DOB_game_circuit_mode1(OBJBlock *ptr)
{
	switch(ptr->pattern){
	case 0:
		ptr->disp_x = 320;
		ptr->pattern = 1;
		//ptr->work2 = 100;
		ptr->work2 = 160-GetWordLength(circuit_name[map_number])/2;
		//break;
	case 1:
		DOB_moving1_x(ptr,ptr->work2);
		ptr->work1 = (ptr->disp_x - ptr->work2)/4;
		if (ptr->work1 > 8)
			ptr->work1 = 8;
		ptr->workf1 = 1.0 + 0.05*ptr->work1;
		if (ptr->disp_x <= ptr->work2 + 20){
			ptr->pattern = 2;
			ptr->sd_number = 0;
		}
		break;
	case 2:
		DOB_moving1_x(ptr,ptr->work2);
		ptr->work1 = (ptr->disp_x - ptr->work2)/4;
		ptr->sd_number++;
		//ptr->workf1 = 0.8 + 0.007*(ptr->sd_number - 8)*(ptr->sd_number - 8);
		ptr->workf1 = 0.4 + 0.0085*(ptr->sd_number - 10)*(ptr->sd_number - 10);
		if ((ptr->sd_number > 8)&&(ptr->workf1 > 1.0))
			ptr->workf1 = 1.0;
		break;
	default:
		break;
	}
}

//
// サーキット名伸び縮みその２
//
void DOB_game_circuit_mode2(OBJBlock *ptr)
{
	switch(ptr->pattern){
	case 0:
		ptr->disp_x = 320;
		ptr->pattern = 1;
		//break;
	case 1:
		DOB_moving3_x(ptr,100);
		ptr->work1 = (ptr->disp_x-100)/6;
		if (ptr->work1 > 8)
			ptr->work1 = 8;
		ptr->workf1 = 0.6 + 0.07*ptr->work1;
		if (ptr->disp_x == 100){
			ptr->pattern = 2;
			ptr->sd_number = 0;
		}
		break;
	case 2:
		ptr->sd_number++;
		ptr->work1 = 0;
		ptr->workf1 = 1.5 - 0.004*(ptr->sd_number - 15)*(ptr->sd_number - 15);
		if ((ptr->sd_number > 15)&&(ptr->workf1 < 0.8)){
			ptr->pattern = 3;
			ptr->sd_number = 0;
		}
		break;
	case 3:
		ptr->sd_number++;
		ptr->work1 = 0;
		ptr->workf1 = 1.25- 0.002*(ptr->sd_number - 15)*(ptr->sd_number - 15);
		if ((ptr->sd_number > 12)&&(ptr->workf1 < 1.0))
			ptr->workf1 = 1.0;
		break;
	default:
		break;
	}
}

void DOB_msel_noise(OBJBlock *ptr)
{
	ptr->work1++;
	if (ptr->work1 > ptr->work2)
		ptr->kind = 0;
}

void DOB_game_time(OBJBlock *ptr)
{
	int dx;

	switch(ptr->pattern){
	case 0:
		ptr->disp_x = 330;
		ptr->pattern = 1;
		SkipReset();
		break;
	case 1:
		DOB_moving1_x(ptr,160);
		if (ptr->disp_x == 160){
			ptr->pattern = 2;
			ptr->work2 = 0;
		}
		break;
	case 2:
		ptr->work2++;
		if ((k_skip_flg || (ptr->work2 > RT_WAIT_TIME1))
			&& oga_demo_skip_ok_flag){
			ptr->pattern = 3;
			ptr->work1 = ptr->disp_x;/*1フレーム後の座標を覚えておく*/
			SetOBJBlock(KO_GAME_POINT,0,0,0);
		}
		break;
	case 3:
		ptr->disp_x = ptr->work1;/*1フレーム前につくった座標値*/
		if (ptr->work1 < 330){
			if (k_skip_flg)
				ptr->work1 += DP_SCROLL_SPEED_SKIP;
			else
				ptr->work1 += DP_SCROLL_SPEED_NORMAL;
		}
		else
			ptr->kind = 0;
		break;
	default:
		break;
	}
}

void DOB_game_point(OBJBlock *ptr)
{
	extern short rank_to_num[];
	int i,check,dx;

	switch(ptr->pattern){
	case KSEQ_GPP_INIT:/*初期化*/
		ptr->disp_x = -160;
		ptr->pattern = KSEQ_GPP_MOVE1;
		for(i = 0;i < 4;i++)
			*(additional_point+i) = additional_point_defaults[i];
		ptr->work2 = ptr->disp_x;/*1フレーム後の座標を覚えておく*/
		break;
	case KSEQ_GPP_MOVE1:/*定位置で止める*/
		ptr->disp_x = ptr->work2;/*1フレーム前につくった座標値*/
		if (k_skip_flg)
			dx = DP_SCROLL_SPEED_SKIP;
		else
			dx = DP_SCROLL_SPEED_NORMAL;
		if (ptr->work2 + dx < 0){
			ptr->work2 += dx;
			screen1->posx += dx;
			screen2->posx -= dx;
		}
		else{
			ptr->work2 = 0;
			ptr->disp_x = 0;
			ptr->pattern = KSEQ_GPP_WAIT1;
			ptr->work1 = 0;
			screen1->posx = 240;
			screen2->posx = 80;
		}
		break;
	case KSEQ_GPP_WAIT1:/*キーを押したり一定時間立ったとき*/
		ptr->disp_x = 0;
		ptr->work1++;
		if ((k_skip_flg || (ptr->work1 > DP_WAIT_TIME3))
			&& oga_demo_skip_ok_flag){
			ptr->pattern = KSEQ_GPP_ADD1;
			ptr->work1 = 0;
			ptr->work2 = 0;
		}
		break;
	case KSEQ_GPP_ADD1:/*加算中*/
	case KSEQ_GPP_ADD2:
	case KSEQ_GPP_ADD3:
	case KSEQ_GPP_ADD4:
		check = 0;
		i = ptr->pattern - KSEQ_GPP_ADD1;
		ptr->work1++;
		if((!(ptr->work1%3)) || k_skip_flg){
			if (*(additional_point+i)>0){
				*(additional_point+i) = *(additional_point+i) - 1;
				d_points[kart_data[rank_to_num[i]].kart]++;
				Na_System_Start(SE_COIN);
				if (*(additional_point+i) == 0){
					if (!ptr->work2){
						ptr->work2 = 1;
						ptr->work1 = 0;
					}
				}
			}
		}
		if (ptr->work2 && ((ptr->work1 > 10)||(k_skip_flg && (ptr->work1>3))))
			check++;
		if (check){
			ptr->work2 = 0;
			ptr->work1 = 0;
			if (ptr->pattern < KSEQ_GPP_ADD4){
				ptr->pattern++;
			}
			else{
				ptr->pattern = KSEQ_GPP_ADDEND;
			}
		}
		break;
	case KSEQ_GPP_ADDEND:/*加算終了後キー入力もしくは一定時間経過後*/
		ptr->work1++;
		if (((k_skip_flg&&(ptr->work1 > 10))||(ptr->work1 > DP_WAIT_TIME1))
			&& oga_demo_skip_ok_flag){
			ptr->pattern = KSEQ_GPP_NAMEOFF;
			ptr->work1 = 0;
		}
		break;
	case KSEQ_GPP_NAMEOFF:/*１位から順に消していく*/
		ptr->work1++;
		if (k_skip_flg)
			ptr->work1 += DP_SORT_TIME;
		if (ptr->work1 > DP_SORT_TIME*8){
			ptr->pattern = KSEQ_GPP_NAMEON;
		}
		break;
	case KSEQ_GPP_NAMEON:/*８位から順に表示していく*/
		ptr->work1--;
		if (k_skip_flg)
			ptr->work1 -= DP_SORT_TIME;
		if (ptr->work1 <= 0){
			ptr->pattern = KSEQ_GPP_WAIT2;
			ptr->work1 = 0;
			if (circuit_select == 3){
				i = 0;
				while(i < 8){
					if (name_to_num[d_points_rank[i]] < players){
						SaveCupStatus(i);
						break;
					}
					i++;
				}
			}
		}
		break;
	case KSEQ_GPP_WAIT2:/* 一定時間表示 */
		ptr->work1++;
		if (ptr->work1 > DP_WAIT_TIME2){
			ptr->pattern = KSEQ_GPP_WAIT3;
			ptr->work1 = 0;
			SkipReset();
		}
		break;
	case KSEQ_GPP_WAIT3:
		if (k_skip_flg && oga_demo_skip_ok_flag){
			ptr->pattern = KSEQ_GPP_MOVE2;
			ptr->work2 = ptr->disp_y;/*1フレーム後の座標を覚えておく*/
			Na_System_Start(SE_WIPE_RESULT);
		}
		break;
	case KSEQ_GPP_MOVE2:
		ptr->disp_y = ptr->work2;/*1フレーム前につくった座標値*/
		if (ptr->work2 < 240/*300*/){
			//if (k_skip_flg)
			//	dx = DP_SCROLL_SPEED_SKIP;
			//else
				dx = DP_SCROLL_SPEED_NORMAL;
			ptr->work2 += dx;
			screen1->posy += dx;
			screen2->posy -= dx;
		}
		else{
			extern ushort finish_zoom_flag;

			ptr->work2 = 0;
			ptr->pattern = KSEQ_GPP_END;
			ptr->work1 = 0;
			screen1->posy = 300;
			screen2->posy = -60;
			finish_zoom_flag = 4;
			Na_Seq_Fadeout(25);
		}
		break;
	case KSEQ_GPP_END:
		break;
	default:
		break;
	}
}

void DOB_info_3p(OBJBlock *ptr)
{
	int dx;

	switch(ptr->pattern){
	case 0:
		ptr->disp_x = 330;
		ptr->pattern = 1;
		ptr->work1 = 255;
		break;
	case 1:
		DOB_moving1_x(ptr,160);
		if (ptr->disp_x == 160){
			ptr->pattern = 2;
		}
		break;
	case 2:
		break;
	case 3:
		if (ptr->work1)
			ptr->work1 -= 51;
		break;
	default:
		break;
	}
}

void DOB_gp_lose(OBJBlock *ptr)
{
	int dx,i;
	OBJBlock *ptr2;

	switch(ptr->pattern){
	case KSEQ_GPL_FADEIN:
		//if (!ptr->work1)
		//	ptr->work2 = 0;
		if (ptr->work2 > 10)
			ptr->work1 += 3;
		if (ptr->work1 >100){
			ptr->pattern = KSEQ_GPL_SELECT1 ;
			ptr->work1 = 0;
		}
		break;
	case KSEQ_GPL_SELECT1:
	case KSEQ_GPL_SELECT2:
		if (FadeChecker())
			break;
		if ((contOR->ontrigger|contOR->stick_ontrigger) & CONT_UP){
			if (ptr->pattern > KSEQ_GPL_SELECT1){
				ptr->pattern--;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = -1;
			}
		}
		if ((contOR->ontrigger|contOR->stick_ontrigger) & CONT_DOWN){
			if (ptr->pattern < KSEQ_GPL_SELECT2){
				ptr->pattern++;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = 1;
			}
		}
		if (contOR->ontrigger & (CONT_A|CONT_START)){
			SetFadeOut(30);
			Na_Seq_Fadeout(25);
			Na_System_Start(SE_MENU_OK_QUIT);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
		}
		break;
	default:
		break;
	}
	if (ptr->work2 < 40)
		ptr->work2++;
}

void DOB_vs_result(OBJBlock *ptr)
{
	int dx,i;
	OBJBlock *ptr2;

	switch(ptr->pattern){
	case KSEQ_VS_FADEIN:
		ptr->work1 += 3;
		if (ptr->work1 >100){
			ptr->pattern = KSEQ_VS_FACEIN;
			ptr->work1 = 0;
			for (i = 0;i < players;i++)
				SetOBJBlock(KO_GAME_VS_1P+i,0,0,5-i);
			//SetOBJBlock(KO_GAME_VS_4P,0,0,5);
			//SetOBJBlock(KO_GAME_MA,60,50,8);
			//SetOBJBlock(KO_GAME_MA,160,50,8);
		}
		break;
	case KSEQ_VS_FACEIN:
		ptr2 = Get_OBJBlock_ptr(KO_GAME_VS_1P);
		if (ptr2->pattern >= 2)
			ptr->pattern = KSEQ_VS_POINTIN;
		break;
	case KSEQ_VS_POINTIN:
		ptr->work1+=32;
		if (ptr->work1 > 255){
			//ptr->pattern = KSEQ_VS_SELECT0;
			if (game_mode == VSBATTLE)/* カーソル位置は覚えています */
				ptr->pattern = vs_result_cursor;
			else
				ptr->pattern = bt_result_cursor;
			ptr->work1 = 0;
		}
		break;
	case KSEQ_VS_SELECT0:
	case KSEQ_VS_SELECT1:
	case KSEQ_VS_SELECT2:
	case KSEQ_VS_SELECT3:
		if (FadeChecker())
			break;
		if ((contOR->ontrigger|contOR->stick_ontrigger) & CONT_UP){
			if (ptr->pattern > KSEQ_VS_SELECT0){
				ptr->pattern--;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = -1;
			}
		}
		if ((contOR->ontrigger|contOR->stick_ontrigger) & CONT_DOWN){
			if (ptr->pattern < KSEQ_VS_SELECT3){
				ptr->pattern++;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = 1;
			}
		}
		if (contOR->ontrigger & (CONT_A|CONT_START)){
			SetFadeOut(30);
			Na_System_Start(SE_MENU_OK);
			if (game_mode == VSBATTLE)/* カーソル位置を記憶します */
				vs_result_cursor = ptr->pattern;
			else
				bt_result_cursor = ptr->pattern;
			if (ptr->workf1 < 4.2)
				ptr->workf1 += 4.0;
		}
		break;
	default:
		break;
	}
}

void DOB_vs_face(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	int num,a;
	OBJBlock *ptr2;
	int loser_flg;

	a = driver2pselset[player_driver[ptr->kind - KO_GAME_VS_1P]];
	num = ptr->kind - KO_GAME_VS_1P;
	switch(ptr->pattern){
	case 0:
		//pos_ptr = &vs_face_start_position[(players-2)*4 + num];
		pos_ptr = &vs_face_start_position2;
		ptr->disp_x = pos_ptr->x;
		ptr->disp_y = pos_ptr->y;
		ptr->pattern = 1;
		break;
	case 1:
		//pos_ptr = &vs_face_target_position[(players-2)*4 + ogawa_rank[num]];
		pos_ptr = &vs_face_target_position[(players-2)*4 + num];
		DOB_moving1_x(ptr,pos_ptr->x);
		DOB_moving1_y(ptr,pos_ptr->y);
		if (ptr->disp_x == pos_ptr->x){
			ptr->pattern = 2;
			ptr->work2 = 0;
		}
		break;
	case 2:
		loser_flg = 0;
		switch(game_mode){
		case VSBATTLE:
			if (ogawa_rank[num])
				loser_flg = 1;
			break;
		case BATTLE:
			if (win_kart != num)
				loser_flg = 1;
			break;
		}
		if (loser_flg)
			break;
		ptr->work2++;
		if (ptr->work2 > VS_RESULT_WAIT_TIME1){
			ptr2 = Get_OBJBlock_ptr(KO_GAME_VS_RES);
			if (ptr2->pattern >= KSEQ_VS_POINTIN){
				ChangeSeqData_vs(ptr->sd_number,0,num,
								 (TexBlockSeq *)GetVAddress(TBSeq_psel_p1[a]));
				ptr->pattern = 3;
				Na_SeMute_Off(num);
				Na_PlyVoice_Start(num,player_driver[num]*0x10
								  +SE_VOICE_GOALIN);
			}
		}
		break;
	case 3:
		if ((seq_data_block+ptr->sd_number)->pattern >= p1_pat_num[a]){
			ChangeSeqData_vs(ptr->sd_number,0,num,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p2[a]));
			ptr->pattern = 4;
		}
		break;
	case 4:
	default:
		break;
	}
}

void DOB_game_ta1(OBJBlock *ptr)
{
	int dx;

	switch(ptr->pattern){
	case 0:
		ptr->disp_x = 330;
		ptr->pattern = 1;
		SkipReset();
		SetOBJBlock(KO_GAME_TA_SORT,0,0,0);/*ベストレコードをソートする*/
		break;
	case 1:
		DOB_moving1_x(ptr,160);
		if (ptr->disp_x == 160){
			ptr->pattern = 2;
			ptr->work2 = 0;
		}
		break;
	case 2:
		ptr->work2++;
		if (ptr->work2 > TA_RESULT_WAIT_TIME1){
			ptr->pattern = 3;
		}
		break;
	case 3:
		if (k_skip_flg){
			SkipReset();
			ptr->pattern = 4;
			ptr->work1 = ptr->disp_x;/*1フレーム後の座標を覚えておく*/
			SetOBJBlock(KO_GAME_TA2,0,0,0);
		}
		break;
	case 4:
		ptr->disp_x = ptr->work1;/*1フレーム前につくった座標値*/
		if (ptr->work1 < 330){
			if (k_skip_flg)
				ptr->work1 += DP_SCROLL_SPEED_SKIP;
			else
				ptr->work1 += DP_SCROLL_SPEED_NORMAL;
		}
		else
			ptr->kind = 0;
		break;
	default:
		break;
	}
}

void DOB_game_ta2(OBJBlock *ptr)
{
	extern short rank_to_num[];
	int i,check,dx,a;

	switch(ptr->pattern){
	case KSEQ_TA_INIT:/*初期化*/
		ptr->disp_x = -160;
		ptr->pattern = KSEQ_TA_MOVING;
		for(i = 0;i < 4;i++)
			*(additional_point+i) = additional_point_defaults[i];
		ptr->work2 = ptr->disp_x;/*1フレーム後の座標を覚えておく*/
		break;
	case KSEQ_TA_MOVING:
		ptr->disp_x = ptr->work2;/*1フレーム前につくった座標値*/
		if (k_skip_flg)
			dx = DP_SCROLL_SPEED_SKIP;
		else
			dx = DP_SCROLL_SPEED_NORMAL;
		if (ptr->work2 + dx< 0){
			ptr->work2 += dx;
			screen1->posx += dx;
			screen2->posx -= dx;
		}
		else{
			ptr->work2 = 0;
			ptr->disp_x = 0;
			ptr->pattern = ta_result_cursor;/* カーソル位置は覚えています */
			if ((ptr->pattern == KSEQ_TA_SELECT5)&&(lost_ghost == LOST_GHOST))
				ptr->pattern--;
			//ptr->work1 = 0;
			screen1->posx = 240;
			screen2->posx = 80;
		}
		break;
	case KSEQ_TA_SELECT1:
	case KSEQ_TA_SELECT2:
	case KSEQ_TA_SELECT3:
	case KSEQ_TA_SELECT4:
	case KSEQ_TA_SELECT5:
	case KSEQ_TA_SELECT6:
		if (FadeChecker())
			break;
		if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_UP){
			if (ptr->pattern > KSEQ_TA_SELECT1){
				ptr->pattern--;
				if (lost_ghost == LOST_GHOST){/* リプレイ不可 */
					if (ptr->pattern == KSEQ_TA_SELECT5)
						ptr->pattern--;
				}
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = -1;
			}
		}
		if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_DOWN){
			if (ptr->pattern < KSEQ_TA_SELECT6){
				ptr->pattern++;
				if (lost_ghost == LOST_GHOST){/* リプレイ不可 */
					if (ptr->pattern == KSEQ_TA_SELECT5)
						ptr->pattern++;
				}
				if ((ptr->pattern == KSEQ_TA_SELECT6)
					&& (ghost_status != GHOST_DRIVE)){/* ゴースト不在 */
						ptr->pattern -= 2;
				}
				else{
					Na_System_Start(SE_CURSOL);
					if (ptr->workf1 < 4.2)
						ptr->workf1 += 4.0;
					ptr->pattern2 = 1;
				}
			}
		}
		if (cont1P->ontrigger & (CONT_A|CONT_START)){
			if (ptr->pattern == KSEQ_TA_SELECT6){
				check = 0;
				//Na_System_Start(SE_DECIDE);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				if (init_pak_flg){
					a = osPfsFindFile(&pfs_k,company_code_kart,game_code_kart,
									  (u8 *)game_name_kart,(u8 *)ext_name_kart,
									  &file_no_kart);
					switch(a){
					case 0:/* 問題なし */
						LoadGameNoteKart_data();
						ptr->pattern = KSEQ_TA_GHOSTB1
							+ CheckSameMap(cup_select*4 + circuit_select);
						check = 1;
						Na_System_Start(SE_DECIDE);
						break;
					case PFS_ERR_INVALID:/* カートのゲームノートはなかった */
						break;
					case PFS_ERR_NEW_PACK:
						init_pak_flg = 0;
						break;
					default:
						init_pak_flg = 0;/* とりあえず初期化のやり直し */
						break;
					}
				}
				if (check)
					break;
				if (!init_pak_flg){
					a = initPak();
					switch(a){
					case -1:/* コントローラパックがささっていない */
						ptr->pattern = KSEQ_TA_GHOSTA1;
						check = 1;
						break;
					case -2:/* エラー */
					case -3:
						ptr->pattern = KSEQ_TA_GHOSTA2;
						check = 1;
						break;
					case 0:/* 成功 */
						break;
					case PFS_ERR_NOPACK:/*コントローラパックがささっていない */
					case PFS_ERR_DEVICE:/* コントローラパックではない */
						ptr->pattern = KSEQ_TA_GHOSTA1;
						check = 1;
						break;
					case PFS_ERR_ID_FATAL:/* コントローラパックが壊れている */
						ptr->pattern = KSEQ_TA_GHOSTA2;
						check = 1;
						break;
					case PFS_ERR_CONTRFAIL:/* エラー */
					default:
						check = 1;
						ptr->pattern = KSEQ_TA_GHOSTA2;
						break;
					}
					if (check){
						Na_System_Start(SE_BUBU);
						break;
					}

					/* すでにゲームノートを作っていないか */
					if (!osPfsFindFile(&pfs_k,company_code_kart,game_code_kart,
									   (u8 *)game_name_kart,
									   (u8 *)ext_name_kart,
									   &file_no_kart)){
						LoadGameNoteKart_data();
						ptr->pattern = KSEQ_TA_GHOSTB1
							+ CheckSameMap(cup_select*4 + circuit_select);
						Na_System_Start(SE_DECIDE);
						break;/* ゲームノートがあるので表示なし */
					}			
				}
			
				if (pfsFileNum >= pfsFileNumMax){
					ptr->pattern = KSEQ_TA_GHOSTA4;/* ファイルがいっぱい */
					Na_System_Start(SE_BUBU);
					break;
				}

				if (pfsFreeBlocks >= 121){
					ptr->pattern = KSEQ_TA_GHOSTB3;
					ptr->work1 = 0;
					Na_System_Start(SE_DECIDE);
					break;/* ゲームノートはないけどスペースはある */
				}
				else{
					ptr->pattern = KSEQ_TA_GHOSTA4;
					Na_System_Start(SE_BUBU);
					break;/* ゲームノートをつくるスペースがない */
				}


				break;
			}
			/* 上５つを選んだとき */
			//SetFadeOut(30);
			ptr->work1 = ptr->pattern;
			ta_result_cursor = ptr->pattern;/* カーソル位置を記憶します */
			ptr->pattern = KSEQ_TA_END;
			ptr->work2 = ptr->disp_y;/*1フレーム後の座標を覚えておく*/
			//Na_System_Start(SE_MENU_OK_QUIT);
			Na_System_Start(SE_WIPE_RESULT);
			if (ptr->workf1 < 4.2)
				ptr->workf1 += 4.0;
		}
		break;
	case KSEQ_TA_GHOSTA1:
	case KSEQ_TA_GHOSTA2:
	case KSEQ_TA_GHOSTA3:
	case KSEQ_TA_GHOSTA4:
	case KSEQ_TA_GHOSTA5:/* ゲームノート作り失敗 */
	case KSEQ_TA_GHOSTA6:/* 同じゴーストを書こうとした */
	case KSEQ_TA_GHOSTD2:/* セーブ失敗 */
		if (cont1P->ontrigger & (CONT_A|CONT_B|CONT_START)){
			ptr->pattern = KSEQ_TA_SELECT6;
			Na_System_Start(SE_CANCEL);
			if (ptr->workf1 < 4.2)
				ptr->workf1 += 4.0;
		}
		break;
	case KSEQ_TA_GHOSTB1:
	case KSEQ_TA_GHOSTB2:
		ptr->work2 = ptr->pattern - KSEQ_TA_GHOSTB1;
		if (ptr->work2 != CheckSameMap2(cup_select*4 + circuit_select)){
			if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_UP){
				if (ptr->pattern > KSEQ_TA_GHOSTB1){
					ptr->pattern--;
					Na_System_Start(SE_CURSOL);
					if (ptr->workf1 < 4.2)
						ptr->workf1 += 4.0;
					ptr->pattern2 = -1;
				}
			}
			if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_DOWN){
				if (ptr->pattern < KSEQ_TA_GHOSTB2){
					ptr->pattern++;
					Na_System_Start(SE_CURSOL);
					if (ptr->workf1 < 4.2)
						ptr->workf1 += 4.0;
					ptr->pattern2 = 1;
				}
			}
		}

		if (cont1P->ontrigger & CONT_B){
			ptr->pattern = KSEQ_TA_SELECT6;
			Na_System_Start(SE_CANCEL);
			break;
		}
		if (cont1P->ontrigger & (CONT_A|CONT_START)){
			PAK_GHOST *pak_ptr;

			//ptr->work2 = ptr->pattern - KSEQ_TA_GHOSTB1;
			pak_ptr = &pak_ghost[ptr->work2];
			if (!pak_ptr->e.ghost_flg){/* 新規にデータを書くとき */
				ptr->pattern = KSEQ_TA_GHOSTD;
				ptr->work1 = 0;
			}
			else{/* 以前のデータがあるとき */
				int value;

				value = CheckSameGhost(ptr->work2);
				if (!value)/* パックの中身と同一 */
					ptr->pattern = KSEQ_TA_GHOSTA6;
				else
					ptr->pattern = KSEQ_TA_GHOSTC1;
			}
			Na_System_Start(SE_DECIDE);
			if (ptr->workf1 < 4.2)
				ptr->workf1 += 4.0;
		}
		break;
	case KSEQ_TA_GHOSTB3:
		if (ptr->work1 == 1){
			if (makeGameNoteKartOnly()){
				ptr->pattern = KSEQ_TA_GHOSTA5;
				break;
			}
		}
		ptr->work1++;
		if (ptr->work1 >= 2){
			ptr->pattern = KSEQ_TA_GHOSTB1;
			//ptr->work1 = 0;
		}
		break;
	case KSEQ_TA_GHOSTC1:
	case KSEQ_TA_GHOSTC2:
		if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_UP){
			if (ptr->pattern > KSEQ_TA_GHOSTC1){
				ptr->pattern--;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = -1;
			}
		}
		if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_DOWN){
			if (ptr->pattern < KSEQ_TA_GHOSTC2){
				ptr->pattern++;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = 1;
			}
		}
		if (cont1P->ontrigger & CONT_B){
			ptr->pattern = KSEQ_TA_GHOSTB1 + ptr->work2;
			Na_System_Start(SE_CANCEL);
			break;
		}
		if (cont1P->ontrigger & (CONT_A|CONT_START)){
			if (ptr->pattern == KSEQ_TA_GHOSTC2){
				ptr->pattern = KSEQ_TA_GHOSTD;
				ptr->work1 = 0;
				Na_System_Start(SE_DECIDE);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
			}
			else{
				ptr->pattern = KSEQ_TA_GHOSTB1 + ptr->work2;
				Na_System_Start(SE_CANCEL);
			}
		}
		break;
	case KSEQ_TA_GHOSTD:/* セーブ中 */
		if (ptr->work1 == 1){
			a = osPfsFindFile(&pfs_k,company_code_kart,game_code_kart,
							  (u8 *)game_name_kart,(u8 *)ext_name_kart,
							  &file_no_kart);
			if (a){
				ptr->pattern = KSEQ_TA_GHOSTD2;
				//ptr->work1 = 0;
				Na_System_Start(SE_BUBU);
				break;
			}
			a = SaveGameNoteKart_ghost(ptr->work2);
			if (a){
				ptr->pattern = KSEQ_TA_GHOSTD2;
				Na_System_Start(SE_BUBU);
				//ptr->work1 = 0;
				break;
			}
		}
		ptr->work1++;
		if (ptr->work1 >= 2){
			ptr->pattern = KSEQ_TA_SELECT6;
			//ptr->work1 = 0;
		}
		break;
	case KSEQ_TA_END:
		ptr->disp_y = ptr->work2;/*1フレーム前につくった座標値*/
		if (ptr->work2 < 240/*300*/){
			//if (k_skip_flg)
			//	dx = DP_SCROLL_SPEED_SKIP;
			//else
				dx = DP_SCROLL_SPEED_NORMAL;
			ptr->work2 += dx;
			screen1->posy += dx;
			screen2->posy -= dx;
		}
		else{
			extern ushort finish_zoom_flag;

			switch(ptr->work1){
			case KSEQ_TA_SELECT1:/* リトライ */
				replay_flag = 0;
				retry_flag = 1;
				goto_racing();
				break;
			case KSEQ_TA_SELECT2:/* コースチェンジ */
				goto_mapselect();
				break;
			case KSEQ_TA_SELECT3:/* プレーヤーチェンジ */
				goto_kartselect();
				break;
			case KSEQ_TA_SELECT4:/* おわる */
				goto_gameselect();
				//goto_title();
				break;
			case KSEQ_TA_SELECT5:/* リプレイ */
				replay_flag = 1;
				retry_flag = 0;
				goto_racing();
				break;
			}
			ptr->work2 = 0;
			ptr->pattern = KSEQ_TA_END2;/* あと一回だけ表示ルーチンへ */
			//ptr->work1 = 0;
			screen1->posy = 300;
			screen2->posy = -60;
			finish_zoom_flag = 4;
			Na_Seq_Fadeout(25);
		}
		break;
	case KSEQ_TA_END2:
		ptr->kind = 0;
		break;
	default:
		//PRINTF("pattern:%d ",ptr->pattern);
		break;
	}
}

void DOB_game_pause(OBJBlock *ptr)
{
	int type;
	Controller 	*cont;

	if (pause_flag){
		switch(ptr->pattern){
		case KSEQ_PS_OFF:
			ptr->pattern = start_pause_seq[game_mode];
			break;
		case KSEQ_PS_TA1:
		case KSEQ_PS_TA2:
		case KSEQ_PS_TA3:
		case KSEQ_PS_TA4:
		case KSEQ_PS_TA5:
		case KSEQ_PS_GP1:
		case KSEQ_PS_GP2:
		case KSEQ_PS_VS1:
		case KSEQ_PS_VS2:
		case KSEQ_PS_VS3:
		case KSEQ_PS_VS4:
		case KSEQ_PS_BT1:
		case KSEQ_PS_BT2:
		case KSEQ_PS_BT3:
		case KSEQ_PS_BT4:
			if (FadeChecker())
				break;
			cont = &controller[pause_flag -1];
			if ((cont->ontrigger|cont->stick_ontrigger) & CONT_UP){
				if (ptr->pattern > start_pause_seq[game_mode]){
					ptr->pattern--;
					Na_System_Start(SE_CURSOL);
					if (ptr->workf1 < 4.2)
						ptr->workf1 += 4.0;
					ptr->pattern2 = -1;
				}
			}
			if ((cont->ontrigger|cont->stick_ontrigger) & CONT_DOWN){
				if (ptr->pattern < bottom_pause_seq[game_mode]){
					ptr->pattern++;
					Na_System_Start(SE_CURSOL);
					if (ptr->workf1 < 4.2)
						ptr->workf1 += 4.0;
					ptr->pattern2 = 1;
				}
			}
			if (cont->ontrigger & CONT_B){
				//if (ptr->pattern == KSEQ_PS_TA1){
				//	ptr->pattern = KSEQ_PS_OFF;
				//	pause_flag = 0;
				//	Na_PauseSet(0);
				//}
				//else{
				if (ptr->pattern != start_pause_seq[game_mode]){
					ptr->pattern = start_pause_seq[game_mode];
					Na_System_Start(SE_CANCEL);
					break;
				}
				//}
			}
			if (cont->ontrigger & (CONT_A|CONT_START)){
				if (ptr->pattern == start_pause_seq[game_mode]){
					ptr->pattern = KSEQ_PS_OFF;
					pause_flag = 0;
					load_key_status();/* kimura */
					Na_PauseSet(0);
				}
				else{
					SetFadeOut(30);
					Na_System_Start(SE_MENU_OK_QUIT);
					//Na_Seq_Fadeout(25);
					Na_Seq_Fadeout(60);/* 12/19 for Bando (3/4)*/
					if (ptr->workf1 < 4.2)
						ptr->workf1 += 4.0;
				}
			}
			break;
		}
	}
	else
		ptr->pattern = KSEQ_PS_OFF;
}

void DOB_game_ta_replay(OBJBlock *ptr)
{
	int type;
	int check,a;

	if (ptr->pattern != KSEQ_TAR_OFF)
		two_d_flag = 0;
	switch(ptr->pattern){
	case KSEQ_TAR_OFF:
		if (ptr->work1 < 30)
			ptr->work1++;
		if (cont1P->ontrigger & (CONT_START)){
			ptr->pattern = KSEQ_TAR_SEL5;
			Na_System_Start(SE_PAUSE_ON);
			break;
		}
		if (kwlap[0].goalsw){
			ptr->pattern = KSEQ_TAR_FADEHF;
			ptr->work1 = 0;
		}
		break;
	case KSEQ_TAR_FADEHF:
		ptr->work1 += 3;
		if (ptr->work1 >140)
			ptr->pattern = KSEQ_TAR_SEL5;
		break;
	case KSEQ_TAR_SEL1:
	case KSEQ_TAR_SEL2:
	case KSEQ_TAR_SEL3:
	case KSEQ_TAR_SEL4:
	case KSEQ_TAR_SEL5:
	case KSEQ_TAR_SEL6:
		if (FadeChecker())
			break;
		if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_UP){
			if (ptr->pattern > KSEQ_TAR_SEL1){
				ptr->pattern--;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = -1;
			}
		}
		if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_DOWN){
			if (ptr->pattern < KSEQ_TAR_SEL6){
				ptr->pattern++;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = 1;
			}
		}
		if (cont1P->ontrigger & (CONT_A|CONT_START)){
			if (ptr->pattern == KSEQ_TAR_SEL6){
				check = 0;
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				if (init_pak_flg){
					a = osPfsFindFile(&pfs_k,company_code_kart,game_code_kart,
									  (u8 *)game_name_kart,(u8 *)ext_name_kart,
									  &file_no_kart);
					switch(a){
					case 0:/* 問題なし */
						LoadGameNoteKart_data();
						ptr->pattern = KSEQ_TAR_G_B1
							+ CheckSameMap(cup_select*4 + circuit_select);
						check = 1;
						break;
					case PFS_ERR_INVALID:/* カートのゲームノートはなかった */
						break;
					case PFS_ERR_NEW_PACK:
						init_pak_flg = 0;
						break;
					default:
						init_pak_flg = 0;/* とりあえず初期化のやり直し */
						break;
					}
				}
				if (check){
					Na_System_Start(SE_DECIDE);
					break;
				}
				if (!init_pak_flg){
					a = initPak();
					switch(a){
					case -1:/* コントローラパックがささっていない */
						ptr->pattern = KSEQ_TAR_G_A1;
						check = 1;
						break;
					case -2:/* エラー */
					case -3:
						ptr->pattern = KSEQ_TAR_G_A2;
						check = 1;
						break;
					case 0:/* 成功 */
						break;
					case PFS_ERR_NOPACK:/*コントローラパックがささっていない */
					case PFS_ERR_DEVICE:/* コントローラパックではない */
						ptr->pattern = KSEQ_TAR_G_A1;
						check = 1;
						break;
					case PFS_ERR_ID_FATAL:/* コントローラパックが壊れている */
						ptr->pattern = KSEQ_TAR_G_A2;
						check = 1;
						break;
					case PFS_ERR_CONTRFAIL:/* エラー */
					default:
						check = 1;
						ptr->pattern = KSEQ_TAR_G_A2;
						break;
					}
					if (check){
						Na_System_Start(SE_BUBU);
						break;
					}

					/* すでにゲームノートを作っていないか */
					if (!osPfsFindFile(&pfs_k,company_code_kart,game_code_kart,
									   (u8 *)game_name_kart,
									   (u8 *)ext_name_kart,
									   &file_no_kart)){
						LoadGameNoteKart_data();
						ptr->pattern = KSEQ_TAR_G_B1
							+ CheckSameMap(cup_select*4 + circuit_select);
						Na_System_Start(SE_DECIDE);
						break;/* ゲームノートがあるので表示なし */
					}			
				}
			
				if (pfsFileNum >= pfsFileNumMax){
					ptr->pattern = KSEQ_TAR_G_A4;/* ファイルがいっぱい */
					Na_System_Start(SE_BUBU);
					break;
				}

				if (pfsFreeBlocks >= 121){
					ptr->pattern = KSEQ_TAR_G_B3;
					ptr->work1 = 0;
					Na_System_Start(SE_DECIDE);
					break;/* ゲームノートはないけどスペースはある */
				}
				else{
					ptr->pattern = KSEQ_TAR_G_A4;
					Na_System_Start(SE_BUBU);
					break;/* ゲームノートをつくるスペースがない */
				}


				break;
			}
			/* 上５つを選んだとき */
				SetFadeOut(30);
				Na_System_Start(SE_MENU_OK);
				Na_Seq_Fadeout(25);
				Na_SE_Fadeout(25);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
		}
		break;
	case KSEQ_TAR_G_A1:
	case KSEQ_TAR_G_A2:
	case KSEQ_TAR_G_A3:
	case KSEQ_TAR_G_A4:
	case KSEQ_TAR_G_A5:/* ゲームノート作り失敗 */
	case KSEQ_TAR_G_A6:/* 同じゴーストを書こうとした */
	case KSEQ_TAR_G_D2:/* セーブ失敗 */
		if (cont1P->ontrigger & (CONT_A|CONT_B|CONT_START)){
			ptr->pattern = KSEQ_TAR_SEL6;
			Na_System_Start(SE_CANCEL);
			if (ptr->workf1 < 4.2)
				ptr->workf1 += 4.0;
		}
		break;
	case KSEQ_TAR_G_B1:
	case KSEQ_TAR_G_B2:
		ptr->work2 = ptr->pattern - KSEQ_TAR_G_B1;
		if (ptr->work2 != CheckSameMap2(cup_select*4 + circuit_select)){
			if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_UP){
				if (ptr->pattern > KSEQ_TAR_G_B1){
					ptr->pattern--;
					Na_System_Start(SE_CURSOL);
					if (ptr->workf1 < 4.2)
						ptr->workf1 += 4.0;
					ptr->pattern2 = -1;
				}
			}
			if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_DOWN){
				if (ptr->pattern < KSEQ_TAR_G_B2){
					ptr->pattern++;
					Na_System_Start(SE_CURSOL);
					if (ptr->workf1 < 4.2)
						ptr->workf1 += 4.0;
					ptr->pattern2 = 1;
				}
			}
		}

		if (cont1P->ontrigger & CONT_B){
			ptr->pattern = KSEQ_TAR_SEL6;
			Na_System_Start(SE_CANCEL);
			break;
		}
		if (cont1P->ontrigger & (CONT_A|CONT_START)){
			PAK_GHOST *pak_ptr;

			pak_ptr = &pak_ghost[ptr->work2];
			if (!pak_ptr->e.ghost_flg){/* 新規にデータを書くとき */
				ptr->pattern = KSEQ_TAR_G_D;
				ptr->work1 = 0;
			}
			else{/* 以前のデータがあるとき */
				int value;

				value = CheckSameGhost(ptr->work2);
				if (!value)/* パックの中身と同一 */
					ptr->pattern = KSEQ_TAR_G_A6;
				else
					ptr->pattern = KSEQ_TAR_G_C1;
			}
			Na_System_Start(SE_DECIDE);
			if (ptr->workf1 < 4.2)
				ptr->workf1 += 4.0;
		}
		break;
	case KSEQ_TAR_G_B3:
		if (ptr->work1 == 1){
			if (makeGameNoteKartOnly()){
				ptr->pattern = KSEQ_TAR_G_A5;
				break;
			}
		}
		ptr->work1++;
		if (ptr->work1 >= 2){
			ptr->pattern = KSEQ_TAR_G_B1;
			//ptr->work1 = 0;
		}
		break;
	case KSEQ_TAR_G_C1:
	case KSEQ_TAR_G_C2:
		if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_UP){
			if (ptr->pattern > KSEQ_TAR_G_C1){
				ptr->pattern--;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = -1;
			}
		}
		if ((cont1P->ontrigger|cont1P->stick_ontrigger) & CONT_DOWN){
			if (ptr->pattern < KSEQ_TAR_G_C2){
				ptr->pattern++;
				Na_System_Start(SE_CURSOL);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
				ptr->pattern2 = 1;
			}
		}
		if (cont1P->ontrigger & CONT_B){
			ptr->pattern = KSEQ_TAR_G_B1 + ptr->work2;
			Na_System_Start(SE_CANCEL);
			break;
		}
		if (cont1P->ontrigger & (CONT_A|CONT_START)){
			if (ptr->pattern == KSEQ_TAR_G_C2){
				ptr->pattern = KSEQ_TAR_G_D;
				ptr->work1 = 0;
				Na_System_Start(SE_DECIDE);
				if (ptr->workf1 < 4.2)
					ptr->workf1 += 4.0;
			}
			else{
				ptr->pattern = KSEQ_TAR_G_B1 + ptr->work2;
				Na_System_Start(SE_CANCEL);
			}
		}
		break;
	case KSEQ_TAR_G_D:/* セーブ中 */
		if (ptr->work1 == 1){
			a = osPfsFindFile(&pfs_k,company_code_kart,game_code_kart,
							  (u8 *)game_name_kart,(u8 *)ext_name_kart,
							  &file_no_kart);
			if (a){
				ptr->pattern = KSEQ_TAR_G_D2;
				//ptr->work1 = 0;
				Na_System_Start(SE_BUBU);
				break;
			}
			a = SaveGameNoteKart_ghost(ptr->work2);
			if (a){
				ptr->pattern = KSEQ_TAR_G_D2;
				//ptr->work1 = 0;
				Na_System_Start(SE_BUBU);
				break;
			}
		}
		ptr->work1++;
		if (ptr->work1 >= 2){
			ptr->pattern = KSEQ_TAR_SEL6;
			//ptr->work1 = 0;
		}
		break;
	}
}

void DOB_game_ta_mes1(OBJBlock *ptr)
{
	switch(ptr->pattern){
	case 0:
		ptr->disp_x = 320 + GetWordLength(ta_romghost_message_j)/2;
		ptr->disp_y = 218/*120*/;
		ptr->pattern = 1;
		Na_PlyVoice_Start(0,SE_VOICE_GOGO + 0x10*romghost_kart);
		break;
	case 1:
		DOB_moving1_x(ptr,160);
		if (ptr->disp_x == 160){
			ptr->pattern = 2;
			ptr->work1 = 0;
		}
		break;
	case 2:
		ptr->work1++;
		if (ptr->work1 > 60){
			ptr->pattern = 3;
			ptr->work1 = 0;
		}
		break;
	case 4:
		ptr->work1++;
		if (ptr->work1 > 5){/* 5フレームの余裕を見てから削除 */
			ptr->kind = 0;
			break;
		}		
	case 3:
		DOB_moving4_x(ptr,160,-1);
		if (ptr->disp_x == -20-GetWordLength(ta_romghost_message_j)/2){
			if (ptr->pattern == 3)
				ptr->pattern = 4;
		}
		break;
	default:
		break;
	}
}

void DOB_dsel_snap(OBJBlock *ptr)
{
	if (ptr->work1 != tsel_cursor){/* カーソルを左右に動かすごとに... */
		ptr->work1 = tsel_cursor;
		ChangeSeqData(ptr->sd_number,0,(TexBlockSeq *)GetVAddress(
			TBSeq_msel_map[map_number_chart[tsel_cursor/4][tsel_cursor%4]]));
		if (!CheckPakStatus()){
			LoadGameNoteKart_data();
		}
		else{/* パックデータがうまくロードできなかったとき... */
			pak_ghost[0].e.ghost_flg = 0;
			pak_ghost[1].e.ghost_flg = 0;
		}
	}
}

void DOB_dsel_sel1(OBJBlock *ptr)
{
	if (msel_mode != DSEL_SELECT1)
		ptr->disp_on = 0;
	else
		ptr->disp_on = 1;		
}

void DOB_dsel_sel2(OBJBlock *ptr)
{
	if (msel_mode != DSEL_SELECT2)
		ptr->disp_on = 0;
	else
		ptr->disp_on = 1;		
}

void DOB_dsel_sel3(OBJBlock *ptr)
{
	if (msel_mode != DSEL_ERROR)
		ptr->disp_on = 0;
	else
		ptr->disp_on = 1;		
}

//
// ＴＡ５位以内に入ったときファンファーレ
//
void DOB_ta_fanfare(OBJBlock *ptr)
{
	if (kwlap[0].goalsw){
		if (kwlap[0].totaltime < (GetRecordTime2(4)& 0x000fffff))
			rankin_fanfare = 1;
		ptr->kind = 0;
	}
}

void DOB_ta_lostghost(OBJBlock *ptr)
{
	switch(ptr->pattern){
	case 0:
		if (lost_ghost == LOST_GHOST){
			ptr->pattern = 1;
			ptr->work1 = 0;
		}
		break;
	case 1:
		ptr->work1++;
		if (kwlap[0].goalsw == 1)
			ptr->pattern = 2;
		break;
	case 2:
		break;
	default:
		break;
	}
}

void DOB_ending1_halffade(OBJBlock *ptr)
{
	switch(ptr->pattern){
	case 0:
		ptr->work1 += 3;
		if (ptr->work1 >100){
			ptr->work1 = 0;
			ptr->pattern = 1;
			cup_select = cup_select % 4;/* 念のため */
			race_level = race_level % 4;
			SetOBJBlock(KO_END1_MES1,0,0,4);
		}
		break;
	case 1:
	case 2:
	case 3:
	case 4: /* 各メッセージを順に出す */
		ptr->work1++;
		if (ptr->work1 > 8){
			ptr->pattern++;
			ptr->work1 = 0;
			SetOBJBlock(KO_END1_MES1+ptr->pattern -1,0,0,4);
		}
		break;
	case 5: /* 一定時間のウェイト */
		ptr->work1++;
		if (ptr->work1 > 100){
			if ((contOR->ontrigger) || (contOR->stick_ontrigger)){
				ptr->pattern = 6;
				ptr->work1 = 0;
				if (resultstat.rank < 3)
					Na_System_Start(SE_MENU_OK);
				else
					Na_System_Start(SE_MENU_OK_QUIT);
			}
		}
		break;
	case 6: /* 何かキーが押されたらフェードアウト */
		SetFadeOut(30);
		Na_Seq_Fadeout(25);
		Na_SE_Fadeout(25);
		ptr->pattern = 7;
		break;
	case 7:
		break;
	default:
		break;
	}
}


void DOB_ending1_message(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	int num;

	num = ptr->kind - KO_END1_MES1;
	switch(ptr->pattern){
	case 0:
		pos_ptr = &ending1_messages_start_position[num];
		ptr->disp_x = pos_ptr->x;
		ptr->disp_y = pos_ptr->y;
		ptr->pattern = 1;
		break;
	case 1:
		pos_ptr = &ending1_messages_target_position[num];
		DOB_moving1(ptr,pos_ptr->x,pos_ptr->y);
		if ((ptr->disp_x == pos_ptr->x)&&(ptr->disp_y == pos_ptr->y))
			ptr->pattern = 2;
		break;
	case 2:
		break;
	default:
		break;
	}
}

void DOB_ending1_face(OBJBlock *ptr)
{
	POS_XY *pos_ptr;
	int num,num2,a;

	num2 = ptr->kind - KO_END1_MES1;
	num = resultstat.driver;
	a = driver2pselset[num];
	switch(ptr->pattern){
	case 0:
		pos_ptr = &ending1_messages_start_position[num2];
		ptr->disp_x = pos_ptr->x;
		ptr->disp_y = pos_ptr->y;
		ptr->pattern = 1;
		break;
	case 1:
		pos_ptr = &ending1_messages_target_position[num2];
		DOB_moving1(ptr,pos_ptr->x,pos_ptr->y);
		if ((ptr->disp_x == pos_ptr->x)&&(ptr->disp_y == pos_ptr->y)){
			ptr->pattern = 2;
			ptr->work2 = 0;
		}
		break;
	case 2:
		ptr->work2++;
		if (ptr->work2 > GP_ENDING_WAIT_TIME1){
			if (resultstat.rank >= 3){
				ptr->pattern = 4;
				Na_SeMute_Title_Off();
				Na_PlyVoice_Start(0,num*0x10+SE_VOICE_SPIN);
				Na_SeMute_Title();
			}
			else{
				ptr->pattern = 3;
				ChangeSeqData_vs(ptr->sd_number,0,num,
								 (TexBlockSeq *)GetVAddress(TBSeq_psel_p1[a]));
				//Na_SeMute_Off(0);
				Na_SeMute_Title_Off();
				Na_PlyVoice_Start(0,num*0x10+SE_VOICE_GOALIN);
				Na_SeMute_Title();
			}
		}
		break;
	case 3:
		if ((seq_data_block+ptr->sd_number)->pattern >= p1_pat_num[a]){
			ChangeSeqData_vs(ptr->sd_number,0,num,
						  (TexBlockSeq *)GetVAddress(TBSeq_psel_p2[a]));
			ptr->pattern = 4;
		}
		break;
	case 4:
	default:
		break;
	}
}

void DOB_staffroll_messages(OBJBlock *ptr)
{
	ENDING_DATA *e_ptr;
	int num;

	num = ptr->kind - KO_SR_A1;
	e_ptr = &ending_data[num];

	switch(e_ptr->type){
	case 0:
	default:
		DOB_staffroll_type0(ptr);
		break;
	case 1:
		DOB_staffroll_type1(ptr);
		break;
	}
}

void DOB_staffroll_type0(OBJBlock *ptr)
{
	ENDING_DATA *e_ptr;
	int num;
	char **c_ptr;

	num = ptr->kind - KO_SR_A1;
	e_ptr = &ending_data[num];
	if (race_level == 3)
		c_ptr = &ending_names_kana[num];
	else
		c_ptr = &ending_names[num];

	ptr->disp_y = e_ptr->start_y;
	switch(ptr->pattern){
	case 0:
		ptr->disp_x = e_ptr->start_x;
		ptr->pattern = 1;
		/*目標の設定*/
		ptr->work2 = e_ptr->target_x
			+GetWordLength(*c_ptr)*e_ptr->mul/2;
		//break;
	case 1:
		DOB_moving1_x(ptr,ptr->work2);
		ptr->work1 = (ptr->work2 - ptr->disp_x)/4;/*字間の設定*/
		if (ptr->work1 > 8)
			ptr->work1 = 8;
		ptr->workf1 = 1.0 + 0.05*ptr->work1;/*横倍率の設定*/
		if (ptr->disp_x >= ptr->work2 - 20){
			ptr->pattern = 2;
			ptr->sd_number = 0;/*汎用カウンタとして使用*/
		}
		break;
	case 2:
		DOB_moving1_x(ptr,ptr->work2);
		ptr->work1 = (ptr->work2 - ptr->disp_x)/4;
		ptr->sd_number++;
		//ptr->workf1 = 0.8 + 0.007*(ptr->sd_number - 8)*(ptr->sd_number - 8);
		ptr->workf1 = 0.4 + 0.0085*(ptr->sd_number - 10)*(ptr->sd_number - 10);
		if ((ptr->sd_number > 8)&&(ptr->workf1 > 1.0)){
			ptr->workf1 = 1.0;
			ptr->pattern = 3;
		}
		break;
	case 3:
		if (ending_message_flg)
			ptr->pattern = 4;
		break;
	case 4:
		DOB_moving4_x(ptr,ptr->work2,1);
		if (ptr->disp_y > SCREEN_WD*1.5)
			ptr->kind = 0;
		break;
	default:
		break;
	}
}

void DOB_staffroll_type1(OBJBlock *ptr)
{
	ENDING_DATA *e_ptr;
	int num;
	char **c_ptr;

	num = ptr->kind - KO_SR_A1;
	e_ptr = &ending_data[num];
	if (race_level == 3)
		c_ptr = &ending_names_kana[num];
	else
		c_ptr = &ending_names[num];

	ptr->disp_y = e_ptr->start_y;
	switch(ptr->pattern){
	case 0:
		ptr->disp_x = e_ptr->start_x;
		ptr->pattern = 1;
		/*目標の設定*/
		ptr->work2 = e_ptr->target_x
			-GetWordLength(*c_ptr)*e_ptr->mul/2;
		//break;
	case 1:
		DOB_moving1_x(ptr,ptr->work2);
		ptr->work1 = (ptr->disp_x - ptr->work2)/4;/*字間の設定*/
		if (ptr->work1 > 8)
			ptr->work1 = 8;
		ptr->workf1 = 1.0 + 0.05*ptr->work1;/*横倍率の設定*/
		if (ptr->disp_x <= ptr->work2 + 20){
			ptr->pattern = 2;
			ptr->sd_number = 0;/*汎用カウンタとして使用*/
		}
		break;
	case 2:
		DOB_moving1_x(ptr,ptr->work2);
		ptr->work1 = (ptr->disp_x - ptr->work2)/4;
		ptr->sd_number++;
		//ptr->workf1 = 0.8 + 0.007*(ptr->sd_number - 8)*(ptr->sd_number - 8);
		ptr->workf1 = 0.4 + 0.0085*(ptr->sd_number - 10)*(ptr->sd_number - 10);
		if ((ptr->sd_number > 8)&&(ptr->workf1 > 1.0)){
			ptr->workf1 = 1.0;
			ptr->pattern = 3;
		}
		break;
	case 3:
		if (ending_message_flg)
			ptr->pattern = 4;
		break;
	case 4:
		DOB_moving4_x(ptr,ptr->work2,-1);
		if (ptr->disp_y > SCREEN_WD*1.5)
			ptr->kind = 0;
		break;
	default:
		break;
	}
}

