www.pudn.com > ncdzsrc.rar > sprite.c


/*************************************************************************** 
 
	sprite.c 
 
	NEOGEO CD スプライト描画処理 
 
***************************************************************************/ 
 
#ifndef SELF_INCLUDE 
 
#define ARGS	UINT32 *sprite, UINT16 *bm, UINT16 *paldata 
 
/******************************************************************************/ 
#define SELF_INCLUDE 
/******************************************************************************/ 
 
#ifdef OPAQUE 
#undef OPAQUE 
#endif 
 
#define OPAQUE 0 
	#define FLIPY 0 
		#define FLIPX 0 
			#include "sprite.c" /* opaque = no, flipx = no, flipy = no */ 
		#undef  FLIPX 
		#define FLIPX 1 
			#include "sprite.c" /* opaque = no, flipx = yes, flipy = no */ 
		#undef  FLIPX 
	#undef  FLIPY 
	#define FLIPY 1 
		#define FLIPX 0 
			#include "sprite.c" /* opaque = no, flipx = no, flipy = yes */ 
		#undef  FLIPX 
		#define FLIPX 1 
			#include "sprite.c" /* opaque = no, flipx = yes, flipy = yes */ 
		#undef  FLIPX 
	#undef  FLIPY 
#undef  OPAQUE 
 
#define OPAQUE 1 
	#define FLIPY 0 
		#define FLIPX 0 
			#include "sprite.c" /* opaque = yes, flipx = no, flipy = no */ 
		#undef  FLIPX 
		#define FLIPX 1 
			#include "sprite.c" /* opaque = yes, flipx = yes, flipy = no */ 
		#undef  FLIPX 
	#undef  FLIPY 
	#define FLIPY 1 
		#define FLIPX 0 
			#include "sprite.c" /* opaque = yes, flipx = no, flipy = yes */ 
		#undef  FLIPX 
		#define FLIPX 1 
			#include "sprite.c" /* opaque = yes, flipx = yes, flipy = yes */ 
		#undef  FLIPX 
	#undef  FLIPY 
#undef OPAQUE 
 
/******************************************************************************/ 
#undef  SELF_INCLUDE 
/******************************************************************************/ 
 
