/************************************************************************************************/
/*												*/
/*				--------------------------------- 	       			*/
/*				    Ultra64 Mario Kart Program    		 		*/
/*				---------------------------------				*/
/*					File		: kwprint.c   				*/
/*					Description	:	    				*/
/*					Date		: 1995.10.05   				*/
/*					Author		: Yasuhiro Kawaguchi			*/
/*									  			*/
/************************************************************************************************/
#include "headers.h"
extern Dynamic	*dynamicp;
extern ushort center_line_max;
extern ushort old_oga_area[10];
extern int ogawa_rap[10];
extern int ogawa_rank[10];
extern short balloon_number[8];
//extern short rank_to_num[i];

/************************************************************************************************/
/*												*/
/*												*/
/*     		  	  	  Texture Image Table  						*/
/*												*/
/*												*/
/************************************************************************************************/
/********************************************************************************/
/*										*/
/*	    		Texture Tile (64x64)   					*/
/*										*/
/********************************************************************************/
/* Point Data */
Vtx dvtx_ktile48x40[] ={
	{   -24,   -19,  0, 0, 0,         0,  0xff, 0xff, 0xff, 0xff },
	{    23,   -19,  0, 0, ktx48,     0,  0xff, 0xff, 0xff, 0xff },
	{    23,    20,  0, 0, ktx48, ktx40,  0xff, 0xff, 0xff, 0xff },
	{   -24,    20,  0, 0, 0,     ktx40,  0xff, 0xff, 0xff, 0xff },
};

Vtx dvtx_ktile48x40xflip[] ={
	{   -24,   -19,  0, 0, ktx48, 0,      0xff, 0xff, 0xff, 0xff },
	{    23,   -19,  0, 0, 0,     0,      0xff, 0xff, 0xff, 0xff },
	{    23,    20,  0, 0, 0,     ktx40,  0xff, 0xff, 0xff, 0xff },
	{   -24,    20,  0, 0, ktx48, ktx40,  0xff, 0xff, 0xff, 0xff },
};

Vtx dvtx_tellesa48x40[] ={
	{   -24,   -19,  0, 0, 0,         0,  0xff, 0xff, 0xff, 0xff },
	{    23,   -19,  0, 0, ktx48,     0,  0xff, 0xff, 0xff, 0xff },
	{    23,    20,  0, 0, ktx48, ktx40,  0xff, 0xff, 0xff, 0xff },
	{   -24,    20,  0, 0, 0,     ktx40,  0xff, 0xff, 0xff, 0xff },
};

Vtx dvtx_tellesa48x40xflip[] ={
	{   -24,   -19,  0, 0, ktx48, 0,      0xff, 0xff, 0xff, 0xff },
	{    23,   -19,  0, 0, 0,     0,      0xff, 0xff, 0xff, 0xff },
	{    23,    20,  0, 0, 0,     ktx40,  0xff, 0xff, 0xff, 0xff },
	{   -24,    20,  0, 0, ktx48, ktx40,  0xff, 0xff, 0xff, 0xff },
};

/********************************************************************************/
/*	    		Polygon Tile (320x240) 					*/
/********************************************************************************/
#if 0
/* Point Data */
extern Vtx dvtx_test_triangle[] ={
    	{      0,   0, 0, 0, 0, 0, 0xff, 0x00, 0x00, 0xff },
  	{      0, 120, 0, 0, 0, 0, 0x00, 0xff, 0xff, 0xff },
	{      0, 240, 0, 0, 0, 0, 0xff, 0x00, 0x00, 0xff },
};		   

extern Vtx dvtx_wipetile[] ={
    	{   -160,   -120,    0, 0, 0, 0, 0, 0, 0, 255 },
  	{    160,   -120,    0, 0, 0, 0, 0, 0, 0, 255 },
    	{    160,    120,    0, 0, 0, 0, 0, 0, 0, 255 },
      	{   -160,    120,    0, 0, 0, 0, 0, 0, 0, 255 },
};		   

extern Vtx dvtx_wipetile1[] ={
    	{   -160,   -120,    0, 0, 0, 0, 0, 0, 0, 50 },
  	{   -160,   -120,    0, 0, 0, 0, 0, 0, 0, 150 },
    	{   -160,    120,    0, 0, 0, 0, 0, 0, 0, 150 },
      	{   -160,    120,    0, 0, 0, 0, 0, 0, 0, 50 },
};		   

extern Vtx dvtx_wipetile2[] ={
    	{    160,   -120,    0, 0, 0, 0, 0, 0, 0, 150 },
  	{    160,   -120,    0, 0, 0, 0, 0, 0, 0, 50 },
    	{    160,    120,    0, 0, 0, 0, 0, 0, 0, 50 },
      	{    160,    120,    0, 0, 0, 0, 0, 0, 0, 150 },
};		   

extern Vtx dvtx_wipetile3[] ={
    	{   -160,   -120,    0, 0, 0, 0, 0, 0, 0, 150 },
  	{   -160,   -120,    0, 0, 0, 0, 0, 0, 0, 200 },
    	{   -160,    120,    0, 0, 0, 0, 0, 0, 0, 200 },
      	{   -160,    120,    0, 0, 0, 0, 0, 0, 0, 150 },
};		   

extern Vtx dvtx_wipetile4[] ={
    	{    160,   -120,    0, 0, 0, 0, 0, 0, 0, 200 },
  	{    160,   -120,    0, 0, 0, 0, 0, 0, 0, 150 },
    	{    160,    120,    0, 0, 0, 0, 0, 0, 0, 150 },
      	{    160,    120,    0, 0, 0, 0, 0, 0, 0, 200 },
};		   

extern Vtx dvtx_blackfadetile[] ={
    	{   -160,   -120,    0, 0, 0, 0, 0, 0, 0, 0 },
  	{    160,   -120,    0, 0, 0, 0, 0, 0, 0, 0 },
    	{    160,    120,    0, 0, 0, 0, 0, 0, 0, 0 },
      	{   -160,    120,    0, 0, 0, 0, 0, 0, 0, 0 },
};		   

extern Vtx dvtx_whitefadetile[] ={
    	{   -160,   -120,    0, 0, 0, 0, 255, 255, 255, 0 },
  	{    160,   -120,    0, 0, 0, 0, 255, 255, 255, 0 },
    	{    160,    120,    0, 0, 0, 0, 255, 255, 255, 0 },
      	{   -160,    120,    0, 0, 0, 0, 255, 255, 255, 0 },
};		   


extern Vtx dvtx_redfadetile[] ={
    	{   -160,   -120,    0, 0, 0, 0, 255, 0, 0, 0 },
  	{    160,   -120,    0, 0, 0, 0, 255, 0, 0, 0 },
    	{    160,    120,    0, 0, 0, 0, 255, 0, 0, 0 },
      	{   -160,    120,    0, 0, 0, 0, 255, 0, 0, 0 },
};		   

extern Vtx dvtx_greenfadetile[] ={
    	{   -160,   -120,    0, 0, 0, 0, 0, 255, 0, 0 },
  	{    160,   -120,    0, 0, 0, 0, 0, 255, 0, 0 },
    	{    160,    120,    0, 0, 0, 0, 0, 255, 0, 0 },
      	{   -160,    120,    0, 0, 0, 0, 0, 255, 0, 0 },
};		   

extern Vtx dvtx_bluefadetile[] ={
    	{   -160,   -120,    0, 0, 0, 0, 0, 0, 255, 0 },
  	{    160,   -120,    0, 0, 0, 0, 0, 0, 255, 0 },
    	{    160,    120,    0, 0, 0, 0, 0, 0, 255, 0 },
      	{   -160,    120,    0, 0, 0, 0, 0, 0, 255, 0 },
};		   

extern Vtx *FadeColorTable[] ={
    	dvtx_blackfadetile,dvtx_whitefadetile,
	dvtx_redfadetile,dvtx_greenfadetile,dvtx_bluefadetile,
};

#endif

/*======================================================*/
/*		Sprite Library Table			*/
/*======================================================*/
ushort *itemboxtbl_pal[]={
	ib_nothingpal,
	ib_bananapal,
	ib_bananaspal,
	ib_shl_gpal,
	ib_shls_gpal,
	ib_shl_rpal,
	ib_shls_rpal,
	ib_shl_ppal,
	ib_thunderpal,
	ib_imboxpal,
	ib_starpal,
	ib_tellesapal,
	ib_msh1pal,
	ib_msh2pal,
	ib_msh3pal,
	ib_mshcpal,
};

uchar *itemboxtbl_idx[]={
	ib_nothingidx,
	ib_bananaidx,
	ib_bananasidx,
	ib_shl_gidx,
	ib_shls_gidx,
	ib_shl_ridx,
	ib_shls_ridx,
	ib_shl_pidx,
	ib_thunderidx,
	ib_imboxidx,
	ib_staridx,
	ib_tellesaidx,
	ib_msh1idx,
	ib_msh2idx,
	ib_msh3idx,
	ib_mshcidx,
};

/*======================================================*/
/*		LAP Count Table				*/
/*======================================================*/
unsigned short *lap_list[]={
	lap1,lap2,lap3,
};

/**********************************************************/
/*		Kao Panel Table    			  */
/**********************************************************/
unsigned short *kao_colpal_list[]={
	pmapal,plupal,pyopal,pkipal,
	pdopal,pwapal,ppepal,pkupal,
};

unsigned char *kao_index_list[]={
	pmaidx,pluidx,pyoidx,pkiidx,
	pdoidx,pwaidx,ppeidx,pkuidx,
};

/************************************************************************************************/
/*												*/
/*												*/
/*	   				Set Texture Tile					*/
/*												*/
/*												*/
/************************************************************************************************/
extern void kwset_tile (FVector position,USVector angle,float scale,Vtx *vtxaddr)
{
	kwcreateaffine3D (position,angle,scale);
 	gSPVertex(graphPtr++ ,&vtxaddr[0], 4, 0); 
	gSPDisplayList(graphPtr++, &kwsetTile);
}

/************************************************************************************************/
/*												*/
/*												*/
/*	    		  	  	  3D Polygon      					*/
/*												*/
/*												*/
/************************************************************************************************/
extern void kwpolygon3D (FVector position,USVector angle,float scale,Gfx *listptr)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);
	gSPDisplayList(graphPtr++, &kwpolygon_init);
	gSPDisplayList(graphPtr++, listptr);
}

extern void kwpolygon3D_both (FVector position,USVector angle,float scale,Gfx *listptr)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);
	gSPDisplayList(graphPtr++, &kwpolygon_init);
	gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);

	gSPDisplayList(graphPtr++, listptr);

	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
}

//smooth shading
extern void kwpolygon3D_slight (FVector position,USVector angle,float scale,Gfx *listptr)
{
//Modeling Henkan
	kwcreateaffine3D	(position,angle,scale);
	gSPDisplayList		(graphPtr++, &kwpolygon_slight_init);
	gSPDisplayList		(graphPtr++, listptr);
}

//flat shading
extern void kwpolygon3D_tex_flight (FVector position,USVector angle,float scale,Gfx *listptr)
{

//Modeling Henkan
	kwcreateaffine3D	(position,angle,scale);
	gSPDisplayList		(graphPtr++, &kwpolygon_tex_flight_init);
	gSPDisplayList		(graphPtr++, listptr);
}

//smooth shading
extern void kwpolygon3D_tex_slight (FVector position,USVector angle,float scale,Gfx *listptr)
{
//Modeling Henkan
	kwcreateaffine3D	(position,angle,scale);
	gSPDisplayList		(graphPtr++, &kwpolygon_tex_slight_init);
	gSPDisplayList		(graphPtr++, listptr);
}

extern void kwpolygon3D_tex_slight_both (FVector position,USVector angle,float scale,Gfx *listptr)
{
//Modeling Henkan
	kwcreateaffine3D	(position,angle,scale);
	gSPDisplayList		(graphPtr++, &kwpolygon_tex_slight_init);
	gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
	gSPDisplayList		(graphPtr++, listptr);
	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
}

extern void kwpolygon3D_iceblock (FVector position,USVector angle,float scale,Gfx *listptr)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);
 
 	gSPDisplayList	 	(graphPtr++, kwpolygon_iceblock_init);
        gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
        gSPDisplayList		(graphPtr++, listptr);
     	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
}

extern void kwpolygon3D_icekage (FVector position,USVector angle,float scale,Gfx *listptr,uint a)
{
//Modeling Henkan
	kwcreateaffine3D_icekage(position,angle,scale);
	gSPDisplayList		(graphPtr++, &kwpolygon_icekage_init);
	gDPSetPrimColor   	(graphPtr++ ,0,0,255,255,255,a);

	gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
	gSPDisplayList		(graphPtr++, listptr);
	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
}

extern void kwpolygon3D_shade (FVector position,USVector angle,float scale,Gfx *listptr)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);
	gSPDisplayList(graphPtr++, &kwshade_init);
	gSPDisplayList(graphPtr++, listptr);
}

extern void kwshade_triangle (int x,int y,unsigned short ang ,float scale,Vtx *vtxaddr)
{
	AffineMtx tmpmat;

	kwcreateaffine2D (x,y,ang,scale);
	gSPDisplayList(graphPtr++, &kwshade_init);
	gSPVertex(graphPtr++ ,&vtxaddr[0], 3, 0); 
	gSPDisplayList(graphPtr++, &kwsetTriangle);
}

extern void kwshade_tile (int x,int y,unsigned short ang ,float scale,Vtx *vtxaddr)
{
	AffineMtx tmpmat;

	kwcreateaffine2D (x,y,ang,scale);
	gSPDisplayList(graphPtr++, &kwshade_init);
	gSPVertex(graphPtr++ ,&vtxaddr[0], 4, 0); 
	gSPDisplayList(graphPtr++, &kwsetTile);
}


extern void kwshade_xlu_tile (int x,int y,unsigned short ang ,float scale,Vtx *vtxaddr,int alpha)
{
	AffineMtx tmpmat;

	kwcreateaffine2D (x,y,ang,scale);
	gSPDisplayList(graphPtr++, &kwshade_init);

//	gDPSetRenderMode(graphPtr++ ,G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2);  //(AA_ZB)
//	gDPSetRenderMode(graphPtr++,G_RM_XLU_TEX_EDGE, G_RM_XLU_TEX_EDGE2);
	gDPSetRenderMode(graphPtr++, G_RM_CLD_SURF, G_RM_CLD_SURF2);

	(vtxaddr+0)->v.cn[3] = alpha;
	(vtxaddr+1)->v.cn[3] = alpha;
	(vtxaddr+2)->v.cn[3] = alpha;
	(vtxaddr+3)->v.cn[3] = alpha;

	gSPVertex(graphPtr++ ,&vtxaddr[0], 4, 0); 
	gSPDisplayList(graphPtr++, &kwsetTile);
}

extern void kw_shutter1 (int x,int y,unsigned short ang ,float scale,Vtx *vtxaddr,int alpha)
{
	AffineMtx tmpmat;

	(vtxaddr+1)->v.ob[0] = (short)alpha;
	(vtxaddr+2)->v.ob[0] = (short)alpha;

	kwcreateaffine2D (x,y,ang,scale);
	gSPDisplayList(graphPtr++, &kwshade_init);
	gDPSetRenderMode(graphPtr++, G_RM_CLD_SURF, G_RM_CLD_SURF2);

	gSPVertex(graphPtr++ ,&vtxaddr[0], 4, 0); 
	gSPDisplayList(graphPtr++, &kwsetTile);
}


extern void kw_shutter2 (int x,int y,unsigned short ang ,float scale,Vtx *vtxaddr,int alpha)
{
	AffineMtx tmpmat;

	(vtxaddr+0)->v.ob[0] = (short)alpha;
	(vtxaddr+3)->v.ob[0] = (short)alpha;

	kwcreateaffine2D (x,y,ang,scale);
	gSPDisplayList(graphPtr++, &kwshade_init);
	gDPSetRenderMode(graphPtr++, G_RM_CLD_SURF, G_RM_CLD_SURF2);

	gSPVertex(graphPtr++ ,&vtxaddr[0], 4, 0); 
	gSPDisplayList(graphPtr++, &kwsetTile);
}

/************************************************************************************************/
/*												*/
/*												*/
/*		  			Load Texture  Image					*/
/*												*/
/*												*/
/************************************************************************************************/
extern int kwget_maskval (int sizex){
	int mask=0,div,syou,amari;
	div= sizex;

	while (1){
		mask++;
		syou  = div/2;
		amari = div%2; 
		div = syou;
		if (syou equ 1) break;
	}

	return (mask);
}


extern void kwloadtextureblock_rgba_32b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_RGBA, G_IM_SIZ_32b, cutx, cuty, 0,
			G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
			G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtexturetile_rgba_32b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureTile (graphPtr++ ,texaddr, G_IM_FMT_RGBA, G_IM_SIZ_32b, cutx, cuty,0,0,(cutx-1),(cuty-1), 0,
				G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}


