/*
//
//	us_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 TITLE_TIME 60
#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[] = {
	{ 97,167},{ 97,182},{ 97,197},{ 97,212}
};

POS_XY vs_result_winlose_position[] = {
//	{25,75},{240,75}
	{48,75},{265,75}
};

POS_XY ta_result_cursor_position[] = {
	{173,141},{173,154},{173,167},{173,180},{173,193},{173,206}
};


POS_XY ta_ghostb_cursor_position[] = {
	{172,165},{172,195}
};

POS_XY ta_ghostc_cursor_position[] = {
	{192,179},{192,194}
};


POS_XY tar_select_cursor_position[] = {
	{ 97,148},{ 97,161},{ 97,174},{ 97,187},{ 97,200},{ 97,213}
};


POS_XY tar_ghostb_cursor_position[] = {
	{82,144},{82,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*/,13/*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[] = {
	"mushroom cup",
	"flower cup",
	"star cup",
	"special cup",
	"battle"
};

char *cup_name_j[] = {
	"mushroom cup",
	"flower cup",
	"star cup",
	"special cup"
//	"キノコ カップ",
//	"フラワー カップ",
//	"スター カップ",
//	"スペシャル カップ"
};

char *circuit_name[] = {
	"mario raceway","choco mountain","bowser's castle","banshee boardwalk",
	"yoshi valley","frappe snowland","koopa troopa beach","royal raceway",
	"luigi raceway","moo moo farm","toad's turnpike","kalimari desert",
	"sherbet land","rainbow road","wario stadium","block fort",
	"skyscraper","double deck","d.k.'s jungle parkway","big donut"

};

char *circuit_name_j[] = {
	"mario raceway","choco mountain","bowser's castle","banshee boardwalk",
	"yoshi valley","frappe snowland","koopa troopa beach","royal raceway",
	"luigi raceway","moo moo farm","toad's turnpike","kalimari desert",
	"sherbet land","rainbow road","wario stadium","block fort",
	"skyscraper","double deck","d.k.'s jungle parkway","big donut"
#if 0
	"マリオサーキット","チョコマウンテン",
	"クッパキャッスル","ヒュ＾ドロいけ",
	"ヨッシーバレー","フラッペスノーランド",
	"ノコノコビーチ","ピーチサーキット",
	"ルイージサーキット","モ＾モ＾ファーム",
	"キノピオハイウェイ","カラカラさばく",
	"シャーベットランド","レインボーロード",
	"ワリオスタジアム","ブロックとりで",
	"まてんろう","ダブルデッキ",
	"ドンキージャングルパーク","ビッグドーナッツ"
#endif
};

char *circuit_name_semilong_j[] = {
	"mario raceway","choco mountain","bowser's castle","banshee boardwalk",
	"yoshi valley","frappe snowland","koopa troopa beach","royal raceway",
	"luigi raceway","moo moo farm","toad's turnpike","kalimari desert",
	"sherbet land","rainbow road","wario stadium","block fort",
	"skyscraper","double deck","d.k.'s jungle parkway","big donut"
#if 0
	"マリオサーキット","チョコマウンテン",
	"クッパキャッスル","ヒュ＾ドロいけ",
	"ヨッシーバレー","フラッペスノーランド",
	"ノコノコビーチ","ピーチサーキット",
	"ルイージサーキット","モ＾モ＾ファーム",
	"キノピオハイウェイ","カラカラさばく",
	"シャーベットランド","レインボーロード",
	"ワリオスタジアム","ブロックとりで",
	"まてんろう","ダブルデッキ",
	"ドンキージャングル","ビッグドーナッツ"
#endif
};

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[] = {
	"MARIO","LUIGI",
	"YOSHI","TOAD",
	"D.K.","WARIO",
	"PEACH","BOWSER","ーーーー"
#if 0
	"マリオ","ルイージ",
	"ヨッシー","キノピオ",
	"Ｄ．コング","ワリオ",
	"ピーチ","クッパ","ーーーー"
#endif
};

char *class_name[] = {
	"50(","100(",
	"150(",
	"extra"
	//" おまけ"
};

char *class_name_j[] = {
	"50(","100(",
	"150(",
	"extra"
	//" おまけ"
};

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[] = {
	"STEREO","HEADPHONE",
	"","MONO"
};

char *win_lose_j[] = {
	"WINNER!","LOSER!"
};

char *bestrec_j[] = {
	"BEST RECORDS","BEST LAP","LAP TIME"
};

char *laptime_j[] = {
	"LAP 1","LAP 2","LAP 3","TOTAL"
};

char *recordtime_j[] = {
	"1 ｓ","2 ｎ","3 ｒ","4 ｔ","5 ｔ"," "
};

char *ta_result_select_j[] = {
	"CONTINUE GAME","RETRY","COURSE CHANGE","DRIVER CHANGE",
	"QUIT","REPLAY","SAVE GHOST"
};

char *vs_result_title_j[] = {
	"VS MATCH RANKING",
	"BATTLE RANKING"
};

char ta_romghost_message_j[] = "NOW-MEET THE COURSE GHOST!!!";

//char no_controller_message[] = "NO CONTOROLLER";
//char no_controller_message[] = "1P のコントローラをせつぞくしてください";
char *no_controller_message[] = {
	"CONNECT A CONTROLLER TO SOCKET 1,",
	"THEN POWER ON AGAIN"
};

char *msel_battle_messages_j[] = {
	"BATTLE GAME",
	"POP OPPOSING PLAYER'S BALLOONS",
	"WHEN ALL 3 ARE GONE,THEY ARE OUT!"
};

char tsel_title_j[] = {
	"a BUTTON*SEE DATA  B BUTTON*EXIT"
};

char dsel_length_j[] = {
	"distance"
};

char *dsel_lengthdata_j[] = {
	"567m","687m","777m","747m",
	"772m","734m","691m","1025m",
	"717m","527m","1036m","753m",
	"756m","2000m","1591m","","","","893m",""
};

char *dsel_select1_j[] = {
	"return to menu","erase records for this course",
	"erase ghost from this course"
};

char *dsel_select2_j[] = {
	"quit","erase"
};

char *dsel_select2_messages_j[] = {
	"THE BEST RECORDS AND BEST",
	"LAP FOR THIS COURSE WILL BE",
	"ERASED.  IS THIS OK?",
	"GHOST DATA FOR THIS",
	"COURSE WILL BE ERASED.",
	"IS THIS OK?"
};

char *dsel_select3_messages_j[] = {
	"UNABLE TO ERASE ",
	"GHOST DATA"
};

char *option_select1_messages_j[] = {
	"RETURN TO GAME SELECT",
	"SOUND MODE",
	"COPY N64 CONTROLLER PAK",
	"ERASE ALL DATA",
};

char *option_select3_messages_j[] = {
	"ALL SAVED DATA WILL BE",
	"PERMANENTLY ERASED.",
	"ARE YOU REALLY SURE?"
};

char *option_select3e_messages_j[] = {
	"",
	"ALL SAVED DATA",
	"HAS BEEN NOW ERASED."
};

char *option_copy_pak1err_messages_j[] = {
	"CONTROLLER 1 DOES NOT HAVE ",
	"N64 CONTROLLER PAK",
	"",
	"",
	"UNABLE TO READ ",
	"N64 CONTROLLER PAK DATA ",
	"FROM CONTROLLER 1",
	"",
	"UNABLE TO CREATE GAME DATA ",
	"FROM CONTROLLER 1 ",
	"N64 CONTROLLER PAK",
	"",
	"UNABLE TO COPY GHOST ",
	"-- INSUFFICIENT FREE PAGES ",
	"IN CONTROLLER 1 ",
	"N64 CONTROLLER PAK"
	
};

char *option_copy_pak2err_messages_j[] = {
	"NO GHOST DATA ",
	"IN CONTROLLER 2 ",
	"N64 CONTROLLER PAK",

	"NO MARIO KART 64 DATA ",
	"PRESENT IN CONTROLLER 2 ",
	"N64 CONTROLLER PAK",

	"CONTROLLER 2 ",
	"DOES NOT HAVE ",
	"N64 CONTROLLER PAK SET",

	"UNABLE TO READ DATA ",
	"FROM CONTROLLER 2 ",
	"N64 CONTROLLER PAK"
	
};

char *option_copy_copyerr_messages_j[] = {
	"UNABLE TO COPY DATA ",
	"FROM CONTROLLER 1 ",
	"N64 CONTROLLER PAK",
	"UNABLE TO READ DATA ",
	"FROM CONTROLLER 2 ",
	"N64 CONTROLLER PAK"
	
};

char *option_copy_pak_j[] = {
	"CONTROLLER 1",
	"CONTROLLER 2"
	
};

char *option_copy_pak2sel_message_j[] = {
	"WHICH FILE DO YOU WANT TO MAKE A COPY OF?",
	"TO WHICH FILE DO YOU WANT TO COPY?"
};

char *option_copy_sure_messages_j[] = {
	"CURRENT DATA WILL BE ERASED,",
	"IS THIS OK?"
};

char *option_copy_sure2_messages_j[] = {
	"QUIT",
	"COPY"
};

char *option_copy_copy_messages_j[] = {
	"COPYING",
	"DATA COPY COMPLETED"
};

char *gsel_caution_messages_j[] = {
	"NO N64 CONTROLLER PAK DETECTED",
	"TO SAVE GHOST DATA, ",
	"INSERT N64 CONTROLLER PAK ",
	"INTO CONTROLLER 1",

	"UNABLE TO READ ",
	"N64 CONTROLLER PAK DATA",
	"",
	"",

	"",
	"",
	"",
	"",

	"INSUFFICIENT FREE PAGES AVAILABLE ",
	"IN N64 CONTROLLER PAK TO CREATE ",
	"GAME DATA, PLEASE FREE 121 PAGES.",
	"SEE INSTRUCTION BOOKLET FOR DETAILS.",

	"TO SAVE GHOST DATA, ",
	"INSERT N64 CONTROLLER PAK ",
	"INTO CONTROLLER 1"
};


char *ta_ghosta_messages_j[] = {
	"N64 CONTROLLER PAK ",
	"NOT DETECTED. ",
	"IF YOU WANT TO SAVE ",
	"THE GHOST DATA, ",
	"PLEASE INSERT ",
	"N64 CONTROLLER PAK ",
	"INTO CONTROLLER 1",

	"",
	"UNABLE TO SAVE ",/* パックのハード異常？ */
	"     THE GHOST",
	"",
	"",
	"",
	"",

	"",
	"UNABLE TO SAVE ",
	"     THE GHOST",
	"",
	"",
	"",
	"",

	"INSUFFICIENT ",
	"FREE PAGES AVAILABLE ",
	"",
	"-- GHOST DATA ",
	"COULD NOT BE SAVED",
	"",
	"",

	"",
	"CANNOT CREATE ",
	"     GAME DATA",
	"",
	"",
	"",
	"",

	"",
	"THIS GHOST IS ",
	"     ALREADY SAVED",
	"",
	"",
	"",
	""
};