static void (*neo_draw_sprite[2][4][16])(UINT32 *sprite, UINT16 *bm, UINT16 *paldata) = 
{ 
	{ 
		{ 
			draw_sprite_0_0_1,  draw_sprite_0_0_2, 
			draw_sprite_0_0_3,  draw_sprite_0_0_4, 
			draw_sprite_0_0_5,  draw_sprite_0_0_6, 
			draw_sprite_0_0_7,  draw_sprite_0_0_8, 
			draw_sprite_0_0_9,  draw_sprite_0_0_10, 
			draw_sprite_0_0_11, draw_sprite_0_0_12, 
			draw_sprite_0_0_13, draw_sprite_0_0_14, 
			draw_sprite_0_0_15, draw_sprite_0_0_16 
		}, 
		{ 
			draw_sprite_0_1_1,  draw_sprite_0_1_2, 
			draw_sprite_0_1_3,  draw_sprite_0_1_4, 
			draw_sprite_0_1_5,  draw_sprite_0_1_6, 
			draw_sprite_0_1_7,  draw_sprite_0_1_8, 
			draw_sprite_0_1_9,  draw_sprite_0_1_10, 
			draw_sprite_0_1_11, draw_sprite_0_1_12, 
			draw_sprite_0_1_13, draw_sprite_0_1_14, 
			draw_sprite_0_1_15, draw_sprite_0_1_16 
		}, 
		{ 
			draw_sprite_0_2_1,  draw_sprite_0_2_2, 
			draw_sprite_0_2_3,  draw_sprite_0_2_4, 
			draw_sprite_0_2_5,  draw_sprite_0_2_6, 
			draw_sprite_0_2_7,  draw_sprite_0_2_8, 
			draw_sprite_0_2_9,  draw_sprite_0_2_10, 
			draw_sprite_0_2_11, draw_sprite_0_2_12, 
			draw_sprite_0_2_13, draw_sprite_0_2_14, 
			draw_sprite_0_2_15, draw_sprite_0_2_16 
		}, 
		{ 
			draw_sprite_0_3_1,  draw_sprite_0_3_2, 
			draw_sprite_0_3_3,  draw_sprite_0_3_4, 
			draw_sprite_0_3_5,  draw_sprite_0_3_6, 
			draw_sprite_0_3_7,  draw_sprite_0_3_8, 
			draw_sprite_0_3_9,  draw_sprite_0_3_10, 
			draw_sprite_0_3_11, draw_sprite_0_3_12, 
			draw_sprite_0_3_13, draw_sprite_0_3_14, 
			draw_sprite_0_3_15, draw_sprite_0_3_16 
		} 
	}, 
	{ 
		{ 
			draw_sprite_1_0_1,  draw_sprite_1_0_2, 
			draw_sprite_1_0_3,  draw_sprite_1_0_4, 
			draw_sprite_1_0_5,  draw_sprite_1_0_6, 
			draw_sprite_1_0_7,  draw_sprite_1_0_8, 
			draw_sprite_1_0_9,  draw_sprite_1_0_10, 
			draw_sprite_1_0_11, draw_sprite_1_0_12, 
			draw_sprite_1_0_13, draw_sprite_1_0_14, 
			draw_sprite_1_0_15, draw_sprite_1_0_16 
		}, 
		{ 
			draw_sprite_1_1_1,  draw_sprite_1_1_2, 
			draw_sprite_1_1_3,  draw_sprite_1_1_4, 
			draw_sprite_1_1_5,  draw_sprite_1_1_6, 
			draw_sprite_1_1_7,  draw_sprite_1_1_8, 
			draw_sprite_1_1_9,  draw_sprite_1_1_10, 
			draw_sprite_1_1_11, draw_sprite_1_1_12, 
			draw_sprite_1_1_13, draw_sprite_1_1_14, 
			draw_sprite_1_1_15, draw_sprite_1_1_16 
		}, 
		{ 
			draw_sprite_1_2_1,  draw_sprite_1_2_2, 
			draw_sprite_1_2_3,  draw_sprite_1_2_4, 
			draw_sprite_1_2_5,  draw_sprite_1_2_6, 
			draw_sprite_1_2_7,  draw_sprite_1_2_8, 
			draw_sprite_1_2_9,  draw_sprite_1_2_10, 
			draw_sprite_1_2_11, draw_sprite_1_2_12, 
			draw_sprite_1_2_13, draw_sprite_1_2_14, 
			draw_sprite_1_2_15, draw_sprite_1_2_16 
		}, 
		{ 
			draw_sprite_1_3_1,  draw_sprite_1_3_2, 
			draw_sprite_1_3_3,  draw_sprite_1_3_4, 
			draw_sprite_1_3_5,  draw_sprite_1_3_6, 
			draw_sprite_1_3_7,  draw_sprite_1_3_8, 
			draw_sprite_1_3_9,  draw_sprite_1_3_10, 
			draw_sprite_1_3_11, draw_sprite_1_3_12, 
			draw_sprite_1_3_13, draw_sprite_1_3_14, 
			draw_sprite_1_3_15, draw_sprite_1_3_16 
		} 
	} 
}; 
 
 
/******************************************************************************/ 
 