extern void kwloadtextureblock_rgba_16b (ushort *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, cutx, cuty, 0,
			G_TX_MIRROR| G_TX_CLAMP, G_TX_MIRROR | G_TX_CLAMP,
			G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_rgba_16b_mr (ushort *texaddr,int cutx,int cuty,int power)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, cutx, cuty, 0,
			G_TX_MIRROR| G_TX_WRAP,G_TX_NOMIRROR | G_TX_CLAMP, 
     			power, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtexturetile_rgba_16b (ushort *texaddr,int cutx,int cuty)
{
	gDPLoadTextureTile (graphPtr++ ,texaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, cutx, cuty,0,0,(cutx-1),(cuty-1), 0,
				G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_ia_16b (ushort *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_IA, G_IM_SIZ_16b, cutx, cuty, 0,
		        G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
			G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtexturetile_ia_16b (ushort *texaddr,int cutx,int cuty)
{
	gDPLoadTextureTile (graphPtr++ ,texaddr, G_IM_FMT_IA, G_IM_SIZ_16b, cutx, cuty,0,0,(cutx-1),(cuty-1), 0,
				G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_ia_8b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_IA, G_IM_SIZ_8b, cutx, cuty, 0,
		   		G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
		       		G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtexturetile_ia_8b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureTile (graphPtr++ ,texaddr, G_IM_FMT_IA, G_IM_SIZ_8b, cutx, cuty,0,0,(cutx-1),(cuty-1), 0,
				G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_a_8b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_I, G_IM_SIZ_8b, cutx, cuty, 0,
		   		G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
		       		G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_ia_4b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock_4b (graphPtr++ ,texaddr, G_IM_FMT_IA, cutx, cuty, 0,
		        G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
			G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtexturetile_ia_4b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureTile_4b (graphPtr++ ,texaddr, G_IM_FMT_IA, cutx, cuty,0,0,(cutx-1),(cuty-1), 0,
				G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_i_8b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_I, G_IM_SIZ_8b, cutx, cuty, 0,
		   		G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
		       		G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_i_4b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock_4b (graphPtr++ ,texaddr, G_IM_FMT_I, cutx, cuty, 0, 
		   		G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
		       		G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_a_4b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock_4b (graphPtr++ ,texaddr, G_IM_FMT_I, cutx, cuty, 0, 
		   		G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
		       		G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_a_4b_xflip (uchar *texaddr,int cutx,int cuty)
{
	int mask;
	mask = kwget_maskval (cutx);
	gDPLoadTextureBlock_4b (graphPtr++ ,texaddr, G_IM_FMT_I, cutx, cuty, 0, 
		   		G_TX_MIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_CLAMP,
		       		mask, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

extern void kwloadtextureblock_ci_8b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_CI, G_IM_SIZ_8b, cutx, cuty, 0,
			G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
     			G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);

}

extern void kwloadtextureblock_ci_8b_mr (uchar *texaddr,int cutx,int cuty,int power)
{
	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_CI, G_IM_SIZ_8b, cutx, cuty, 0,
			G_TX_MIRROR| G_TX_WRAP,G_TX_NOMIRROR | G_TX_CLAMP, 
     			power, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);

}

extern void kwloadtexturetile_ci_8b (uchar *texaddr,int cutx,int cuty)
{
	gDPLoadTextureTile (graphPtr++ ,texaddr, G_IM_FMT_CI, G_IM_SIZ_8b, cutx, cuty,0,0,(cutx-1),(cuty-1), 0,
				G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
}

#define MULTIBIT_ALPHA	0, 0, 0, TEXEL0, 0, 0, 0, TEXEL1

extern void kwloadtextureblock_multi_16b (ushort *texaddr,uchar *alphaaddr,int sizex,int sizey)
{
	gDPSetCombineMode(graphPtr++ ,MULTIBIT_ALPHA, G_CC_PASS2);
	_gDPLoadTextureBlock (graphPtr++ ,alphaaddr, 256, G_IM_FMT_I,G_IM_SIZ_8b,
  			sizex,sizey, 0,
			G_TX_MIRROR| G_TX_CLAMP, G_TX_MIRROR | G_TX_CLAMP,
			G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);

	gDPLoadTextureBlock (graphPtr++ ,texaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, sizex, sizey, 0,
			G_TX_MIRROR| G_TX_CLAMP, G_TX_MIRROR | G_TX_CLAMP,
			G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);

	gDPSetTile	(graphPtr++ ,G_IM_FMT_I, G_IM_SIZ_8b, (sizex+7)>>3 , 256, 1, 0, 0, 0, 0, 0, 0, 0);
	gDPSetTileSize	(graphPtr++ ,G_TX_RENDERTILE+1, 0, 0, (sizex-1) << 2, (sizey-1) << 2);
}

#if 0
	gDPLoadSync(graphPtr++);
	gDPSetTextureImage(graphPtr++,G_IM_FMT_IA,G_IM_SIZ_8b,cutx,texaddr);
	gDPSetTile(graphPtr++,G_IM_FMT_IA,G_IM_SIZ_8b,(((cutx*G_IM_SIZ_8b_TILE_BYTES)+7)>>3),0,G_TX_LOADTILE,0,G_TX_CLAMP,G_TX_NOMASK,G_TX_NOLOD,G_TX_CLAMP,G_TX_NOMASK,G_TX_NOLOD);
	gDPSetTile(graphPtr++,G_IM_FMT_IA,G_IM_SIZ_8b,(((cutx*G_IM_SIZ_8b_LINE_BYTES)+7)>>3),0,G_TX_RENDERTILE,0,G_TX_CLAMP,G_TX_NOMASK,G_TX_NOLOD,G_TX_CLAMP,G_TX_NOMASK,G_TX_NOLOD);
	gDPLoadTile(graphPtr++,G_TX_LOADTILE,0,0<<G_TEXTURE_IMAGE_FRAC,(sizex-1)<<G_TEXTURE_IMAGE_FRAC,(cuty-1)<<G_TEXTURE_IMAGE_FRAC);
	gDPSetTileSize(graphPtr++,G_TX_RENDERTILE,0,0<<G_TEXTURE_IMAGE_FRAC,(sizex-1)<<G_TEXTURE_IMAGE_FRAC,(cuty-1)<<G_TEXTURE_IMAGE_FRAC);
#endif

/************************************************************************************************/
/*												*/
/*												*/
/*		  	    		Texture Setting	     					*/
/*												*/
/*												*/
/************************************************************************************************/

/*======================================================================================*/
/*		     		Set Texture Tile    					*/
/*======================================================================================*/
static void kwsettexturetile (Vtx *vtxaddr)
{
	gSPVertex(graphPtr++ ,vtxaddr, 4, 0); 
	gSPDisplayList(graphPtr++, &kwsetTile);
}

static void kwsettexturetriangle (Vtx *vtxaddr)
{
	gSPVertex(graphPtr++ ,vtxaddr, 3, 0); 
	gSPDisplayList(graphPtr++, &kwsetTriangle);
}

/****************************************************************************************/
/*											*/
/*											*/
/*	    			Shading Tile  	 					*/
/*											*/
/*											*/
/****************************************************************************************/

extern void kwtile3D_shade (FVector position,USVector angle,float scale,Vtx *vtxaddr)
{
	AffineMtx tmpmat;

	kwcreateaffine3D (position,angle,scale);
	gSPDisplayList(graphPtr++, &kwshade_init);

	gSPVertex(graphPtr++ ,&vtxaddr[0], 4, 0); 
	gSPDisplayList(graphPtr++, &kwsetTile);

}

extern void kwline3D_shade (FVector position,USVector angle,float scale,Vtx *vtxaddr)
{
	AffineMtx tmpmat;

	kwcreateaffine3D (position,angle,scale);
	gSPDisplayList(graphPtr++, &kwshadeline_init);

	gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);

	gSPVertex(graphPtr++ ,&vtxaddr[0], 4, 0); 
	gSPDisplayList(graphPtr++, &kwsetTile);

	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
}

/****************************************************************************************/
/*											*/
/*											*/
/*	   			RGBA Mode (Texture)  					*/
/*											*/
/*											*/
/****************************************************************************************/
/*======================================================================================*/
/*											*/
/*				RGBA Draw Sub Routine	 				*/
/*											*/
/*======================================================================================*/
static void kwtexture_rgba_sub_pt (ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cuty)
{
	int i,n=0;
	ushort	*tmpaddr;

//RDP Debug
	//kwtestrdpmode ();

	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {

		kwloadtextureblock_rgba_16b (tmpaddr,sizex,cuty);
		kwsettexturetile (&vtxaddr[n]);
		tmpaddr	+= (sizex*cuty);
		n +=4;
	}
    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

static void kwtexture_rgba_sub_bl (ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cuty)
{
	int i,n=0;
	ushort	*tmpaddr;

//RDP Debug
	//kwtestrdpmode ();

	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {
	    	kwloadtextureblock_rgba_16b (tmpaddr,sizex,cuty);
	    	kwsettexturetile (&vtxaddr[n]);
       	    	tmpaddr	+= (sizex*(cuty-1));
	    	n +=4;
	}
    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

static void kwtexture_rgba_sub_bl_mr (ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cuty,int power)
{
	int i,n=0;
	ushort	*tmpaddr;

//RDP Debug
	//kwtestrdpmode ();

	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {
	    	kwloadtextureblock_rgba_16b_mr (tmpaddr,sizex,cuty,power);
	    	kwsettexturetile (&vtxaddr[n]);
       	    	tmpaddr	+= (sizex*(cuty-1));
	    	n +=4;
	}
    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

// Multi Bit RGBA
static void kwtexture_rgbma_sub_bl (ushort *texaddr,uchar *alphaaddr,Vtx *vtxaddr,int sizex,int sizey,int cuty)
{
	int i,n=0;
	ushort	*tmpaddr_tex;
	uchar	*tmpaddr_alp;
//RDP Debug
	//kwtestrdpmode ();

	tmpaddr_tex = texaddr;
	tmpaddr_alp = alphaaddr;

  	gSPDisplayList		(graphPtr++, &kwchange2cyclemode);

  	for	(i =0; i<sizey/cuty; i++) {
	    	kwloadtextureblock_multi_16b (tmpaddr_tex,tmpaddr_alp,sizex,cuty);
	    	kwsettexturetile (&vtxaddr[n]);
       	    	tmpaddr_tex	+= (sizex*(cuty-1));
       	    	tmpaddr_alp	+= (sizex*(cuty-1));
	    	n +=4;
	}
        gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
  	gSPDisplayList	(graphPtr++, &kwchange1cyclemode);
}


static void kwtexture_rgba32_sub_pt (uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cuty)
{
	int i,n=0;
	uchar	*tmpaddr;

//RDP Debug
	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {
		kwloadtextureblock_rgba_32b (tmpaddr,sizex,cuty);
		kwsettexturetile (&vtxaddr[n]);
		tmpaddr	+= (sizex*cuty*4);
		n +=4;
	}
    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

static void kwtexture_rgba32_sub_bl (uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cuty)
{
	int i,n=0;
	uchar	*tmpaddr;

//RDP Debug
	//kwtestrdpmode ();

	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {
	    	kwloadtextureblock_rgba_32b (tmpaddr,sizex,cuty);
	    	kwsettexturetile (&vtxaddr[n]);
       	    	tmpaddr	+= (sizex*(cuty-1)*4);
	    	n +=4;
	}
    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}


/*======================================================================================*/
/*											*/
/*				RGBA Display Sub Routine				*/
/*											*/
/*======================================================================================*/
extern void kwtexture2D_rgba_pt (int x,int y,unsigned short ang ,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	kwcreateaffine2D	(x,y,ang,scale);
	gSPDisplayList		(graphPtr++, &kwtexture_rgba_pt_init);
	kwtexture_rgba_sub_pt	(texaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture2D_flash_rgba_pt (int x,int y,unsigned short ang ,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	kwcreateaffine2D	(x,y,ang,scale);
	gSPDisplayList	(graphPtr++, &kwtexture_rgba_xlu_pt_init);
	icemode (kwflash_r,kwflash_g,kwflash_b,128,128,128,255);
	kwtexture_rgba_sub_pt	(texaddr,vtxaddr,sizex,sizey,cuty);
}


extern void kwtexture2D_rgba_bl(int x,int y,unsigned short ang ,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	kwcreateaffine2D	(x,y,ang,scale);
	gSPDisplayList		(graphPtr++, &kwtexture_rgba_bl_init);
	kwtexture_rgba_sub_bl	(texaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture2D_rgba_aa_bl(int x,int y,unsigned short ang ,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	kwcreateaffine2D	(x,y,ang,scale);
	gSPDisplayList		(graphPtr++, &kwtexture_rgba_aa_bl_init);
	kwtexture_rgba_sub_bl	(texaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture2D_rgba_xlu (int x,int y,unsigned short ang ,float scale,uint alpha,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	kwcreateaffine2D	(x,y,ang,scale);
	gSPDisplayList		(graphPtr++, &kwtexture_rgba_xlu_aa_zb_bl_init);
	subalphamode		(alpha);
	kwtexture_rgba_sub_bl	(texaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture2D_rgbma_bl(int x,int y,unsigned short ang ,float scale,ushort *texaddr,uchar *alphaaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	kwcreateaffine2D (x,y,ang,scale);
	gSPDisplayList(graphPtr++, &kwtexture_rgba_bl_init);
	kwtexture_rgbma_sub_bl (texaddr,alphaaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture2D_triangle_rgba (int x,int y,unsigned short ang ,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP Initial
	gSPDisplayList (graphPtr++, &kwtexture_rgba_bl_init);
//DRAW
	kwloadtextureblock_rgba_16b	(texaddr,sizex,sizey);
	kwsettexturetriangle		(vtxaddr);
}

extern void kwtexture2D_rgba32_pt (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	kwcreateaffine2D (x,y,ang,scale);
	gSPDisplayList(graphPtr++, &kwtexture_rgba_pt_init);
	kwtexture_rgba32_sub_pt (texaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture2D_rgba32_bl(int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	kwcreateaffine2D (x,y,ang,scale);
	gSPDisplayList(graphPtr++, &kwtexture_rgba_bl_init);
	kwtexture_rgba32_sub_bl (texaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture3D_rgba_bl (FVector position,USVector angle,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_rgba_bl_init);

//DRAW
	kwtexture_rgba_sub_bl (texaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture3D_rgba_aa_zb_bl (FVector position,USVector angle,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_rgba_aa_zb_bl_init);

//DRAW
	kwtexture_rgba_sub_bl (texaddr,vtxaddr,sizex,sizey,cuty);
}

extern void kwtexture3D_rgba_aa_zb_bl_mr (FVector position,USVector angle,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty,int power)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_rgba_aa_zb_bl_init);

//DRAW
	kwtexture_rgba_sub_bl_mr (texaddr,vtxaddr,sizex,sizey,cuty,power);
}


extern void kwtexture3D_rgba_aa_zb_bl_bt (FVector position,USVector angle,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList		(graphPtr++, &kwtexture_rgba_aa_zb_bl_init);
	gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);

//DRAW
	kwtexture_rgba_sub_bl (texaddr,vtxaddr,sizex,sizey,cuty);

	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
}

extern void kwtexture3D_triangle_rgba (FVector position,USVector angle,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);
//RDP&RCP Initial
	gSPDisplayList (graphPtr++, &kwtexture_rgba_bl_init);
//DRAW
	kwloadtextureblock_rgba_16b	(texaddr,sizex,sizey);
	kwsettexturetriangle		(vtxaddr);
}


extern void kwtexture3D_rgba32_aa_zb_bl (FVector position,USVector angle,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_rgba_aa_zb_bl_init);

//DRAW
	kwtexture_rgba32_sub_bl (texaddr,vtxaddr,sizex,sizey,cuty);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 8 x 8 ) 			*/
/*==============================================================================*/
extern void kwtexture8x8_rgba_bl (int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl (x,y,ang,scale,texaddr,vtx_ktile8x8,8,8,8,8);
}

/*==============================================================================*/
/*			Display Texture Tile  ( 16 x 16 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_16x16_rgba_bl (int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl(x,y,ang,scale,texaddr,vtx_ktile16x16,16,16,16,16);
}

extern void kwtexture3D_16x16_rgba_bl (FVector postion,USVector angle,float scale,ushort *texaddr)
{	
	kwtexture3D_rgba_bl	(postion,angle,scale,texaddr,vtx_ktile16x16,16,16,16,16);
}

extern void kwtexture_triangle_16x16_rgba (int x,int y,unsigned short ang,float scale,ushort *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_triangle_rgba (x,y,ang,scale,texaddr,vtxaddr,16,16);
 }

extern void kwtexture3D_triangle_16x16_rgba (FVector position,USVector angle,float scale,ushort *texaddr,Vtx *vtxaddr)
{	
	kwtexture3D_triangle_rgba (position,angle,scale,texaddr,vtxaddr,16,16);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 24 x 24 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_24x24_rgba (int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl	(x,y,ang,scale,texaddr,vtx_ktile24x24,24,24,24,24);
}
#endif
/*==============================================================================*/
/*			Display Texture Tile  ( 32 x 32 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_32x32_rgba ( int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl(x,y,ang,scale,texaddr,vtx_ktile32x32,32,32,32,32);
 }

/*==============================================================================*/
/*			Display Texture Tile  ( 40 x 40 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_40x40_rgba (int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl(x,y,ang,scale,texaddr,vtx_ktile40x40,40,40,40,40);
}
#endif
/*==============================================================================*/
/*			Display Texture Tile  ( 48 x 48 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_48x48_rgba ( int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl(x,y,ang,scale,texaddr,vtx_ktile48x48,48,48,48,24);
}
#endif

/*==============================================================================*/
/*			Display Texture Tile  ( 64 x 32 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_64x32_rgba_bl ( int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl(x,y,ang,scale,texaddr,vtx_ktile64x32,64,32,64,32);
 }

extern void kwtexture3D_64x32_rgba_bl (FVector postion,USVector angle,float scale,ushort *texaddr)
{	
	kwtexture3D_rgba_bl	(postion,angle,scale,texaddr,vtx_ktile64x32,64,32,64,32);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 64 x 64 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_64x64_rgba_bl ( int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl(x,y,ang,scale,texaddr,vtx_ktile64x64_bl,64,64,64,32);
 }

extern void kwtexture2D_64x64_rgba_xlu ( int x,int y,unsigned short ang,float scale,uint alpha,ushort *texaddr)
{	
	kwtexture2D_rgba_xlu (x,y,ang,scale,alpha,texaddr,vtx_ktile64x64_bl,64,64,64,32);
 }

/*==============================================================================*/
/*			Display Texture Tile  ( 128 x 32 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture3D_128x32_rgba_bl (FVector postion,USVector angle,float scale,ushort *texaddr)
{	
	kwtexture3D_rgba_bl	(postion,angle,scale,texaddr,vtx_ktile128x32,128,32,128,16);
}
#endif

/*==============================================================================*/
/*			Display Texture Tile  ( 128 x 128 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_128x128_rgba_bl ( int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_bl(x,y,ang,scale,texaddr,vtx_ktile128x128,128,128,128,16);
}

extern void kwtexture2D_128x128_rgba_aa_bl ( int x,int y,unsigned short ang,float scale,ushort *texaddr)
{	
	kwtexture2D_rgba_aa_bl(x,y,ang,scale,texaddr,vtx_ktile128x128,128,128,128,16);
}
#endif

/************************************************************************************************/
/*									       			*/
/*									       			*/
/*	   			Colour Index (8bit)Mode (Texture) 	       			*/
/*									 			*/
/*												*/
/************************************************************************************************/
/*==============================================================================*/
/* 				Initial & Load Texture				*/
/*==============================================================================*/
static void kwloadtexture_ci8_aa_zb_bl (ushort *paladdr,uchar *idxaddr,int sizex,int sizey)
{
//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_zb_bl_init);

	gDPLoadTLUT_pal256(graphPtr++ ,paladdr);
     	kwloadtextureblock_ci_8b  (idxaddr,sizex,sizey);
}

static void kwloadtexture_ci8_aa_zb_bl_mr (ushort *paladdr,uchar *idxaddr,int sizex,int sizey,int power)
{
//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_zb_bl_init);

	gDPLoadTLUT_pal256(graphPtr++ ,paladdr);
     	kwloadtextureblock_ci_8b_mr  (idxaddr,sizex,sizey,power);
}

/*==============================================================================*/
/*										*/
/*			Draw Sub Routine (Color Index 8bit Mode)		*/ 
/*										*/
/*==============================================================================*/
// Filter = POINT
static void kwci8sub_pt (ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,n=0;
	uchar	*tmpaddr;

	gDPLoadTLUT_pal256(graphPtr++ ,paladdr);

	//kwtestrdpmode ();

	tmpaddr = idxaddr;

	for	(i =0; i<(sizey/cuty); i++) {
			kwloadtextureblock_ci_8b  (tmpaddr,cutx,cuty);
 			gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0); 
			gSPDisplayList(graphPtr++, &kwsetTile);

       			tmpaddr	+= (cutx*(cuty));
			n +=4;
	}

	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

// Filter = Bilerp
static void kwci8sub_bl (ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,n=0;
	uchar	*tmpaddr;

	gDPLoadTLUT_pal256(graphPtr++ ,paladdr);

	//kwtestrdpmode ();

	tmpaddr = idxaddr;

	for	(i =0; i<(sizey/cuty); i++) {
	     	kwloadtextureblock_ci_8b  (tmpaddr,cutx,cuty);
 	     	gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0); 
	     	gSPDisplayList(graphPtr++, &kwsetTile);
       	      	tmpaddr	+= (cutx*(cuty-1));  //minus 1 !!!!!
	     	n +=4;
	}

	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

// Filter = Bilerp (mirror)
static void kwci8sub_bl_mr (ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty,int power)
{
	int i,n=0;
	uchar	*tmpaddr;

	gDPLoadTLUT_pal256(graphPtr++ ,paladdr);

	//kwtestrdpmode ();

	tmpaddr = idxaddr;

	for	(i =0; i<(sizey/cuty); i++) {
	     	kwloadtextureblock_ci_8b_mr  (tmpaddr,cutx,cuty,power);
 	     	gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0); 
	     	gSPDisplayList(graphPtr++, &kwsetTile);
       	      	tmpaddr	+= (cutx*(cuty-1));  //minus 1 ???????
	     	n +=4;
	}

	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

// Filter = Bilerp
static void kwci8sub_bl_cutx (ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx)
{
	int i,n=0;
	uchar	*tmpaddr;

	gDPLoadTLUT_pal256(graphPtr++ ,paladdr);

	//kwtestrdpmode ();

	tmpaddr = idxaddr;

	for	(i =0; i<(sizex/cutx); i++) {
	     	kwloadtextureblock_ci_8b  (tmpaddr,cutx,sizey);
 	     	gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0); 
	     	gSPDisplayList(graphPtr++, &kwsetTile);
       	      	tmpaddr	+= cutx*sizey;
	     	n +=4;
	}

	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

/*==============================================================================*/
/*										*/
/*			Display Sub Routine (Color Index 8bit Mode)		*/ 
/*										*/
/*==============================================================================*/
extern void kwtexture2D_ci8_pt (int x,int y,unsigned short ang ,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP Initial
	gSPDisplayList	(graphPtr++, &kwtexture_ci8_pt_init);
//DRAW
	kwci8sub_pt	(paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture2D_ci8_bl (int x,int y,unsigned short ang ,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_bl_init);
//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture2D_ci8_av (int x,int y,unsigned short ang ,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_av_init);
//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}


extern void kwtexture2D_ci8_aa_pt (int x,int y,unsigned short ang ,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_pt_init);
//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture2D_ci8_aa_bl (int x,int y,unsigned short ang ,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_bl_init);
//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture2D_ci8_aa_bl_cutx (int x,int y,unsigned short ang ,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_bl_init);
//	gSPDisplayList(graphPtr++, &kwtexture_ci8_pt_init);

//DRAW
	kwci8sub_bl_cutx (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx);

}


extern void kwtexture2D_ci8_xlu_pt (int x,int y,unsigned short ang ,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);

//RDP&RCP Initial
	gSPDisplayList	(graphPtr++, &kwtexture_ci8_xlu_pt_init);
	subalphamode	(alpha);

//	kwtestcombinemode ();
//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ci8_xlu_bl (int x,int y,unsigned short ang ,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_bl_init);
	subalphamode	(alpha);

//	kwtestcombinemode ();
//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture2D_ci8_aa_xlu_pt (int x,int y,unsigned short ang ,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_aa_pt_init);
	subalphamode	(alpha);

//	kwtestcombinemode ();
//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ci8_aa_xlu_bl (int x,int y,unsigned short ang ,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);

//RDP&RCP Initial
	gSPDisplayList	(graphPtr++, &kwtexture_ci8_xlu_aa_bl_init);
	subalphamode	(alpha);

//	kwtestcombinemode ();
//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture3D_ci8_pt (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_pt_init);
//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture3D_ci8_bl (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_bl_init);
//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}


extern void kwtexture3D_ci8_aa_pt (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_pt_init);

//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_aa_bl (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_bl_init);

//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}


extern void kwtexture3D_ci8_zb_bl (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_zb_bl_init);

//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture3D_ci8_aa_zb_pt (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_zb_pt_init);

//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_aa_zb_bl (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_zb_bl_init);

//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_aa_zb_bl_mr (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty,int power)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_zb_bl_init);
//DRAW
	kwci8sub_bl_mr (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty,power);

}

//cutx bersion
extern void kwtexture3D_ci8_aa_zb_bl_cutx (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_aa_zb_bl_init);

//DRAW
	kwci8sub_bl_cutx (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx);

}


extern void kwtexture3D_ci8_xlu_pt (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
	subalphamode	(alpha);

//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_xlu_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_bl_init);
	subalphamode	(alpha);

//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_xlu_aa_pt (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_aa_pt_init);
	subalphamode	(alpha);

//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_xlu_aa_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_aa_bl_init);
	subalphamode	(alpha);

//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_xlu_zb_pt (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_zb_pt_init);
	subalphamode	(alpha);

//DRAW
	kwci8sub_pt (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_xlu_zb_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_zb_bl_init);
	subalphamode	(alpha);

//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

}

extern void kwtexture3D_ci8_xlu_aa_zb_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_aa_zb_bl_init);
	subalphamode	(alpha);

//DRAW
	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture3D_ci8_pcl_aa_zb_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP Initial
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_aa_zb_bl_init);

//DRAW
 	gDPSetAlphaCompare	(graphPtr++,G_AC_DITHER);
	gDPSetRenderMode	(graphPtr++,G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2);
	subalphamode	(alpha);

	kwci8sub_bl (paladdr,idxaddr,vtxaddr,sizex,sizey,cutx,cuty);

 	gDPSetAlphaCompare	(graphPtr++,G_AC_NONE);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 24 x 24 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_24x48_ci8_pt (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_pt	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,24,48,24,48);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 32 x 32 ) 			*/
/*==============================================================================*/
extern void kwtexture32x32_ci8_pt (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_pt	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,32,32,32,32);
}

/*==============================================================================*/
/*			Display Texture Tile  ( 48 x 40 ) 			*/
/*==============================================================================*/
extern void kwtexture3D_48x40_ci8_xlu_aa_zb_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_xlu_aa_zb_bl	(position,angle,scale,alpha,paladdr,idxaddr,vtxaddr,48,48,48,40);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 48 x 48 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_48x48_ci8_pt (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_pt	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,48,48,48,48);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 64 x 32 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_64x32_ci8_pt (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_pt 	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,64,32,64,32);
}

extern void kwtexture2D_64x64_ci8_pt (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_pt	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture2D_64x64_ci8_bl (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_bl	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture2D_64x64_ci8_av (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_av	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture2D_64x64_ci8_aa_pt (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_aa_pt	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture2D_64x64_ci8_aa_bl (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_aa_bl	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,64,64,64,32);
}


extern void kwtexture2D_64x64_ci8_xlu_pt (int x,int y,unsigned short ang,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_xlu_pt	(x,y,ang,scale,alpha,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture2D_64x64_ci8_aa_xlu_pt (int x,int y,unsigned short ang,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_aa_xlu_pt	(x,y,ang,scale,alpha,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture3D_64x64_ci8_bl (FVector postion,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_bl	(postion,angle,scale,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture3D_64x64_ci8_aa_bl (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_aa_bl	(position,angle,scale,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture3D_64x64_ci8_aa_zb_bl (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_aa_zb_bl	(position,angle,scale,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture3D_64x64_ci8_xlu_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_xlu_bl	(position,angle,scale,alpha,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture3D_64x64_ci8_xlu_aa_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_xlu_aa_bl	(position,angle,scale,alpha,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture3D_64x64_ci8_xlu_zb_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_xlu_zb_bl	(position,angle,scale,alpha,paladdr,idxaddr,vtxaddr,64,64,64,32);
}

extern void kwtexture3D_64x64_ci8_xlu_aa_zb_bl (FVector position,USVector angle,float scale,uint alpha,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_xlu_aa_zb_bl	(position,angle,scale,alpha,paladdr,idxaddr,vtxaddr,64,64,64,32);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 72 x 48 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_72x48_ci8_bl (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_bl	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,72,48,72,24);
}

extern void kwtexture2D_72x48_ci8_aa_pt (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_aa_pt	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,72,48,72,24);
}
extern void kwtexture2D_72x48_ci8_aa_bl (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_aa_bl	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,72,48,72,24);
}

extern void kwtexture3D_72x48_ci8_aa_zb_bl (FVector position,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_aa_zb_bl	(position,angle,scale,paladdr,idxaddr,vtxaddr,72,48,72,24);
}

/*==============================================================================*/
/*			Display Texture Tile  ( 80 x 48 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_80x48_ci8_aa_bl (int x,int y,unsigned short ang,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ci8_aa_bl	(x,y,ang,scale,paladdr,idxaddr,vtxaddr,80,48,80,24);
}
extern void kwtexture3D_80x48_ci8_aa_bl (FVector postion,USVector angle,float scale,ushort *paladdr,uchar *idxaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ci8_aa_bl	(postion,angle,scale,paladdr,idxaddr,vtxaddr,80,48,80,24);
}
#endif

/****************************************************************************************/
/*											*/
/*											*/
/*	 			Intensity Alpha	Mode  (Texture)				*/
/*						       					*/
/*											*/
/****************************************************************************************/

/*======================================================================================*/
/*											*/
/*			Draw Sub Routine [Intensity Alpha]				*/
/*											*/
/*======================================================================================*/
extern void kwtexblockdraw_ia16 (ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,j,n=0;
	ushort	*tmpaddr;

	//kwtestrdpmode ();

	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {
		for	(j=0; j<sizex/cutx; j++) {

			kwloadtextureblock_ia_16b (tmpaddr,cutx,cuty);
 			gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0);
			gSPDisplayList(graphPtr++, &kwsetTile);
       			tmpaddr	+= (cutx*cuty);
			n +=4;
       		 }
	}

    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}
extern void kwtextiledraw_ia16 (ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,j,n=0;
	ushort	*tmpaddr;

	//kwtestrdpmode ();

	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {
		for	(j=0; j<sizex/cutx; j++) {

			kwloadtexturetile_ia_16b (tmpaddr,cutx,cuty);
 			gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0);
			gSPDisplayList(graphPtr++, &kwsetTile);
       			tmpaddr	+= (cutx*cuty);
			n +=4;
       		 }
	}

    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);

}

extern void kwtexblockdraw_ia8 (uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,j,n=0;
	uchar	*tmpaddr;
	tmpaddr = texaddr;

	//kwtestrdpmode ();

	for	(i =0; i<sizey/cuty; i++) {
		for	(j=0; j<sizex/cutx; j++) {

			kwloadtextureblock_ia_8b (tmpaddr,cutx,cuty);
 			gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0);
			gSPDisplayList(graphPtr++, &kwsetTile);
       			tmpaddr	+= (cutx*cuty);
			n +=4;
       		 }
	}

    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

extern void kwtextiledraw_ia8 (uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,j,n=0;
	uchar	*tmpaddr;

	//kwtestrdpmode ();

	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {
		for	(j=0; j<sizex/cutx; j++) {

			kwloadtexturetile_ia_8b (tmpaddr,cutx,cuty);
 			gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0);
			gSPDisplayList(graphPtr++, &kwsetTile);
       			tmpaddr	+= (cutx*cuty);
			n +=4;
       		 }
	}

    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);

}

extern void kwtexblockdraw_ia4 (uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,j,n=0;
	uchar	*tmpaddr;

	//kwtestrdpmode ();

	tmpaddr = texaddr;
	for	(i =0; i<sizey/cuty; i++) {
		for	(j=0; j<sizex/cutx; j++) {

			kwloadtextureblock_ia_4b (tmpaddr,cutx,cuty);
 			gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0);
			gSPDisplayList(graphPtr++, &kwsetTile);
       			tmpaddr	+= (cutx*cuty/2);
			n +=4;
       		 }
	}

    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);

}

extern void kwtexblockdraw_a8 (uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,j,n=0;
	uchar	*tmpaddr;
	tmpaddr = texaddr;

	//kwtestrdpmode ();

	for	(i =0; i<sizey/cuty; i++) {
		for	(j=0; j<sizex/cutx; j++) {

			kwloadtextureblock_i_8b (tmpaddr,cutx,cuty);
 			gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0);
			gSPDisplayList(graphPtr++, &kwsetTile);
       			tmpaddr	+= (cutx*cuty);
			n +=4;
       		 }
	}

    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

extern void kwtexblockdraw_a4 (uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
	int i,j,n=0;
	uchar	*tmpaddr;
	tmpaddr = texaddr;

	//kwtestrdpmode ();

	for	(i =0; i<sizey/cuty; i++) {
		for	(j=0; j<sizex/cutx; j++) {
			kwloadtextureblock_i_4b (tmpaddr,cutx,cuty);
 			gSPVertex(graphPtr++ ,&vtxaddr[n], 4, 0);
			gSPDisplayList(graphPtr++, &kwsetTile);
       			tmpaddr	+= (cutx*cuty/2);
			n +=4;
       		 }
	}

    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

/*======================================================================================*/
/*											*/
/*			Set Sub Routine [Intensity Alpha]				*/
/*											*/
/*======================================================================================*/
extern void kwtexture2D_ia16_pt (int x,int y,unsigned short ang ,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);

//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);

//DRAW
	kwtexblockdraw_ia16 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ia16_tile_pt (int x,int y,unsigned short ang ,float scale,ushort *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan

	kwcreateaffine2D (x,y,ang,scale);

//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);

//DRAW
	kwtextiledraw_ia16 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture2D_ia8_pt (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);

//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ia8_bl (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{

//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);
//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ia8_aa_pt (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_aa_pt_init);
//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ia8_aa_bl (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_aa_bl_init);
//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture2D_ia8_xlu_pt (int x,int y,unsigned short ang ,float scale,uint r,uint g,uint b,uint a,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);
	toumeimode	(r,g,b,a);
//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ia8_xlu_bl (int x,int y,unsigned short ang ,float scale,uint r,uint g,uint b,uint a,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);
	toumeimode	(r,g,b,a);
//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture2D_ia8_xlu_aa_zb_bl (int x,int y,unsigned short ang ,float scale,uint r,uint g,uint b,uint a,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_aa_zb_bl_init);
	toumeimode	(r,g,b,a);
//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture2D_ia8_tile_pt (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);
//DRAW
	kwtextiledraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ia8_tile_bl (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);
//DRAW
	kwtextiledraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ia4_pt (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan

	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);
//DRAW
	kwtexblockdraw_ia4 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_ia4_xlu_bl (int x,int y,unsigned short ang ,float scale,uint r,uint g,uint b,uint a,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);
	toumeimode	(r,g,b,a);
//DRAW
	kwtexblockdraw_ia4 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_a4_pt (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan

	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);
	gDPSetCombineMode	(graphPtr++,G_CC_A4, G_CC_A4);
//DRAW
	kwtexblockdraw_a4 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_a4_bl (int x,int y,unsigned short ang ,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan

	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);
	gDPSetCombineMode	(graphPtr++,G_CC_A4, G_CC_A4);
//DRAW
	kwtexblockdraw_a4 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture2D_a4_xlu_pt (int x,int y,unsigned short ang ,float scale,uint r,uint g,uint b,uint a,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);
	splashmode	(r,g,b,a);
	
//DRAW
	kwtexblockdraw_a4 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture2D_a4_xlu_bl (int x,int y,unsigned short ang ,float scale,uint r,uint g,uint b,uint a,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine2D (x,y,ang,scale);
//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);
	splashmode	(r,g,b,a);
	
//DRAW
	kwtexblockdraw_a4 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture3D_ia8_pt (FVector position,USVector angle,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{

//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);

//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture3D_ia8_bl (FVector position,USVector angle,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{

//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);

//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture3D_ia8_zb_pt (FVector position,USVector angle,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{

//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_pt_init);

//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

extern void kwtexture3D_ia8_zb_bl (FVector position,USVector angle,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{

//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);

//DRAW
	kwtexblockdraw_ia8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}


extern void kwtexture3D_16x16_ia8_pt (FVector position,USVector angle,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ia8_pt	(position,angle,scale,texaddr,vtxaddr,16,16,16,16);
}


extern void kwdraw_kage3D (BUMP *bump,FVector position,float scale)
{
	AffineMtx tmpmat;

	if (kwcalc_bump (bump,position)) {

		kagezahyou[kx] = position[COORD_X];
       		kagezahyou[ky] = 0.8+calc_hight(position[COORD_X],0.0,position[COORD_Z],bump->last_zx);
       		kagezahyou[kz] = position[COORD_Z];

		kwcreateaffine3D_hole (kagezahyou,bump->bump_zx,scale);

//	    	osSyncPrintf ("vx=%f \n",bump->bump_zx[kx]);
//    		osSyncPrintf ("vy=%f \n",bump->bump_zx[ky]);
//	    	osSyncPrintf ("vz=%f \n\n",bump->bump_zx[kz]);

	        //kwcreate_rotation_matrix (tmpmat,bump->bump_zx,kagezahyou,0x0000,scale);
       		//Affine2Mtx (&dynamicp->modeling[modelingnum],tmpmat);
	       	//gSPMatrix (graphPtr++, K0_TO_PHYS((u32) &(dynamicp->modeling[modelingnum++])),G_MTX_MODELVIEW|G_MTX_LOAD|G_MTX_NOPUSH);

		gSPDisplayList (graphPtr++, &kwdraw_kage2);
	}
}

extern void kwdraw_kage3D_fast	(int num,float scale)
{
	if ((kwanm_bitcheckflag(num,kf_kage)) and (kwanm_bitcheckflag(num,kf_onsurf))) {
		kagezahyou[COORD_X] = kwanm[num].p[kx]; 
       		kagezahyou[COORD_Y] = kwanm[num].ground+0.8;
       		kagezahyou[COORD_Z] = kwanm[num].p[kz];
	       		
       		kwcreateaffine3D(kagezahyou,kwanm[num].kageang,scale);
		gSPDisplayList	(graphPtr++, &kwdraw_kage);
	}
}

extern void kwdraw_kage3D_flat	(int num,float scale)
{
	if (kwanm_bitcheckflag(num,kf_kage)) {
		kagezahyou[COORD_X] = kwanm[num].p[kx]; 
       		kagezahyou[COORD_Y] = kwanm[num].ground+0.8;
		kagezahyou[COORD_Z] = kwanm[num].p[kz];
	       		
		kageangle[COORD_X]  = kwdeg90;
		kageangle[COORD_Y]  = 0;
		kageangle[COORD_Z]  = 0;

		kwcreateaffine3D(kagezahyou,kageangle,scale);
		gSPDisplayList	(graphPtr++, &kwdraw_kage);
	}
}

extern void kwdraw_kage3D_bump	(int num,float scale)
{
	AffineMtx tmpmat;
	if ((kwanm_bitcheckflag(num,kf_kage)) and (kwanm_bitcheckflag(num,kf_onsurf))) {
 		kagezahyou[COORD_X] = kwanm[num].p[kx];
       		kagezahyou[COORD_Y] = kwanm[num].ground+0.8;
       		kagezahyou[COORD_Z] = kwanm[num].p[kz];

		kwcreate_rotation_matrix (tmpmat,kwanm[num].e,kagezahyou,0x0000,scale);
       		Affine2Mtx (&dynamicp->modeling[modelingnum],tmpmat);
       		gSPMatrix (graphPtr++, K0_TO_PHYS((u32) &(dynamicp->modeling[modelingnum++])),G_MTX_MODELVIEW|G_MTX_LOAD|G_MTX_NOPUSH);
       		gSPDisplayList (graphPtr++, &kwdraw_kage2);

	}
}
extern void kwdraw_hole3D (float scale)
{
	kwcreateaffine3D_hole (kagezahyou,kagedirection,scale);
	gSPDisplayList	(graphPtr++, &kwdraw_hole);
}

extern void kwtexture3D_a8_zb_bl (FVector position,USVector angle,float scale,uchar *texaddr,Vtx *vtxaddr,int sizex,int sizey,int cutx,int cuty)
{
//Modeling Henkan
	kwcreateaffine3D (position,angle,scale);

//RDP&RCP MODE
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);

	sparkmode (spark_r,spark_g,spark_b);
//DRAW
	kwtexblockdraw_a8 (texaddr,vtxaddr,sizex,sizey,cutx,cuty);
}

/************************************************************************************************/
/*												*/
/*												*/
/*		  		Display Texture	List						*/
/*												*/
/*												*/
/************************************************************************************************/

/*==============================================================================*/
/*			Display Texture Tile  ( 8 x 160 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_8x160_ia8_pt (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt (x,y,ang,scale,texaddr,vtxaddr,8,160,8,160);
}
#endif
/*==============================================================================*/
/*			Display Texture Tile  ( 12 x 16 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_12x16_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_tile_pt(x,y,ang,scale,texaddr,vtxaddr,12,16,12,16);
}
#endif

/*==============================================================================*/
/*			Display Texture Tile  ( 12 x 160 ) 			*/
/*==============================================================================*/
#if 0

extern void kwtexture2D_12x160_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_tile_pt(x,y,ang,scale,texaddr,vtxaddr,12,160,12,160);
}

extern void kwtexture2D_12x160_ia16 (int x,int y,unsigned short ang,float scale,ushort *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia16_tile_pt(x,y,ang,scale,texaddr,vtxaddr,12,160,12,160);
}
#endif

/*==============================================================================*/
/*			Display Texture Tile  ( 12 x 192 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_12x192_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_tile_pt(x,y,ang,scale,texaddr,vtxaddr,12,192,12,192);
}
#endif

/*==============================================================================*/
/*			Display Texture Tile  ( 16 x 16 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_16x16_ia16 (int x,int y,unsigned short ang,float scale,ushort *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia16_pt(x,y,ang,scale,texaddr,vtxaddr,16,16,16,16);
}

extern void kwtexture2D_16x16_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt(x,y,ang,scale,texaddr,vtxaddr,16,16,16,16);
}

extern void kwtexture2D_16x16_ia4 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	

	kwtexture2D_ia4_pt(x,y,ang,scale,texaddr,vtxaddr,16,16,16,16);
}

/*==============================================================================*/
/*			Display Texture Tile  ( 16 x 160 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_16x160_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt	(x,y,ang,scale,texaddr,vtxaddr,16,160,16,160);
}
#endif

/*==============================================================================*/
/*			Display Texture Tile  ( 32 x 32 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_32x32_ia16 (int x,int y,unsigned short ang,float scale,ushort *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia16_pt(x,y,ang,scale,texaddr,vtxaddr,32,32,32,32);
}

extern void kwtexture2D_32x32_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt(x,y,ang,scale,texaddr,vtxaddr,32,32,32,32);
}

extern void kwtexture2D_32x32_ia4 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia4_pt(x,y,ang,scale,texaddr,vtxaddr,32,32,32,32);
}
extern void kwtexture3D_32x32_ia8 (FVector position,USVector angle,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture3D_ia8_pt	(position,angle,scale,texaddr,vtxaddr,32,32,32,32);
}

/*==============================================================================*/
/*			Display Texture Tile  ( 48 x 16 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_48x16_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt(x,y,ang,scale,texaddr,vtxaddr,48,16,48,16);
}
#endif
/*==============================================================================*/
/*			Display Texture Tile  ( 64 x 32 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_64x32_ia16 (int x,int y,unsigned short ang,float scale,ushort *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia16_pt	(x,y,ang,scale,texaddr,vtxaddr,64,32,64,32);
}
extern void kwtexture2D_64x32_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt	(x,y,ang,scale,texaddr,vtxaddr,64,32,64,32);
}

extern void kwtexture2D_64x32_ia8_bl (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_bl	(x,y,ang,scale,texaddr,vtxaddr,64,32,64,32);
}

extern void kwtexture2D_64x32_ia8_aa_pt (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_aa_pt	(x,y,ang,scale,texaddr,vtxaddr,64,32,64,32);
}
extern void kwtexture2D_64x32_ia8_aa_bl (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_aa_bl	(x,y,ang,scale,texaddr,vtxaddr,64,32,64,32);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 64 x 64 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_64x64_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt(x,y,ang,scale,texaddr,vtxaddr,64,64,64,64);
}

extern void kwtexture2D_64x64_ia16 (int x,int y,unsigned short ang,float scale,ushort *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia16_pt(x,y,ang,scale,texaddr,vtxaddr,64,64,64,32);
}

/*==============================================================================*/
/*			Display Texture Tile  ( 64 x 96 ) 			*/
/*==============================================================================*/
extern void kwtexture2D_64x96_ia8_pt (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt(x,y,ang,scale,texaddr,vtxaddr,64,96,64,48);
}
/*==============================================================================*/
/*			Display Texture Tile  ( 112 x 32 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_112x32_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt(x,y,ang,scale,texaddr,vtxaddr,112,32,112,32);
}
#endif
/*==============================================================================*/
/*			Display Texture Tile  ( 128 x 32 ) 			*/
/*==============================================================================*/
#if 0
extern void kwtexture2D_128x32_ia8 (int x,int y,unsigned short ang,float scale,uchar *texaddr,Vtx *vtxaddr)
{	
	kwtexture2D_ia8_pt(x,y,ang,scale,texaddr,vtxaddr,128,32,128,32);
}
#endif

/************************************************************************************************/
/*												*/
/*												*/
/*												*/
/*		  			2D Sprite						*/
/*												*/
/*												*/
/*												*/
/************************************************************************************************/

/************************************************************************************************/
/*									     			*/
/*												*/
/*				 								*/
/* 	 		      		Sprite Tool 			  			*/
/*												*/
/*									     			*/
/*												*/
/************************************************************************************************/

/********************************************************************************/
/*										*/
/*				Display Tool					*/
/*										*/
/********************************************************************************/
/*--------------------------------------------------------------*/
/*			han toumei mode	de Z buffer ga kiku	*/
/*--------------------------------------------------------------*/
extern void renderghost (void)
{
 	gDPSetRenderMode	(graphPtr++,G_RM_GOAST_SURF, G_RM_GOAST_SURF2);
// 	gDPSetRenderMode	(graphPtr++,G_RM_GOAST, G_RM_GOAST2);
}


/*--------------------------------------------------------------*/
/*			256 color mode Set			*/
/*--------------------------------------------------------------*/
static void initcolpal_ci8	(ushort *paladdr)
{
	gDPLoadTLUT_pal256	(graphPtr++ ,paladdr);
 	gDPLoadSync		(graphPtr++); //kanarazu irero !!
	gDPSetTexturePersp	(graphPtr++,G_TP_NONE);
}

/*--------------------------------------------------------------*/
/*			Primitive Color Set			*/
/*--------------------------------------------------------------*/
extern void kwsetprimcolor (uint r,uint g,uint b,uint a)
{
	gDPSetPrimColor   	(graphPtr++ ,0,0,r,g,b,a);
}

/*--------------------------------------------------------------*/
/*			Env Color Set				*/
/*--------------------------------------------------------------*/
extern void kwsetenvcolor (uint r,uint g,uint b,uint a)
{
	gDPSetEnvColor		(graphPtr++ ,r,g,b,a);
}

/*--------------------------------------------------------------*/
/*			Prim Env Color Set			*/
/*--------------------------------------------------------------*/
extern void kwset2color (uint prim_r,uint prim_g,uint prim_b,uint env_r,uint env_g,uint env_b,uint a)
{
//uchi , soto
	gDPSetPrimColor   	(graphPtr++ ,0,0,prim_r,prim_g,prim_b,a);
	gDPSetEnvColor		(graphPtr++ ,env_r,env_g,env_b,255);
}

/*--------------------------------------------------------------*/
/*			sub color mode				*/
/*--------------------------------------------------------------*/
extern void subcolormode (uint r,uint g,uint b)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_TOUMEI,G_CC_TOUMEI);
	gDPSetPrimColor   	(graphPtr++ ,0,0,r,g,b,255);
}
/*--------------------------------------------------------------*/
/*			han toumei mode				*/
/*--------------------------------------------------------------*/
extern void subalphamode (uint a) {
   	gDPSetCombineMode	(graphPtr++ ,G_CC_TOUMEI,G_CC_TOUMEI);
	gDPSetPrimColor   	(graphPtr++ ,0,0,255,255,255,a);
}

/*--------------------------------------------------------------*/
/*			han toumei mode	[Alpha nomi]		*/
/*--------------------------------------------------------------*/
extern void toumeiamode (uint a)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_TOUMEIA,G_CC_TOUMEIA);
	gDPSetPrimColor   	(graphPtr++ ,0,0,0,0,0,a);
}

/*--------------------------------------------------------------*/
/*			han toumei mode				*/
/*--------------------------------------------------------------*/
extern void toumeimode (uint r,uint g,uint b,uint a)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_TOUMEI,G_CC_TOUMEI);
	gDPSetPrimColor   	(graphPtr++ ,0,0,r,g,b,a);
}

/*--------------------------------------------------------------*/
/*			smoke mode				*/
/*--------------------------------------------------------------*/
extern void smokemode (uint a)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_SMOKE, G_CC_SMOKE);
	gDPSetPrimColor   	(graphPtr++ ,0,0,0,0,0,a);
}

/*--------------------------------------------------------------*/
/*			splash mode				*/
/*--------------------------------------------------------------*/
extern void splashmode (uint r,uint g,uint b,uint a)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_SPLASH, G_CC_SPLASH);
	gDPSetPrimColor   	(graphPtr++ ,0,0,r,g,b,a);
}

/*--------------------------------------------------------------*/
/*			splash mode				*/
/*--------------------------------------------------------------*/
extern void radarmode (uint r,uint g,uint b)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_RADAR, G_CC_RADAR);
	gDPSetPrimColor   	(graphPtr++ ,0,0,r,g,b,255);
}

/*--------------------------------------------------------------*/
/*			rank mode				*/
/*--------------------------------------------------------------*/
extern void rankmode (uint r,uint g,uint b,uint a)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_RANK, G_CC_RANK);
	gDPSetPrimColor   	(graphPtr++ ,0,0,r,g,b,a);
}

/*--------------------------------------------------------------*/
/*			water mode				*/
/*--------------------------------------------------------------*/
extern void watermode (uint a)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_WATER, G_CC_WATER);
	gDPSetPrimColor   	(graphPtr++ ,0,0,255,255,255,a);
}

/*--------------------------------------------------------------*/
/*			ice mode				*/
/*--------------------------------------------------------------*/
extern void coladdmode (uint prim_r,uint prim_g,uint prim_b,uint prim_a)
{
	gDPSetPrimColor   	(graphPtr++ ,0,0,prim_r,prim_g,prim_b,prim_a);
   	gDPSetCombineMode	(graphPtr++ ,G_CC_COLADD, G_CC_COLADD);
}


/*--------------------------------------------------------------*/
/*			ice mode				*/
/*--------------------------------------------------------------*/
extern void icemode (uint prim_r,uint prim_g,uint prim_b,uint env_r,uint env_g,uint env_b,uint a)
{
	uint	r2,g2,b2;

//	r2=100;
//	g2=100;
//	b2=100;


//	gDPSetEnvColor		(graphPtr++ ,(uint)testx,(uint)testy,(uint)testz,255);
//	gDPSetPrimColor   	(graphPtr++ ,0,0,(uint)testx,(uint)testy,(uint)testz,255);
//	gDPSetPrimColor   	(graphPtr++ ,0,0,r2,g2,b2,255);
//	gDPSetEnvColor		(graphPtr++ ,255,0,0,255);

	gDPSetPrimColor   	(graphPtr++ ,0,0,prim_r,prim_g,prim_b,a);
	gDPSetEnvColor		(graphPtr++ ,env_r,env_g,env_b,255);
   	gDPSetCombineMode	(graphPtr++ ,G_CC_ICE, G_CC_ICE);
}


/*--------------------------------------------------------------*/
/*			spark mode				*/
/*--------------------------------------------------------------*/
extern void sparkmode (uint r,uint g,uint b)
{
   	gDPSetCombineMode	(graphPtr++ ,G_CC_SPARK, G_CC_SPARK);
	gDPSetPrimColor   	(graphPtr++ ,0,0,r,g,b,255);
}

/*--------------------------------------------------------------*/
/*			2 color mode				*/
/*--------------------------------------------------------------*/
extern void color2mode (uint prim_r,uint prim_g,uint prim_b,uint env_r,uint env_g,uint env_b,uint a)
{
	gDPSetPrimColor   	(graphPtr++ ,0,0,prim_r,prim_g,prim_b,a);
	gDPSetEnvColor		(graphPtr++ ,env_r,env_g,env_b,255);
   	gDPSetCombineMode	(graphPtr++ ,G_CC_2COLOR, G_CC_2COLOR);
}

/********************************************************************************************************/
/*													*/
/*										       			*/
/*	    			    		Draw Tool 			    			*/
/*													*/
/*													*/
/********************************************************************************************************/

/*======================================================================*/
/*									*/
/*	  			Rectangle 				*/
/*	mode : copy / 1 cycle mode					*/
/*======================================================================*/
extern void kwrectangle	(int sx,int sy,int sizex,int sizey,int s ,int t,int mode){
//Draw
	if (mode equ copymode) {
		gSPTextureRectangle	(graphPtr++,sx<<2,sy<<2,(sx+sizex-1)<<2,(sy+sizey-1)<<2,0,s<<5,t<<5,4<<10,1<<10);
	}
	else {
		gSPTextureRectangle	(graphPtr++,sx<<2,sy<<2,(sx+sizex)<<2,(sy+sizey)<<2    ,0,s<<5,t<<5,1<<10,1<<10);
	}
}

/*======================================================================*/
/*	Sprite Draw Routine	       			       	        */
/*   		:clipping nashi	       			        	*/
/*     		:scale nashi	       				 	*/
/*		:input  (s,t) =(0,0)   					*/
/*		:output (s,t) =(0,0)   					*/
/*		:output length = static    				*/
/*======================================================================*/
static void spr_draw_noclip	(int sx,int sy,int sizex,int sizey,int mode)
{
	kwrectangle	(sx,sy,sizex,sizey,0,0,mode);
}

/*======================================================================*/
/*	Sprite Draw Routine	       			       	        */
/*   		:clipping ari	       			        	*/
/*     		:scale nashi	       				 	*/
/*		:input  (s,t) =(0,0) 					*/
/*		:output (s,t) =(?,?)   					*/
/*		:output length = ? 					*/
/*		:flip (nashi)						*/
/*======================================================================*/
static void spr_draw_clip	(int sx,int sy,int sizex,int sizey,int mode)
{
	int	s,t,clipx,clipy,cliplengthx,cliplengthy;

	if (sx >-sizex  && sy > -sizey) {

// texture image (s,t) zahyou initial
		s=t=0;
		clipx = sx;
       		clipy = sy;

//yoko clipping
		if (sx<0) {
			s = -sx;			
			clipx =0;
		}

//tate clipping
		if (sy<0) {
			t = -sy;			
			clipy =0;
		}

//after clipping length
       		cliplengthx =sizex-s;

       		cliplengthy =sizey-t;

//Draw
		kwrectangle	(clipx,clipy,cliplengthx,cliplengthy,s,t,mode);

	}
}


/*======================================================================*/
/*	Sprite Draw Routine	       			       	        */
/*   		:clipping ari	       			        	*/
/*     		:scale nashi	       				 	*/
/*		:input  (s,t) =(0,0) 					*/
/*		:output (s,t) =(?,?)   					*/
/*		:output length = ? 					*/
/*		:flip (xflip)						*/
/*======================================================================*/
static void spr_draw_clip_xflip	(int sx,int sy,int sizex,int sizey,int mode)
{
	int	s,t,clipx,clipy,cliplengthx,cliplengthy;

	if (sx >-sizex  && sy > -sizey) {

// texture image (s,t) zahyou initial
		s=t=0;
		clipx = sx;
       		clipy = sy;

//yoko clipping
		if (sx<0) {
			s = -sx;			
			clipx =0;
		}

//tate clipping
		if (sy<0) {
			t = -sy;			
			clipy =0;
		}

//after clipping length
       		cliplengthx =sizex-s;

       		cliplengthy =sizey-t;

//Draw
		kwrectangle	(clipx,clipy,cliplengthx,cliplengthy,(s+sizex),t,mode);

	}
}

/*======================================================================*/
/*	Sprite Draw Routine	       			       	        */
/*   		:clipping ari	       			        	*/
/*     		:scale nashi	       				 	*/
/*		:input  (s,t) =(?,?) 					*/
/*		:output (s,t) =(?,?)   					*/
/*		:output length = ? 					*/
/*======================================================================*/
static void spr_draw_clip_st	(int sx,int sy,int sizex,int sizey,int ss,int tt,int mode)
{
	int	s,t,clipx,clipy,cliplengthx,cliplengthy;

	if (sx >-sizex  && sy > -sizey) {

// texture image (s,t) zahyou initial
		clipx = sx;
       		clipy = sy;
		s =ss,t=tt;
		cliplengthx =sizex;
		cliplengthy =sizey;

//yoko clipping
		if (sx<0) {
			s -=sx;			
			clipx =0;
       			cliplengthx =sizex+sx;
		}

//tate clipping
		if (sy<0) {
			t -=sy;			
			clipy =0;
	       		cliplengthy =sizey+sy;
		}

//Draw
		kwrectangle	(clipx,clipy,cliplengthx,cliplengthy,s,t,mode);

	}
}


/*======================================================================*/
/*	Sprite Draw Routine	  					*/
/*   		:clipping nashi			       	        	*/
/*     		:scale ari			       		 	*/
/*		:input  (s,t) =(0,0)   					*/
/*		:output (s,t) =(0,0)   					*/
/*======================================================================*/
static void spr_draw_noclip_scale	(int cx,int cy,int sizex,int sizey,float scale)
{
	int	sx,sy,ex,ey,lengthx,lengthy;

// center tyuushin no scaling 
	lengthx = (int)(sizex*2*scale+0.5);
	lengthy = (int)(sizey*2*scale+0.5);

	sx = cx*4-lengthx;
	sy = cy*4-lengthy;
	ex = cx*4+lengthx; 
	ey = cy*4+lengthy; 

/*
// hidari ue sumi tyuushin no scaling 
	sx = (uint)  ((cx-sizex/2)*4);
	sy = (uint)  ((cy-sizey/2)*4);
	ex = sx+(uint)(sizex*4*scale+0.5);
	ey = sy+(uint)(sizey*4*scale+0.5);

*/
  	gSPTextureRectangle	(graphPtr++,sx,sy,ex,ey,0,0<<5,0<<5,(short int)(1024/scale+0.5),(short int)(1024/scale+0.5));


}

/*======================================================================*/
/*	Sprite Draw Routine	  			       	        */
/*   		:clipping ari				        	*/
/*     		:scale ari					 	*/
/*		:input  (s,t) =(0,0)   					*/
/*		:output (s,t) =(clip s,clip t)				*/
/*======================================================================*/
static void spr_draw_clip_scale	(int cx,int cy,int sizex,int sizey,float scale)
{
	int	s,t,sx,sy,ex,ey,lengthx,lengthy;
	short int sc;

//(s,t) scaling
	sc = (short int)(1024/scale+0.5);	//1024 = 2^10
	
//Length After Scaling
	lengthx =(int)(sizex*4*scale+0.5);
	lengthy =(int)(sizey*4*scale+0.5);

//Left Top Zahyou
	sx = cx*4-sizex*2;
	sy = cy*4-sizey*2;
	ex = sx+lengthx;
	ey = sy+lengthy;

//centering
	sx = cx*4-lengthx/2;
	sy = cy*4-lengthy/2;

	if (sx > -lengthx  && sy > -lengthy) {

// texture image (s,t) zahyou initial
		s=t=0;

//yoko clipping
		if (sx<0) {
			s = (short int)(-sx*8/scale);			
			lengthx +=sx;
			sx =0;
		}

//tate clipping
		if (sy<0) {
			t = (short int)(-sy*8/scale);			
			lengthy +=sy;
			sy =0;
		}

//after clipping length
       		ex =sx+lengthx;
       		ey =sy+lengthy;
//Draw
  	gSPTextureRectangle	(graphPtr++,sx,sy,ex,ey,0,s,t,sc,sc);
	}
}

/*
// center tyuushin no scaling 
	lengthx = (int)(sizex*4*scale+0.5);   // yoko no nagasa
	lengthy = (int)(sizey*4*scale+0.5);   // tate no nagasa

	sx = cx*4-lengthx/2;
	sy = cy*4-lengthy/2;

	if (sx > -lengthx  && sy > -lengthy) {

// texture image (s,t) zahyou initial
		s=t=0;

//yoko clipping
		if (sx<0) {
			s = (short int)(-sx*8/scale);			
			lengthx +=sx;
			sx =0;
		}

//tate clipping
		if (sy<0) {
			t = (short int)(-sy*8/scale);			
			lengthy +=sy;
			sy =0;
		}

//after clipping length
       		ex =sx+lengthx;
       		ey =sy+lengthy;
//Draw
  	gSPTextureRectangle	(graphPtr++,sx,sy,ex,ey,0,s,t,(short int)(4*1024/scale+0.5),(short int)(1024/scale+0.5));
	}
}
*/

/*
// center tyuushin no scaling 
	lengthx = (int)(sizex*scale+0.5);   // yoko no nagasa
	lengthy = (int)(sizey*scale+0.5);   // tate no nagasa

	sx = cx-lengthx/2;
	sy = cy-lengthy/2;

	if (sx > -lengthx  && sy > -lengthy) {

// texture image (s,t) zahyou initial
		s=t=0;

//yoko clipping
		if (sx<0) {
			s = (short int)(-sx/scale);			
			lengthx =lengthx+sx;
			sx =0;
		}

//tate clipping
		if (sy<0) {
			t = (short int)(-sy/scale);			
			lengthy =lengthy+sy;
			sy =0;
		}

//after clipping length
       		ex =sx+lengthx;
       		ey =sy+lengthy;


//	kwrmonPrintf("%d, %d, %d %d\n", sx, sy, ex, ey);
  //	kwrmonPrintf("%d, %d, %d %d\n", s, t, lengthx ,lengthy);
    //	kwrmonPrintf("%f\n", 1024/scale);

//Draw
  		gSPTextureRectangle	(graphPtr++,sx<<2,sy<<2,ex<<2,ey<<2,0,s<<5,t<<5,(short int)(1024/scale+0.5),(short int)(1024/scale+0.5));


  	}
}

*/

/*======================================================================*/
/*	Sprite Draw Routine	  					*/
/*======================================================================*/
#define	MY_MORPH	TEXEL1,TEXEL0,PRIMITIVE_ALPHA,TEXEL0,TEXEL1,TEXEL0,PRIMITIVE,TEXEL0

extern void kwsprite_rgba_morph (int sx,int sy,uint sizex,uint sizey,uint alpha,ushort *texaddr0,ushort *texaddr1)
{
	gSPDisplayList		(graphPtr++, &kwsprite_rgba_xlu_pt_init);

//Change 2 Cycle Mode
  	gSPDisplayList		(graphPtr++, &kwchange2cyclemode);

	gDPSetTextureLOD	(graphPtr++,G_TL_TILE);
	gDPSetPrimColor   	(graphPtr++,0,0,0,0,0,alpha);
   	gDPSetCombineMode	(graphPtr++,MY_MORPH,G_CC_PASS2);

	gDPLoadMultiTile	(graphPtr++,texaddr0,0,G_TX_RENDERTILE,G_IM_FMT_RGBA,G_IM_SIZ_16b,
				sizex,sizey,0,0,sizex-1,sizey-1,0,
				G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);

	gDPLoadMultiTile	(graphPtr++,texaddr1,256,G_TX_RENDERTILE+1,G_IM_FMT_RGBA,G_IM_SIZ_16b,
				sizex,sizey,0,0,sizex-1,sizey-1,0,
				G_TX_NOMIRROR| G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);

	spr_draw_noclip		(sx,sy,sizex,sizey,cycle2mode);

//Return 1 Cycle Mode
  	gSPDisplayList	(graphPtr++, &kwchange1cyclemode);
}

/************************************************************************************************/
/*									     			*/
/*									     			*/
/*							     			     	       	*/
/*		  			Draw Line						*/
/*								       			       	*/
/*									     			*/
/*									     			*/
/************************************************************************************************/
#if 1
extern void kwline_yoko (short tx,short ty,short length,ushort r,ushort g,ushort b,ushort a)
{	
	gDPSetPrimColor   	(graphPtr++,0,0,r,g,b,a);

	gDPSetTextureLUT	(graphPtr++,G_TT_NONE);
	gDPSetTexturePersp	(graphPtr++,G_TP_NONE);
	gDPSetCombineMode	(graphPtr++,G_CC_PRIMITIVE, G_CC_PRIMITIVE);
 	gDPSetRenderMode	(graphPtr++,G_RM_XLU_SURF, G_RM_XLU_SURF2);

 	spr_draw_clip		(tx,ty,length,1,cycle1mode);
}



extern void kwline_tate (short tx,short ty,short length,ushort r,ushort g,ushort b,ushort a)
{	
	gDPSetPrimColor   	(graphPtr++,0,0,r,g,b,a);

	gDPSetTextureLUT	(graphPtr++,G_TT_NONE);
	gDPSetTexturePersp	(graphPtr++,G_TP_NONE);
	gDPSetCombineMode	(graphPtr++,G_CC_PRIMITIVE, G_CC_PRIMITIVE);
 	gDPSetRenderMode	(graphPtr++,G_RM_XLU_SURF, G_RM_XLU_SURF2);
 	spr_draw_clip		(tx,ty,1,length,cycle1mode);
}

#endif

/************************************************************************************************/
/*									     			*/
/*									     			*/
/*							     			     	       	*/
/*		 	Display Sprite Sub Routine 	[ RGBA :Full Color]    		       	*/
/*								       			       	*/
/*									     			*/
/*									     			*/
/************************************************************************************************/
/*======================================================================================*/
/*	Sprite Display Sub Routine  [RGBA full color mode] 				*/
/*		:copy mode								*/
/* 		:cut nashi								*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:1 kai de texture LOAD dekiru						*/
/*======================================================================================*/

/*======================================================================================*/
/*	Sprite Display Sub Routine							*/
/*		:copy mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*======================================================================================*/
static void kwsprite_sub (int cx,int cy,ushort *addr,uint sizex,uint sizey,uint cuty,int mode)
{
	int	i,j;
	int	intx,sx,sy;
	ushort	*tmpaddr;

// test mode
	//kwtestrdpmode ();

	sx = intx = cx-sizex/2;
	sy =        cy-sizey/2;
	tmpaddr = addr;

	for	(i =0; i<sizey/cuty; i++) {

		kwloadtextureblock_rgba_16b	(tmpaddr,sizex,cuty);
	       	spr_draw_clip		(sx,sy,sizex,cuty,mode);

       	       	tmpaddr	+= (sizex*cuty);
		sx  = intx;
		sy += cuty; 
	}
}


/*======================================================================================*/
/*	Sprite Display Sub Routine							*/
/*		:1 cycle mode								*/
/* 		:cut ari  [yoko,tate]							*/
/*		:clipping ari								*/
/*		:scale ari								*/
/*======================================================================================*/
static void kwsprite_scale_sub (int cx,int cy,ushort *addr,uint sizex,uint sizey,uint cutx,uint cuty,float scale)
{
	int	i,j;
	int	intx,sx,sy,lengthx,lengthy;
	ushort	*tmpaddr;

	//kwtestrdpmode ();

//	lengthx =	(int)(cutx*scale);
  	lengthy =	(int)(cuty*scale);
    //	sx = intx =	cx-lengthx/2;
      //	sy =		cy-lengthy/2;

	tmpaddr =	addr;

	for	(i =0; i<sizey/cuty; i++) {
  //		for	(j=0; j<sizex/cutx; j++) {
		kwloadtextureblock_rgba_16b	(tmpaddr,cutx,cuty);
		//	spr_draw_clip		(sx,sy,lengthx,lengthy,cycle1mode);
		  	spr_draw_clip_scale	(cx,cy,sizex,sizey,scale);
       			//gSPTextureRectangle	(graphPtr++,tmpx<<2,tmpy<<2,(tmpx+cutx-1)<<2,(tmpy+cuty-1)<<2,0,0,0,4<<10,1<<10);

       			tmpaddr	+= (cutx*cuty);
//      			sx += lengthx;
    //   		 }
		sx  = intx;
      		sy += lengthy;
	}

}

/*======================================================================================*/
/*	Sprite Draw Sub Routine [RGBA Full Colour Mode]					*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster [yoko nomi]							*/
/*		:step [ Line Number for Texture Image]					*/
/*======================================================================================*/
static void kwsprite_draw_yra	(int cx,int cy,ushort *addr,int sizex,int sizey)
{
	float		scale;
	int		i,j,intsx,intex,sx,ex,sy;
	short		angle,angstep;
	unsigned short	*tmpaddr;


// wave parameter set
	wave_angle += wave_speed;
	angle	= wave_angle;
	angstep	= wave_anglestep;
	scale	= wave_scale;
	tmpaddr = addr;

// initial zahyou
	intsx	= cx-sizex/2;
	intex	= intsx+sizex;
	   sy	= cy-sizey/2;

//draw
	for	(i =0; i<sizey; i++) {

		sx = (int)(intsx+scale*sint(angle));
		ex = (int)(intex+scale*sint(angle));

		kwloadtextureblock_rgba_16b (tmpaddr,sizex,1);
       		spr_draw_clip		(sx,sy,sizex,1,cycle1mode);

		angle +=angstep;
       		tmpaddr	+= sizex;
		sy ++;
	}
}


/*======================================================================================*/
/*	Aurora Draw Sub Routine [RGBA Full Colour Mode]					*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster [yoko nomi]							*/
/*		:step [ Line Number for Texture Image]					*/
/*======================================================================================*/
#if 0
static void kwsprite_draw_ourora	(int cx,int cy,ushort *addr,int sizex,int sizey,int step)
{
	float		scale;
	int		i,j,intsx,intex,sx,ex,sy,loadlength;
	short		angle,angstep;
	unsigned short	*tmpaddr;


// wave parameter set
	wave_angle += wave_speed;
	angle	= wave_angle;
	angstep	= wave_anglestep;
	scale	= wave_scale;
	tmpaddr = addr;
	loadlength =1;

// initial zahyou
	intsx	= cx-sizex/2;
	intex	= intsx+sizex;
	   sy	= cy-sizey/2;

	for	(i =0; i<sizey/loadlength; i++) {

	//load texture
		kwloadtextureblock_rgba_16b (tmpaddr,sizex,loadlength);
	//draw
		sx = (int)(intsx+scale*sint(angle));
		ex = (int)(intex+scale*sint(angle));

		for	(j=0;j<loadlength;j++){
	       		spr_draw_clip		(sx,sy,sizex,step,cycle1mode);
			angle +=angstep;
       	       		tmpaddr	+= sizex;
	       		sy ++;
		}

	}
}
#endif

/*======================================================================================*/
/*	Sprite Display Sub Routine  [RGBA full color mode] 				*/
/*		:copy mode								*/
/* 		:cut nashi								*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:1 kai de texture LOAD dekiru						*/
/*======================================================================================*/
extern void kwsprite (int cx,int cy,uint sizex,uint sizey,ushort *addr)
{	
	int	sx,sy;
	sx = 	cx-sizex/2;
	sy =	cy-sizey/2;

//COPY MODE
	gSPDisplayList		(graphPtr++, &kwchangecopymode);
	gSPDisplayList		(graphPtr++, &kwsprite_rgba_pt_init);
 	gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);

	//kwtestrdpmode ();

	kwloadtextureblock_rgba_16b (addr,sizex,sizey);
  	spr_draw_clip		(sx,sy,sizex,sizey,copymode);
	gSPDisplayList		(graphPtr++, &kwsprite_finish);
}

/*======================================================================================*/
/*	Sprite Display Sub Routine  [RGBA full color mode] 				*/
/*		:1 cycle mode								*/
/* 		:cut nashi								*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:1 kai de texture LOAD dekiru						*/
/*======================================================================================*/
/// Keikoku !!!!!!!!!!!!!!!! (zetai Alpha comp wo xlu surf de tukuna !!!)

extern void kwsprite_flash (int cx,int cy,uint sizex,uint sizey,ushort *addr)
{	
	int	sx,sy;
	sx = 	cx-sizex/2;
	sy =	cy-sizey/2;

	gSPDisplayList		(graphPtr++, &kwsprite_rgba_xlu_pt_init);
	icemode (kwflash_r,kwflash_g,kwflash_b,128,128,128,255);
// 	gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);

	kwloadtextureblock_rgba_16b (addr,sizex,sizey);
  	spr_draw_clip		(sx,sy,sizex,sizey,cycle1mode);
	gSPDisplayList		(graphPtr++, &kwsprite_finish);
}


/*======================================================================================*/
/*	Sprite Display Sub Routine  [RGBA full color mode] 				*/
/*		:copy mode								*/
/* 		:cut nashi								*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:1 kai de texture LOAD dekiru [Tile Mode]				*/
/*======================================================================================*/
extern void kwsprite_t (int cx,int cy,uint sizex,uint sizey,ushort *addr)
{	
	int	sx,sy;
	sx = 	cx-sizex/2;
	sy =	cy-sizey/2;

//COPY MODE
	gSPDisplayList		(graphPtr++, &kwchangecopymode);
	gSPDisplayList		(graphPtr++, &kwsprite_rgba_pt_init);
 	gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);

	//kwtestrdpmode ();

	kwloadtexturetile_rgba_16b (addr,sizex,sizey);
 	spr_draw_clip		(sx,sy,sizex,sizey,copymode);
	gSPDisplayList		(graphPtr++, &kwsprite_finish);
}

/*======================================================================================*/
/*	Sprite Display Sub Routine  [32 bit RGBA full color mode]			*/
/*		:cycle 1 mode								*/
/* 		:cut nashi								*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:1 kai de texture LOAD dekiru						*/
/*======================================================================================*/
extern void kwsprite_32b (int cx,int cy,uint sizex,uint sizey,uchar *addr)
{	
	int	sx,sy;
	sx = 	cx-sizex/2;
	sy =	cy-sizey/2;

	gSPDisplayList		(graphPtr++, &kwsprite_rgba_pt_init);
 	gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);

	kwloadtextureblock_rgba_32b (addr,sizex,sizey);
	spr_draw_clip		(sx,sy,sizex,sizey,cycle1mode);

	gSPDisplayList		(graphPtr++, &kwsprite_finish);
}



/*======================================================================================*/
/*	Sprite Display Sub Routine							*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*======================================================================================*/
extern void kwsprite_tile_32b (short cx,short cy,uchar *addr,uint sizex,uint sizey)
{
	int	i,j,cnt,intx,sx,sy,tmp;
	uint	y,length,syou,amari,cuty,texsize;
	uchar	*tmpaddr;

	sx = intx = cx-sizex/2;
	sy =        cy-sizey/2;
	tmpaddr = addr;

	gSPDisplayList		(graphPtr++, &kwsprite_rgba_pt_init);
// 	gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);
//        gDPSetRenderMode	(graphPtr++,G_RM_OPA_SURF, G_RM_OPA_SURF2);
	gDPSetRenderMode(graphPtr++ ,G_RM_XLU_SURF, G_RM_XLU_SURF2);  //(AA_ZB)

	length =  sizex*sizey*4;
	syou  = length/4096;
	amari = length%4096;
	if (amari) syou++;

	cnt  = syou;
	cuty = sizey/syou;

	for	(i =0; i< cnt; i++) {
		kwloadtexturetile_rgba_32b (tmpaddr,sizex,cuty);
		spr_draw_noclip (sx,sy,sizex,cuty,cycle1mode);

		texsize = sizex*cuty*4;
       	       	tmpaddr	+= texsize;

		tmp = length-texsize;
		if (tmp lt 0)	cuty = length/sizex;
		else 		length -= texsize;

		sx  = intx;
		sy += cuty; 
	}

	gSPDisplayList		(graphPtr++, &kwsprite_finish);
}

extern void kwdisplay_titlelogo (short x,short y){
	kwsprite_tile_32b (x,y,logoptr,256,128);
}

/*======================================================================================*/
/*	Sprite Display Sub Routine  [RGBA full color mode] 				*/
/*		:copy mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:suukai ni wakete  texture LOAD						*/
/*======================================================================================*/
static void  kwsprite_div	(int cx,int cy,ushort *addr,uint sizex,uint sizey,uint cuty)
{
//COPY MODE
	gSPDisplayList	(graphPtr++, &kwchangecopymode);
	gSPDisplayList	(graphPtr++, &kwsprite_rgba_pt_init);
 	gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);

	//kwtestrdpmode ();

	kwsprite_sub	(cx,cy,addr,sizex,sizey,cuty,copymode);
	gSPDisplayList	(graphPtr++, &kwsprite_finish);
}


/*======================================================================================*/
/*	Sprite Display Sub Routine  [RGBA full color mode] 				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:suukai ni wakete  texture LOAD						*/
/*		:alpha no atai ni yori toumeido ga kimaru				*/
/*======================================================================================*/
extern void  kwsprite_xlu 	(int cx,int cy,uint alpha,ushort *addr,uint sizex,uint sizey,uint cutx,uint cuty)
{
	gSPDisplayList	(graphPtr++, &kwsprite_rgba_xlu_pt_init);
	subalphamode	(alpha);

	//kwtestrdpmode ();
	kwsprite_sub	(cx,cy,addr,sizex,sizey,cuty,cycle1mode);
}

/*======================================================================================*/
/*	Sprite Display Sub Routine [RGBA full color mode]  				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate]								*/
/*		:clipping ari								*/
/*		:scale ari								*/
/*======================================================================================*/
extern void kwsprite_scale (int cx,int cy,float scale, ushort *addr ,uint sizex,uint sizey )
{	
	gSPDisplayList			(graphPtr++, &kwsprite_rgba_aa_bl_init);

	//kwtestrdpmode ();

	kwloadtextureblock_rgba_16b	(addr,sizex,sizey);
  	spr_draw_clip_scale		(cx,cy,sizex,sizey,scale);
}

/*======================================================================================*/
/*	Sprite Display Sub Routine [RGBA full color mode]				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster mode ari  [yoko raster]						*/
/*		:hantoumei mode ari							*/
/*======================================================================================*/
#if 0
static void  kwsprite_yra (int cx,int cy,ushort *addr,int sizex,int sizey,int step)
{
	gSPDisplayList	(graphPtr++, &kwsprite_rgba_pt_init);
	subalphamode	(testalpha);

	//kwtestrdpmode ();
	kwsprite_draw_ourora (cx,cy,addr,sizex,sizey,step);
}
#endif
/*==============================================================================*/
/*			Display Sprite (8x8)					*/
/*==============================================================================*/
extern void kwsprite8x8	(int cx,int cy,ushort *addr){	
	kwsprite	(cx,cy,8,8,addr);
}

/*==============================================================================*/
/*			Display Sprite (8x16)					*/
/*==============================================================================*/
extern void kwsprite8x16 (int cx,int cy,ushort *addr){	
	kwsprite	(cx,cy,8,16,addr);
}

/*==============================================================================*/
/*			Display Sprite (12x160)					*/
/*==============================================================================*/
#if 0
extern void kwsprite12x160	(int cx,int cy,ushort *addr){	
	kwsprite	(cx,cy,12,160,addr);
}
#endif
/*==============================================================================*/
/*			Display Sprite (12x192)					*/
/*==============================================================================*/
#if 0
extern void kwsprite12x192	(int cx,int cy,ushort *addr){	
       	kwsprite_div	(cx,cy,addr,12,192,96);
}
#endif
/*==============================================================================*/
/*			Display Sprite (16x16)					*/
/*==============================================================================*/
extern void kwsprite16x16	(int cx,int cy,ushort *addr){	
	kwsprite	(cx,cy,16,16,addr);
}

/*==============================================================================*/
/*			Display Sprite (32x8)					*/
/*==============================================================================*/
extern void kwsprite32x8	(int cx,int cy,ushort *addr){	
	kwsprite	(cx,cy,32,8,addr);
}
/*==============================================================================*/
/*			Display Sprite (32x16)					*/
/*==============================================================================*/
extern void kwsprite32x16	(int cx,int cy,ushort *addr){	
	kwsprite	(cx,cy,32,16,addr);
}

extern void kwsprite32x16_sc	(int cx,int cy,float scale,ushort *addr)
{	
       	kwsprite_scale	(cx,cy,scale,addr,32,16);
}

/*==============================================================================*/
/*			Display Sprite (32x32)					*/
/*==============================================================================*/
extern void kwsprite32x32	(int cx,int cy,ushort *addr){	
	kwsprite	(cx,cy,32,32,addr);
}

extern void kwsprite32x32_32b	(int cx,int cy,uchar *addr){	
	kwsprite_32b	(cx,cy,32,32,addr);
}


/*==============================================================================*/
/*			Display Sprite (40x32)					*/
/*==============================================================================*/
extern void kwsprite40x32	(int cx,int cy,ushort *addr){	
	kwsprite	(cx,cy,40,32,addr);
}

/*==============================================================================*/
/*			Display Sprite (48x48)					*/
/*==============================================================================*/
extern void kwsprite48x48	(int cx,int cy,ushort *addr){	
       	kwsprite_div	(cx,cy,addr,48,48,24);
}

/*==============================================================================*/
/*			Display Sprite (64x32)					*/
/*==============================================================================*/
extern void kwsprite64x32	(int cx,int cy,ushort *addr){	
       	kwsprite	(cx,cy,64,32,addr);
}

extern void kwsprite64x32_sc	(int cx,int cy,float scale,ushort *addr){	
       	kwsprite_scale	(cx,cy,scale,addr,64,32);
}

/*==============================================================================*/
/*			Display Sprite (64x64)					*/
/*==============================================================================*/
extern void kwsprite64x64	(int cx,int cy,ushort *addr){	
       	kwsprite_div	(cx,cy,addr,64,64,32);
}

/*==============================================================================*/
/*			Display Sprite (128x32)					*/
/*==============================================================================*/
#if 0
extern void kwsprite128x32	(int cx,int cy,ushort *addr){	
       	kwsprite_div	(cx,cy,addr,128,32,16);
}
#endif
/*==============================================================================*/
/*			Display Sprite (128x128)				*/
/*==============================================================================*/
#if 0
extern void kwsprite128x128	(int cx,int cy,ushort *addr){	
       	kwsprite_div	(cx,cy,addr,128,128,16);
}

extern void kwsprite128x128_sc	(int cx,int cy,ushort *addr,float scale){	
	gSPDisplayList	(graphPtr++, &kwsprite_rgba_bl_init);
       	kwsprite_scale_sub	(cx,cy,addr,128,128,128,16,scale);
}
#endif
/*==============================================================================*/
/*			Display Sprite (192x192)				*/
/*==============================================================================*/
#if 0
extern void kwsprite192x192	(int cx,int cy,ushort *addr){	
       	kwsprite_div	(cx,cy,addr,192,192,8);
}
#endif
/*==============================================================================*/
/*			Display Sprite (320x128)				*/
/*==============================================================================*/
#if 0
extern void kwsprite320x128	(int cx,int cy,ushort *addr){	
       	kwsprite_div	(cx,cy,addr,320,128,4);
}

extern void kwsprite_aurora	(int cx,int cy,ushort *addr,int step){	
       	kwsprite_yra (cx,cy,addr,320,128,step);
}
#endif
/*==============================================================================*/
/*			Display Sprite (320x240)				*/
/*==============================================================================*/
#if 0
extern void kwsprite320x240	(int cx,int cy,ushort *addr){	
       	kwsprite_div	(cx,cy,addr,320,240,6);
}

extern void kwsprite320x240_xlu	(int cx,int cy,ushort *addr,uint alpha){	
       	kwsprite_xlu	(cx,cy,alpha,addr,320,240,320,6);
}

extern void kwsprite320x240_yra	(int cx,int cy,ushort *addr,int step){	
       	kwsprite_yra (cx,cy,addr,320,240,step);
}

#endif
/************************************************************************************************/
/*									     			*/
/*									     			*/
/*										      		*/
/*	  			Intensity Alpha	Mode  				       		*/
/*									     			*/
/*										       		*/
/*									     			*/
/************************************************************************************************/

/*======================================================================================*/
/*	Sprite Display Sub Routine [Intensity Alpha 16 bit mode]  			*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*======================================================================================*/
static void kwsprite_ia16 (int cx,int cy,ushort *texaddr,int sizex,int sizey,int cuty)
{
	int i,sx,sy;
	ushort	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);

 	for	(i =0; i<sizey/cuty; i++) {
		kwloadtextureblock_ia_16b (tmpaddr,sizex,cuty);
		spr_draw_clip		(sx,sy,sizex,cuty,cycle1mode);
       		tmpaddr	+= (sizex*cuty);
		sy +=cuty; 
	}
}


/*======================================================================================*/
/*	Sprite Common Routine [Intensity Alpha 8 bit mode]     				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:load texture block							*/
/*======================================================================================*/
static void kwsprite_ia8_common (int cx,int cy,uchar *texaddr,int sizex,int sizey,int cuty)
{
	int i,sx,sy;
	uchar	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;
	tmpaddr = texaddr;


 	for	(i =0; i<sizey/cuty; i++) {
		kwloadtextureblock_ia_8b (tmpaddr,sizex,cuty);
		spr_draw_clip		(sx,sy,sizex,cuty,cycle1mode);
       		tmpaddr	+= (sizex*cuty);
		sy +=cuty; 
	}
}
/*======================================================================================*/
/*	Sprite Display Sub Routine [Intensity Alpha 8 bit mode]  			*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:load texture block							*/
/*		:filter = point								*/
/*======================================================================================*/
extern void kwsprite_ia8_pt (int cx,int cy,uchar *texaddr,int sizex,int sizey,int cutx,int cuty)
{
	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
	//kwtestrdpmode ();

	kwsprite_ia8_common (cx,cy,texaddr,sizex,sizey,cuty);
}

/*======================================================================================*/
/*	Sprite Display Sub Routine [Intensity Alpha 8 bit mode]  			*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:load texture block							*/
/*		:filter = bilearp							*/
/*======================================================================================*/
extern void kwsprite_ia8_bl (int cx,int cy,uchar *texaddr,int sizex,int sizey,int cutx,int cuty)
{
	gSPDisplayList(graphPtr++, &kwsprite_ia_bl_init);
	//kwtestrdpmode ();

	kwsprite_ia8_common (cx,cy,texaddr,sizex,sizey,cuty);
}
/*======================================================================================*/
/*	Sprite Display Sub Routine [Intensity Alpha 8 bit mode]  			*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:load texture block							*/
/*		:filter = point								*/
/*		:color (R,G,B,A) setting possible					*/
/*======================================================================================*/
extern void kwsprite_ia8_xlu_pt (int cx,int cy,uchar *texaddr,uint r,uint g,uint b,uint a,int sizex,int sizey,int cutx,int cuty)
{
	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
	toumeimode (r,g,b,a);
	//kwtestrdpmode ();

	kwsprite_ia8_common (cx,cy,texaddr,sizex,sizey,cuty);
}
/*======================================================================================*/
/*	Sprite Display Sub Routine [Intensity Alpha 8 bit mode]  			*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:load texture tile							*/
/*======================================================================================*/
static void kwsprite_tile_ia8 (int cx,int cy,uchar *texaddr,int sizex,int sizey,int cuty)
{
	int i,sx,sy;
	uchar	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;
	tmpaddr = texaddr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);

 	for	(i =0; i<sizey/cuty; i++) {
		kwloadtexturetile_ia_8b (tmpaddr,sizex,cuty);
		spr_draw_clip		(sx,sy,sizex,cuty,cycle1mode);
       		tmpaddr	+= (sizex*cuty);
		sy +=cuty; 
	}
}

/*======================================================================================*/
/*	Sprite Display Sub Routine [Intensity Alpha 4 bit mode]  			*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*======================================================================================*/
static void kwsprite_ia4 (int cx,int cy,uchar *texaddr,int sizex,int sizey,int cuty)
{
	int i,sx,sy;
	uchar	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;
	tmpaddr = texaddr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
	//kwtestrdpmode ();

 	for	(i =0; i<sizey/cuty; i++) {

		kwloadtextureblock_ia_4b (tmpaddr,sizex,cuty);
		spr_draw_clip		(sx,sy,sizex,cuty,cycle1mode);
       		tmpaddr	+= (sizex*cuty);
		sy +=cuty; 
	}
}
	#if 0
	gDPLoadSync(graphPtr++);
	gDPSetTextureImage(graphPtr++,G_IM_FMT_IA,G_IM_SIZ_4b,sizex,tmpaddr);
	gDPSetTile(graphPtr++,G_IM_FMT_IA,G_IM_SIZ_4b,(((sizex*G_IM_SIZ_4b_TILE_BYTES)+7)>>3),0,G_TX_LOADTILE,0,G_TX_CLAMP,G_TX_NOMASK,G_TX_NOLOD,G_TX_CLAMP,G_TX_NOMASK,G_TX_NOLOD);
	gDPSetTile(graphPtr++,G_IM_FMT_IA,G_IM_SIZ_4b,(((sizex*G_IM_SIZ_4b_LINE_BYTES)+7)>>3),0,G_TX_RENDERTILE,0,G_TX_CLAMP,G_TX_NOMASK,G_TX_NOLOD,G_TX_CLAMP,G_TX_NOMASK,G_TX_NOLOD);
	gDPLoadTile(graphPtr++,G_TX_LOADTILE,0,0<<G_TEXTURE_IMAGE_FRAC,(sizex-1)<<G_TEXTURE_IMAGE_FRAC,(cuty-1)<<G_TEXTURE_IMAGE_FRAC);
	gDPSetTileSize(graphPtr++,G_TX_RENDERTILE,0,0<<G_TEXTURE_IMAGE_FRAC,(sizex-1)<<G_TEXTURE_IMAGE_FRAC,(cuty-1)<<G_TEXTURE_IMAGE_FRAC);
	#endif

/*======================================================================================*/
/*	Sprite Display Sub Routine [Intensity Alpha 4 bit mode]  			*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:load texture block							*/
/*		:filter = point								*/
/*		:color (R,G,B,A) setting possible					*/
/*======================================================================================*/
extern void kwsprite_ia4_xlu_pt (int cx,int cy,uchar *texaddr,uint r,uint g,uint b,uint a,int sizex,int sizey,int cutx,int cuty)
{
	int i,sx,sy;
	uchar	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;
	tmpaddr = texaddr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
	toumeimode (r,g,b,a);

 	for	(i =0; i<sizey/cuty; i++) {
		kwloadtextureblock_ia_4b (tmpaddr,sizex,cuty);
		spr_draw_clip		(sx,sy,sizex,cuty,cycle1mode);
       		tmpaddr	+= (sizex*cuty/2);
		sy +=cuty; 
	}
}

/*======================================================================================*/
/*	Sprite Display Sub Routine [Alpha 4 bit mode]  					*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:load texture block							*/
/*		:filter = point								*/
/*		:color (R,G,B,A) setting possible					*/
/*		:flip : nashi								*/
/*======================================================================================*/
extern void kwsprite_a4_xlu_pt (int cx,int cy,uchar *texaddr,uint r,uint g,uint b,uint a,int sizex,int sizey,int cutx,int cuty)
{
	int i,sx,sy;
	uchar	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;
	tmpaddr = texaddr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
	splashmode (r,g,b,a);
	//kwtestrdpmode ();

 	for	(i =0; i<sizey/cuty; i++) {
		kwloadtextureblock_a_4b (tmpaddr,sizex,cuty);
		spr_draw_clip		(sx,sy,sizex,cuty,cycle1mode);
       		tmpaddr	+= (sizex*cuty/2);
		sy +=cuty; 
	}
}


/*======================================================================================*/
/*	Sprite Display Sub Routine [Alpha 4 bit mode]  					*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:load texture block							*/
/*		:filter = point								*/
/*		:color (R,G,B,A) setting possible					*/
/*		:flip :x flip								*/
/*======================================================================================*/
extern void kwsprite_a4_xlu_pt_xflip (int cx,int cy,uchar *texaddr,uint r,uint g,uint b,uint a,int sizex,int sizey,int cutx,int cuty)
{
	int i,sx,sy;
	uchar	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;
	tmpaddr = texaddr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
	splashmode (r,g,b,a);

 	for	(i =0; i<sizey/cuty; i++) {
		kwloadtextureblock_a_4b_xflip (tmpaddr,sizex,cuty);
		spr_draw_clip_xflip	(sx,sy,sizex,cuty,cycle1mode);
       		tmpaddr	+= (sizex*cuty/2);
		sy +=cuty; 
	}
}


/*======================================================================================*/
/*	Sprite Display Sub Routine [Alpha 4 bit mode]  					*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale ari								*/
/*		:load texture block							*/
/*		:filter = bl								*/
/*		:color (R,G,B) setting possible	:Alpha ha dekinai!!!!			*/
/*======================================================================================*/
extern void kwsprite_scale_a4_xlu_bl (int cx,int cy,uchar *texaddr,float scale,uint r,uint g,uint b,uint a,int sizex,int sizey,int cutx,int cuty)
{
	int i,sx,sy;
	uchar	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;
	tmpaddr = texaddr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_bl_init);
	radarmode (r,g,b);

 	for	(i =0; i<sizey/cuty; i++) {
		kwloadtextureblock_a_4b (tmpaddr,sizex,cuty);
	  	spr_draw_clip_scale	(cx,cy,sizex,sizey,scale);
       		tmpaddr	+= (sizex*cuty/2);
		sy +=cuty; 
	}
}

/*======================================================================================*/
/*	Sprite Draw Sub Routine [Intensity Alpha 16 bit Mode]  				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster [yoko nomi]							*/
/*		:step [ Line Number for Texture Image]					*/
/*======================================================================================*/
static void kwsprite_draw_yra_ia16	(int cx,int cy,ushort *addr,int sizex,int sizey)
{
	float		scale;
	int		i,j,intsx,intex,sx,ex,sy;
	short		angle,angstep;
	unsigned short	*tmpaddr;

// wave parameter set
	wave_angle += wave_speed;
	angle	= wave_angle;
	angstep	= wave_anglestep;
	scale	= wave_scale;
	tmpaddr = addr;

// initial zahyou
	intsx	= cx-sizex/2;
	intex	= intsx+sizex;
	   sy	= cy-sizey/2;

//Initial Intensity Mode
	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);

	//kwtestrdpmode ();
//draw
	for	(i =0; i<sizey; i++) {

		sx = (int)(intsx+scale*sint(angle));
		ex = (int)(intex+scale*sint(angle));

		kwloadtextureblock_ia_16b (tmpaddr,sizex,1);
       		spr_draw_clip	(sx,sy,sizex,1,cycle1mode);
		angle +=angstep;
       		tmpaddr	+= sizex;
		sy ++;
	}
}

/*======================================================================================*/
/*	Sprite Draw Sub Routine [Intensity Alpha 8 bit Mode]  				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster [yoko nomi]							*/
/*		:step [ Line Number for Texture Image]					*/
/*======================================================================================*/
static void kwsprite_draw_yra_ia8	(int cx,int cy,uchar *addr,int sizex,int sizey)
{
	float		scale;
	int		i,j,intsx,intex,sx,ex,sy;
	short		angle,angstep;
	unsigned char	*tmpaddr;

// wave parameter set
	wave_angle += wave_speed;
	angle	= wave_angle;
	angstep	= wave_anglestep;
	scale	= wave_scale;
	tmpaddr = addr;

// initial zahyou
	intsx	= cx-sizex/2;
	intex	= intsx+sizex;
	   sy	= cy-sizey/2;

//Initial Intensity Mode
	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
	//kwtestrdpmode ();

//draw
	for	(i =0; i<sizey; i++) {

		sx = (int)(intsx+scale*sint(angle));
		ex = (int)(intex+scale*sint(angle));

		kwloadtextureblock_ia_8b (tmpaddr,sizex,1);
       		spr_draw_clip	(sx,sy,sizex,1,cycle1mode);
		angle +=angstep;
       		tmpaddr	+= sizex;
		sy ++;
	}
}


/*======================================================================================*/
/*	Sprite Draw Sub Routine [Intensity Alpha 4 bit Mode]  				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster [yoko nomi]							*/
/*		:step [ Line Number for Texture Image]					*/
/*======================================================================================*/
static void kwsprite_draw_yra_ia4	(int cx,int cy,uchar *addr,int sizex,int sizey)
{
	float		scale;
	int		i,j,intsx,intex,sx,ex,sy;
	short		angle,angstep;
	unsigned char	*tmpaddr;

// wave parameter set
	wave_angle += wave_speed;
	angle	= wave_angle;
	angstep	= wave_anglestep;
	scale	= wave_scale;
	tmpaddr = addr;

// initial zahyou
	intsx	= cx-sizex/2;
	intex	= intsx+sizex;
	   sy	= cy-sizey/2;

//Initial Intensity Mode
	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
	//kwtestrdpmode ();

//draw
	for	(i =0; i<sizey; i++) {

		sx = (int)(intsx+scale*sint(angle));
		ex = (int)(intex+scale*sint(angle));

		kwloadtextureblock_ia_4b (tmpaddr,sizex,1);
       		spr_draw_clip	(sx,sy,sizex,1,cycle1mode);
		angle +=angstep;
       		tmpaddr	+= sizex;
		sy ++;
	}
}
/*======================================================================================*/
/*											*/
/*				Display Function [Intensity Alpha]			*/
/*											*/
/*======================================================================================*/

extern void kwsprite8x160_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia8_pt	(cx,cy,texaddr,8,160,8,160);
}

extern void kwsprite12x160_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia8_pt	(cx,cy,texaddr,12,160,12,160);
}