char *ta_lost_ghost_message_j[] = {
	"RACE DATA CANNOT ",
	"BE SAVED FOR GHOST"
};

char *ta_ghostb_messages_j[] = {
	"SELECT THE FILE ",
	"YOU WANT TO SAVE",
	"NO DATA"
};

char *ta_ghostb3_messages_j[] = {
	"CREATING ",
	"MARIO KART 64 ",
	"GAME DATA",
	"CANNOT CREATE GAME DATA",
	"",
	""
};

char *ta_ghostc_messages_j[] = {
	"THE PREVIOUS DATA ",
	"WILL BE ERASED, ",
	"IS THIS OK?"
};

char *ta_ghostc_select_messages_j[] = {
	"QUIT",
	"SAVE"
};

char *ta_ghostd_messages_j[] = {
	"SAVING GHOST DATA",
	"",
	"PLEASE WAIT"
};

char *ta_ghostd2_messages_j[] = {
	"UNABLE TO SAVE ",
	"THE GHOST"
};



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 PLACED",
	"    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( osPfsInit(&intMesgQueue, &pfs_k, 0 ) )
			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);
	kwdb_effectcount = effectcount;/* for kawaguti */
	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-5,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.75;
			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*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-1*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:
		{
			float mul1;

			if (ptr->kind == KO_MSEL_BRECORD)
				mul1 = 0.6;
			else
				mul1 = 0.8;
			
			msel_bbox_sub(ptr);
			SetPalette(3);
			SetWord2_a(ptr->disp_x+8,ptr->disp_y+16,
					   bestrec_j[ptr->kind - KO_MSEL_BRECORD],0,mul1,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(293,28,tsel_title_j,0,.55,.55);
		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;
#if 1
	if (code > 49)/* 英語版はカナを表示したらダメ */
		code = 43;
#endif
	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.65;
		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(105,ptr->disp_y+25,
				circuit_name_j[map_num],0,mul1,mul1);

	SetPalette(2);
	SetWord2_a(45,ptr->disp_y+40,dsel_length_j,0,mul1,mul1);
	SetWord3_a(165,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 = 63;
	mul1 = 0.6;
	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 - 6;
	pos_buf.y = y - 5 + 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.65;

	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);

	//mul1 = 0.75;
	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 = 82;
	y = 123;
	mul1 = 0.75;

	SetPalette(2);
	for (i = 0;i < 2;i++)
		SetWord2_a(x-40,y-50+i*16,
				   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 = 50;
			y = 85+i*35;
			SetWord2_a(x,y,option_select1_messages_j[i],0,0.9,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(40,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 = 132;
			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 = 0.9;
		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 = 0.8;
		SetPalette(2);
		x = msel_mode-OPT_PAK1_ERR1;
		for (i = 0;i < 4;i++)
			SetWord2_a(35,85+i*20,
					   option_copy_pak1err_messages_j[x*4 + i],0,mul1,mul1);
		break;
	case OPT_COPY_ERR1:
	case OPT_COPY_ERR2:
		mul1 = 0.9;
		SetPalette(2);
		x = msel_mode-OPT_COPY_ERR1;
		for (i = 0;i < 3;i++)
			SetWord2_a(65,85+i*20,
					   option_copy_copyerr_messages_j[x*3 + 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:
		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;
		}
		mul1 = 0.6;
		SetPalette(1+b);
		SetWord3_ac(160,85,option_copy_pak2sel_message_j[b],0,mul1,mul1);
		for (i = 0;i < 2;i++){
			mul1 = 0.75;
			SetPalette(3);
			SetWord3_ac(92 + i*130,125,option_copy_pak_j[i],0,mul1,mul1);
			for (j = 0;j < 2;j++){
				char let[5];
				PAK_GHOST *pak_ptr;

				mul1 = 0.6;
				x = 32+i*137;
				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;
				mul1 = 0.5;
				if (!pak_ptr->e.ghost_flg){
					SetWord2_a(x+10,y,
							   ta_ghostb_messages_j[2],0,mul1,mul1);
				}
				else{
					int a;

					a = pak_ptr->e.ghost_map;
					SetWord2_a(x+10,y,
							   circuit_name_semilong_j
							   [map_number_chart[a/4][a%4]],
							   0,mul1,mul1);
				}
			}
		}
		break;
	case OPT_SURE1:
	case OPT_SURE2:
		mul1 = 0.8;
		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 = 0.75;
			SetPalette(3);
			SetWord3_ac(92 + i*130,125,option_copy_pak_j[i],0,mul1,mul1);
			for (j = 0;j < 2;j++){
				char let[5];
				PAK_GHOST *pak_ptr;

				mul1 = 0.6;
				x = 32+i*137;
				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);
				mul1 = 0.5;
				if (!i)
					pak_ptr = &pak_ghost[j];
				else
					pak_ptr = ((PAK_GHOST *)kdl_buff) + j;
				if (!pak_ptr->e.ghost_flg){
					SetWord2_a(x+10,y,
							   ta_ghostb_messages_j[2],0,mul1,mul1);
				}
				else{
					int a;

					a = pak_ptr->e.ghost_map;
					SetWord2_a(x+10,y,
							   circuit_name_semilong_j
							   [map_number_chart[a/4][a%4]],
							   0,mul1,mul1);
				}
			}
		}

		for (i = 0;i < 2;i++){
			mul1 = 0.75;
			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 = 0.75;
			SetPalette(3);
			SetWord3_ac(92 + i*130,125,option_copy_pak_j[i],0,mul1,mul1);
			for (j = 0;j < 2;j++){
				char let[5];
				PAK_GHOST *pak_ptr;

				mul1 = 0.6;
				x = 32+i*137;
				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);
				mul1 = 0.5;
				if (!i)
					pak_ptr = &pak_ghost[j];
				else
					pak_ptr = ((PAK_GHOST *)kdl_buff) + j;
				if (!pak_ptr->e.ghost_flg){
					SetWord2_a(x+10,y,
							   ta_ghostb_messages_j[2],0,mul1,mul1);
				}
				else{
					int a;

					a = pak_ptr->e.ghost_map;
					SetWord2_a(x+10,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;
	int l_1,l_2;
	float mul1;

	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+30,ptr->disp_y+25,"results",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);
	}

	//mul1 = 0.7;
	mul1 = 0.6;
	SetPalette(5);
#if 1
	l_1 = (GetWordLength(cup_name[cup_select])+8)*mul1/2;
	l_2 = (GetWordLength(class_name[race_level])+8)*mul1/2;
	SetWord3_ac(245-l_2-ptr->disp_x,ptr->disp_y+225,
				cup_name[cup_level],0,mul1,mul1);
	SetWord3_ac(245+l_1-ptr->disp_x,ptr->disp_y+225,
				class_name[popup_status[players-1][play_mode[players-1]]],
				0,mul1,mul1);
#else
	SetWord2_a(195-ptr->disp_x,ptr->disp_y+225,
				cup_name[cup_level],0,mul1,mul1);
	SetWord2_a(275-ptr->disp_x,ptr->disp_y+225,
				class_name[popup_status[players-1][play_mode[players-1]]],
				0,mul1,mul1);
#endif
}

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,0.65,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;
	int l_1,l_2;
	float mul1;

	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+25,-ptr->disp_y+25,"driver's points",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);
	}

	//mul1 = 0.7;
	mul1 = 0.6;
	SetPalette(5);
#if 1
	l_1 = (GetWordLength(cup_name[cup_select])+8)*mul1/2;
	l_2 = (GetWordLength(class_name[race_level])+8)*mul1/2;
	SetWord3_ac(230-l_2-ptr->disp_x,ptr->disp_y+225,
				cup_name[cup_level],0,mul1,mul1);
	SetWord3_ac(230+l_1-ptr->disp_x,ptr->disp_y+225,
				class_name[popup_status[players-1][play_mode[players-1]]],
				0,mul1,mul1);
#else
	SetWord2_a(150+25-ptr->disp_x,ptr->disp_y+225,
				cup_name[cup_level],0,mul1,mul1);
	SetWord2_a(150+110-ptr->disp_x,ptr->disp_y+225,
				class_name[popup_status[players-1][play_mode[players-1]]],
				0,mul1,mul1);
#endif
}

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.6;
	SetPalette(4);
	SetWord3_ac(ptr->disp_x+67,ptr->disp_y+25,
				circuit_name_j[map_number_chart[cup_select][circuit_select]],
				0,mul1,mul1);
	mul1 = 0.75;
	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.6;
	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);
	mul1 = 0.75;
	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(178-ptr->disp_x,ptr->disp_y+147+i*13,
								ta_result_select_j[i+1],0,mul1,mul1);
			}
			else{
				SetWord2_a(178-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;
		mul1 = 0.6;
		for(i = 0;i < 7;i++)
			SetWord2_a(162,140+i*13,ta_ghosta_messages_j[j*7 + i],
					   0,mul1,mul1);		
		break;
	case KSEQ_TA_GHOSTB1:
	case KSEQ_TA_GHOSTB2:
		SetPalette(1);
		mul1 = 0.7;
		for (i = 0;i < 2;i++)
			SetWord2_a(165,ptr->disp_y+140+i*13,
					   ta_ghostb_messages_j[i],0,mul1,mul1);
		for (i = 0;i < 2;i++){
			char let[5];
			mul1 = 0.6;
			SetCursorMessageColor(ptr->pattern - KSEQ_TA_GHOSTB1,i,1);
			kawano_itoa(i+1,let);
			SetWord2_a(177-ptr->disp_x,170+i*30,let+1,0,mul1,mul1);
			pak_ptr = &pak_ghost[i];
			if (!pak_ptr->e.ghost_flg){
				mul1 = 0.45;
				SetWord2_a(187-ptr->disp_x,170+i*30,ta_ghostb_messages_j[2],
						   0,mul1,mul1);
			}
			else{
				int a;

				mul1 = 0.45;
				a = pak_ptr->e.ghost_map;
				SetWord2_a(187-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);
		mul1 = 0.8;
		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);
		mul1 = 0.67;
		for (i = 0;i < 3;i++)
			SetWord2_a(163,ptr->disp_y+140+i*13,
					   ta_ghostc_messages_j[i],0,mul1,mul1);
		mul1 = 0.75;
		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);
		mul1 = 0.67;
		for (i = 0;i < 3;i++)
			SetWord2_a(163,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 = 0.85;

	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)+8)*mul1;
	box_h = 24*mul1;
	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[] = {
	{105,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(157,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(157,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},
	{110, 40},{110,160},{110, 40},{110,160},
	{ 40,100},{178,100},{ 40,100},{178,100},
	{ 40, 40},{178, 40},{ 40,160},{178,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-2,pos_ptr->y+i*13,
				   ta_result_select_j[i2],0,mul1,mul1);
	}
}

POS_XY gp_pause_message_positions[] = {
	{105,140},{120,100},{120,100},{120,100},
	{105, 85},{105,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},
	{110, 40},{110,160},{110, 40},{110,160},
	{ 40,100},{178,100},{ 40,100},{178,100},
	{ 40, 40},{178, 40},{ 40,160},{178,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-2,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-15,x+j+3,y+2,
										0,0,0,150);
			SetPalette(1);
			SetWord2_a(x-4,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(157,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(157,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;
		mul1 = 0.8;
		for(i = 0;i < 7;i++)
			SetWord2_a(77,110+i*13,ta_ghosta_messages_j[j*7 + 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(90,ptr->disp_y+110+i*13,
					   ta_ghostb_messages_j[i],0,mul1,mul1);
		mul1 = 0.75;
		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(90-ptr->disp_x,150+i*20,let+1,0,mul1,mul1);
			pak_ptr = &pak_ghost[i];
			if (!pak_ptr->e.ghost_flg){
				SetWord2_a(105-ptr->disp_x,150+i*20,ta_ghostb_messages_j[2],
						   0,mul1,mul1);
			}
			else{
				int a;

				a = pak_ptr->e.ghost_map;
				SetWord2_a(105-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(85,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(85,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(93,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;
	float mul1;

#if 1
	if (kwradarsw == 1)
		return;
#endif
	gDPSetPrimColor(graphPtr++,0,0,	0,0,0,ptr->work1);
	moji = cup_name[cup_level];
	SetPalette(5);
	mul1 = 0.85;
	SetWord3_acp(ptr->disp_x+65,ptr->disp_y+160,moji,0,mul1,1.0);

	moji = circuit_name[map_number];
	SetPalette(map_number%4);
	SetWord3_acp(ptr->disp_x+65,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(105,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,0.65,mul1);	
		SetWord3_acp(pos_ptr->x,pos_ptr->y,wl_ptr,0,0.65,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.45;
	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_ap(x-3,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 0
	if (race_level == 3)
		c_ptr = &ending_names_kana[num];
	else
#endif
		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/*40*/){
			    SetFadeOutWhite(40/*20*/);
				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-4,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,mul2;

	mul1 = 1.0;
	SetPalette(3);
	SetWord3_ac(152,68,msel_battle_messages_j[0],0,mul1,mul1);
	mul1 = 0.7;
	mul2 = 0.8;
	SetWord2_a(23,88,msel_battle_messages_j[1],0,mul1,mul2);
	SetWord2_a(23,106,msel_battle_messages_j[2],0,mul1,mul2);
	//SetWord4_a(30,106,msel_battle_messages_j[2],4,mul1,mul2);
}

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 1
	if (number != ptr->pattern){
		ptr->pattern = number;
		ChangeSeqData(ptr->sd_number,0,
					  (TexBlockSeq *)GetVAddress(TBSeq_cp_messages[number]));
	}
#else
	if ((frame_counter%20) == 0){
		ptr->pattern = (frame_counter/20)%6;
		number = ptr->pattern;
		ChangeSeqData(ptr->sd_number,0,
					  (TexBlockSeq *)GetVAddress(TBSeq_cp_messages[number]));
	}
#endif
}

//
// 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 ");
				a = osPfsInit(&intMesgQueue, &pfs_k, 0 );
				//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(60);/* 12/19 for Bando */
					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;
		}
		if (kwlap[0].goalsw == 1)
			ptr->pattern = 2;
		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 0
	if (race_level == 3)
		c_ptr = &ending_names_kana[num];
	else
#endif
		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 0
	if (race_level == 3)
		c_ptr = &ending_names_kana[num];
	else
#endif
		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;
	}
}