INLINE void neo_draw_gfx(UINT16 **line, UINT16 *paldata, unsigned int code, 
		int flipx, int sx, int sy, int zx, int yoffs, int opaque) 
{ 
	UINT32 *fspr; 
 
	if (sx <= -16) return; 
 
#if ENABLE_SYSTEM_CHECK 
	fspr = (UINT32 *)memory_region(REGION_GFX6) + code * 32 + 2 * yoffs; 
#else 
	fspr = (UINT32 *)memory_region(REGION_GFX2) + code * 32 + 2 * yoffs; 
#endif 
 
	(*neo_draw_sprite[opaque][flipx][zx])(fspr, line[sy] + sx, paldata); 
} 
 
 
static void draw_sprites(int start, int end, const struct rectangle *clip) 
{ 
	int sx = 0, sy = 0, my = 0, zx = 0x0f, zy = 0xff; 
	int offs, count; 
	int t1, t3; 
	char fullmode = 0; 
	UINT16 **line = scrbitmap.line; 
 
	/* Draw sprites */ 
	for (count = start; count < end; count++) 
	{ 
		UINT8 *zoomy_rom; 
		int drawn_lines; 
 
		t1 = neogeo_vidram16[(0x10400 >> 1) + count]; 
		t3 = neogeo_vidram16[(0x10000 >> 1) + count]; 
 
		/* If this bit is set this new column is placed next to last one */ 
		if (t1 & 0x40) 
		{ 
			sx += zx + 1; 
		} 
		else /* nope it is a new block */ 
		{ 
			/* Sprite scaling */ 
			zy = t3 & 0xff; 
 
			sx = neogeo_vidram16[(0x10800 >> 1) + count] >> 7; 
 
			/* Number of tiles in this strip */ 
			my = t1 & 0x3f; 
 
			sy = 0x200 - (t1 >> 7); 
 
			if (my > 0x20) 
			{ 
				my = 0x20; 
 
//				if (sy < 248) 
					fullmode = 1; 
//				else 
					/* kludge to avoid a white line in KOF94 Japan stage... */ 
					/* probably indication of a subtle bug somewhere else */ 
//					fullmode = 0; 
			} 
			else 
				fullmode = 0; 
		} 
 
		/* Get new zoom for this column */ 
		zx = (t3 >> 8) & 0x0f; 
 
		if (sx >= 0x1f0) sx -= 0x200; 
 
		/* No point doing anything if tile strip is 0 */ 
		if (my == 0) continue; 
 
		if (sx >= 320) continue; 
 
		offs = count << 6; 
 
		/* get pointer to table in zoom ROM (thanks to Miguel Angel Horna for the info) */ 
		zoomy_rom = memory_region(REGION_GFX3) + (zy << 8); 
		drawn_lines = 0; 
 
		/* my holds the number of tiles in each vertical multisprite block */ 
		while (drawn_lines < my * 0x10) 
		{ 
			int yy = (sy + drawn_lines) & 0x1ff; 
 
			if (yy >= clip->min_y && yy <= clip->max_y) 
			{ 
				int tileno, tileatr; 
				int tile, yoffs; 
				int zoom_line; 
				int invert = 0; 
 
				zoom_line = drawn_lines & 0xff; 
				if (drawn_lines & 0x100) 
				{ 
					zoom_line ^= 0xff; 
					invert = 1; 
				} 
				if (fullmode)	/* fix for joyjoy, trally... */ 
				{ 
					if (zy) 
					{ 
						zoom_line %= 2 * (zy + 1); 
						if (zoom_line >= (zy + 1)) 
						{ 
							zoom_line = 2 * (zy + 1) - 1 - zoom_line; 
							invert ^= 1; 
						} 
					} 
				} 
 
				yoffs = zoomy_rom[zoom_line] & 0x0f; 
				tile = zoomy_rom[zoom_line] >> 4; 
 
				if (invert) 
				{ 
					tile ^= 0x1f; 
					yoffs ^= 0x0f; 
				} 
 
				tileno  = neogeo_vidram16[offs + 2 * tile]; 
				tileatr = neogeo_vidram16[offs + 2 * tile + 1]; 
 
				if (tileatr & 0x8) 
					tileno = (tileno & ~7) | (neogeo_frame_counter & 7); 
				else 
				if (tileatr & 0x4) 
					tileno = (tileno & ~3) | (neogeo_frame_counter & 3); 
 
				if (tileatr & 0x02) yoffs ^= 0x0f;	/* flip y */ 
 
				if (video_spr_usage[tileno]) 
				{ 
					UINT16 color = tileatr >> 8; 
 
					neo_draw_gfx(line, 
						&video_palette[color << 4], 
						tileno, 
						tileatr & 0x01, 
						sx, yy, 
						zx, yoffs, 
						video_spr_usage[tileno] & 1 
					); 
				} 
			} 
 
			drawn_lines++; 
		} 
	} 
} 
 