extern void kwsprite12x192_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia8_pt	(cx,cy,texaddr,12,192,12,192);

 }

extern void kwsprite16x16_ia (int cx,int cy,ushort *texaddr)
{	
	kwsprite_ia16	(cx,cy,texaddr,16,16,16);

 }

extern void kwsprite16x160_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia8_pt	(cx,cy,texaddr,16,160,16,160);

 }

extern void kwsprite32x32_ia (int cx,int cy,ushort *texaddr)
{	
	kwsprite_ia16	(cx,cy,texaddr,32,32,32);

 }

extern void kwsprite32x32_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia8_pt	(cx,cy,texaddr,32,32,32,32);

 }

extern void kwsprite32x32_ia4 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia4	(cx,cy,texaddr,32,32,32);

 }

extern void kwsprite32x32_yra_ia16 (int cx,int cy,ushort *texaddr)
{	
	kwsprite_draw_yra_ia16	(cx,cy,texaddr,32,32);
}

extern void kwsprite32x32_yra_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_draw_yra_ia8	(cx,cy,texaddr,32,32);
}

extern void kwsprite32x32_yra_ia4 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_draw_yra_ia4	(cx,cy,texaddr,32,32);
}

extern void kwsprite64x32_ia (int cx,int cy,ushort *texaddr)
{	
	kwsprite_ia16	(cx,cy,texaddr,64,32,32);

 }