#undef ARGS 
 
/******************************************************************************/ 
 
#else	/* SELF_INCLUDE */ 
 
#define TILE(x)			tile = sprite[x]; 
 
#if (OPAQUE == 0) 
 
#define B0(x, shift)	if (tile & 0x0f) bm[x] = paldata[tile & 0x0f]; 
#define BX(x, shift)	tile >>= (shift*4); B0(x, 0); 
 
#if (FLIPX == 0 && FLIPY == 0) 
#define FUNC_START(zx)	static void draw_sprite_0_0_##zx(ARGS) 
#elif (FLIPX == 1 && FLIPY == 0) 
#define FUNC_START(zx)	static void draw_sprite_0_1_##zx(ARGS) 
#elif (FLIPX == 0 && FLIPY == 1) 
#define FUNC_START(zx)	static void draw_sprite_0_2_##zx(ARGS) 
#else 
#define FUNC_START(zx)	static void draw_sprite_0_3_##zx(ARGS) 
#endif 
 
#else /* OPAQUE */ 
 
#define B0(x, shift)	bm[x] = paldata[tile & 0x0f]; 
#define BX(x, shift)	tile >>= (shift*4); B0(x, 0); 
 
#if (FLIPX == 0 && FLIPY == 0) 
#define FUNC_START(zx)	static void draw_sprite_1_0_##zx(ARGS) 
#elif (FLIPX == 1 && FLIPY == 0) 
#define FUNC_START(zx)	static void draw_sprite_1_1_##zx(ARGS) 
#elif (FLIPX == 0 && FLIPY == 1) 
#define FUNC_START(zx)	static void draw_sprite_1_2_##zx(ARGS) 
#else 
#define FUNC_START(zx)	static void draw_sprite_1_3_##zx(ARGS) 
#endif 
 
#endif /* OPAQUE */ 
 
#define UPDATE_SPRITE_POS								\ 
{														\ 
	UINT32 tile;										\ 
 
#define FUNC_END										\ 
} 
 
 
/*--------------------------------------------*/ 
/*  1 : -------- O------- :          0        */ 
/*  2 : ----O--- O------- :     4    0        */ 
/*  3 : ----O--- O---O--- :     4    0   4    */ 
/*  4 : --O-O--- O---O--- :   2 2    0   4    */ 
/*  5 : --O-O--- O---O-O- :   2 2    0   4 2  */ 
/*  6 : --O-O-O- O---O-O- :   2 2 2  0   4 2  */ 
/*  7 : --O-O-O- O-O-O-O- :   2 2 2  0 2 2 2  */ 
/*  8 : O-O-O-O- O-O-O-O- : 0 2 2 2  0 2 2 2  */ 
/*  9 : O-O-O-O- OOO-O-O- : 0 2 2 2  011 2 2  */ 
/* 10 : O-OOO-O- OOO-O-O- : 0 211 2  011 2 2  */ 
/* 11 : O-OOO-O- OOO-O-OO : 0 211 2  011 2 21 */ 
/* 12 : O-OOO-OO OOO-O-OO : 0 211 21 011 2 21 */ 
/* 13 : O-OOO-OO OOO-OOOO : 0 211 21 011 2111 */ 
/* 14 : OOOOO-OO OOO-OOOO : 01111 21 011 2111 */ 
/* 15 : OOOOO-OO OOOOOOOO : 01111 21 01111111 */ 
/* 16 : OOOOOOOO OOOOOOOO : 01111111 01111111 */ 
/*--------------------------------------------*/ 
 
#if (FLIPX == 0) 
 
FUNC_START(1) 
	UPDATE_SPRITE_POS 
	TILE(1) B0( 0,0) 
FUNC_END 
 
FUNC_START(2) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 0,4) 
	TILE(1) B0( 1,0) 
FUNC_END 
 
FUNC_START(3) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 0,4) 
	TILE(1) B0( 1,0) BX( 2,4) 
FUNC_END 
 
FUNC_START(4) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 0,2) BX( 1,2) 
	TILE(1) B0( 2,0) BX( 3,4) 
FUNC_END 
 
FUNC_START(5) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 0,2) BX( 1,2) 
	TILE(1) B0( 2,0) BX( 3,4) BX( 4,2) 
FUNC_END 
 
FUNC_START(6) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 0,2) BX( 1,2) BX( 2,2) 
	TILE(1) B0( 3,0) BX( 4,4) BX( 5,2) 
FUNC_END 
 
FUNC_START(7) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 0,2) BX( 1,2) BX( 2,2) 
	TILE(1) B0( 3,0) BX( 4,2) BX( 5,2) BX( 6,2) 
FUNC_END 
 
FUNC_START(8) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,2) BX( 2,2) BX( 3,2) 
	TILE(1) B0( 4,0) BX( 5,2) BX( 6,2) BX( 7,2) 
FUNC_END 
 
FUNC_START(9) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,2) BX( 2,2) BX( 3,2) 
	TILE(1) B0( 4,0) BX( 5,1) BX( 6,1) BX( 7,2) BX( 8,2) 
FUNC_END 
 
FUNC_START(10) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,2) BX( 2,1) BX( 3,1) BX( 4,2) 
	TILE(1) B0( 5,0) BX( 6,1) BX( 7,1) BX( 8,2) BX( 9,2) 
FUNC_END 
 
FUNC_START(11) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,2) BX( 2,1) BX( 3,1) BX( 4,2) 
	TILE(1) B0( 5,0) BX( 6,1) BX( 7,1) BX( 8,2) BX( 9,2) BX(10,1) 
FUNC_END 
 
FUNC_START(12) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,2) BX( 2,1) BX( 3,1) BX( 4,2) BX( 5,1) 
	TILE(1) B0( 6,0) BX( 7,1) BX( 8,1) BX( 9,2) BX(10,2) BX(11,1) 
FUNC_END 
 
FUNC_START(13) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,2) BX( 2,1) BX( 3,1) BX( 4,2) BX( 5,1) 
	TILE(1) B0( 6,0) BX( 7,1) BX( 8,1) BX( 9,2) BX(10,1) BX(11,1) BX(12,1) 
FUNC_END 
 
FUNC_START(14) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,1) BX( 2,1) BX( 3,1) BX( 4,1) BX( 5,2) BX( 6,1) 
	TILE(1) B0( 7,0) BX( 8,1) BX( 9,1) BX(10,2) BX(11,1) BX(12,1) BX(13,1) 
FUNC_END 
 
FUNC_START(15) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,1) BX( 2,1) BX( 3,1) BX( 4,1) BX( 5,2) BX( 6,1) 
	TILE(1) B0( 7,0) BX( 8,1) BX( 9,1) BX(10,1) BX(11,1) BX(12,1) BX(13,1) BX(14,1) 
FUNC_END 
 
FUNC_START(16) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 0,0) BX( 1,1) BX( 2,1) BX( 3,1) BX( 4,1) BX( 5,1) BX( 6,1) BX( 7,1) 
	TILE(1) B0( 8,0) BX( 9,1) BX(10,1) BX(11,1) BX(12,1) BX(13,1) BX(14,1) BX(15,1) 
FUNC_END 
 
#else /* FLIPX */ 
 
FUNC_START(1) 
	UPDATE_SPRITE_POS 
	TILE(1) B0( 0,0) 
FUNC_END 
 
FUNC_START(2) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 1,4) 
	TILE(1) B0( 0,0) 
FUNC_END 
 
FUNC_START(3) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 2,4) 
	TILE(1) B0( 1,0) BX( 0,4) 
FUNC_END 
 
FUNC_START(4) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 3,2) BX( 2,2) 
	TILE(1) B0( 1,0) BX( 0,4) 
FUNC_END 
 
FUNC_START(5) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 4,2) BX( 3,2) 
	TILE(1) B0( 2,0) BX( 1,4) BX( 0,2) 