extern void kwsprite64x64_ia (int cx,int cy,ushort *texaddr)
{	
	kwsprite_ia16	(cx,cy,texaddr,64,64,32);

 }
extern void kwsprite64x96_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia8_pt	(cx,cy,texaddr,64,96,64,48);
}

extern void kwsprite112x32_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia8_pt	(cx,cy,texaddr,112,32,112,32);

}

extern void kwsprite128x32_ia8 (int cx,int cy,uchar *texaddr)
{	
	kwsprite_ia8_pt	(cx,cy,texaddr,128,32,128,32);

 }

/************************************************************************************************/
/*			     									*/
/*			     									*/
/* 				Colour Index (8bit)Mode  (Sprite) 				*/
/*												*/
/*			     									*/
/************************************************************************************************/

/*======================================================================================*/
/*	Sprite Draw Sub Routine [colour index 8bit mode]				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*======================================================================================*/
static void spr_draw_ci8	(int cx,int cy,uchar *idxaddr,int sizex,int sizey,int cuty)
{
	int	i,sx,sy;
	uchar	*tmpaddr;

	sx = cx-sizex/2;
	sy = cy-sizey/2;
	tmpaddr = idxaddr;


	for	(i =0; i<(sizey)/(cuty); i++) {

		kwloadtextureblock_ci_8b (tmpaddr,sizex,cuty);
		spr_draw_clip		(sx,sy,sizex,cuty,cycle1mode);
		// gSPTextureRectangle	(graphPtr++,(tmpx-sizex/2)<<2,(tmpy-sizey/2)<<2,(tmpx-sizex/2+cutx)<<2,(tmpy-sizey/2+cuty)<<2,0,0,0,1<<10,1<<10);
       		tmpaddr	+= (sizex*cuty);
		sy += cuty; 
	}
}


/*======================================================================================*/
/*	Sprite Draw Sub Routine [colour index 8bit mode]				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster [yoko nomi]							*/
/*======================================================================================*/
static void spr_draw_ci8_yra	(int cx,int cy,uchar *addr,int sizex,int sizey)
{
	float		scale;
	int		i,j,intsx,intex,sx,ex,sy;
	short		angle,angstep;
	unsigned char	*tmpaddr;

// wave parameter set
	wave_angle += wave_speed;
	angle	= wave_angle;
	angstep	= wave_anglestep;
	scale	= wave_scale;
	tmpaddr = addr;

// initial zahyou
	intsx	= cx-sizex/2;
	intex	= intsx+sizex-1;
	   sy	= cy-sizey/2;

//draw
	for	(i =0; i<sizey; i++) {

		sx = (uint)(intsx+scale*sint(angle));
		ex = (uint)(intex+scale*sint(angle));

		kwloadtextureblock_ci_8b (tmpaddr,sizex,1);
       		spr_draw_clip		(sx,sy,sizex,1,cycle1mode);
//			gSPTextureRectangle	(graphPtr++,sx<<2,sy<<2,ex<<2,(sy+1)<<2,0,0,0,1<<10,1<<10);

		angle +=angstep;
       		tmpaddr	+= sizex;
		sy ++;
	}
}

/*======================================================================================*/
/*	Sprite Draw Sub Routine [colour index 8bit mode]				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster [tate nomi]							*/
/*======================================================================================*/
static void spr_draw_ci8_tra	(int cx,int cy,uchar *addr,int sizex,int sizey)
{
	float		scale;
	int 		i,j,intsy,intey,sx,sy,ey;
	short		angle,angstep;
	unsigned char	*tmpaddr;

// wave parameter set
	wave_angle += wave_speed;
	angle	= wave_angle;
	angstep	= wave_anglestep;
	scale	= wave_scale;
	tmpaddr = addr;

// initial zahyou
	intsy	= cy-sizey/2;
	intey	= intsy+sizey-1;
	   sx	= cx-sizex/2;

//draw
	for	(i =0; i<sizex; i++) {

		sy = (uint)(intsy+scale*sint(angle));
		ey = (uint)(intey+scale*sint(angle));

			kwloadtextureblock_ci_8b (tmpaddr,1,sizey);
			gSPTextureRectangle	(graphPtr++,sx<<2,sy<<2,(sx+1)<<2,ey<<2,0,0,0,1<<10,1<<10);

		angle +=angstep;
       		tmpaddr	+= sizey;
		sx ++;
	}
}


/*======================================================================================*/
/*	Sprite Display Sub Routine [colour index 8bit mode]				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:hantoumei mode nashi							*/
/*======================================================================================*/
static void spr_draw_sub_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr,int sizex,int sizey,int cuty)
{
	gSPDisplayList(graphPtr++, &kwtexture_ci8_pt_init);
	initcolpal_ci8 (paladdr);
	//kwtestrdpmode ();
	spr_draw_ci8 (cx,cy,idxaddr,sizex,sizey,cuty);
}

/*======================================================================================*/
/*	Sprite Display Sub Routine [colour index 8bit mode]				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:hantoumei mode ari							*/
/*======================================================================================*/
static void spr_draw_sub_ci8_xlu (int cx,int cy,uint alpha,ushort *paladdr,uchar *idxaddr,int sizex,int sizey,int cuty)
{
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
	subalphamode	(alpha);
	initcolpal_ci8 (paladdr);
	//kwtestrdpmode ();
	spr_draw_ci8 (cx,cy,idxaddr,sizex,sizey,cuty);
}

/*======================================================================================*/
/*	Sprite Display Sub Routine [colour index 8bit mode]				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster mode ari  [yoko raster]						*/
/*		:hantoumei mode ari							*/
/*======================================================================================*/
static void  spr_draw_sub_ci8_yra (int cx,int cy,ushort *paladdr,uchar *idxaddr,int sizex,int sizey)
{
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
	subalphamode	(testalpha);
	initcolpal_ci8 (paladdr);
	//kwtestrdpmode ();
	spr_draw_ci8_yra (cx,cy,idxaddr,sizex,sizey);
}


/*======================================================================================*/
/*	Sprite Display Sub Routine [colour index 8bit mode]				*/
/*		:1 cycle mode								*/
/* 		:cut ari [tate cut nomi]						*/
/*		:clipping ari								*/
/*		:scale nashi								*/
/*		:raster mode ari  [tate raster]						*/
/*		:hantoumei mode ari							*/
/*======================================================================================*/
static void  spr_draw_sub_ci8_tra (int cx,int cy,ushort *paladdr,uchar *idxaddr,int sizex,int sizey)
{
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
	subalphamode	(testalpha);
	initcolpal_ci8 (paladdr);
	//kwtestrdpmode ();
	spr_draw_ci8_tra (cx,cy,idxaddr,sizex,sizey);
}

/*==============================================================================*/
/*								      		*/
/*		       	  Colour Inde 8bit Draw Routine				*/
/*										*/
/*==============================================================================*/
extern void kwsprite_ci8_pt (int cx,int cy,ushort *paladdr,uchar *idxaddr,int sizex,int sizey,int cutx,int cuty)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,sizex,sizey,cuty);
}

extern void kwsprite_ci8_xlu_pt (int cx,int cy,uint alpha,ushort *paladdr,uchar *idxaddr,int sizex,int sizey,int cutx,int cuty)
{	
	spr_draw_sub_ci8_xlu (cx,cy,alpha,paladdr,idxaddr,sizex,sizey,cuty);
}

extern void kwsprite8x128_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,8,128,128);

 }
extern void kwsprite32x32_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,32,32,32);
 }

extern void kwsprite32x64_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,32,64,64);
 }

extern void kwsprite40x32_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,40,32,32);
 }

extern void kwsprite48x48_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,48,48,24);
 }

extern void kwsprite64x32_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,64,32,32);
 }

extern void kwsprite64x64_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,64,64,32);
 }

extern void kwsprite64x64_ci8_xlu (int cx,int cy,uint alpha,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8_xlu (cx,cy,alpha,paladdr,idxaddr,64,64,32);
 }

extern void kwsprite64x64_ci8_ra (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8_yra(cx,cy,paladdr,idxaddr,64,64);
 }


extern void kwsprite320x240_ci8 (int cx,int cy,ushort *paladdr,uchar *idxaddr)
{	
	spr_draw_sub_ci8(cx,cy,paladdr,idxaddr,320,240,6);
 }


/*
	char i,j,n=0;
	uchar	*tmpaddr;
	int tmpx,tmpy;

	gSPDisplayList(graphPtr++, &kwtextureci8_init);


	gDPSetAlphaCompare	(graphPtr++ ,G_AC_NONE);
   	gDPSetCombineMode	(graphPtr++ ,G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
	gDPSetPrimColor   	(graphPtr++ ,0,0,kwr,kwg,kwb,kwa);
	gDPSetRenderMode	(graphPtr++ ,G_RM_XLU_SURF, G_RM_XLU_SURF2);	 //AA_ZB wo ireruto bokeru!!

	gDPLoadTLUT_pal256(graphPtr++ ,paladdr);
 	gDPLoadSync(graphPtr++); //kanarazu irero !!
	gDPSetTexturePersp	(graphPtr++,G_TP_NONE);

	tmpaddr = idxaddr;
	tmpx = *x,tmpy = *y;

	for	(i =0; i<sizey/cuty; i++) {
		for	(j=0; j<sizex/cutx; j++) {

			gDPLoadTextureBlock (graphPtr++ ,tmpaddr, G_IM_FMT_CI, G_IM_SIZ_8b, cutx, cuty, 0,
					G_TX_NOMIRROR, G_TX_NOMIRROR,
     	       				G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);

  			gSPTextureRectangle	(graphPtr++,(tmpx-sizex/2)<<2,(tmpy-sizey/2)<<2,(tmpx-sizex/2+cutx)<<2,(tmpy-sizey/2+cuty)<<2,0,0,0,1<<10,1<<10);

       			tmpaddr	+= (cutx*cuty);
			tmpx +=cutx; 
       		 }
		tmpx = *x;
		tmpy +=cuty; 
	}

    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}
*/


/************************************************************************************************/
/*												*/
/*  					Display Item Box					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_itembox (int player) {
	int num;
	num = itemboxallocptr[player];
	if (kwanm[num].anmptr gt 1) {
		kwsprite40x32_ci8   (kwlap[player].ix+kwlap[player].addix,kwlap[player].iy+kwlap[player].addiy,kwanm[num].texaddr,kwanm[num].indexaddr);
	}
}

extern void kwdisplay_itemboxs (int player) {
	int num;
	num = itemboxallocptr[player];
	if (kwanm[num].anmptr gt 1) {
	  	kwtexture2D_ci8_bl (kwlap[player].ix+kwlap[player].addix,kwlap[player].iy+kwlap[player].addiy,0,kwlap[player].is,kwanm[num].texaddr,kwanm[num].indexaddr,vtx_ktile40x32,40,32,40,32);
	}
}

/************************************************************************************************/
/*												*/
/*					Display Syuukai count 	[LAP]				*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_syuukai (int player) {
       	kwsprite32x8  (kwlap[player].cx,kwlap[player].cy+3,lap88moji);
	kwsprite32x16  (kwlap[player].cx+28,kwlap[player].cy,lap_list[kwlap[player].lapcnt]);
}

/************************************************************************************************/
/*												*/
/*			      		Display Rank	[Jyunni]				*/
/*												*/
/************************************************************************************************/
//large
extern void kwdisplay_rank (int player) {
	if (kwlap[player].ranksw){
		if (kwlap[player].goal nequ 3) {
			kwtexture2D_a4_xlu_bl (kwlap[player].rx+kwlap[player].rgx,kwlap[player].ry+kwlap[player].rgy,0,kwlap[player].rs,255,rank_color[kwrank[player]],0,255,brank+128*32*(kwrank[player]),vtx_ktile128x64_ia,128,64,128,64);
		}
		else {
			kwtexture2D_a4_xlu_bl (kwlap[player].rx+kwlap[player].rgx,kwlap[player].ry+kwlap[player].rgy,0,kwlap[player].rs,255,rank_color[kw8gftimer],0,255,brank+128*32*(ogawa_rank[player]),vtx_ktile128x64_ia,128,64,128,64);
		}
	}
}

//small
extern void kwdisplay_srank (int player) {
	if (kwlap[player].ranksw){
		if (kwlap[player].goal nequ 3) {
			kwtexture2D_a4_xlu_bl (kwlap[player].rx+kwlap[player].rgx,kwlap[player].ry+kwlap[player].rgy,0,kwlap[player].rs,255,ranks_color[ogawa_rank[player]],0,255,srank+64*32*(ogawa_rank[player]),vtx_ktile64x64_ia,64,64,64,64);
		}
		else {
			kwtexture2D_a4_xlu_bl (kwlap[player].rx+kwlap[player].rgx,kwlap[player].ry+kwlap[player].rgy,0,kwlap[player].rs,255,ranks_color[kw4gftimer],0,255,srank+64*32*(ogawa_rank[player]),vtx_ktile64x64_ia,64,64,64,64);
		}
	}
}

/************************************************************************************************/
/*												*/
/*			      		Display [1p][2p][3p][4p]no kakunin			*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_order (int player) {
	#if 0
	if (demo_flag equ 0) {
		kwsprite64x32_ci8 (kwlap[player].px,kwlap[player].py,orderpal,orderidx+player*64*32);
	}
	#endif
}

/************************************************************************************************/
/*												*/
/* 					Display Zanzou						*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_zanzou (int player) {

//Time
	if (kwlap[player].tptr2) {
		kwsprite_xlu (kwlap[player].tx[1]-19,kwlap[player].ty+8,128,time,32,16,32,16);
  		kwprintlaptime_xlu  (kwlap[player].tx[1],kwlap[player].ty,128,kwlap[player].totaltime);
	}
	if (kwlap[player].tptr3) {
		 kwsprite_xlu (kwlap[player].tx[2]-19,kwlap[player].ty+8,80,time,32,16,32,16);
		 kwprintlaptime_xlu (kwlap[player].tx[2],kwlap[player].ty,80,kwlap[player].totaltime);
	}

//Lap Count
  	if (kwlap[player].cptr2) {
		kwsprite_xlu  (kwlap[player].cx2,kwlap[player].cy+3,128,lap88moji,32,8,32,8);
		kwsprite_xlu  (kwlap[player].cx2+28,kwlap[player].cy,128,lap_list[kwlap[player].lapcnt],32,16,32,16);
	}
    	if (kwlap[player].cptr3) {
		kwsprite_xlu  (kwlap[player].cx3,kwlap[player].cy+3,80,lap88moji,32,8,32,8);
		kwsprite_xlu  (kwlap[player].cx3+28,kwlap[player].cy,80,lap_list[kwlap[player].lapcnt],32,16,32,16);
	}
}

/************************************************************************************************/
/*												*/
/* 					Display Speed Meter					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_speedmeter (int player) {
	//meter
//	kwtexture2D_a4_pt 	(kwlap[player].mx,kwlap[player].my,0,1.0,spmeter,vtx_ktile64x96_ia8_pt,64,96,64,48);
	kwtexture2D_a4_xlu_pt 	(kwlap[player].mx,kwlap[player].my,0,1.0,rcolor_r,rcolor_g,rcolor_b,255,spmeter,vtx_ktile64x96_ia8_pt,64,96,64,48);

	//hari
	kwtexture2D_a4_bl	(harix,hariy,hariangz,1.0,hari,vtx_haritile64x32_ia,64,32,64,32);
}

/************************************************************************************************/
/*												*/
/* 					Display Radar Map					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_radarmap (int screen) {
	if (screen_flip) {
		kwsprite_a4_xlu_pt_xflip (radarx[screen]+rmodex,radary[screen]+rmodey,radarptr,rcolor_r,rcolor_g,rcolor_b,255,radarsizex,radarsizey,radarsizex,radarsizey);
	}
	else{
		kwsprite_a4_xlu_pt	(radarx[screen]+rmodex,radary[screen]+rmodey,radarptr,rcolor_r,rcolor_g,rcolor_b,255,radarsizex,radarsizey,radarsizex,radarsizey);
	}
}

extern void kwdisplay_kawanoradarmap (int mapnum) {
	short sizex,sizey;

	sizex = roadmapsizetbl[mapnum*2+0];
	sizey = roadmapsizetbl[mapnum*2+1];

	kwsprite_a4_xlu_pt	(260,60,kawano_radarptr[mapnum],255,255,255,255,sizex,sizey,sizex,sizey);
}

/************************************************************************************************/
/*												*/
/* 					Display Radar Map					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_radarsline (int screen) {
	float x,y;
//start line
	x = radarx[screen]+rmodex-radarsizex/2+rzerox;
	y = radary[screen]+rmodey-radarsizey/2+rzeroy;

//	x = radarx[screen]+testpos2[kx]-radarsizex/2+rzerox;
//	y = radary[screen]+testpos2[ky]-radarsizey/2+rzeroy;

	switch (map_number){
		case KT1:  y =y-2.0;  break;
		case KT2:  y =y-16.0; break;
		case KT12: y =y+4.0; break;
	}
	kwsprite8x8 (x,y,sline);

}
/************************************************************************************************/
/*												*/
/* 					Display Radar Map					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_radarplayer_sub (int screen,int player,int texnum) {
	float fx,fz;
	short x,y;
	ushort chara;
	CAR *car;

	car   = kart1+player;
	chara  =car->kart;

	if (car->flag & EXIST){

		#if 1
		fx = car->position[kx]*(radarscale);
		fz = car->position[kz]*(radarscale);
		x = radarx[screen]+rmodex-radarsizex/2+rzerox+(short)(fx);
		y = radary[screen]+rmodey-radarsizey/2+rzeroy+(short)(fz);
		#endif

		#if 0
	     	fx = car->position[kx]*(radarscale+testv2[kz]);
	      	fz = car->position[kz]*(radarscale+testv2[kz]);
	     	x = radarx[screen]+testpos2[kx]-radarsizex/2+rzerox+(short)(fx);
	      	y = radary[screen]+testpos2[ky]-radarsizey/2+rzeroy+(short)(fz);
		#endif

		if (texnum nequ 8) {
       			if ((ogawa_rank[player] equ 0) and ((game_mode nequ BATTLE) and (game_mode nequ TIMEATTACK)) ){
       				kwtexture2D_flash_rgba_pt (x,y,(ushort)(0x8000+car->direction[ky]),1.00,markmario+8*8*texnum,vtx_ktile8x8,8,8,8,8);
       			}
       			else {
				kwtexture2D_rgba_pt (x,y,(ushort)(0x8000+car->direction[ky]),1.00,markmario+8*8*texnum,vtx_ktile8x8,8,8,8,8);
	       		}
		}
		else {
			if (ogawa_rank[player] equ 0) kwsprite_flash (x,y,8,8,markmario+8*8*8);
       			else			      kwsprite (x,y,8,8,markmario+8*8*8);
       		}

	}
}

extern void kwdisplay_radarplayer (int screen) {
	int i;
	short kartnum;
	switch (game_mode){
		case MARIOGP:
			//Computer Kart
			for (i=kwkartnum-1; i gte 0 ;i--) {
				kartnum = rank_to_num[i];
				if ( ((kart1+kartnum)->flag) & COP) kwdisplay_radarplayer_sub (screen,kartnum,8);
			}
			//Main Kart
			for (i=kwkartnum-1;i gte 0;i--) {
				kartnum = rank_to_num[i];
				if ( ((kart1+kartnum)->flag & COP) nequ COP) kwdisplay_radarplayer_sub (screen,kartnum,(kart1+kartnum)->kart);
			}
		break;

		case TIMEATTACK:
			//Ghost Kart
				for (i=0;i < 8;i++) {
					if ( ((kart1+i)->flag & GHOST) equ GHOST  ) kwdisplay_radarplayer_sub (screen,i,8);
				}

			//Main Kart
				kwdisplay_radarplayer_sub (screen,kwplayer1,kart1->kart);
		break;

		case VSMODE:
			//Main Kart
			for (i=player_number-1;i gte 0; i--) {
				kartnum = rank_to_num[i];
				kwdisplay_radarplayer_sub (screen,kartnum,(kart1+kartnum)->kart);
			}
		break;

		case BATTLE:
			//Main Kart
			for (i=0;i <player_number;i++) {
				if ( ((kart1+i)->flag & BOMB_KART) equ 0){
					kwdisplay_radarplayer_sub (screen,i,(kart1+i)->kart);
				}
			}
		break;
	}
}

/************************************************************************************************/
/*												*/
/*   			   		Lap Time   						*/
/*												*/
/************************************************************************************************/
#define gametime_max	99*60*100+5999
/*======================================================================================*/
/*											*/
/*		       		       	LAP TIME      					*/
/*											*/
/*======================================================================================*/
static int kwdiv (int *warareru,int waru) {
	int answer;	

	if (*warareru nequ 0) {
		answer = *warareru/waru;
		*warareru %= waru;  
	}
	else {
		*warareru =0;
		answer =0;
	}
	return (answer);
}

extern void kwgettimer (int timer)
{
//timer ( seisuu bu = second,syousuu bu = 1/100 second)
	int i,j,tmptimer;

	tmptimer = timer;
// 99'59'99 check
	if (tmptimer gte gametime_max ) tmptimer = gametime_max;

// minute
		timetbl[0] = (char)kwdiv(&tmptimer,60000);
		timetbl[1] = (char)kwdiv(&tmptimer,6000);
// second
		timetbl[3] = (char)kwdiv(&tmptimer,1000);
		timetbl[4] = (char)kwdiv(&tmptimer,100);
// 1/100 second
		timetbl[6] = (char)kwdiv(&tmptimer,10);
       		timetbl[7] = (char)tmptimer;
//'	
		timetbl[2] = 10;
//"	
		timetbl[5] = 11;
}

/*======================================================================================*/
/*				Time Display Routine (59'59"99)				*/
/*======================================================================================*/
static void   kwprintlaptime_sub	(int tx,int ty)
{
	int	i,x=tx;

	for (i=0;i<8;i++) {
	  	spr_draw_clip_st (x,ty,8,16,timetbl[i]*8,0,copymode);
       		x +=8;
	}
}

extern void kwprintlaptime	(int tx,int ty,int timer){
//Init Screen
	gSPDisplayList		(graphPtr++, &kwchangecopymode);
	gSPDisplayList		(graphPtr++, &kwsprite_rgba_pt_init);
	gDPSetAlphaCompare	(graphPtr++ ,G_AC_THRESHOLD);

	kwloadtextureblock_rgba_16b	(time0123,104,16);

//Set Time
	kwgettimer (timer);
	kwprintlaptime_sub   (tx,ty);

//Finish
	gSPDisplayList		(graphPtr++, &kwsprite_finish);

}

/*======================================================================================*/
/*				Time Display Routine (59'59"99)		[toumei mode]	*/
/*======================================================================================*/
static void   kwprintlaptime_xlu_sub	(int tx,int ty)
{
	int	i,x=tx;

	for (i=0;i<8;i++) {
		spr_draw_clip_st (x,ty,8,16,timetbl[i]*8,0,cycle1mode);
       		x +=8;
	}
}

extern void kwprintlaptime_xlu	(int tx,int ty,uint alpha,int timer){
	int ptr;
	ushort r,g,b;

//Init Screen
	gSPDisplayList		(graphPtr++, &kwsprite_rgba_xlu_pt_init);
	subalphamode		(alpha);
	kwloadtextureblock_rgba_16b	(time0123,104,16);
//Set Time
	kwgettimer (timer);
	kwprintlaptime_xlu_sub   (tx,ty);
}


/*======================================================================================*/
/*				Time Display Routine (59'59"99)		[toumei mode]	*/
/*======================================================================================*/
extern void kwprintlaptime_flash (int tx,int ty,int timer){
	int ptr;

//Init Screen
	gSPDisplayList		(graphPtr++, &kwsprite_rgba_xlu_pt_init);
	icemode (kwflash_r,kwflash_g,kwflash_b,128,128,128,255);
	kwloadtextureblock_rgba_16b	(time0123,104,16);

//Set Time
	kwgettimer (timer);
	kwprintlaptime_xlu_sub   (tx,ty);
}

/*======================================================================================*/
/*											*/
/*				Time Main Display					*/
/*											*/
/*======================================================================================*/
extern void kwdisplay_totaltime (int player)
{
//Total Time & LAP Time
	int i;
	if ((game_mode nequ VSMODE) and (game_mode nequ BATTLE) ) {
		if (kwlap[player].goal equ kwgoalcnt) {
			if (replay_flag equ 0){
				//LAP Time (1,2,3)
       				for (i=0;i <3;i++) {
	       		       		if (kwbestlap[i] equ 0) {
						kwprintlaptime (kwlap[player].tx[i+1],kwlap[player].ty+i*16,kwlap[player].laptimebuf[i]);
	       				}
					else {
						kwprintlaptime_flash (kwlap[player].tx[i+1],kwlap[player].ty+i*16,kwlap[player].laptimebuf[i]);
					}
				}

				//Total Time
		       		kwsprite32x16  (kwlap[player].tx[4]-19,kwlap[player].ty+48+8,total);

				if (kwbesttotalsw) {
	       	       			kwprintlaptime_flash (kwlap[player].tx[4],kwlap[player].ty+48,kwlap[player].totaltime);
		       		}
		       		else {
	       	       			kwprintlaptime (kwlap[player].tx[4],kwlap[player].ty+48,kwlap[player].totaltime);
		       		}
			}
		}
		else {
			//Normal Time
			if (kwlap[player].flashtm equ 0) {
				kwsprite32x16  (kwlap[player].tx[0]-19,kwlap[player].ty+8,time);
       	       			kwprintlaptime (kwlap[player].tx[0],kwlap[player].ty,kwlap[player].totaltime);
			}
			//LAP Time
       			else {
			  	kwsprite32x16  (kwlap[player].tx[0]-19,kwlap[player].ty+8,lapmoji);

				if (kwbestlapsw) {
	       	       			kwprintlaptime_flash (kwlap[player].tx[0],kwlap[player].ty,kwlap[player].laptime);
				}
				else {
       					if (kwlap[player].dispsw equ 0) kwprintlaptime (kwlap[player].tx[0],kwlap[player].ty,kwlap[player].laptime);
		       		}

	       		}
		}
	}
}

/*======================================================================================*/
/*											*/
/*				LAP Count Display					*/
/*											*/
/*======================================================================================*/
extern void kwdisplay_lap88 (short x,short y,char lap)
{

//COPY MODE
	gSPDisplayList		(graphPtr++, &kwchangecopymode);
	gSPDisplayList		(graphPtr++, &kwsprite_rgba_pt_init);
 	gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);

	kwloadtextureblock_rgba_16b (lap88,32,8);

  	spr_draw_clip_st  	(x   ,y,8,8,8*lap,0,copymode);
  	spr_draw_clip_st  	(x+8 ,y,8,8,24   ,0,copymode);
  	spr_draw_clip_st  	(x+16,y,8,8,16   ,0,copymode);


	gSPDisplayList		(graphPtr++, &kwsprite_finish);
}

/************************************************************************************************/
/*												*/
/*												*/
/*		   	     		Kao Panel    						*/
/*												*/
/*												*/
/************************************************************************************************/
static void kwdisplay_kaopanel_sub (float x,float y,short rank,short lap,short kaonum,uint alpha,int frame,int mirrorx,int goal)
{

	if ((map_number equ KT5) and (lap lt 3) and (goal equ 0)) {
	    	//Panel (hatena)
	    	kwcreateaffine2D (x,y,0,1.00);
       	    	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
	    	toumeimode (255,255,255,kwa);
	    	gDPLoadTLUT_pal256	(graphPtr++ ,pbombpal);
	    	kwloadtextureblock_ci_8b(pbombidx+32*32,32,32);
	    	gSPDisplayList (graphPtr++, &kwsettile32x32);
	}
	else {

		//Panel
		kwcreateaffine2D (x,y,0,1.00);
       		gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
		toumeimode (255,255,255,alpha);
    		gDPLoadTLUT_pal256	(graphPtr++ ,kao_colpal_list[kaonum]);
	       	kwloadtextureblock_ci_8b(kao_index_list[kaonum],32,32);

		if (mirrorx)	{
			gSPDisplayList (graphPtr++, &kwsettile32x32xflip);
		}
		else {
			gSPDisplayList (graphPtr++, &kwsettile32x32);
		}
		// Frame
		if (frame) {
	  		kwcreateaffine2D (x,y,0,1.00);
       			gSPDisplayList (graphPtr++, &kwtexture_ia_bl_init);
			toumeimode (wakur,wakug,wakub,255);
       			kwloadtextureblock_ia_4b (pframe,32,32);
       			gSPDisplayList		(graphPtr++, &kwsettile32x32);
		}
		//number
       		gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
		toumeimode (255,255,255,alpha);
 	       	gSPDisplayList(graphPtr++, &kwtexture_ci8_pt_init);
       	       	gDPLoadTLUT_pal256 (graphPtr++ ,numpal);
		kwloadtextureblock_ci_8b(numidx+rank*16*16,16,16);

  		if (mirrorx)	kwcreateaffine2D (x+9,y+7,0,1.00);
  		else 		kwcreateaffine2D (x-9,y+7,0,1.00);
	   	gSPDisplayList (graphPtr++, &kwsettile16x16);
	}
}

extern void kwdisplay_kaopanel (void)
{
	int	lap,rank,mirrorx;
	short	kno,kaonum;

	if (kwgoalpanelsw equ 0) {
		for (rank=0;rank<4; rank++)  {
       			if (panely[rank] gte 0) {
				mirrorx =0;
				if (paneladdx[rank] lt 0.0) mirrorx =1;
       			       	kno=rank_to_num[rank];
				kaonum = kwpanel[rank];
       			       //	kaonum  = (kart1+kno)->kart;
				lap  = ogawa_rap[kno];
       				if (kaonum equ kart1->kart) kwdisplay_kaopanel_sub (panelx[rank],panely[rank],rank,lap,kaonum,255,1,mirrorx,0);
       				else			    kwdisplay_kaopanel_sub (panelx[rank],panely[rank],rank,lap,kaonum,kwa,0,mirrorx,0);
			}
		}
	}
	else {
		for (rank=0;rank<8; rank++)  {
       			if (panely[rank] gte 0) {
				mirrorx =0;
				if (paneladdx[rank] lte 0.0) mirrorx =1;
       				kno=rank_to_num[rank];
       				kaonum  = (kart1+kno)->kart;
				lap  = ogawa_rap[kno];
       				if (kno equ kwplayer1)	kwdisplay_kaopanel_sub (panelx[rank],panely[rank],rank,lap,kaonum,255,1,mirrorx,1);
       				else			kwdisplay_kaopanel_sub (panelx[rank],panely[rank],rank,lap,kaonum,255,0,mirrorx,1);
			}
		}
	}
	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

/************************************************************************************************/
/*												*/
/*												*/
/*    	   	     		Ogawa Debuging Mode 						*/
/*												*/
/*												*/
/************************************************************************************************/

/*==============================================================================*/
/*	  			Enemy Kart Zahyou				*/
/*==============================================================================*/
static int kwcalc_enemycar_zahyou (ushort kartnum,int *x,int *y)
{
// (*x,*y) ha modorichi
	int length,num,lap;
	num =0;
	length =0;
	lap  = ogawa_rap[kartnum];

//syuukai
	if (lap lt 3) {
		if (player_number equ 1){
       			if (lap gte 0) length = (wakulx+wakuly)*2*rate_count_F[kartnum];

       			if (length lt wakulx) {
       				*x =length;
       				*y =0;
       				num =1;
       			}
       			else if (length lt wakulx+wakuly) {
       				*x =wakulx;
       		       		*y =length-wakulx;
       		       		num =2;
			}
	       		else if (length lt wakulx*2+wakuly) {
       	       			*x =wakulx-(length-(wakulx+wakuly));
       	       			*y =wakuly;
       				num =3;
			}
       			else {
       				*x =0;
       				*y =wakuly-(length-(wakulx*2+wakuly));
       				num =4;
       			}
		}
		else {
      			if (lap gte 0) length = wakulx*rate_count_F[kartnum];
			*x =length;
			*y =0;
		}
	}
//GOAL shita
	else {
		if (player_number equ 1){
			*x = 32;
			*y = 32+ogawa_rank[kartnum]*20;
			num =0;
		}
		else {
      			length = wakulx*rate_count_F[kartnum];
			*x =length;
			*y =0;
		}
	}
	return (num);
}

static void kwcalc_bombkart_zahyou (ushort bombnum,int *x,int *y)
{
// (*x,*y) ha modorichi
	int length;
	ushort area;
	BOM_TYPE *bom_ptr;
	bom_ptr = & bom[bombnum];

	area = bom_ptr->area;

//syuukai
		length =0;
		if (area) length = (wakulx+wakuly)*2*area/center_line_max;

		if (length lt wakulx) {
       			*x =length;
       			*y =0;
		}
		else if (length lt wakulx+wakuly) {
			*x =wakulx;
	       		*y =length-wakulx;
		}
		else if (length lt wakulx*2+wakuly) {
       			*x =wakulx-(length-(wakulx+wakuly));
       			*y =wakuly;
		}
		else {
			*x =0;
			*y =wakuly-(length-(wakulx*2+wakuly));
		}
}

/*==============================================================================*/
/*	  			Draw Road Line					*/
/*==============================================================================*/
static void kwdisplay_road (void)
{
	int x,y,line,lap,kartnum;
	ushort r,g,b,a;


//	kartnum = rankbuf_carnum[0];

	if (game_mode equ TIMEATTACK)	kartnum = real_rank_to_num[0];
	else				kartnum = rank_to_num[0];

	line = kwcalc_enemycar_zahyou (kartnum,&x,&y);
	lap =  ogawa_rap[kartnum];

//	kwrmonPrintf ("line = %d \n",line);
//	kwrmonPrintf ("lap = %d \n",lap);
//	kwrmonPrintf ("kartnum = %d \n",kartnum);
//	kwrmonPrintf ("x zahyou = %d \n",x);
//	kwrmonPrintf ("y zahyou = %d \n\n",y);

//ROAD Line (OLD)
	if (lap gt 0) { 
		if (lap equ 1) {
			r=0;
			g=0;
			b=255;
			a =255;
		}

		else if (lap equ 2) {
			r=255;
			g=255;
			b=0;
			a =255;
		}

		else {
			r=255;
			g=0;
			b=0;
			a =255;
		}

			kwline_yoko (wakusx,wakusy,wakulx       ,r,g,b,a);
       	       		kwline_tate (wakusx+wakulx,wakusy,wakuly,r,g,b,a);
       	       		kwline_yoko (wakusx,wakusy+wakuly,wakulx,r,g,b,a);
       	       		kwline_tate (wakusx,wakusy,wakuly       ,r,g,b,a);
	}

//ROAD Line (New)
	if ((lap gte 0) and (lap lt 3)) {
		switch (lap) {
       			case 0:
       				r=0;
       				g=0;
       				b=255;
       			break;

       			case 1:
       				r=255;
       				g=255;
       				b=0;
       			break;

       			case 2:
       				r=255;
       				g=0;
				b=0;
	       		break;
		}


		switch (line) {
       			case 0:
       			break;

       			case 1:
       				kwline_yoko (wakusx,wakusy,x,r,g,b,255);
       			break;

			case 2:
	       			kwline_yoko (wakusx,wakusy,wakulx,r,g,b,255);
       	       			kwline_tate (wakusx+wakulx,wakusy,y,r,g,b,255);
			break;

       			case 3:
       				kwline_yoko (wakusx,wakusy,wakulx,r,g,b,255);
       				kwline_tate (wakusx+wakulx,wakusy,wakuly,r,g,b,255);
       				kwline_yoko (wakusx+x,wakusy+wakuly,wakulx-x,r,g,b,255);
       			break;

       			case 4:
       				kwline_yoko (wakusx,wakusy,wakulx,r,g,b,255);
       		       		kwline_tate (wakusx+wakulx,wakusy,wakuly,r,g,b,255);
       		       		kwline_yoko (wakusx,wakusy+wakuly,wakulx,r,g,b,255);
       		       		kwline_tate (wakusx,wakusy+y,wakuly-y,r,g,b,255);
       			break;

		}
	}
}
/*==============================================================================*/
/*	  			Bomb Kart Panel					*/
/*==============================================================================*/
extern void kwdisplay_bombpanel (void) {
	int i,x,y;
	BOM_TYPE *bom_ptr;
	ushort mv_pat_BOM;

	for (i=0;i < BOM_MAX;i++) {
		bom_ptr = &bom[i];
		mv_pat_BOM = bom_ptr->mv_pat;
		if ( (mv_pat_BOM nequ BOM_MODE_BOOM) and (mv_pat_BOM nequ BOM_MODE_NULL) ){
			kwcalc_bombkart_zahyou (i,&x,&y);
			// enemy kao panel
		 	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
			gDPLoadTLUT_pal256	(graphPtr++ ,pbombpal);
			kwloadtextureblock_ci_8b(pbombidx,32,32);
		 	kwcreateaffine2D	(wakusx+x,wakusy+y,0,0.6);
	       		gSPDisplayList		(graphPtr++, &kwsettile32x32);
		}
	}
}

/*==============================================================================*/
/*	  			Draw Enemy Kart Panel				*/
/*==============================================================================*/
static void kwdisplay_enemycar_sub (int kartnum,int rank)
{
	int num,x,y,sx,sy,lap,player,xflipsw,panel;
	ushort	alpha;
	CAR *car;

	car	= kart1+kartnum;
	lap     = ogawa_rap[kartnum];
	player  = (kart1+kartnum)->kart;
	num = kwcar[kartnum].num;

//Zahyou Calculate
	if (player_number equ 1) {
		sx =wakusx;
		sy =wakusy;
	}
	else {
		sx =wakusx;
		sy =120;
	}

//panel x flip check
	panel = kwcalc_enemycar_zahyou (kartnum,&x,&y);
	if ( (panel equ 2) or (panel equ 3)) xflipsw =1;
	else xflipsw = 0;

//MAZE Syori  (hatena)
	if ((map_number equ KT5)  and (lap lt 3)){
//	if (enemy_enter_maze[player]) {
	 	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);
		gDPLoadTLUT_pal256	(graphPtr++ ,pbombpal);
		kwloadtextureblock_ci_8b(pbombidx+32*32,32,32);

//	 	kwcreateaffine2D	(sx+x,sy+y,kwcar[kartnum].spin_angle,kwcar[kartnum].scale);
//	 	kwcreateaffine2D	(sx+x,sy+y,kwcar[kartnum].spin_angle,kwcar[kartnum].scale);

		kwanm[num].p[kx] = (float)(sx+x)+kwanm[num].sp[kx];
		kwanm[num].p[ky] = (float)(sy+y)+kwanm[num].sp[ky];
		kwanm[num].p[kz] = kwanm[num].sp[kz];
		kwcreateaffine3D (kwanm[num].p,kwanm[num].ang,kwanm[num].scale);
      		gSPDisplayList		(graphPtr++, &kwsettile32x32);

	}
	else {
// enemy kao panel
		gDPLoadTLUT_pal256	(graphPtr++ ,kao_colpal_list[player]);
       		gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_pt_init);

       		if (car->slip_flag & STAR) icemode (kwflash_r,kwflash_g,kwflash_b,128,128,128,kwanm[num].alpha);
       		else	subalphamode (kwanm[num].alpha);

		kwloadtextureblock_ci_8b(kao_index_list[player],32,32);

		kwanm[num].p[kx] = (float)(sx+x)+kwanm[num].sp[kx];
		kwanm[num].p[ky] = (float)(sy+y)+kwanm[num].sp[ky];
		kwanm[num].p[kz] = kwanm[num].sp[kz];
		kwcreateaffine3D (kwanm[num].p,kwanm[num].ang,kwanm[num].scale);

		if (xflipsw){
			gSPDisplayList	(graphPtr++, &kwsettile32x32xflip);  
		}
		else {
		     	gSPDisplayList	(graphPtr++, &kwsettile32x32);
		}
		// number
		gDPLoadTLUT_pal256	(graphPtr++ ,num_spal);
       		kwloadtextureblock_ci_8b(num_sidx+(rank+1)*8*8,8,8);

       		if (xflipsw){
       			kwcreateaffine2D	(sx+x+6,sy+y+4,0,1.0);
       		}
       		else {
       			kwcreateaffine2D	(sx+x-5,sy+y+4,0,1.0);
       		}
       		gSPDisplayList		(graphPtr++, &kwsettile8x8);


		// Frame
		if ((car equ kart1) and (race_screen_mode equ FULL_SCREEN)) {
       			gSPDisplayList	 (graphPtr++, &kwtexture_ia_pt_init);
       	       		toumeimode	 (wakur,wakug,wakub,255);
       	       		kwloadtextureblock_ia_4b (pframe,32,32);
	       		kwcreateaffine3D (kwanm[num].p,kwanm[num].ang,kwanm[num].scale);
	       		//kwcreateaffine2D (sx+x,sy+y,kwcar[kartnum].spin_angle,kwcar[kartnum].scale);
       	       		gSPDisplayList	 (graphPtr++, &kwsettile32x32);
		}
	}
}