FUNC_END 
 
FUNC_START(6) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 5,2) BX( 4,2) BX( 3,2) 
	TILE(1) B0( 2,0) BX( 1,4) BX( 0,2) 
FUNC_END 
 
FUNC_START(7) 
	UPDATE_SPRITE_POS 
	TILE(0) BX( 6,2) BX( 5,2) BX( 4,2) 
	TILE(1) B0( 3,0) BX( 2,2) BX( 1,2) BX( 0,2) 
FUNC_END 
 
FUNC_START(8) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 7,0) BX( 6,2) BX( 5,2) BX( 4,2) 
	TILE(1) B0( 3,0) BX( 2,2) BX( 1,2) BX( 0,2) 
FUNC_END 
 
FUNC_START(9) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 8,0) BX( 7,2) BX( 6,2) BX( 5,2) 
	TILE(1) B0( 4,0) BX( 3,1) BX( 2,1) BX( 1,2) BX( 0,2) 
FUNC_END 
 
FUNC_START(10) 
	UPDATE_SPRITE_POS 
	TILE(0) B0( 9,0) BX( 8,2) BX( 7,1) BX( 6,1) BX( 5,2) 
	TILE(1) B0( 4,0) BX( 3,1) BX( 2,1) BX( 1,2) BX( 0,2) 
FUNC_END 
 
FUNC_START(11) 
	UPDATE_SPRITE_POS 
	TILE(0) B0(10,0) BX( 9,2) BX( 8,1) BX( 7,1) BX( 6,2) 
	TILE(1) B0( 5,0) BX( 4,1) BX( 3,1) BX( 2,2) BX( 1,2) BX( 0,1) 
FUNC_END 
 
FUNC_START(12) 
	UPDATE_SPRITE_POS 
	TILE(0) B0(11,0) BX(10,2) BX( 9,1) BX( 8,1) BX( 7,2) BX( 6,1) 
	TILE(1) B0( 5,0) BX( 4,1) BX( 3,1) BX( 2,2) BX( 1,2) BX( 0,1) 
FUNC_END 
 
FUNC_START(13) 
	UPDATE_SPRITE_POS 
	TILE(0) B0(12,0) BX(11,2) BX(10,1) BX( 9,1) BX( 8,2) BX( 7,1) 
	TILE(1) B0( 6,0) BX( 5,1) BX( 4,1) BX( 3,2) BX( 2,1) BX( 1,1) BX( 0,1) 
FUNC_END 
 
FUNC_START(14) 
	UPDATE_SPRITE_POS 
	TILE(0) B0(13,0) BX(12,1) BX(11,1) BX(10,1) BX( 9,1) BX( 8,2) BX( 7,1) 
	TILE(1) B0( 6,0) BX( 5,1) BX( 4,1) BX( 3,2) BX( 2,1) BX( 1,1) BX( 0,1) 
FUNC_END 
 
FUNC_START(15) 
	UPDATE_SPRITE_POS 
	TILE(0) B0(14,0) BX(13,1) BX(12,1) BX(11,1) BX(10,1) BX( 9,2) BX( 8,1) 
	TILE(1) B0( 7,0) BX( 6,1) BX( 5,1) BX( 4,1) BX( 3,1) BX( 2,1) BX( 1,1) BX( 0,1) 
FUNC_END 
 
FUNC_START(16) 
	UPDATE_SPRITE_POS 
	TILE(0) B0(15,0) BX(14,1) BX(13,1) BX(12,1) BX(11,1) BX(10,1) BX( 9,1) BX( 8,1) 
	TILE(1) B0( 7,0) BX( 6,1) BX( 5,1) BX( 4,1) BX( 3,1) BX( 2,1) BX( 1,1) BX( 0,1) 
FUNC_END 
 
#endif /* FLIPX */ 
 
#undef FUNC_START 
#undef FUNC_END 
#undef UPDATE_SPRITE_POS 
#undef TILE 
#undef B0 
#undef BX 
 
#endif /* SELF_INCLUDE */