/*==============================================================================*/
/*										*/
/*	  			Draw Enemy Rank					*/
/*										*/
/*==============================================================================*/
extern void kwdisplay_enemycar (void)
{
	int i,rank,x,y,kartnum,max;
	CAR *car;
//drawline
	if (race_screen_mode equ FULL_SCREEN ) 	kwdisplay_road ();

//Draw BOMB Kart
//	if (game_mode equ VSMODE) kwdisplay_bombpanel ();

//2p LR screen DEL
	max = 8;
	if ((player_number equ 2)and (screen_mode equ RIGHT_LEFT_SCREEN )) max =0;
 	rank =max-1;

//enemy kart
	for (i=0;i<max;i++)  {
		kartnum = rank_to_num[rank];
		car = kart1+kartnum;
		if ((car->flag & EXIST) and (!((kartnum equ kwplayer1)and(player_number equ 1)))) kwdisplay_enemycar_sub (kartnum,rank);
		rank--;
	}

//Draw My Kart
	if (game_mode equ TIMEATTACK) {
		kwdisplay_enemycar_sub (0,real_rank[kwplayer1]);
	}
	else {
		if (player_number equ 1)  kwdisplay_enemycar_sub (0,ogawa_rank[kwplayer1]);
	}
//Finish
	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/*					3D Effect							*/
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/


/************************************************************************************************/
/*												*/
/*		   	     		Leaf Display						*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_leaf(int player)
{
	int i,num;
//leaf
	gSPDisplayList	(graphPtr++, &kwtexture_rgba_aa_zb_bl_init);
	gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
    	kwloadtextureblock_rgba_16b (rgba_happa,32,16);

	for (i=0;i< leafkazumax;i++) {
		num=leafallocptr[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 1)and (kwanm[num].type equ objnum_TREE_LEAF)){

			if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
		       		kwcreateaffine3D_anm (num);
       				gSPDisplayList(graphPtr++,kwsettile32x16);
			}
		}
       	}
//Finish
	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
      	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}


/************************************************************************************************/
/*												*/
/*		   	     		Snow Display   						*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_snow (void)
{
	int i,num;
//RDP&RCP MODE  Initial
	gSPDisplayList (graphPtr++, &kwtexture_ia_zb_bl_init);
	gDPSetCombineMode (graphPtr++,G_CC_A4, G_CC_A4);

//Texture Load
	kwloadtextureblock_a_4b (a4_snow,16,16);
	for (i=0;i<kwsnowkazumax_3D;i++) {
		num=effectallocptr[i];
		if (kwanm[num].anmptr > 1) {

		//Modeling Henkan
		kwcreateaffine3D_anm (num);

		//DRAW
		gSPDisplayList(graphPtr++,kwsettile16x16);
		}
	}
	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

/************************************************************************************************/
/*												*/
/*		   	     		Kumo Display	  					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_kumo_draw (int num,short x,short y)
{
	int loadsw=0;
	if (kwanm[num].flag & kf_dispon) {
		if (kwanm[num].type nequ kumotype){
	       		kumotype = kwanm[num].type;
       			kwloadtextureblock_i_4b (kwanm[num].indexaddr,kwanm[num].texsizex,kwanm[num].texsizey);
		}
		kwcreateaffine2D (x,y,0x0000,kwanm[num].scale);
		gSPVertex(graphPtr++ ,&kwanm[num].vtxaddr[0], 4, 0);
		gSPDisplayList(graphPtr++, &kwsetTile);
	}
}

static void kwdisplay_star_draw (int num,short x,short y)
{
	int loadsw=0;
	if (kwanm[num].flag & kf_dispon) {
		if (kwanm[num].type nequ kumotype){
	       		kumotype = kwanm[num].type;
       			kwloadtextureblock_i_4b (kwanm[num].indexaddr,kwanm[num].texsizex,kwanm[num].texsizey);
		}

		kwsetprimcolor (255,255,255,kwanm[num].alpha);
		kwcreateaffine2D (x,y,0x0000,kwanm[num].scale);
		gSPVertex(graphPtr++ ,&kwanm[num].vtxaddr[0], 4, 0);
		gSPDisplayList(graphPtr++, &kwsetTile);
	}
}

static void kwdisplay_kumo_sub (short horizon,int offset){
	int i,num;
	short y;
	kumotype =255;
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);

	//Star Display
	if (kwhoshisw){
		splashmode (255,255,255,255);
	       	for (i=0;i< kumo_kazu;i++) {
    			num = kumoallocptr[i+offset];
			y =horizon-kwanm[num].iy;
			kwdisplay_star_draw (num,kwanm[num].ix,y);
       		}
	}
	//Kumo Display
	else {
		sparkmode (255,255,255);
	       	for (i=0;i< kumo_kazu;i++) {
    			num = kumoallocptr[i+offset];
			y =horizon-kwanm[num].iy;
			kwdisplay_kumo_draw (num,kwanm[num].ix,y);
       		}
	}
}

static void kwdisplay_kumo_2pud_sub (short horizon,int offset){
	int i,num;
	short y,h;

	if (kwdemo_2pgp equ 0) {
	  	if	(map_number equ KT7)  h = horizon;
       		else if (map_number equ KT10) h = horizon-16;
       		else if (map_number equ KT5)  h = horizon-16;
       		else			      h = horizon+16;
	}
	else{
	  	if	(map_number equ KT7)  h = horizon*2;
//       		else if (map_number equ KT1)  h = horizon+32;
//       		else if (map_number equ KT8)  h = horizon+32;
//       		else if (map_number equ KT9)  h = horizon+32;
//       		else if (map_number equ KT12) h = horizon+32;
		else			      h = horizon+32;
	}

	kumotype =255;
	gSPDisplayList(graphPtr++, &kwtexture_ia_bl_init);

	//Star Display
	if (kwhoshisw){
		splashmode (255,255,255,255);
	       	for (i=0;i< kumo_kazu;i++) {
    			num = kumoallocptr[i+offset];
			y =(h-kwanm[num].iy)/2;
			kwdisplay_star_draw (num,kwanm[num].ix,y);
       		}
	}
	//Kumo Display
	else {
		sparkmode (255,255,255);
	       	for (i=0;i< kumo_kazu;i++) {
    			num = kumoallocptr[i+offset];
			y =(h-kwanm[num].iy)/2;
			kwdisplay_kumo_draw (num,kwanm[num].ix,y);
       		}
	}
}

extern void kwdisplay_kumo_1p (void)
{
	kwdisplay_kumo_sub (SCREEN_HT-screen1->horizon,0);
}

extern void kwdisplay_kumo_2pl (void)
{
	short horizon;
	horizon = SCREEN_HT-screen1->horizon;	   
  	if	(map_number equ KT7)  horizon +=0-48;
	else if (map_number equ KT10) horizon -=16+48;
	else if (map_number equ KT5)  horizon -=16+48;
	else			      horizon -=48;
	kwdisplay_kumo_sub (horizon,0);
}

extern void kwdisplay_kumo_2pr (void)
{
	short horizon;
  	horizon = SCREEN_HT-screen2->horizon;
  	if	(map_number equ KT7)  horizon +=0-48;
	else if (map_number equ KT10) horizon -=16+48;
	else if (map_number equ KT5)  horizon -=16+48;
	else			      horizon -=48;
	kwdisplay_kumo_sub (horizon,kumo_kazu);
}

extern void kwdisplay_kumo_2pu (void)
{
	short horizon;
	horizon = SCREEN_HT-screen1->horizon;
	kwdisplay_kumo_2pud_sub (horizon,0);
}

extern void kwdisplay_kumo_2pd (void)
{
	short horizon;

  	horizon = SCREEN_HT-screen2->horizon;
	kwdisplay_kumo_2pud_sub (horizon,kumo_kazu);
}


//	if (kwdemo_2pgp equ 0) {
//	  	if	(map_number equ KT7)  horizon +=0;
//       		else if (map_number equ KT10) horizon -=16;
//       		else if (map_number equ KT5)  horizon -=16;
//       		else			      horizon +=16;
//	}
//	else{
//	  	if	(map_number equ KT7)  horizon = horizon*2;
//       		else if (map_number equ KT5)  horizon = (horizon-16)*2;

      // 		else if (map_number equ KT10) horizon -=16/2;
    //   		else if (map_number equ KT12)  horizon +=96;
  //     		else if (map_number equ KT5)  horizon -=16/2;
//       		else			      horizon +=16/2;
//		else	horizon= horizon*2;
//	}

//	osSyncPrintf ("kumo2 = %d \n\n",testnum);
//	testnum =0;

/************************************************************************************************/
/*												*/
/*		   	     		Puku Puku Display  					*/
/*												*/
/************************************************************************************************/
#define	LDIRX_puku1	0
#define	LDIRY_puku1	-120
#define	LDIRZ_puku1	0

Lights1 pukupuku_material[]={
	{{100,0,0,0,100,0,0,0},{100,0,0,0,100,0,0,0,LDIRX_puku1,LDIRY_puku1,LDIRZ_puku1,0}},
	{{100,100,0,0,100,100,0,0},{255,255,0,0,255,255,0,0,LDIRX_puku1,LDIRY_puku1,LDIRZ_puku1,0}},
	{{100,100,100,0,100,100,100,0},{255,255,255,0,255,255,255,0,LDIRX_puku1,LDIRY_puku1,LDIRZ_puku1,0}},
	{{100,0,0,0,100,0,0,0},{100,0,0,0,100,0,0,0,LDIRX_puku1,LDIRY_puku1,LDIRZ_puku1,0}},
};

static void kwset_pukupuku_light (int num){
	if (kwanm[num].type equ 0){
		pukupuku_material[0].l[0].l.dir[0] = pukupuku_material[1].l[0].l.dir[0] = pukupuku_material[2].l[0].l.dir[0] = pukupuku_material[3].l[0].l.dir[0] = 0;
       		pukupuku_material[0].l[0].l.dir[1] = pukupuku_material[1].l[0].l.dir[1] = pukupuku_material[2].l[0].l.dir[1] = pukupuku_material[3].l[0].l.dir[1] = -120;
       		pukupuku_material[0].l[0].l.dir[2] = pukupuku_material[1].l[0].l.dir[2] = pukupuku_material[2].l[0].l.dir[2] = pukupuku_material[3].l[0].l.dir[2] = 0;
	}
	else {
		pukupuku_material[0].l[0].l.dir[0] = pukupuku_material[1].l[0].l.dir[0] = pukupuku_material[2].l[0].l.dir[0] = pukupuku_material[3].l[0].l.dir[0] = 99;
       		pukupuku_material[0].l[0].l.dir[1] = pukupuku_material[1].l[0].l.dir[1] = pukupuku_material[2].l[0].l.dir[1] = pukupuku_material[3].l[0].l.dir[1] = 66;
       		pukupuku_material[0].l[0].l.dir[2] = pukupuku_material[1].l[0].l.dir[2] = pukupuku_material[2].l[0].l.dir[2] = pukupuku_material[3].l[0].l.dir[2] = 0;
	}
}
extern void kwdisplay_pukupuku (int player)
{
	int i,num;
	num = objallocptr2[0];
	if (kwanm[num].anmptr >1) {
		if (kwanm_bitcheckflag (num,kf_dispon)){
			kwcreateaffine3D	(kwanm[num].p,kwanm[num].ang,kwanm[num].scale);

			kwset_pukupuku_light (num);
			gSPDisplayList		(graphPtr++, &kwpolygon_tex_slight_init);

			gSPLight(graphPtr++,(&pukupuku_material[0].l[0]),1);
			gSPLight(graphPtr++,(&pukupuku_material[0].a),2);
			gSPDisplayList(graphPtr++,pukupuku_obj_o5);

			gSPLight(graphPtr++,(&pukupuku_material[1].l[0]),1);
	       		gSPLight(graphPtr++,(&pukupuku_material[1].a),2);
	       		gSPDisplayList(graphPtr++,pukupuku_obj_o4);

			gSPLight(graphPtr++,(&pukupuku_material[2].l[0]),1);
			gSPLight(graphPtr++,(&pukupuku_material[2].a),2);
			gSPDisplayList(graphPtr++,pukupuku_obj_o3);

			gSPLight(graphPtr++,(&pukupuku_material[3].l[0]),1);
       			gSPLight(graphPtr++,(&pukupuku_material[3].a),2);
			gSPDisplayList(graphPtr++,pukupuku_obj_o1);
		}
	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Tellesa Display  					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_tellesa_sub (int num,int player,uint distance) {
	int lengthx,lengthz,kagesw;
	CAMERA *camera;
	camera = camera1+player;
	//hontai
       	kwanm[num].texang[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
	kwtexture3D_ci8_xlu_zb_bl (kwanm[num].p,kwanm[num].texang,kwanm[num].scale,kwanm[num].alpha,kwanm[num].texaddr,kwanm[num].indexaddr,kwanm[num].vtxaddr,48,40,48,40);
	//kage
	if ( (kwanm_bitcheckflag(num,kf_kage)) and (distance lte 300*300)) kwdraw_kage3D (&tellesabump,kwanm[num].p,0.40);
}

extern void kwdisplay_tellesa (int player)
{
	int i,num;
	uint distance;
	for (i=0;i< tel_matowari_max;i++) {
		num = objallocptr3[i];
       		if (kwanm[num].anmptr gt 1){ 
			distance = kwcheck_vis_area (num,player,kwdeg90,800);
       			if (kwanm_bitcheckflag (num,kf_visible)) kwdisplay_tellesa_sub (num,player,distance);
	       	}
       	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Bat Display  						*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_bat (int player)
{
	int i,num;
	CAMERA *camera;
 	camera = camera1+player;

   	num = objallocptr[batnum];
  	//load image
  	kwloadtexture_ci8_aa_zb_bl_mr (kwanm[num].texaddr,kwanm[num].indexaddr,32,64,5);
  	//texture angle
  	texangle[kx] = kwanm[num].texang[kx];
  	texangle[kz] = kwanm[num].texang[kz];

  	//set tile
  	if (effect_sw2 or effect_tm2){
  		for (i=0;i< kanoke_bat_kazu;i++) {
  			num = effectallocptr2[i];
  			if ((num nequ alloc_clear) and (kwanm[num].anmptr gte 2)) {
				if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
  			       		texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
  					kwset_tile (kwanm[num].p,texangle,kwanm[num].scale,vtx_ktile64x64_bl_mr);
  		       		}
  		       	}
  	       	}
      	}

  	//set tile
  	if (effect_sw3 or effect_tm3){
  		for (i=0;i< danro_bat_kazu;i++) {
  			num = effectallocptr3[i];
  			if ((num nequ alloc_clear) and (kwanm[num].anmptr gte 2)) {
				if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
  		       			texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
	  				kwset_tile (kwanm[num].p,texangle,kwanm[num].scale,vtx_ktile64x64_bl_mr);
  			       	}
  		       	}
  	       	}
  	}
  	//finish
  	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

/************************************************************************************************/
/*												*/
/*		   	     		Kanoke Display  					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_kanoke (int player)
{
	int num;
	num = objallocptr[kanokenum];
	kwcheck_vis_area (num,player,kwdeg120,800);
	if (kwanm_bitcheckflag (num,kf_visible)) {
		if (kwanm[num].anmptr >1) kwpolygon3D	(kwanm[num].p,kwanm[num].texang,kwanm[num].scale,kwanm[num].shape);
	}
}

/************************************************************************************************/
/*												*/
/*		   	     		ICE BOX Display						*/
/*												*/
/************************************************************************************************/
Lights1 iceblock3_material[]={
	{{150,180,250,0,150,180,250,0},{255,255,255,0,255,255,255,0,0,0,0,0}},
};

extern void kwdisplay_iceblock_sub (int player)
{
	int i;
	CAR *car;

	car = kart1+player;
//hontai
	texzahyou[kx] =  car->position[kx];
	texzahyou[ky] =  car->position[ky];
       	texzahyou[kz] =  car->position[kz];

	texangle[kx] =0;
	texangle[ky] =0;
	texangle[kz] =0;

	kwpolygon3D_iceblock (texzahyou,texangle,0.02,iceblock3_modelT);
}

extern void kwdisplay_iceblock_kakera (int player)
{
	int i,num;
//	int i,num,cnt;

	texangle[kx] =kakera_ang[kx];
	texangle[ky] =kakera_ang[ky];
	texangle[kz] =kakera_ang[kz];

	gSPDisplayList(graphPtr++, &kwtexture_ia_aa_zb_bl_init);

	gSPNumLights(graphPtr++,NUMLIGHTS_1);
	gSPLight(graphPtr++ ,(&iceblock3_material[0].l[0]),1);
	gSPLight(graphPtr++ ,(&iceblock3_material[0].a),2);
	gDPSetCombineMode (graphPtr++,G_CC_MODULATERGBA,G_CC_MODULATERGBA);

	gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
	gSPSetGeometryMode	(graphPtr++,G_SHADE|G_SHADING_SMOOTH|G_LIGHTING);
	kwloadtextureblock_ia_16b (iceblock_txt,32,32);

  //  	cnt =0;
	if (player_number lt 3){
		for (i=0;i<effectkazumax2;i++) {
       			num = effectallocptr2[i];
       			if ((num nequ alloc_clear) and (kwanm[num].anmptr gte 1)) {
       				kwcreateaffine3D (kwanm[num].p,texangle,kwanm[num].scale);
       				//gSPVertex(graphPtr++ ,&vtx_dosuntriangle32x32_light[0], 3, 0);
       				//gSPVertex(graphPtr++ ,&vtx_ktriangle32x32[0], 3, 0);
       				gSPVertex(graphPtr++ ,&vtx_ktriangle32x32_light[0], 3, 0);
       				gSPDisplayList(graphPtr++, &kwsetTriangle);
       			       //	cnt++;
	       		}
	      	}
	}
	else {
		for (i=0;i<effectkazumax2;i++) {
       			num = effectallocptr2[i];
       			if ((num nequ alloc_clear) and (kwanm[num].anmptr gte 1) and (kwanm[num].stack[7] equ player)) {
				if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
       			     		kwcreateaffine3D (kwanm[num].p,texangle,kwanm[num].scale);
       			       		gSPVertex(graphPtr++ ,&vtx_ktriangle32x32_light[0], 3, 0);
       			       		gSPDisplayList(graphPtr++, &kwsetTriangle);
       			      //	gSPVertex(graphPtr++ ,&vtx_dosuntriangle32x32_light[0], 3, 0);
       			      // 	cnt++;
		       		}
	       		}
	      	}
	}

//	osSyncPrintf ("kazu = %d \n",cnt);
	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
	gSPClearGeometryMode	(graphPtr++,G_LIGHTING);
    	gSPTexture		(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

extern void kwdisplay_iceblock (int player)
{
	int i,num,flag;
	CAR *car;
	FVector l;

      	iceblock3_material[0].l[0].l.dir[0] = kwlight[0];
	iceblock3_material[0].l[0].l.dir[1] = kwlight[1];
	iceblock3_material[0].l[0].l.dir[2] = kwlight[2];
	gSPLight(graphPtr++ ,(&iceblock3_material[0].l[0]),1);
	gSPLight(graphPtr++ ,(&iceblock3_material[0].a),2);

	//hontai
	flag =0;
	for (i=0;i<player_number;i++) {
		num = jugemuallocptr[i];
		if (kwanm_bitcheckevflag (num,jgm_ice)) {
			kwdisplay_iceblock_sub (i);
		}
		if (kwanm_bitcheckevflag (num,jgm_icebomb)) flag =1;
	}

	//kakera !!!
	kwdisplay_iceblock_kakera (player);
}

extern void kwdisplay_iceblock_kage_sub (int player)
{
	int num;
	CAR *car;
	car = kart1+player;
	num = jugemuallocptr[player];
	if (kwanm_bitcheckevflag (num,jgm_icekage))  {
//kage
		texzahyou[kx] =  car->position[kx];
       		texzahyou[ky] =  car->ground-6.5;
       		texzahyou[kz] =  car->position[kz];

//       		texangle[kx] =0;
//       		texangle[ky] =0;
//       		texangle[kz] =0;

//		gSPLight(graphPtr++ ,(&iceblock3_material[0].l[0]),1);
//       		gSPLight(graphPtr++ ,(&iceblock3_material[0].a),2);

		kwpolygon3D_icekage (texzahyou,texangle,0.02,iceblock3_modelT,255);
	}
}

extern void kwdisplay_iceblock_kage (int player)
{
	int i,num;
	CAR *car;
	FVector l;

      	iceblock3_material[0].l[0].l.dir[0] = kwlight[0];
	iceblock3_material[0].l[0].l.dir[1] = kwlight[1];
	iceblock3_material[0].l[0].l.dir[2] = kwlight[2];
	gSPLight(graphPtr++ ,(&iceblock3_material[0].l[0]),1);
	gSPLight(graphPtr++ ,(&iceblock3_material[0].a),2);

  	texangle[kx] =0;
       	texangle[ky] =0;
       	texangle[kz] =0;

	//hontai
	if (players equ 1){
		for (i=0;i<player_number;i++) {
			kwdisplay_iceblock_kage_sub (i);
		}
	}
}

#if 0
extern void kwdisplay_iceblock (int player)
{
	int i,num,num2,cnt;
	CAR *car;
	FVector l;
	car = kart1+player;
	num = jugemuallocptr[player];

	if (car->jugemu_flag & FREEZE) {
	      	iceblock3_material[0].l[0].l.dir[0] = kwlight[0];
       		iceblock3_material[0].l[0].l.dir[1] = kwlight[1];
       		iceblock3_material[0].l[0].l.dir[2] = kwlight[2];
		gSPLight(graphPtr++ ,(&iceblock3_material[0].l[0]),1);
		gSPLight(graphPtr++ ,(&iceblock3_material[0].a),2);
	}

//hontai
	if (kwanm_bitcheckevflag (num,jgm_ice)) {
		#if 0
	       	iceblock3_material[0].a.l.col[0] =(uchar)testx;
       		iceblock3_material[0].a.l.col[1] =(uchar)testy;
	       	iceblock3_material[0].a.l.col[2] =(uchar)testz;

       		iceblock3_material[0].a.l.colc[0] =(uchar)testx;
       		iceblock3_material[0].a.l.colc[1] =(uchar)testy;
       		iceblock3_material[0].a.l.colc[2] =(uchar)testz;
		#endif

		texzahyou[kx] =  car->position[kx];
       		texzahyou[ky] =  car->position[ky];
       		texzahyou[kz] =  car->position[kz];

		texangle[kx] =0;
		texangle[ky] =0;
		texangle[kz] =0;

		kwpolygon3D_iceblock (texzahyou,texangle,0.02,iceblock3_modelT);
	}

//Broken ICE
//	if (kwanm_bitcheckevflag (num,jgm_icebomb)) {
		texangle[kx] =kakera_ang[kx];
       		texangle[ky] =kakera_ang[ky];
       		texangle[kz] =kakera_ang[kz];

		gSPDisplayList(graphPtr++, &kwtexture_ia_aa_zb_bl_init);

		gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
		gSPSetGeometryMode	(graphPtr++,G_SHADE|G_SHADING_SMOOTH|G_LIGHTING);

		kwloadtextureblock_ia_16b (iceblock_txt,32,32);

	       	cnt =0;
		for (i=0;i<effectkazumax2;i++) {
	       		num2 = effectallocptr2[i];
	       		if ((num2 nequ alloc_clear) and (kwanm[num2].anmptr gte 1)) {
				kwcreateaffine3D (kwanm[num2].p,texangle,kwanm[num2].scale);
				gSPVertex(graphPtr++ ,&vtx_ktriangle32x32_light[0], 3, 0);
				gSPDisplayList(graphPtr++, &kwsetTriangle);

			    	cnt++;
		       	}
	       	}

  //		osSyncPrintf ("player = %d \n",player);
  //		osSyncPrintf ("kazu = %d\n \n",cnt);

		gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
		gSPClearGeometryMode	(graphPtr++,G_LIGHTING);
    		gSPTexture		(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
//	}
}

extern void kwdisplay_iceblock_kage (int player)
{
	int num;
	CAR *car;
	car = kart1+player;

	num = jugemuallocptr[player];
	if (kwanm_bitcheckevflag (num,jgm_icekage))  {
//kage
		texzahyou[kx] =  car->position[kx];
       		texzahyou[ky] =  car->ground-6.5;
       		texzahyou[kz] =  car->position[kz];

       		texangle[kx] =0;
       		texangle[ky] =0;
       		texangle[kz] =0;

		gSPLight(graphPtr++ ,(&iceblock3_material[0].l[0]),1);
       		gSPLight(graphPtr++ ,(&iceblock3_material[0].a),2);

		kwpolygon3D_icekage (texzahyou,texangle,0.02,iceblock3_modelT,255);
	}
}
#endif

/************************************************************************************************/
/*												*/
/*		   	     		SNOW MAN Display					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_snowman_kakera (int player)
{
	int num,i;
	CAMERA *camera;
	camera = camera1+player;

	kwloadtexture_ci8_aa_zb_bl (ci8_snowkakerapal,ci8_snowkakeraidx,32,32);

	for (i=0;i< effectkazumax2;i++) {
		num = effectallocptr2[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 0)) {
			kwcheck_vis_area (num,player,kwdeg60,500);
			if (kwanm_bitcheckflag (num,kf_visible)) {

		  		//Modeling Henkan
	       	       		kwanm[num].texang[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
	  	       		kwcreateaffine3D_anm (num);
				//DRAW
				gSPDisplayList(graphPtr++,kwsettile32x32);
		       	}
	       	}
       	 }
	//finish
    		gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}


static void kwdisplay_snowman_sub (int player)
{
	int i,num;
	CAMERA *camera;
	camera = camera1+player;

	for (i=0;i < snowman_kazu;i++) {
		num = objallocptr[i];
		if (kwanm[num].anmptr gte 2) {
			kwcheck_vis_area (num,player,kwdeg60,600);
	      		if (kwanm_bitcheckflag (num,kf_visible)) {

				//(angle)
		       		texangle[kx] = kwanm[num].texang[kx];
       				texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
       				texangle[kz] = kwanm[num].texang[kz];

				//BODY
				if (kwanm_bitcheckflag (num,kf_dispon)){
					kwtexture3D_ci8_aa_zb_bl (kwanm[num].p,texangle,kwanm[num].scale,kwanm[num].texaddr,kwanm[num].indexaddr,kwanm[num].vtxaddr,64,64,64,32);

				}
				//FACE
				num = objallocptr2[i];
				//(angle)
		       		texangle[kx] = kwanm[num].texang[kx];
       				texangle[kz] = kwanm[num].texang[kz];
 				kwtexture3D_ci8_aa_zb_bl (kwanm[num].p,texangle,kwanm[num].scale,kwanm[num].texaddr,kwanm[num].indexaddr,kwanm[num].vtxaddr,64,64,64,32);

			}
		}
	}
}


extern void kwdisplay_snowman (int player)
{
	int i,num;

//snowman
		kwdisplay_snowman_sub (player);
//snowman kakera
	kwdisplay_snowman_kakera (player);
	
}

/************************************************************************************************/
/*												*/
/*		   	     		Jugemu Display  					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_jugemu (int player)
{
	float x,z,cx,cz;
	int num;
	CAMERA *camera;

	num = jugemuallocptr[player];
	camera = camera1+player;

	if (kwanm_bitcheckflag (num,kf_dispon)) {

//hontai
       	    	kwanm[num].texang[kx] = 0x0000;
       		kwanm[num].texang[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
       		kwanm[num].texang[kz] = 0x8000;

		if (kwanm_bitoffcheckevflag (num,jgm_warp)) {
		     kwtexture3D_ci8_aa_zb_bl (kwanm[num].p,kwanm[num].texang,kwanm[num].scale,kwanm[num].texaddr,kwanm[num].indexaddr,kwanm[num].vtxaddr,kwanm[num].texsizex,kwanm[num].texsizey,kwanm[num].texsizex,kwanm[num].texsizey/2);
		}
		else {
	  	       	kwtexture3D_ci8_pcl_aa_zb_bl (kwanm[num].p,kwanm[num].texang,kwanm[num].scale,kwanm[num].alpha,kwanm[num].texaddr,kwanm[num].indexaddr,kwanm[num].vtxaddr,kwanm[num].texsizex,kwanm[num].texsizey,kwanm[num].texsizex,kwanm[num].texsizey/2);
		}
//kage
		if (race_screen_mode equ FULL_SCREEN) {
			cx = kwanm[num].p[kx]-kwcamera->camera_pos[COORD_X];
			cz = kwanm[num].p[kz]-kwcamera->camera_pos[COORD_Z];

			if (cx lt 0) cx= -cx;
			if (cz lt 0) cz= -cz;

		   	if ( (cx+cz) lte 200.0) {
		       		kwdraw_kage3D (&jugemubump[player],kwanm[num].p,0.35);
			}
		}
	}

}

	#if 0
	kwrmonPrintf ("x = %f \n",kwanm[num].p[kx]);
	kwrmonPrintf ("y = %f \n",kwanm[num].p[ky]);
	kwrmonPrintf ("z = %f \n",kwanm[num].p[kz]);
	#endif

	#if 0
	kwrmonPrintf ("x1 = %f \n",texzahyou[COORD_X]);
	kwrmonPrintf ("y1 = %f \n",texzahyou[COORD_Y]);
	kwrmonPrintf ("z1 = %f \n",texzahyou[COORD_Z]);
	#endif


	#if 0
	kwrmonPrintf ("kx1 = %f \n",kagezahyou[COORD_X]);
	kwrmonPrintf ("ky1 = %f \n",kagezahyou[COORD_Y]);
	kwrmonPrintf ("kz1 = %f \n",kagezahyou[COORD_Z]);
	#endif			      

	#if 0
	kwrmonPrintf ("angx  = %x \n"  ,kageangle[COORD_X]);
	kwrmonPrintf ("angy  = %x \n"  ,kageangle[COORD_Y]);
	kwrmonPrintf ("angz  = %x \n\n",kageangle[COORD_Z]);
	#endif

	#if 0
	kwrmonPrintf ("texzahyoux  = %f \n",texzahyou[COORD_X]);
	kwrmonPrintf ("texzahyouy  = %f \n",texzahyou[COORD_Y]);
	kwrmonPrintf ("texzahyouz  = %f \n",texzahyou[COORD_Z]);

	kwrmonPrintf ("testang[kx]  = %x \n",texangle[COORD_X]);
	kwrmonPrintf ("testang[ky]  = %x \n",texangle[COORD_Y]);
	kwrmonPrintf ("testang[kz]  = %x \n",texangle[COORD_Z]);

	kwrmonPrintf ("pal addr    = %x \n",kwanm[num].texaddr);
	kwrmonPrintf ("index addr  = %x \n\n",kwanm[num].indexaddr);
	#endif

	#if 0
	kwrmonPrintf ("testang[kx]  = %x \n",texangle2[COORD_X]);
	kwrmonPrintf ("testang[ky]  = %x \n",texangle2[COORD_Y]);
	kwrmonPrintf ("testang[kz]  = %x \n\n",texangle2[COORD_Z]);

	#endif

	#if 0
	texzahyou[COORD_X] = mykart1->position[COORD_X]+jugemux;
	texzahyou[COORD_Y] = mykart1->position[COORD_Y]-jugemuy;
	texzahyou[COORD_Z] = mykart1->position[COORD_Z]+jugemuz;
	#endif

	#if 0
	kwrmonPrintf ("cx  = %f \n",camera1->camera_pos[COORD_X]);
	kwrmonPrintf ("cy  = %f \n",camera1->camera_pos[COORD_Y]);
	kwrmonPrintf ("cz  = %f \n",camera1->camera_pos[COORD_Z]);

	kwrmonPrintf ("sx  = %f \n",texzahyou[COORD_X]-camera1->camera_pos[COORD_X]);
	kwrmonPrintf ("sy  = %f \n",texzahyou[COORD_Y]-camera1->camera_pos[COORD_Y]);
	kwrmonPrintf ("sz  = %f \n\n\n",texzahyou[COORD_Z]-camera1->camera_pos[COORD_Z]);

	#endif

/************************************************************************************************/
/*												*/
/*		   	     		Doshin Display  					*/
/*												*/
/************************************************************************************************/
#define	LDIRX1	  0
#define	LDIRY1	  0
#define	LDIRZ1	120
#define	AMBDIV1	3

Lights1 dosun_material[]={
	{{255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0,255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0},{255,255,255,0,255,255,255,0,0,-120,0,0}},
	{{255/AMBDIV1,255/AMBDIV1,0/AMBDIV1,0,255/AMBDIV1,255/AMBDIV1,0/AMBDIV1,0},{255,255,0,0,255,255,0,0,0,120,0,0}},
	{{255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0,255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0},{255,255,255,0,255,255,255,0,-66,82,-55,0}},
	{{255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0,255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0},{255,255,255,0,255,255,255,0,LDIRX1,LDIRY1,LDIRZ1,0}},
	{{255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0,255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0},{255,255,255,0,255,255,255,0,LDIRX1,LDIRY1,LDIRZ1,0}},
	{{255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0,255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0},{255,255,255,0,255,255,255,0,LDIRX1,LDIRY1,LDIRZ1,0}},
	{{255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0,255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0},{255,255,255,0,255,255,255,0,LDIRX1,LDIRY1,LDIRZ1,0}},
	{{255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0,255/AMBDIV1,255/AMBDIV1,255/AMBDIV1,0},{255,255,255,0,255,255,255,0,LDIRX1,LDIRY1,LDIRZ1,0}},
};
extern void kwset_doshin_lightvec (int num)
{
	kwcalc_lightvector ();
	dosun_material[0].l[0].l.dir[0] = kwlight[0];
	dosun_material[0].l[0].l.dir[1] = kwlight[1];
	dosun_material[0].l[0].l.dir[2] = kwlight[2];
}

extern void kwset_doshin_light (int num)
{
	switch (kwanm[num].output){
		case 0:
			gSPLight(graphPtr++ ,(&dosun_material[0].l[0]),1);
			gSPLight(graphPtr++ ,(&dosun_material[0].a),2);
		break;

		case 1:
			gSPLight(graphPtr++ ,(&dosun_material[1].l[0]),1);
			gSPLight(graphPtr++ ,(&dosun_material[1].a),2);
		break;

		case 2:
			gSPLight(graphPtr++ ,(&dosun_material[2].l[0]),1);
			gSPLight(graphPtr++ ,(&dosun_material[2].a),2);
		break;


		case 3:
			gSPLight(graphPtr++ ,(&dosun_material[3].l[0]),1);
			gSPLight(graphPtr++ ,(&dosun_material[3].a),2);
		break;

		case 4:
			gSPLight(graphPtr++ ,(&dosun_material[4].l[0]),1);
			gSPLight(graphPtr++ ,(&dosun_material[4].a),2);
		break;
	}
}

extern void kwdisplay_doshin_sub (int num)
{
	if ((kwanm[num].anmptr >1) and (kwanm_bitoffcheckevflag (num,evf_broken)) ){
//kage
		kwdraw_kage3D_flat (num,1.75);
//hontai
		kwcreateaffine3D    (kwanm[num].p,kwanm[num].texang,kwanm[num].scale);

		kwset_doshin_light (num);
		gSPDisplayList	    (graphPtr++, &kwpolygon_tex_slight_init);
		gDPSetTextureLUT (graphPtr++ ,G_TT_RGBA16);
		gDPLoadTLUT_pal256 (graphPtr++ ,dossn_facepal);
		kwloadtextureblock_ci_8b_mr (kwanm[num].indexaddr,16,64,4);
       		gSPDisplayList		(graphPtr++, kwanm[num].shape);

	}
}
#if 0
static void kwcheck_doshin_flags (int num,int player)
{
	CAMERA *camera;
	camera = camera1+player;

	switch (kwanm[num].type){
		case dosun_normal:
			if (kwanm_bitoffcheckevflag (num,evf_turn)){
					if (kwdistance lte (300*300) ) {
					if (kwanm_checkobjang_camera_xz (num,camera,kwdeg30)){
		       		       		kwanm_setevflag (num,evf_turn);
					}
				}
			}
		break;

		case dosun_ori:
			if (kwdistance lte (100*100) ) kwanm_setevflag (num,evf_warau);
		break;

	}
}
#endif

extern void kwdisplay_doshin (int player)
{
	int num,i,j;
	short front,back;
	CAMERA *camera;
	CAR *car;
	camera = camera1+player;
	car = kart1+player;

//Clear Flag !!!!
	if (player equ kwplayer1){
		for (i=0;i < doshin_kazu;i++) {
       			num = objallocptr[i];
       			kwanm_clrflag (num,(kf_areain+kf_visible+kf_near));
       			kwanm_clrevflag (num,(evf_shake+evf_warau));
		}
	}

//light calculate
		kwset_doshin_lightvec (num);

//DOSUN Body
	for (i=0;i < doshin_kazu;i++) {
		num = objallocptr[i];
		back  = kwanm[num].mappoint-1;
		front = kwanm[num].mappoint+1;

		if (sequence_mode nequ ENDINGSEQUENCE) {
			if ((kwpoint[player] gte back) and (kwpoint[player] lte front)) {
				if (kwanm_vischeck_camera_xz (num,camera,kwdeg180)){
		       			kwdisplay_doshin_sub (num);
		       		}
			}
		}
		else {
       			kwdisplay_doshin_sub (num);
		}
		#if 0
		if ((kwpoint[player] gte back) and (kwpoint[player] lte front)) {
			kwanm_setflag (num,kf_near);
			if ( kwpoint[i] equ kwanm[num].mappoint) kwanm_setflag (num,kf_areain);
			if (kwanm_vischeck_camera_xz (num,camera,kwdeg120)){
				kwanm_setflag (num,kf_visible);

				if (kwanm_bitcheckflag (num,kf_distance)){
					 kwdistance = kwanm_calc_distance_camera_xz (num,camera);
				}
				kwcheck_doshin_flags (num,player);
			       	kwdisplay_doshin_sub (num);
			}
		}
		#endif
	}

//DOSUN Broken

	gSPDisplayList(graphPtr++, kwtexture_rgba_aa_zb_bl_init);
	gDPSetCombineMode (graphPtr++,G_CC_MODULATERGBA,G_CC_MODULATERGBA);

	//toriaezu 2 no light de
	gSPNumLights(graphPtr++,NUMLIGHTS_1);
	gSPLight(graphPtr++ ,(&dosun_material[2].l[0]),1);
	gSPLight(graphPtr++ ,(&dosun_material[2].a),2);

	gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
	gSPSetGeometryMode	(graphPtr++,G_SHADE|G_SHADING_SMOOTH|G_LIGHTING);

	kwloadtextureblock_rgba_16b (dossn_skin,32,32);

	for (i=0;i<effectkazumax3;i++) {
		num = effectallocptr3[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 0)and (kwanm[num].type equ objnum_DOSUN_BROKEN)){
			if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
				kwcreateaffine3D (kwanm[num].p,kwanm[num].texang,kwanm[num].scale);
				gSPVertex(graphPtr++ ,&vtx_dosuntriangle32x32_light[0], 3, 0);
				gSPDisplayList(graphPtr++, &kwsetTriangle);
			}
		}
	}

	gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);
	gSPClearGeometryMode	(graphPtr++,G_LIGHTING);
	gSPTexture		(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);

//DOSUN Smoke
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);

//	kwloadtextureblock_a_8b (a8_smoke,32,32);
//	toumeimode (255,255,255,255);
	kwloadtextureblock_ia_8b ((uchar *)Smoke3,32,32);
       	smokemode (0);

	texangle[kx] = 0;
       	texangle[kz] = 0x8000;

	for (i=0;i<effectkazumax2;i++) {
		num = effectallocptr2[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 1)and (kwanm[num].type equ objnum_DOSUN_SMOKE)){
			if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
		   		kwsetprimcolor	(255,255,255,kwanm[num].alpha);
	       	       		texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
		       		kwset_tile (kwanm[num].p,texangle,kwanm[num].scale,vtx_ktile32x32);
			}
		}
	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Fuusen Display  					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_fuusen_sub (int num,int player,int vtxnum){
	CAMERA *camera;
	camera = camera1+player;

	if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
	//	texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
       		texangle[kz] = 0x8000+kwanm[num].stack[6];
       		kwcreateaffine3D (kwanm[num].p,texangle,kwanm[num].scale);

       		kwset2color (kwanm[num].stack[0],kwanm[num].stack[1],kwanm[num].stack[2],kwanm[num].stack[3],kwanm[num].stack[4],kwanm[num].stack[5],kwanm[num].alpha);
       		gSPVertex(graphPtr++ ,&vtx_ktile64x64_bl[vtxnum], 4, 0); 
       		gSPDisplayList(graphPtr++, &kwsetTile);
	}
}

extern void kwdisplay_fuusen (int player){
	int i,num;

//common init
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_aa_zb_bl_init);
 	gDPLoadTLUT_pal256(graphPtr++,moji_color);
	icemode (0,0,0,0,0,0,0);

	texangle[kx] = 0x0000;
	texangle[ky] = 0x8000;

// ballon 1
	kwloadtextureblock_ci_8b ((uchar *)Balloon1,64,32);
	for (i=0;i< fuusen_kazu;i++) {
 		num = effectallocptr3[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 1)){
       			kwdisplay_fuusen_sub (num,player,0);
	 	}
 	}
// ballon 2
	kwloadtextureblock_ci_8b ((uchar *)Balloon2,64,32);
	for (i=0;i< fuusen_kazu;i++) {
 		num = effectallocptr3[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 1)){
       			kwdisplay_fuusen_sub (num,player,4);
	 	}
 	}
}


/************************************************************************************************/
/*												*/
/*		   	     		Train Smoke Display  					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_train_smoke_sub (int num,int player){
	CAMERA *camera;
	camera = camera1+player;

	if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 1) and (kwanm[num].type equ objnum_TRAIN_SMOKE)){

		if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
			kwset2color (kwanm[num].output,kwanm[num].output,kwanm[num].output,0,0,0,kwanm[num].alpha);
	//		kwset2color (testred,testgreen,testblue,testred2,testgreen2,testblue2,kwanm[num].alpha);
	//		kwsetprimcolor	(kwanm[num].output,kwanm[num].output,kwanm[num].output,kwanm[num].alpha);
		     	texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
	       		kwset_tile (kwanm[num].p,texangle,kwanm[num].scale,vtx_ktile32x32);
		}
	}
}
extern void kwdisplay_train_smoke (int player){
	int i,num;
	CAMERA *camera;
	camera = camera1+player;

// Smoke
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);
	kwloadtextureblock_a_8b (a8_smoke,32,32);
   	color2mode (255,255,255,255,255,255,255);

	texangle[kx] = 0;
       	texangle[kz] = 0x8000;

//train1
	if (SL[0].player_near_flg) {
		if(kwvischeck_camera_xz (SL[0].head.pos,camera,kwdeg90)){
			for (i=0;i<effectkazumax2;i++) {
				num = effectallocptr2[i];
				kwdisplay_train_smoke_sub (num,player);
			}
 		}
	}

//train 2
	if (SL[1].player_near_flg) {
		if(kwvischeck_camera_xz (SL[1].head.pos,camera,kwdeg90)){
			for (i=0;i<effectkazumax3;i++) {
				num = effectallocptr3[i];
				kwdisplay_train_smoke_sub (num,player);
			}
		}
	}

}

/************************************************************************************************/
/*												*/
/*		   	     		Ship Smoke Display  					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_ship_smoke_sub (int num,int player){
	CAMERA *camera;
	camera = camera1+player;
	if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 1) and (kwanm[num].type equ objnum_SHIP_SMOKE)){
		if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
			kwset2color (kwanm[num].output,kwanm[num].output,kwanm[num].output,kwanm[num].input,kwanm[num].input,kwanm[num].input,kwanm[num].alpha);
	//		kwsetprimcolor	(kwanm[num].output,kwanm[num].output,kwanm[num].output,kwanm[num].alpha);
       		     	texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
       			kwset_tile (kwanm[num].p,texangle,kwanm[num].scale,vtx_ktile32x32);
		}
	}
}
extern void kwdisplay_ship_smoke (int player){
	int i,num;
	CAMERA *camera;
	camera = camera1+player;

// Smoke
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);
	kwloadtextureblock_a_8b (a8_smoke,32,32);
  //	toumeimode (255,255,255,255);
   	color2mode (255,255,255,255,255,255,255);
	texangle[kx] = 0;
       	texangle[kz] = 0x8000;

//ship1
	if (ship[0].player_near_flg) {
		if(kwvischeck_camera_xz (ship[0].pos,camera,kwdeg90)){
			for (i=0;i<effectkazumax2;i++) {
				num = effectallocptr2[i];
				kwdisplay_ship_smoke_sub (num,player);
			}
		}
	}

//ship 2
	if (ship[1].player_near_flg) {
		if(kwvischeck_camera_xz (ship[1].pos,camera,kwdeg90)){
			for (i=0;i<effectkazumax3;i++) {
				num = effectallocptr3[i];
				kwdisplay_ship_smoke_sub (num,player);
			}
 		}
 	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Koopa Fire Display  					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_koopa_fire_sub (int num,int player){
	CAMERA *camera;
	camera = camera1+player;

       	if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
		if (kwanm[num].type equ objnum_FIRE_WALL){
       			color2mode (255,kwanm[num].output,0,kwanm[num].input,0,0,kwanm[num].alpha);
       		}
      		else {
       			kwsetprimcolor	(255,kwanm[num].output,0,kwanm[num].alpha);
       		}
       		texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
       		kwset_tile (kwanm[num].p,texangle,kwanm[num].scale,vtx_ktile32x32);
	}
}

extern void kwdisplay_fire (int player){
	int i,num;
	CAMERA *camera;
	camera = camera1+player;
// Fire
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);
	kwloadtextureblock_a_8b (ko_fire+kw4gftimer*32*32,32,32);
	splashmode (0,0,0,255);
	texangle[kx] = 0;
       	texangle[kz] = 0x8000;

	for (i=0;i<effectkazumax;i++) {
 		num = effectallocptr[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 2)){
       			kwdisplay_koopa_fire_sub (num,player);
	 	}
 	}
}


/************************************************************************************************/
/*												*/
/*		   	     		Kame Fire Display  					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_kame_fire_sub (int num,uchar color,CAMERA *camera){
       	if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
		switch (color){
			//RED
			case OGA_KAME_FIRE_RED:
  				kwset2color (230,255,255, 0,0,255,kwanm[num].alpha);
				//kwset2color (testred,testgreen,testblue,testred2,testgreen2,testblue2,kwanm[num].alpha);
			break;

			//GREEN
			case OGA_KAME_FIRE_BLUE:
				kwset2color (255,255,150,255, 0, 0,kwanm[num].alpha);
				//kwset2color (testred,testgreen,testblue,testred2,testgreen2,testblue2,kwanm[num].alpha);
			break;

			//TOGEKAME
			case OGA_KAME_FIRE_TOGE:
			      	kwset2color (255,230,255,255,0,150,kwanm[num].alpha);
				//kwset2color (testred,testgreen,testblue,testred2,testgreen2,testblue2,kwanm[num].alpha);
			break;

			//TIMATU
			case 3:
			  	kwset2color (255,255,30,255,0,0,kwanm[num].alpha);
			break;
		}

	     	texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
		kwset_tile (kwanm[num].p,texangle,kwanm[num].scale,vtx_ktile32x32);
		//kwset_tile (kwanm[num].p,texangle,testscale,vtx_ktile32x32);
	}
}

extern void kwdisplay_kame_fire (int player){
	int i,num;
	CAMERA *camera;
	camera = camera1+player;
// Fire
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);
	kwloadtextureblock_a_8b (ko_fire+kw4gftimer*32*32,32,32);
   	color2mode (255,255,255,255,255,255,255);
	texangle[kx] = 0;
       	texangle[kz] = 0x8000;

	for (i=0;i< firekazumax;i++) {
 		num = fireallocptr[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 1)){
			if (kwanm[num].anmtype equ 3)	kwcheck_vis_area (num,player,kwdeg90,1300);
	       		else 				kwcheck_vis_area (num,player,kwdeg90,500);

	       		if (kwanm_bitcheckflag (num,kf_visible)) {
	       			kwdisplay_kame_fire_sub (num,kwanm[num].anmtype,camera);
 	       		}
	 	}
 	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Star Display  						*/
/*												*/
/************************************************************************************************/
//Hoshi
static void kwdisplay_star_sub (int num,CAMERA *camera){
		
	     	texangle[kx] = kwlook_camera_pitch (kwanm[num].p[kz],kwanm[num].p[ky],camera);
	     	texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
		texangle[kz] = kwanm[num].texang[kz];

  		kwsetprimcolor	(kwanm[num].stack[0],kwanm[num].stack[1],kwanm[num].stack[2],kwanm[num].alpha);
		kwcreateaffine3D (kwanm[num].p,texangle,kwanm[num].scale);
       		gSPVertex(graphPtr++ ,&vtx_ktile32x32[0], 4, 0); 
       		gSPDisplayList(graphPtr++, &kwsetTile);
}

extern void kwdisplay_star (int player){
	int i,num;
	CAMERA *camera;
	camera = camera1+player;
// hoshi
	gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);
	kwloadtextureblock_ia_8b ((uchar *)Hoshi,32,32);
	toumeimode (255,255,0,255);
	texangle[kx] = 0;

	for (i=0;i< effectkazumax3;i++) {
 		num = effectallocptr3[i];
		if ((num nequ alloc_clear) and (kwanm[num].anmptr gt 1)){
       			kwdisplay_star_sub (num,camera);
	 	}
 	}
}
/************************************************************************************************/
/*												*/
/*		   	     		Choropu Display  					*/
/*												*/
/************************************************************************************************/
static void kwdisplay_choropu_sub (int num,int player)
{
	CAMERA *camera;

	camera = camera1+player;

	if (kwanm[num].anmptr >2) {
		kwcheck_vis_area (num,player,kwdeg60,300);
		if (kwanm_bitcheckflag (num,kf_visible)) {

		//(angle)
	       		texangle[COORD_X] = kwanm[num].texang[kx];
       			texangle[COORD_Y] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
       			texangle[COORD_Z] = kwanm[num].texang[kz];

		//hontai
 	     		kwtexture3D_ci8_aa_zb_bl_mr (kwanm[num].p,texangle,kwanm[num].scale,kwanm[num].texaddr,kwanm[num].indexaddr,vtx_ktile64x64_bl_mr,32,64,32,64,5);
		}
	}
}

extern void kwdisplay_hole_sub (int num)
{
	if ( (kwanm[num].anmptr gt 0) and (kwanm_bitcheckflag (num,kf_onsurf)) ){
//(position)
		kagezahyou[kx] = kwanm[num].p[kx];
       		kagezahyou[ky] = kwanm[num].ground+0.8;
       		kagezahyou[kz] = kwanm[num].p[kz];
//angle
		
		kagedirection[kx] = kwanm[num].v[kx];
		kagedirection[ky] = kwanm[num].v[ky];
		kagedirection[kz] = kwanm[num].v[kz];

		kwdraw_hole3D (kwanm[num].scale);

//		osSyncPrintf ("vx=%f \n",kwanm[num].v[kx]);
//		osSyncPrintf ("vy=%f \n",kwanm[num].v[ky]);
//		osSyncPrintf ("vz=%f \n\n",kwanm[num].v[kz]);

	}
}

extern void kwdisplay_hole (int player)
{
	int i,num;
	for (i=0;i < choro_hole_kazu;i++) {
		num = effectallocptr[i];
		kwdisplay_hole_sub (num);

	}
}
static void kwdisplay_tuchi (int player)
{
	int num,i;
	CAMERA *camera;
	camera = camera1+player;

	gSPDisplayList	(graphPtr++, &kwtexture_rgba_aa_zb_bl_init);
	kwloadtextureblock_rgba_16b (rgba_tuchi,16,16);

	for (i=0;i< effectkazumax2;i++) {
		num = effectallocptr2[i];
		if (kwanm[num].anmptr gt 0) {
			kwcheck_vis_area (num,player,kwdeg60,200);
			if (kwanm_bitcheckflag (num,kf_visible)) {
			       	if (modelingnum lte effectmtxmax) {	//96/11/18 nichi taisaku !!!!
		  			//Modeling Henkan
	       	       	       		kwanm[num].texang[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
	  	       	       		kwcreateaffine3D_anm (num);
			       		//DRAW
			       		gSPDisplayList(graphPtr++,kwsettile16x16);
			       	}
		       	}
	       	}
       	 }
	//finish
    		gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

extern void kwdisplay_choropu (int player)
{
	int num,i;
//choropu hontai
	for (i=0;i < choro_kazu1;i++) {
		num = objallocptr[i];
		kwdisplay_choropu_sub (num,player);
	}
	
	for (i=0;i < choro_kazu2;i++) {
		num = objallocptr2[i];
		kwdisplay_choropu_sub (num,player);
	}

	for (i=0;i < choro_kazu3;i++) {
		num = objallocptr3[i];
		kwdisplay_choropu_sub (num,player);
	}
//choropu ana
	kwdisplay_hole (player);

//choropu tuchi
	kwdisplay_tuchi (player);
}

/************************************************************************************************/
/*												*/
/*		   	     		Goal Flag Display  					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_goalflag_sub (int num)
{
	if (kwanm[num].anmptr >1) {
	//hontai
		gSPDisplayList(graphPtr++, &kwpolygon_init);
//		kwset_doshin_light (num);
      	       	kwcreateaffine3D (kwanm[num].p,kwanm[num].ang,kwanm[num].scale);
       		if (pause_flag equ 0) kwanm[num].input = (int)draw_localskelton_shape((Hierarchy *)kwanm[num].shape,(AnimePtr *)kwanm[num].vtxaddr,0,kwanm[num].input);
		else	draw_localskelton_shape((Hierarchy *)kwanm[num].shape,(AnimePtr *)kwanm[num].vtxaddr,0,kwanm[num].input);
	}
}
extern void kwdisplay_goalflag (int player)
{
	int num,i;
//	kwset_doshin_lightvec (num);

	for (i=0;i < goalflag_kazu;i++) {
		num = objallocptr[i];
       		kwcheck_vis_area (num,player,kwdeg90,1500);
       		if (kwanm_bitcheckflag (num,kf_visible)) kwdisplay_goalflag_sub (num);
	}
}


/************************************************************************************************/
/*												*/
/*		   	     		Kamome Display  					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_kamome_sub (int num)
{
	if (kwanm[num].anmptr >1) {
	//hontai
      		kwcreateaffine3D (kwanm[num].p,kwanm[num].ang,kwanm[num].scale);
      		gSPDisplayList	 (graphPtr++, &kwpolygon_slight_init);

       		if (pause_flag equ 0) kwanm[num].input = (int)draw_localskelton_shape((Hierarchy *)kwanm[num].shape,(AnimePtr *)kwanm[num].vtxaddr,0,kwanm[num].input);
		else		      draw_localskelton_shape((Hierarchy *)kwanm[num].shape,(AnimePtr *)kwanm[num].vtxaddr,0,kwanm[num].input);	

	}
}
extern void kwdisplay_kamome (int player)
{
	int num,i,distance;

	for (i=0;i < kamome_kazu;i++) {
		num = objallocptr2[i];
       		distance = kwcheck_vis_area (num,player,kwdeg120,1500);
		//kamoe cry check
		if (distance lte 800*800){
			kamomecryflag=1;
       			kwanm_setevflag (num,kmf_areain);		
		}

       		if (kwanm_bitcheckflag (num,kf_visible)) kwdisplay_kamome_sub (num);
	}
}


/************************************************************************************************/
/*												*/
/*		   	     		Kani Display  						*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_kani_sub (int num,int player)
{
	CAMERA *camera;
	if (kwanm[num].anmptr >1) {

	camera = camera1+player;
//kage
		kwdraw_kage3D_fast (num,0.50);
//hontai
       		kwanm[num].texang[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
 	     	kwtexture3D_ci8_aa_zb_bl (kwanm[num].p,kwanm[num].texang,kwanm[num].scale,kwanm[num].texaddr,kwanm[num].indexaddr,vtx_ktile64x64_bl,64,64,64,32);

	}
}
extern void kwdisplay_kani (int player)
{
	int num,i;
	for (i=0;i < kani_kazu;i++) {
		num = objallocptr[i];
       		kwcheck_vis_area (num,player,kwdeg60,800);
		if (kwanm_bitcheckflag (num,kf_visible)) kwdisplay_kani_sub (num,player);
	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Shark Display  						*/
/*												*/
/************************************************************************************************/
#if 0
extern void kwdisplay_shark_sub (int num)
{
	if (kwanm[num].anmptr >1) {

//(angle)
       		texangle[COORD_X] = 0x0000;
       		texangle[COORD_Y] = kwanm[num].ang[ky]+0x4000;
       		texangle[COORD_Z] = 0x0000;
//hontai
	kwpolygon3D_tex_slight	(kwanm[num].p,texangle,kwanm[num].scale,kwanm[num].shape);

	}
}
extern void kwdisplay_shark (void)
{
	int num,i;

	if (effect_sw1) {
		for (i=shark_start;i < shark_end;i++) {
			num = effectallocptr[i];
			kwdisplay_shark_sub (num);
		}
	}

}
#endif




/************************************************************************************************/
/*												*/
/*		   	     		Harinezumi Display  					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_harinezumi_sub (int num,int player)
{
	CAMERA *camera;
	if (kwanm[num].anmptr gt 1) {
		camera = camera1+player;
	//kage
		kwdraw_kage3D_bump (num,0.70);

	//hontai
       		kwanm[num].texang[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
       		kwtexture3D_ci8_aa_zb_bl (kwanm[num].p,kwanm[num].texang,kwanm[num].scale,kwanm[num].texaddr,kwanm[num].indexaddr,kwanm[num].vtxaddr,64,64,64,32);
  	}
}
extern void kwdisplay_harinezumi (int player)
{
	int num,i;
	uint distance;

//Display Harinezumi
	for (i=0;i < harinezumi_kazu;i++) {
		num = objallocptr2[i];
       		distance = kwcheck_vis_area (num,player,kwdeg90,1000);
		if (kwanm_bitcheckflag (num,kf_visible)){
			kwanm_setflag (num,kf_anybody);
			if (distance lte (100*100)) kwanm_setflag (num,kf_kage);
			else			    kwanm_clrflag (num,kf_kage);

			if (distance lte (600*600)) kwanm_setflag (num,kf_bgcheckon);
			if (distance lte (580*580)) kwdisplay_harinezumi_sub (num,player);
		}
	}
}
/************************************************************************************************/
/*												*/
/*		   	     		Ping Display  			[penguin]		*/
/*												*/
/************************************************************************************************/
static void kwcheck_ping_light (int num){
	if (kwanm_bitcheckevflag (num,pgf_kururi)) {
		gSPSetGeometryMode	(graphPtr++,G_SHADE|G_SHADING_SMOOTH);
		gSPClearGeometryMode	(graphPtr++,G_LIGHTING);
	}
	else {
		gSPSetGeometryMode	(graphPtr++,G_SHADE|G_SHADING_SMOOTH|G_LIGHTING);
	}
}
static void kwdisplay_ping_sub (int num,uint distance,uint shadow_distance)
{
	FVector	pos;
	uint check_distance;

	if (kwanm[num].anmptr >1) {
	//kage
		if (kwanm_bitcheckflag (num,kf_kage)) {
			if (kwanm_bitcheckevflag (num,pgf_mrshadow)){
				if (distance lte shadow_distance) {
					pos[kx]=kwanm[num].p[kx];
       			       		pos[ky]=kwanm[num].p[ky]-1.0;
       			       		pos[kz]=kwanm[num].p[kz];
       		       	       		kwcreateaffine3D_icekage(pos,kwanm[num].texang,kwanm[num].scale);
			      		gSPDisplayList	 (graphPtr++, &kwpolygon_slight_init);
       		       			draw_localskelton_shape((Hierarchy *)kwanm[num].shape,(AnimePtr *)kwanm[num].vtxaddr,kwanm[num].anmtype,kwanm[num].anmnum);
				}
			}
			else{
			     if (distance lte 300*300) kwdraw_kage3D_flat (num,1.50);
			}
		}

	//hontai
		kwcreateaffine3D (kwanm[num].p,kwanm[num].texang,kwanm[num].scale);
		gSPDisplayList	 (graphPtr++, &kwpolygon_slight_init);
       		draw_localskelton_shape((Hierarchy *)kwanm[num].shape,(AnimePtr *)kwanm[num].vtxaddr,kwanm[num].anmtype,kwanm[num].anmnum);
	}
}
extern void kwdisplay_ping (int player)
{
	int num,i;
	uint distance,output,shadow_distance;
	ushort check_ang;

//mirror kage distance
	if      (player_number equ 1) shadow_distance =500*500;
	else if (player_number equ 2) shadow_distance =400*400;
	else			      shadow_distance =300*300;	

	for (i=0;i < ping_kazu;i++) {
		num = objallocptr[i];
		if (kwanm[num].anmptr >1) {

			//player =1
			if (player_number equ 1) {
				if (i equ 0) {
					distance = 1500;
					check_ang = kwdeg90;
		       		}
				else {
					if (kwanm_bitcheckevflag (num,pgf_mawaru)){
						//mawaru
						distance = 800;
						check_ang = kwdeg90;
					}
					else	{
						//suberu
						distance = 1000;
						check_ang = kwdeg90;
					}
				}
			}
			//player >1
			else 	{
				if (kwanm_bitcheckevflag (num,pgf_mawaru)) {
					//suberu
					distance = 500;
					check_ang = kwdeg90;
				}
				else	{
					//suberu
					distance  = 600;
					check_ang = kwdeg120;
				}
			}

	       		output = kwcheck_vis_area (num,player,check_ang,distance);
	       		if (kwanm_bitcheckflag (num,kf_visible)) kwdisplay_ping_sub (num,output,shadow_distance);
		}
	}
}

/************************************************************************************************/
/*												*/
/*		   	     		wanwan Display  					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_wanwan_sub (int num,int player)
{
	CAMERA *camera;
	camera = camera1+player;

	if (kwanm[num].anmptr >1) {
		if(kwanm_bitcheckflag (num,kf_lod)) {
			texzahyou[kx]=kwanm[num].p[kx];
	       		texzahyou[ky]=kwanm[num].p[ky]+16.0;
	       		texzahyou[kz]=kwanm[num].p[kz];

       	       		texangle[kx] = 0x0000;
       	       		texangle[ky] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
       	       		texangle[kz] = 0x8000;

 	       		kwtexture3D_rgba_aa_zb_bl_mr (texzahyou,texangle,0.54,wanwan,vtx_ktile64x64_bl_mr,32,64,32,64,5);

		}
		else {
			//kwset_doshin_light (num);
      		       	kwcreateaffine3D (kwanm[num].p,kwanm[num].ang,kwanm[num].scale);
      	       		gSPDisplayList	 (graphPtr++, &kwpolygon_slight_init);
       	       		draw_localskelton_shape((Hierarchy *)kwanm[num].shape,(AnimePtr *)kwanm[num].vtxaddr,0,kwanm[num].anmnum);
		}
	}
}
extern void kwdisplay_wanwan (int player)
{
	int num,i;
	CAMERA *camera;
	camera =camera1+player;

	for (i=0;i < wanwan_kazu;i++) {
		num = objallocptr2[i];
		kwcheck_lod_texture (num,player,1500,2500);
	       	if (kwanm_bitcheckflag (num,kf_visible)) kwdisplay_wanwan_sub (num,player);
	}	
}

/************************************************************************************************/
/*												*/
/*		   	     		Balloon Display  					*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_balloon_sub (int num,int player)
{
	float scale,dist;
	CAMERA *camera;
	camera = camera1+player;

	if (kwanm[num].anmptr >1) {
	//kage
		kwcheck_display_kage (num,player,300);
		dist = kwanm[num].p[ky]-kwanm[num].ground;
		scale = 0.5+20.0/dist;
		kwdraw_kage3D_fast (num,scale);

 		//hontai
		if (kwanm_bitoffcheckflag (num,kf_lod)) {
			kwpolygon3D_slight (kwanm[num].p,kwanm[num].ang,kwanm[num].scale,LUIballoon_model);
			gSPDisplayList(graphPtr++, LUIballoon_modelT);
		}
		else {
			//LOD Polygon 
       			texangle[kx] = kwanm[num].ang[kx];
       			texangle[ky] = (ushort) (0x8000+kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera));
	       		texangle[kz] = kwanm[num].ang[kz];
			kwpolygon3D_slight (kwanm[num].p,texangle,kwanm[num].scale,LUIballoonLOD_model);
			gSPDisplayList(graphPtr++, LUIballoonLOD_modelT);
			if (player_number equ 1) kwanm[num].ang[ky] = 0;
		}
	}
}
extern void kwdisplay_balloon (int player)
{
	int num;
	num = objallocptr[0];

	if (sequence_mode nequ ENDINGSEQUENCE) {
		kwcheck_lod_texture (num,player,1500,3000);
		//	kwcheck_vis_area (num,player,kwdeg60,3000);
		if (kwanm_bitcheckflag (num,kf_visible)) {
			kwdisplay_balloon_sub (num,player);
		}
	}
	else {
			kwanm_clrflag (num,kf_lod);
			kwdisplay_balloon_sub (num,player);
	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Dai Display  						*/
/*												*/
/************************************************************************************************/
static void kwdisplay_dai_sub (int num,int player)
{
	float scale,dist;
	CAMERA *camera;
	camera = camera1+player;
	if (kwanm[num].anmptr gt 1) {
	      //	kwanm[num].p[kx] = kwanm[num].s[kx]+testpos[kx];
	      //	kwanm[num].p[ky] = kwanm[num].s[ky]+testpos[ky];
	       //	kwanm[num].p[kz] = kwanm[num].s[kz]+testpos[kz];
	       //	kwanm[num].ang[kx] = testang[kx];

		kwpolygon3D (kwanm[num].p,kwanm[num].ang,kwanm[num].scale,kwanm[num].shape);
	}
}

extern void kwdisplay_dai (int player)
{
	int i,num;
	for (i=0;i <3;i++) {
		num = objallocptr[i];
		kwdisplay_dai_sub (num,player);

	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Cup Display  						*/
/*												*/
/************************************************************************************************/
static void kwdisplay_cup_sub (int num,int player)
{
	AffineMtx 		affmtx;
        AffineMtx 		aff;
	CAMERA *camera;
	camera = camera1+player;
	if (kwanm[num].anmptr gt 1) {
//	      	kwanm[num].p[kx] = kwanm[num].s[kx]+testpos[kx];
//	      	kwanm[num].p[ky] = kwanm[num].s[ky]+testpos[ky];
//	       	kwanm[num].p[kz] = kwanm[num].s[kz]+testpos[kz];
//		kwanm[num].scale = testscale;
//		kwpolygon3D (kwanm[num].p,kwanm[num].ang,kwanm[num].scale,kwanm[num].shape);

	  	gSPMatrix(graphPtr++, K0_TO_PHYS((u32) &(dynamicp->projection1)),G_MTX_PROJECTION |G_MTX_LOAD|G_MTX_NOPUSH);
  		gSPMatrix(graphPtr++, K0_TO_PHYS((u32) &(dynamicp->viewing)),    G_MTX_MODELVIEW  |G_MTX_LOAD|G_MTX_NOPUSH);

		//Modeling Henkan
		kwcreate_modeling_matrix (affmtx,kwanm[num].p,kwanm[num].ang,kwanm[num].scale);
       		Affine2Mtx (&dynamicp->modeling[modelingnum],affmtx);
       		gSPMatrix (graphPtr++, K0_TO_PHYS((u32) &(dynamicp->modeling[modelingnum++])),G_MTX_MODELVIEW|G_MTX_MUL|G_MTX_NOPUSH);

       		gSPDisplayList(graphPtr++, &kwpolygon_init);
       		gSPDisplayList(graphPtr++, kwanm[num].shape);

		//return matrix
       		gSPMatrix( graphPtr++, K0_TO_PHYS((u32) &(dynamicp->viewing)),G_MTX_PROJECTION|G_MTX_MUL|G_MTX_NOPUSH);	     						      
       		LoadIdentAffineMtx( aff);
       		set_matrix( aff,LOADNOPUSH);
	}
}

extern void kwdisplay_cup (int player)
{
	int i,num;
	num = objallocptr[3];
	kwdisplay_cup_sub (num,player);
}

/************************************************************************************************/
/*												*/
/*		   	     		Neon Display  						*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_neon (int player)
{
	int num,i;
	CAMERA *camera;
	camera = camera1+player;

	for (i=0;i < neon_kazu;i++) {
		num = objallocptr[i];
		if (thunder_flg[player] equ 0){
			//kyori check ha iranai!!!
			if ((kwanm[num].anmptr gt 1) and (kwanm_bitoffcheckflag (num,kf_hidden)) and (kwanm_vischeck_camera_xz (num,camera,kwdeg60)) ) {
	       		       	kwanm[num].texang[ky] =kwlookcamera_xz (num,camera);
	       			kwtexture3D_ci8_aa_zb_bl (kwanm[num].p,kwanm[num].texang,kwanm[num].scale,kwanm[num].texaddr,kwanm[num].indexaddr,vtx_ktile64x64_bl,64,64,64,32);
			}
		}
	}
}


//		kwrmonPrintf ("scale = %f \n",kwanm[num].scale);
//		kwrmonPrintf ("x = %f \n",kwanm[num].p[kx]);
//		kwrmonPrintf ("z = %f \n\n",kwanm[num].p[kz]);
//	    	kwtexture3D_ci8_aa_zb_bl (kwanm[num].p,kwanm[num].texang,testscale,kwanm[num].texaddr,kwanm[num].indexaddr,vtx_ktile64x64_bl,64,64,64,32);

/*======================================================================================*/
/*											*/
/*				For Battle Bomb Kart					*/
/*											*/
/*======================================================================================*/
uint sparkcoltbl[3][3]={
	255,255,255,
	255,255,0,
	255,0,0,
};
uchar bombcoltbl[6]={
	0,1,2,3,2,1,
};

static void kwdisplay_bombspark_bt (int c,int s,int a){
	spark_r =sparkcoltbl[c][0];
	spark_g =sparkcoltbl[c][1];
	spark_b =sparkcoltbl[c][2];

	kwsetprimcolor (spark_r,spark_g,spark_b,a);
	kwcreateaffine3D (texzahyou,texangle,0.20);
	kwloadtextureblock_i_8b (spk+32*32*s,32,32);
	gSPVertex(graphPtr++ ,&vtx_ktile32x32[0], 4,0);
	gSPDisplayList(graphPtr++, &kwsetTile);
}

static void kwdisplay_bombbody_bt (int num,int player,uint alpha)
{
	int n,c,s,anm;
	CAMERA *camera;

	camera = camera1+player;

	//BOMB Body
	n= (kw2gfcnt)%4;

	texzahyou[COORD_X]=kwanm[num].p[kx];
	texzahyou[COORD_Y]=kwanm[num].p[ky]+1.0;
	texzahyou[COORD_Z]=kwanm[num].p[kz];

   	texangle[COORD_X] = 0x0000;
	texangle[COORD_Y] = kwlook_camera (kwanm[num].p[kx],kwanm[num].p[kz],camera);
	texangle[COORD_Z] = 0x8000;

	kwcreateaffine3D (texzahyou,texangle,0.20);
	gSPDisplayList(graphPtr++, &kwtexture_ci8_xlu_aa_zb_bl_init);
	toumeiamode (alpha);
	kwci8sub_bl (bombkartpal,bombkartidx+32*32*n,vtx_ktile32x32,32,32,32,32);

	//pachi pachi common init
	anm = kwgameframetimer;
	gSPDisplayList(graphPtr++, &kwtexture_ia_aa_zb_bl_init);
	splashmode (0,0,0,alpha);
	texzahyou[COORD_Y]+=4.0;

	//pachi pachi 1
	c = (anm+0)%3; 
	s = (anm+0)%4;
	texangle[kz] = 0x0000;
	kwdisplay_bombspark_bt (c,s,alpha);

	//pachi pachi 2
	c = (anm+1)%3; 
	s = (anm+1)%4;
	texangle[kz] = 0x6000;
	kwdisplay_bombspark_bt (c,s,alpha);

	//pachi pachi 3
	c = (anm+2)%3; 
	s = (anm+2)%4;
       	texangle[kz] = 0xa000;
	kwdisplay_bombspark_bt (c,s,alpha);

//finish
    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

static void kwdisplay_bombtire_bt (int num,int player,uint alpha)
{
	FVector p;

	gSPDisplayList(graphPtr++, &kwtexture_rgba_xlu_aa_zb_bl_init);
	toumeiamode (alpha);
	kwloadtextureblock_rgba_16b (bombtire,16,16);

	texzahyou[ky]=kwanm[num].p[ky]-2.0;
	//tire 1
		texzahyou[kx] = kwanm[num].p[kx]+2.0;
		texzahyou[kz] = kwanm[num].p[kz]+2.0;
		kwset_tile (texzahyou,texangle,0.15,vtx_ktile16x16);
	//tire 2
		texzahyou[kx] = kwanm[num].p[kx]+2.0;
		texzahyou[kz] = kwanm[num].p[kz]-2.0;
		kwset_tile (texzahyou,texangle,0.15,vtx_ktile16x16);
	//tire 3
		texzahyou[kx] = kwanm[num].p[kx]-2.0;
		texzahyou[kz] = kwanm[num].p[kz]-2.0;
		kwset_tile (texzahyou,texangle,0.15,vtx_ktile16x16);
	//tire 4
		texzahyou[kx] = kwanm[num].p[kx]-2.0;
		texzahyou[kz] = kwanm[num].p[kz]+2.0;
		kwset_tile (texzahyou,texangle,0.15,vtx_ktile16x16);

//finish
    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);


}
extern void kwdisplay_bombshadow_bt (int num,int player)
{
	AffineMtx tmpmat;
	CAR *car;
	car =kart1+player;

	kagezahyou[COORD_X] = kwanm[num].p[kx];
	kagezahyou[COORD_Y] = kwanm[num].ground+0.8;
       	kagezahyou[COORD_Z] = kwanm[num].p[kz];

	kwcreate_rotation_matrix (tmpmat,car->bump.bump_zx,kagezahyou,0x0000,0.50);
	Affine2Mtx (&dynamicp->modeling[modelingnum],tmpmat);
       	gSPMatrix (graphPtr++, K0_TO_PHYS((u32) &(dynamicp->modeling[modelingnum++])),G_MTX_MODELVIEW|G_MTX_LOAD|G_MTX_NOPUSH);
	gSPDisplayList (graphPtr++, &kwdraw_kage2);
}


extern void kwstart_bombkart (int player){
	int num;
	num = bomballocptr[player];
 	kwanm_start(num,0);
	kwanm[num].alpha =0;
}

extern void kwset_bombkart_alpha (int player,uint alpha){
	int num;
	num = bomballocptr[player];
 	kwanm_start(num,0);
	kwanm[num].alpha =alpha;
}

extern void kwfinish_bombkart (int player){
	int num;
	num = bomballocptr[player];
 	kwanm_finish(num);
}

extern void kwdisplay_bombkart_bt (int player)
{
	int i,num;
	uint alpha;
	CAR *car;

	for (i=0;i <4;i++){
		num = bomballocptr[i];
		if (kwanm[num].anmptr nequ 0) {

			car = kart1+i;
			kwanm[num].p[kx]=car->position[COORD_X];
			kwanm[num].p[ky]=car->position[COORD_Y]-2.0;
			kwanm[num].p[kz]=car->position[COORD_Z];
			kwanm[num].ground = car->ground;
			alpha = kwanm[num].alpha;

	       		//body
			kwdisplay_bombbody_bt (num,player,alpha);

			//tire
			kwdisplay_bombtire_bt (num,player,alpha);

			//shadow
			kwdisplay_bombshadow_bt (num,player);
		}
	}
}

/************************************************************************************************/
/*												*/
/*		   	     		BOMB Kart Display  [For OgawaKart]			*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_bombkart_sub (int bombnum)
{
	int l,n,c,s,anm;
	BOM_TYPE bomb;
	bomb = bom[bombnum];

	//bomb body
	l = (kw2gfcnt)%6;
	n= bombcoltbl[l];
	texzahyou[COORD_X]=bomb.body[COORD_X];
	texzahyou[COORD_Y]=bomb.body[COORD_Y]+1.0;
	texzahyou[COORD_Z]=bomb.body[COORD_Z];
     	kwtexture3D_ci8_aa_zb_bl (texzahyou,texangle,0.25,bombkartpal,bombkartidx+32*32*n,vtx_ktile32x32,32,32,32,32);

	//pachi pachi common init
	anm = kwgameframetimer;
	gSPDisplayList(graphPtr++, &kwtexture_ia_aa_zb_bl_init);
	splashmode (0,0,0,255);
	texzahyou[COORD_Y]=bomb.body[COORD_Y]+5.0;

	//pachi pachi 1
	c = (anm+0)%3; 
	s = (anm+0)%4;
	texangle[COORD_Z] = 0x0000;
	kwdisplay_bombspark_bt (c,s,255);

	//pachi pachi 2
	c = (anm+1)%3; 
	s = (anm+1)%4;
	texangle[COORD_Z] = 0x6000;
	kwdisplay_bombspark_bt (c,s,255);

	//pachi pachi 3
	c = (anm+2)%3; 
	s = (anm+2)%4;
       	texangle[kz] = 0xa000;
	kwdisplay_bombspark_bt (c,s,255);

}

extern void kwdisplay_bombtire (int bombnum,CAMERA *camera)
{
	float x,z;
	BOM_TYPE bomb;

	bomb = bom[bombnum];

    	texangle[COORD_X] = 0x0000;
	texangle[COORD_Z] = 0x8000;

	gSPDisplayList(graphPtr++, &kwtexture_rgba_aa_zb_bl_init);
	kwloadtextureblock_rgba_16b (bombtire,16,16);

	//tire 1
       		texangle[COORD_Y] = kwlook_camera (bomb.tire1[kx],bomb.tire1[kz],camera);
		kwset_tile (bomb.tire1,texangle,0.15,vtx_ktile16x16);
	//tire 2
       		texangle[COORD_Y] = kwlook_camera (bomb.tire2[kx],bomb.tire2[kz],camera);
		kwset_tile (bomb.tire2,texangle,0.15,vtx_ktile16x16);
	//tire 3
       		texangle[COORD_Y] = kwlook_camera (bomb.tire3[kx],bomb.tire3[kz],camera);
		kwset_tile (bomb.tire3,texangle,0.15,vtx_ktile16x16);
	//tire 4
       		texangle[COORD_Y] = kwlook_camera (bomb.tire4[kx],bomb.tire4[kz],camera);
		kwset_tile (bomb.tire4,texangle,0.15,vtx_ktile16x16);

//finish
    gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

extern void kwdisplay_bombshadow (int bombnum)
{
	AffineMtx tmpmat;
	kagezahyou[COORD_X] = bom[bombnum].body[kx];
	kagezahyou[COORD_Y] = bom[bombnum].org_y+1.0;
	kagezahyou[COORD_Z] = bom[bombnum].body[kz];

	kwcreate_rotation_matrix (tmpmat,bom_bump[bombnum].bump_zx,kagezahyou,0x0000,0.50);
       	Affine2Mtx (&dynamicp->modeling[modelingnum],tmpmat);
	gSPMatrix (graphPtr++, K0_TO_PHYS((u32) &(dynamicp->modeling[modelingnum++])),G_MTX_MODELVIEW|G_MTX_LOAD|G_MTX_NOPUSH);
	gSPDisplayList (graphPtr++, &kwdraw_kage2);
}

extern void kwdisplay_bombkart (int player)
{
	int i,num;
	uint distance;
	CAMERA *camera;
	BOM_TYPE *bom_ptr;
	ushort mv_pat_BOM;

	if (sequence_mode equ RESULTSEQUENCE) player=0;
	camera = camera1+player;

//Clear AnyBody Flag
	if (player equ kwplayer1) {
		for (i=0;i < BOM_MAX;i++){
			num = bomballocptr[i];
			bom_ptr = & bom[i];

			if( kwanm_bitcheckflag (num,kf_anybody)) {
				bom_ptr->tenuki_flg =0;
			}
			else {
				if (sequence_mode nequ RESULTSEQUENCE) bom_ptr->tenuki_flg =1;
			}
			kwanm_clrflag (num,kf_anybody);
		}
	}

	for (i=0;i < BOM_MAX;i++){
		bom_ptr = & bom[i];
		mv_pat_BOM = bom_ptr->mv_pat;

		if (bom_ptr->mv_pat nequ BOM_MODE_NULL) {
			num = bomballocptr[i];
			kwanm[num].p[kx]=bom_ptr->body[kx];
			kwanm[num].p[ky]=bom_ptr->body[ky];
			kwanm[num].p[kz]=bom_ptr->body[kz];

			distance = kwcheck_vis_area (num,player,kwdeg70,500);
			if (kwanm_bitcheckflag (num,kf_visible)) {
				kwanm_setflag (num,kf_anybody);
				//(angle)
       		       	    	texangle[kx] = 0x0000;
				texangle[ky] = kwlook_camera (bom[i].body[kx],bom[i].body[kz],camera);
       				texangle[kz] = 0x8000;

		       		//body
				kwdisplay_bombbody_bt (num,player,255);

		      		//tire
		       		kwdisplay_bombtire (i,camera);

		       		//shadow
		       		if ((distance lte 20000) and (mv_pat_BOM nequ BOM_MODE_BOOM)) kwdisplay_bombshadow (i);
			}
		}
	}
}

/************************************************************************************************/
/*												*/
/*		   	     		Tornado Display						*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_tornado (void)
{
	#if 0
	int i,num;
//leaf
			gSPDisplayList	(graphPtr++, &kwtexture_rgba_aa_bl_init);
//			gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
//		    	kwloadtextureblock_rgba_16b (rgba_happa,32,16);
		    	kwloadtextureblock_rgba_16b (rgba_tuchi,16,16);

			for (i=0;i<kwleafkazumax;i++) {
				num = effectallocptr[i];
				if (kwanm[num].anmptr >1) {

				//Modeling Henkan
			       		kwcreateaffine3D_anm (num);
				//DRAW
			       		gSPDisplayList(graphPtr++,kwsettile16x16);
	       			}
       			}
//			gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);

//tuchi kemuri
			//RDP&RCP MODE  Initial
			gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);

			toumeimode (180,128,60,128);

      //	gDPSetAlphaCompare	(graphPtr++,G_AC_DITHER);
      //	kwtestcombinemode ();
      //	kwtestrendermode();

			//Texture Load
			kwloadtextureblock_ia_8b (a8_smoke,16,16);
			//kwloadtextureblock_ia_8b (a8_smoke1+16*16*kwanm[num].anmnum,16,16);

	  		for (i=0;i< gsmokemax;i++) {
				num=effectallocptr2[i];
				if (kwanm[num].anmptr > 1) {

				//Modeling Henkan
			       		kwcreateaffine3D_anm (num);
				//DRAW
			       		gSPDisplayList(graphPtr++,kwsettile16x16);
				}
       			}
    //	gDPSetAlphaCompare	(graphPtr++,G_AC_NONE);

//jyousyou kemuri
			for (i=0;i< usmokemax;i++) {
				num=effectallocptr3[i];

				if (kwanm[num].anmptr > 1) {
				toumeimode (180,128,60,kwanm[num].alpha);
    
      //	kwtestcombinemode ();
      //	kwtestrendermode();
      // 	gDPSetAlphaCompare	(graphPtr++,G_AC_DITHER);

				//Modeling Henkan
			       		kwcreateaffine3D_anm (num);
				//DRAW
			       		gSPDisplayList(graphPtr++,kwsetsmoke1);

  //	gDPSetAlphaCompare	(graphPtr++,G_AC_NONE);
				}
       			}

//				num=effectallocptr3[0];
//				kwrmonPrintf ("anm = %d \n\n",kwanm[num].anmnum);
//				kwrmonPrintf ("scale = %f \n\n",kwanm[num].scale);
//				kwrmonPrintf ("alpha = %d \n\n",kwanm[num].alpha);

//Finish
		    	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
#endif
}

/************************************************************************************************/
/*												*/
/*		   	     		Typhoon Display						*/
/*												*/
/************************************************************************************************/
extern void kwdisplay_typhoon (void)
{
	int i,num;
//leaf
			gSPDisplayList	(graphPtr++, &kwtexture_rgba_aa_zb_bl_init);
			gSPClearGeometryMode	(graphPtr++,G_CULL_BOTH);
	#if 0

		    	kwloadtextureblock_rgba_16b (rgba_happa,32,16);

			for (i=0;i<kwleafkazumax;i++) {
				num = effectallocptr[i];
				if (kwanm[num].anmptr >1) {

				//Modeling Henkan
			       		kwcreateaffine3D_anm (num);
				//DRAW
			       		gSPDisplayList(graphPtr++,kwsettile32x16);
	       			}
       			}
			gSPSetGeometryMode	(graphPtr++,G_CULL_BACK);

	#endif
//tuchi kemuri
			//RDP&RCP MODE  Initial
			gSPDisplayList(graphPtr++, &kwtexture_ia_zb_bl_init);

	#if 0
			toumeimode (255,128,128,80);
			//Texture Load
			kwloadtextureblock_ia_8b ((uchar *)Smoke3,16,16);

			for (i=0;i< gsmokemax;i++) {
				num=effectallocptr2[i];
				if (kwanm[num].anmptr > 1) {

				//Modeling Henkan
			       		kwcreateaffine3D_anm (num);
				//DRAW
			       		gSPDisplayList(graphPtr++,kwsettile16x16);
				}
       			}
	#endif

//jyousyou kemuri
	#if 0
			//Texture Load
			kwloadtextureblock_ia_8b ((uchar *)Smoke3,16,16);

			for (i=0;i< usmokemax;i++) {
				num=effectallocptr3[i];

				if (kwanm[num].anmptr > 1) {

				toumeimode (255,128,128,kwanm[num].alpha);

				//Modeling Henkan
			       		kwcreateaffine3D_anm (num);
				//DRAW
			       		gSPDisplayList(graphPtr++,kwsetsmoke2);
				}
       			}

	#endif
//				num=effectallocptr3[0];
//				kwrmonPrintf ("scale = %f \n\n",kwanm[num].scale);
//Finish
		    	gSPTexture(graphPtr++ ,1, 1, 0, G_TX_RENDERTILE, G_OFF);
}

/********************************************************************************/
/*										*/
/*				Test Mode					*/
/*										*/
/********************************************************************************/
/*======================================================================*/
/*	   			Sync					*/
/*======================================================================*/
extern void kwsync (void) {
	#if kwdebugsw
		gDPLoadSync(graphPtr++);
		gDPPipeSync(graphPtr++);
		gDPTileSync(graphPtr++);
	#endif
}


/*======================================================================*/
/*	   			RDP Test				*/
/*======================================================================*/
extern void kwtestrdpmode (void) {
	#if kwdebugsw
		#if 0
		kwtestfiltermode();
       		kwtestrendermode();
       		kwtestcombinemode();
		#endif
	#endif
}

/*======================================================================*/
/*			Test Filter Mode				*/
/*======================================================================*/
extern void kwtestfiltermode (void) {
#if 0
	switch (kwfiltersw) {
	 	case 1:	
		   	gDPSetTextureFilter(graphPtr++ ,G_TF_POINT);
		break;

	 	case 2:	
		   	gDPSetTextureFilter(graphPtr++ ,G_TF_AVERAGE);
		break;

	 	case 3:	
		   	gDPSetTextureFilter(graphPtr++ ,G_TF_BILERP);
		break;
	}
#endif
}

/*======================================================================*/
/*			Test Render Mode				*/
/*======================================================================*/
extern void kwtestrendermode (void) {
#if 0
	switch (kwrendersw) {
	 	case 1:	
			gDPSetRenderMode(graphPtr++ ,G_RM_OPA_SURF, G_RM_OPA_SURF2);
		break;

	 	case 2:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_OPA_SURF, G_RM_AA_OPA_SURF2);
		break;

	 	case 3:	
			gDPSetRenderMode(graphPtr++ ,G_RM_ZB_OPA_SURF, G_RM_ZB_OPA_SURF2);
		break;

	 	case 4:	
		       gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
		break;

	 	case 5:	
		       	gDPSetRenderMode(graphPtr++ ,G_RM_XLU_SURF, G_RM_XLU_SURF2);
		break;

	 	case 6:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2);
		break;

	 	case 7:	
			gDPSetRenderMode(graphPtr++ ,G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2);
		break;

	 	case 8:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2);
		break;

	 	case 9:	
			gDPSetRenderMode(graphPtr++ ,G_RM_ZB_OPA_DECAL, G_RM_ZB_OPA_DECAL2);
		break;

	 	case 10:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_OPA_DECAL, G_RM_AA_ZB_OPA_DECAL2);
		break;

	 	case 11:	
			gDPSetRenderMode(graphPtr++ ,G_RM_ZB_XLU_DECAL, G_RM_ZB_XLU_DECAL2);
		break;

	 	case 12:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_XLU_DECAL, G_RM_AA_ZB_XLU_DECAL2);
		break;

	 	case 13:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_OPA_INTER, G_RM_AA_ZB_OPA_INTER2);
		break;

	 	case 14:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_XLU_INTER, G_RM_AA_ZB_XLU_INTER2);
		break;

	 	case 15:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_XLU_LINE, G_RM_AA_XLU_LINE2);
		break;

	 	case 16:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_XLU_LINE, G_RM_AA_ZB_XLU_LINE2);
		break;

	 	case 17:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_DEC_LINE, G_RM_AA_DEC_LINE2);
		break;

	 	case 18:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_DEC_LINE, G_RM_AA_ZB_DEC_LINE2);
		break;

	 	case 19:	
			gDPSetRenderMode(graphPtr++ ,G_RM_TEX_EDGE, G_RM_TEX_EDGE2);
		break;

	 	case 20:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_TEX_EDGE, G_RM_AA_TEX_EDGE2);
		break;

	 	case 21:	
			gDPSetRenderMode(graphPtr++ ,G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
		break;

	 	case 22:	
			gDPSetRenderMode(graphPtr++ ,G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
		break;

	 	case 23:	
			gDPSetRenderMode(graphPtr++ ,G_RM_FOG_PRIM_A, G_RM_AA_ZB_OPA_SURF2);
		break;

	 	case 24:	
			gDPSetRenderMode(graphPtr++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
		break;

	 	case 25:	
		   	 gDPSetRenderMode(graphPtr++,G_RM_ADD, G_RM_ADD2);
		break;

	 	case 26:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_XLU_TEX_EDGE, G_RM_XLU_TEX_EDGE2);
		break;

	 	case 27:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_AA_ZB_XLU_INTER, G_RM_AA_ZB_XLU_INTER2);
		break;
	 	case 28:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_AA_ZB_SUB_SURF, G_RM_AA_ZB_SUB_SURF2);
		break;
	 	case 29:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_AA_ZB_PCL_SURF, G_RM_AA_ZB_PCL_SURF2);
		break;
	 	case 30:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_AA_ZB_OPA_TERR, G_RM_AA_ZB_OPA_TERR2);
		break;
	 	case 31:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_AA_ZB_TEX_TERR, G_RM_AA_ZB_TEX_TERR2);
		break;
	 	case 32:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_AA_ZB_SUB_TERR, G_RM_AA_ZB_SUB_TERR2);
		break;
	 	case 33:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_VISCVG, G_RM_VISCVG2);
		break;
	 	case 34:	
		  	 gDPSetRenderMode(graphPtr++,G_RM_OPA_CI, G_RM_OPA_CI2);
		break;
	}
#endif
}

//	 	case 9:	
  //			gDPSetRenderMode(graphPtr++ ,G_RM_OPA_DECAL, G_RM_OPA_DECAL2);
    //		break;

//	 	case 10:	
  //			gDPSetRenderMode(graphPtr++ ,G_RM_AA_OPA_DECAL, G_RM_AA_OPA_DECAL2);
    //		break;
 //	 	case 13:	
   //			gDPSetRenderMode(graphPtr++ ,G_RM_XLU_DECAL, G_RM_XLU_DECAL2);
     //		break;

       //	 	case 14:	
	//		gDPSetRenderMode(graphPtr++ ,G_RM_AA_XLU_DECAL, G_RM_AA_XLU_DECAL2);
	  //	break;

	 //	case 25:	
	   //		gDPSetRenderMode(graphPtr++ ,G_RM_ZB_TEX_EDGE, G_RM_ZB_TEX_EDGE2);
	     //	break;

/*======================================================================*/
/*			Test Combine Mode				*/
/*======================================================================*/
extern void kwtestcombinemode (void) {
#if 0
	switch (kwcombinesw) {
	 	case 1:	
		    	gDPSetCombineMode(graphPtr++,G_CC_PRIMITIVE, G_CC_PRIMITIVE);
		break;
	 	case 2:	
		    	gDPSetCombineMode(graphPtr++,G_CC_SHADE, G_CC_SHADE);
		break;
	 	case 3:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATEI, G_CC_MODULATEI2);
		break;
	 	case 4:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATEIA, G_CC_MODULATEIA2);
		break;
	 	case 5:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
		break;
	 	case 6:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATERGB, G_CC_MODULATERGB2);
		break;
	 	case 7:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATERGBA, G_CC_MODULATERGBA2);
		break;
	 	case 8:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATERGBDECALA, G_CC_MODULATERGBDECALA);
		break;
	 	case 9:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM2);
		break;
	 	case 10:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM2);
		break;
	 	case 11:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM);
		break;
	 	case 12:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATERGB_PRIM, G_CC_MODULATERGB_PRIM2);
		break;
	 	case 13:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM2);
		break;
	 	case 14:	
		    	gDPSetCombineMode(graphPtr++,G_CC_MODULATERGBDECALA_PRIM, G_CC_MODULATERGBDECALA_PRIM);
		break;
	 	case 15:	
		    	gDPSetCombineMode(graphPtr++,G_CC_DECALRGB, G_CC_DECALRGB2);
		break;
	 	case 16:	
		    	gDPSetCombineMode(graphPtr++,G_CC_DECALRGBA, G_CC_DECALRGBA);
		break;

	 	case 17:	
		    	gDPSetCombineMode(graphPtr++,G_CC_BLENDI, G_CC_BLENDI2);
		break;
	 	case 18:	
		    	gDPSetCombineMode(graphPtr++,G_CC_BLENDIA, G_CC_BLENDIA2);
		break;
	 	case 19:	
		    	gDPSetCombineMode(graphPtr++,G_CC_BLENDIDECALA, G_CC_BLENDIDECALA);
		break;
	 	case 20:	
		    	gDPSetCombineMode(graphPtr++,G_CC_BLENDRGBA, G_CC_BLENDRGBA);
		break;
	 	case 21:	
		    	gDPSetCombineMode(graphPtr++,G_CC_BLENDRGBDECALA, G_CC_BLENDRGBDECALA);
		break;
	 	case 22:	
		    	gDPSetCombineMode(graphPtr++,G_CC_HILITERGB, G_CC_HILITERGB);
		break;
	 	case 23:	
		    	gDPSetCombineMode(graphPtr++,G_CC_HILITERGBA, G_CC_HILITERGBA);
		break;
	 	case 24:	
		    	gDPSetCombineMode(graphPtr++,G_CC_TRILERP, G_CC_TRILERP);
		break;
	 	case 25:	
		    	gDPSetCombineMode(graphPtr++,G_CC_INTERFERENCE, G_CC_INTERFERENCE);
		break;

	 	case 26:	
			gDPSetCombineMode(graphPtr++,MY_TWOCOLOR_COMB, MY_TWOCOLOR_COMB);
		break;
	}
#endif
}

/************************************************************************************************/
/*												*/
/*												*/
/*					Print Program						*/
/*												*/
/*												*/
/************************************************************************************************/
#define left_edge  24
#define right_edge 320-left_edge
#define top_edge 24
#define bitmapsize 8
/*==============================================================================================*/
/*									  			*/
/*	       		     		Print Sub Routine   		  			*/
/*									 			*/
/*==============================================================================================*/
static void kwprint8x8 (int ulx,int uly,char ascii)
{	
	short int s,t;

	s = (ascii%16)*8;
	t = (ascii/16)*8;
	kwrectangle	(ulx,uly,8,8,s,t,copymode);
}

static void kaigyou_check (int *tx,int *ty)
{
	*tx +=bitmapsize; 
   	if (*tx >= (right_edge)) {
   		*tx  = left_edge-4;
   		*ty += bitmapsize; 
	}
}

extern void kwprint_sub	(int *tx,int *ty ,char *moji)
{
 	*tx += left_edge-4;	//top x
     	*ty += top_edge-4;	//top y

	while (*moji != NULL) {
		// Do Sprite
		if ( (mojitbl[*moji]) gte 0) kwprint8x8 (*tx,*ty,mojitbl[*moji]);
	  	kaigyou_check (tx,ty);

		// Next
		*moji++;
	}
 }


		#if 0
	       	if (*moji != 0x20) {  //moshi space nara
			if (mojitbl[*moji] nequ 0xff){
	      			kwprint8x8 	(*tx,*ty,mojitbl[*moji]);
			}
		  	kaigyou_check (tx,ty);

	      	}
		else if	(*tx nequ left_edge) {
	       		kaigyou_check (tx,ty);
		}
		#endif
/*==============================================================*/
/*  	    	Sign Int Number Sub Routine    			*/
/*==============================================================*/
static void kwprintnumber_sub (int *tx,int *ty,int number,uint mode)
{       
	char	*ptr;
	int	moto;

	kaigyou_check (tx,ty);

	moto = number;

//Minus Check
		if (moto < 0) {
      			kwprint8x8 	( *tx,*ty,mojitbl['-']);
       			kaigyou_check (tx,ty);
       			moto = -moto;
       		}

	amaritbl[0] = -1;
	ptr = amaritbl;

	if (moto !=0) {
		while  (moto!=0){
			*(++ptr) = (char)(moto%mode);
    			moto   = moto/mode;
	       	}
	}
	else	*(++ptr) = 0;

	do	 {

		kwprint8x8 	( *tx,*ty,*ptr--);
		kaigyou_check (tx,ty);
	} while (*ptr != -1);

}

/*==============================================================*/
/*  	    	Unsigned Int Number Sub Routine   		*/
/*==============================================================*/
static void kwprintnumber_unsign_sub (int *tx,int *ty,uint number,uint mode)
{       
	char	*ptr;
	uint	moto;

	kaigyou_check (tx,ty);

	moto = number;

	amaritbl[0] = -1;
	ptr = amaritbl;

	if (moto !=0) {
		while  (moto!=0){
			*(++ptr) = (char)(moto%mode);
    			moto   = moto/mode;
	       	}
	}
	else	*(++ptr) = 0;

	do	 {
		kwprint8x8 	( *tx,*ty,*ptr--);
		kaigyou_check (tx,ty);
	} while (*ptr != -1);

}


/*==============================================================*/
/*  	    	Unsigned Int Number Sub Routine   		*/
/*==============================================================*/
static void  kwconvnumber (int number)
{       
	int	moto;
	char	*ptr;
	moto = number;

	amaritbl[0] = -1;
	ptr = amaritbl;

	while  (moto!=0){
		*(++ptr) = (char)(moto%10);
		moto   = moto/10;
       	}

	amariptr = ptr;
}

/********************************************************************************/
/*										*/
/*		   		Print Initila & Finish				*/
/*										*/
/********************************************************************************/
extern void kwprintmode_init(void) {
	#if kwprintsw
      	gSPDisplayList		(graphPtr++,kwchangecopymode);
	gSPDisplayList		(graphPtr++, kwprint_init);
      	gDPSetAlphaCompare	(graphPtr++ ,G_AC_THRESHOLD);
	#endif
}

extern void kwprintmode_finish(void) {
	gSPDisplayList		(graphPtr++, &kwsprite_finish);
}


/********************************************************************************/
/*										*/
/*		   		Print Moji    					*/
/*										*/
/********************************************************************************/
extern void kwprint	(int tx,int ty ,char *moji)
{
	#if kwprintsw
	kwprint_sub	(&tx,&ty,moji);
	#endif
}

/********************************************************************************/
/*										*/
/*			Print Signed Number (Decimal) & Message			*/
/*										*/
/********************************************************************************/
extern void kwprintd	(int tx,int ty ,char *moji,int number)
{

#if kwprintsw
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_sub (&tx,&ty,number,10);
#endif
}

/********************************************************************************/
/*										*/
/*			Print Unsigned Number (Decimal) & Message		*/
/*										*/
/********************************************************************************/
extern void kwprintud	(int tx,int ty ,char *moji,uint number)
{

#if kwprintsw
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_unsign_sub (&tx,&ty,number,10);
#endif
}


/********************************************************************************/
/*			Print Signed Int Number (Hex)				*/
/********************************************************************************/
extern void kwprinth	(int tx,int ty ,char *moji,int number)
{
#if kwprintsw
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_sub (&tx,&ty,number,0x10);

//H
      	 kwprint8x8 	( tx,ty,mojitbl['H']);
#endif
}

/********************************************************************************/
/*			Print Unsigned Int Number (Hex)				*/
/********************************************************************************/
extern void kwprintuh	(int tx,int ty ,char *moji,uint number)
{
#if kwprintsw
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_unsign_sub (&tx,&ty,number,0x10);

//H
      	 kwprint8x8 	( tx,ty,mojitbl['H']);
#endif
}

/********************************************************************************/
/*			Print Number (Binary)					*/
/********************************************************************************/
extern void kwprintb	(int tx,int ty ,char *moji,int number)
{
#if kwprintsw
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_sub (&tx,&ty,number,2);
//B
      	 kwprint8x8 	( tx,ty,mojitbl['B']);
 
#endif
}

/********************************************************************************/
/*			Print Unsigned Number (Binary)				*/
/********************************************************************************/
extern void kwprintub	(int tx,int ty ,char *moji,uint number)
{
#if kwprintsw
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_unsign_sub (&tx,&ty,number,2);
//B
      	 kwprint8x8 	( tx,ty,mojitbl['B']);
 
#endif
}



/********************************************************************************/
/*										*/
/*		   		Print Moji    					*/
/*										*/
/********************************************************************************/
extern void kwfprint	(int tx,int ty ,char *moji)
{
#if kwprintsw
	kwprintmode_init();
	kwprint_sub	(&tx,&ty,moji);
	kwprintmode_finish();
#endif
}

/********************************************************************************/
/*										*/
/*			Print Signed Number (Decimal) & Message			*/
/*										*/
/********************************************************************************/
extern void kwfprintd	(int tx,int ty ,char *moji,int number)
{
#if kwprintsw

	kwprintmode_init();
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_sub (&tx,&ty,number,10);
	kwprintmode_finish();
#endif
}

/********************************************************************************/
/*										*/
/*			Print Unsigned Number (Decimal) & Message		*/
/*										*/
/********************************************************************************/
extern void kwfprintud	(int tx,int ty ,char *moji,uint number)
{
#if kwprintsw

	kwprintmode_init();
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_unsign_sub (&tx,&ty,number,10);

	kwprintmode_finish();
#endif
}


/********************************************************************************/
/*			Print Signed Int Number (Hex)				*/
/********************************************************************************/
extern void kwfprinth	(int tx,int ty ,char *moji,int number)
{
#if kwprintsw
	kwprintmode_init();

//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_sub (&tx,&ty,number,0x10);

//H
      	 kwprint8x8 	( tx,ty,mojitbl['H']);

	kwprintmode_finish();
#endif
}

/********************************************************************************/
/*			Print Unsigned Int Number (Hex)				*/
/********************************************************************************/
extern void kwfprintuh	(int tx,int ty ,char *moji,uint number)
{
#if kwprintsw
	kwprintmode_init();

//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_unsign_sub (&tx,&ty,number,0x10);

//H
      	 kwprint8x8 	( tx,ty,mojitbl['H']);

	kwprintmode_finish();
#endif
}

/********************************************************************************/
/*			Print Number (Binary)					*/
/********************************************************************************/
extern void kwfprintb	(int tx,int ty ,char *moji,int number)
{
#if kwprintsw
	kwprintmode_init();

//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_sub (&tx,&ty,number,2);
//B
      	 kwprint8x8 	( tx,ty,mojitbl['B']);
 
	kwprintmode_finish();
#endif
}

/********************************************************************************/
/*			Print Unsigned Number (Binary)				*/
/********************************************************************************/
extern void kwfprintub	(int tx,int ty ,char *moji,uint number)
{
#if kwprintsw
	kwprintmode_init();
//Display Moji
	kwprint_sub	(&tx,&ty ,moji);

//Display Number
	kwprintnumber_unsign_sub (&tx,&ty,number,2);
//B
      	 kwprint8x8 	( tx,ty,mojitbl['B']);
 
	kwprintmode_finish();

#endif
}

	#if 0
/********************************************************************************/
/*			Print Polygon Moji					*/
/********************************************************************************/
extern void kwprintp	(char *moji)
{
	char	mojinum=0;
	FVector	pos = {0,0,0};

//	pos[COORD_X] = test.pos[COORD_X];
//	pos[COORD_Y] = test.pos[COORD_Y];
//	pos[COORD_Z] = test.pos[COORD_Z];

	while (*moji != NULL) {

//	kwrmonPrintf("number %d \n",mojinum);
//	kwrmonPrintf("zahyou %f \n",x);

	//Zahyou
//		printzahyou[mojinum].pos[COORD_X] = x;
//		printzahyou[mojinum].pos[COORD_Y] = y;
//		printzahyou[mojinum].pos[COORD_Z] = z;

	// Display

//	gSPPopMatrix(graphPtr++, G_MTX_MODELVIEW);

	// Next
		pos[COORD_X] +=0x100;
		mojinum++;
		*moji++;

	}
}

/*==============================================================================================*/
/*									  			*/
/*	       		     		Print Number Sub Routine  	  			*/
/*									 			*/
/*==============================================================================================*/
static void kwprintnum_ia_8x16 (int sx,int sy)
{
	int	ulx,uly;
	short int t;
	char	*ptr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
//	kwloadtextureblock_ia_8b	(ia8_num8,8,160);

	ptr = amariptr;
	ulx =sx;
	uly =sy;

	do	 {
		t = (short int)((*ptr--)*16);

	gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);

		gDPSetPrimColor   	(graphPtr++,0,0,0,0,0,255);
  		gSPTextureRectangle	(graphPtr++,(ulx+1)<<2,(uly+1)<<2,(ulx+8+1)<<2,(uly+16+1)<<2,0,0<<5,t<<5,1<<10,1<<10);

		gDPSetPrimColor   	(graphPtr++,0,0,255,255,255,255);
  		gSPTextureRectangle	(graphPtr++,ulx<<2,uly<<2,(ulx+8)<<2,(uly+16)<<2,0,0<<5,t<<5,1<<10,1<<10);

	gDPSetAlphaCompare	(graphPtr++,G_AC_NONE);


		ulx +=8+1;
	} while (*ptr != -1);


}

static void kwprintnum_tex_ia_8x16 (int sx,int sy)
{
	int x,y;
	char	*ptr;

	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);

	ptr = amariptr;
	x=sx,y=sy;

	do	 {

		kwtranslate2D (x,y);
//       		kwloadtextureblock_ia_8b	(ia8_num8+8*16*(*ptr--),8,16);

  		gSPVertex(graphPtr++ ,&vtx_black8x16_ia[0], 4, 0);
  		gSPDisplayList(graphPtr++, &kwsetTile);

      		gSPVertex(graphPtr++ ,&vtx_num8x16_ia[0], 4, 0);
      		gSPDisplayList(graphPtr++, &kwsetTile);

		x +=8+1;
	} while (*ptr != -1);


}

static void kwprintnum_ia_12x16 (int sx,int sy)
{
	int	ulx,uly;
	short int t;
	char	*ptr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
//	kwloadtexturetile_ia_8b	(ia8_num12,12,192);

	ptr = amariptr;
	ulx =sx;
	uly =sy;

	do	 {
		t = (short int)((*ptr--)*12);

		gDPSetAlphaCompare	(graphPtr++,G_AC_THRESHOLD);

		gDPSetPrimColor   	(graphPtr++,0,0,0,0,0,255);
  		gSPTextureRectangle	(graphPtr++,(ulx+2)<<2,(uly+2)<<2,(ulx+12+2)<<2,(uly+16+2)<<2,0,0<<5,t<<5,1<<10,1<<10);

		gDPSetPrimColor   	(graphPtr++,0,0,255,255,255,255);
  		gSPTextureRectangle	(graphPtr++,ulx<<2,uly<<2,(ulx+12)<<2,(uly+16)<<2,0,0<<5,t<<5,1<<10,1<<10);

		gDPSetAlphaCompare	(graphPtr++,G_AC_NONE);

		ulx +=12;
	} while (*ptr != -1);


}

static void kwprintnum_ia_16x16 (int sx,int sy)
{
	int	ulx,uly;
	short int t;
	char	*ptr;

	gSPDisplayList(graphPtr++, &kwsprite_ia_pt_init);
//	kwloadtextureblock_ia_8b	(ia8_num16,16,160);

	ptr = amariptr;
	ulx =sx;
	uly =sy;

	do	 {
		t = (short int)((*ptr--)*16);

		gDPSetPrimColor   	(graphPtr++,0,0,0,0,0,255);
  		gSPTextureRectangle	(graphPtr++,(ulx+2)<<2,(uly+2)<<2,(ulx+16+2)<<2,(uly+16+2)<<2,0,0<<5,t<<5,1<<10,1<<10);

		gDPSetPrimColor   	(graphPtr++,0,0,255,255,255,255);
  		gSPTextureRectangle	(graphPtr++,ulx<<2,uly<<2,(ulx+16)<<2,(uly+16)<<2,0,0<<5,t<<5,1<<10,1<<10);

		ulx +=16;
	} while (*ptr != -1);


}
static void kwprintnum_tex_ia_16x16 (int sx,int sy)
{
	int x,y;
	char	*ptr;

	gSPDisplayList(graphPtr++, &kwtexture_ia_pt_init);

	ptr = amariptr;
	x=sx,y=sy;

	do	 {

		kwtranslate2D (x,y);
//       		kwloadtextureblock_ia_8b	(ia8_num8+16*16*(*ptr--),16,16);

  		gSPVertex(graphPtr++ ,&vtx_black16x16_ia[0], 4, 0);
  		gSPDisplayList(graphPtr++, &kwsetTile);

      		gSPVertex(graphPtr++ ,&vtx_num16x16_ia[0], 4, 0);
      		gSPDisplayList(graphPtr++, &kwsetTile);

		x +=16;
	} while (*ptr != -1);


}

/********************************************************************************/
/*										*/
/*			Print Number (Decimal)	   				*/
/*										*/
/********************************************************************************/
extern void kwprintnum8x16	(int sx,int sy ,int num)    
{
	kwconvnumber	(num);
	kwprintnum_ia_8x16 (sx,sy);
}

extern void kwprintnum12x16	(int sx,int sy ,int num)    
{
	kwconvnumber	(num);
	kwprintnum_ia_12x16 (sx,sy);
}
extern void kwprintnum16x16	(int sx,int sy ,int num)    
{
	kwconvnumber	(num);
	kwprintnum_ia_16x16 (sx,sy);
}
extern void kwtprintnum8x16	(int sx,int sy ,int num)    
{
	kwconvnumber	(num);
	kwprintnum_tex_ia_8x16 (sx,sy);
}

extern void kwtprintnum16x16	(int sx,int sy ,int num)    
{
	kwconvnumber	(num);
	kwprintnum_tex_ia_16x16 (sx,sy);
}

	#endif
/************************************************************************************************/
/*												*/
/*												*/
/*												*/
/*		  			Sprite Library						*/
/*												*/
/*												*/
/*												*/
/************************************************************************************************/

/*======================================================================================*/
/*	Sprite Display Sub Routine  [Sprite Library]					*/
/*		:1 cycle mode								*/
/* 		:cut nashi								*/
/*		:clipping nashi								*/
/*		:scale ari								*/
/*======================================================================================*/
	#if 0
extern void kwspritelib	(Sprite *ptr,short cx,short cy,float scale,ushort *addr)
{	
    Gfx	*dl;

   ptr->rsp_dl_next   = ptr->rsp_dl;

    spMove( ptr, cx,cy );
    spScale( ptr, scale, scale );
    spClearAttribute( ptr, 0xffffffff );
    spSetAttribute( ptr,SP_TEXSHUF|SP_CUTOUT|SP_SCALE);
//    spSetAttribute( ptr, );

    dl = spDraw( ptr );
    gSPDisplayList(graphPtr++, dl );

}


#define NUM_itembox_BMS  (sizeof(itembox_bitmaps)/sizeof(Bitmap))

static Bitmap  itembox_bitmaps[] = {  64, 64, 0,0, item_box+64*32, 32, 0,};

static Gfx      itembox_dl[NUM_DL(NUM_itembox_BMS)];


Sprite itembox_sprite = {

	0,0,		/* Position: x,y */

	64,32,			/* Sprite size in texels (x,y) */

	1.0,1.0,		/* Sprite Scale: x,y */

	0,0,			/* Sprite Explosion Spacing: x,y */

//	SP_TEXSHUF | SP_Z | SP_FASTCOPY,			/* Sprite Attributes */
	SP_TEXSHUF | SP_Z | SP_OVERLAP|SP_CUTOUT,			/* Sprite Attributes */

	0x1234,			/* Sprite Depth: Z */

	255,255,255,255,	/* Sprite Coloration: RGBA */

	0,0,NULL,		/* Color LookUp Table: start_index, length, address */

	0,1,			/* Sprite Bitmap index: start index, step increment */

	NUM_itembox_BMS,		/* Number of bitmaps */
	NUM_DL(NUM_itembox_BMS),	/* Number of display list locations allocated */

	32, 32,			/* Sprite Bitmap Height: Used_height, physical height */
	G_IM_FMT_RGBA,		/* Sprite Bitmap Format */
	G_IM_SIZ_16b,		/* Sprite Bitmap Texel Size */

	itembox_bitmaps,		/* Pointer to bitmaps */

	itembox_dl,			/* Display list memory */

	NULL			/* next_dl pointer */

};

	#endif

