⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tile.h

📁 著名SFC模拟器Snes9x的源代码。
💻 H
字号:
/* * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. * * (c) Copyright 1996 - 2001 Gary Henderson (gary@daniver.demon.co.uk) and *                           Jerremy Koot (jkoot@snes9x.com) * * Super FX C emulator code  * (c) Copyright 1997 - 1999 Ivar (Ivar@snes9x.com) and *                           Gary Henderson. * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. * * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. * C4 C code (c) Copyright 2001 Gary Henderson (gary@daniver.demon.co.uk). * * DOS port code contains the works of other authors. See headers in * individual files. * * Snes9x homepage: www.snes9x.com * * Permission to use, copy, modify and distribute Snes9x in both binary and * source form, for non-commercial purposes, is hereby granted without fee, * providing that this license information and copyright notice appear with * all copies and any derived work. * * This software is provided 'as-is', without any express or implied * warranty. In no event shall the authors be held liable for any damages * arising from the use of this software. * * Snes9x is freeware for PERSONAL USE only. Commercial users should * seek permission of the copyright holders first. Commercial use includes * charging money for Snes9x or software derived from Snes9x. * * The copyright holders request that bug fixes and improvements to the code * should be forwarded to them so everyone can benefit from the modifications * in future versions. * * Super NES and Super Nintendo Entertainment System are trademarks of * Nintendo Co., Limited and its subsidiary companies. */#ifndef _TILE_H_#define _TILE_H_#define TILE_PREAMBLE \    uint8 *pCache; \\    uint32 TileAddr = BG.TileAddress + ((Tile & 0x3ff) << BG.TileShift); \    if ((Tile & 0x1ff) >= 256) \	TileAddr += BG.NameSelect; \\    TileAddr &= 0xffff; \\    uint32 TileNumber; \    pCache = &BG.Buffer[(TileNumber = (TileAddr >> BG.TileShift)) << 6]; \\    if (!BG.Buffered [TileNumber]) \    { \	BG.Buffered[TileNumber] = ConvertTile (pCache, TileAddr); \    } \\    if (BG.Buffered [TileNumber] == BLANK_TILE) \	return; \    register uint32 l; \    if (BG.DirectColourMode) \    { \	if (IPPU.DirectColourMapsNeedRebuild) \            S9xBuildDirectColourMaps (); \        GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & BG.PaletteMask]; \    } \    else \	GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & BG.PaletteMask) << BG.PaletteShift) + BG.StartPalette];#define RENDER_TILE(NORMAL, FLIPPED, N) \    if (!(Tile & (V_FLIP | H_FLIP))) \    { \	bp = pCache + StartLine; \	for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \	{ \	    if (*(uint32 *) bp) \		NORMAL (Offset, bp); \	    if (*(uint32 *) (bp + 4)) \		NORMAL (Offset + N, bp + 4); \	} \    } \    else \    if (!(Tile & V_FLIP)) \    { \	bp = pCache + StartLine; \	for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \	{ \	    if (*(uint32 *) (bp + 4)) \		FLIPPED (Offset, bp + 4); \	    if (*(uint32 *) bp) \		FLIPPED (Offset + N, bp); \	} \    } \    else \    if (Tile & H_FLIP) \    { \	bp = pCache + 56 - StartLine; \	for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \	{ \	    if (*(uint32 *) (bp + 4)) \		FLIPPED (Offset, bp + 4); \	    if (*(uint32 *) bp) \		FLIPPED (Offset + N, bp); \	} \    } \    else \    { \	bp = pCache + 56 - StartLine; \	for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \	{ \	    if (*(uint32 *) bp) \		NORMAL (Offset, bp); \	    if (*(uint32 *) (bp + 4)) \		NORMAL (Offset + N, bp + 4); \	} \    }#define TILE_CLIP_PREAMBLE \    uint32 dd; \    uint32 d1; \    uint32 d2; \\    if (StartPixel < 4) \    { \	d1 = HeadMask [StartPixel]; \	if (StartPixel + Width < 4) \	    d1 &= TailMask [StartPixel + Width]; \    } \    else \	d1 = 0; \\    if (StartPixel + Width > 4) \    { \	if (StartPixel > 4) \	    d2 = HeadMask [StartPixel - 4]; \	else \	    d2 = 0xffffffff; \\	d2 &= TailMask [(StartPixel + Width - 4)]; \    } \    else \	d2 = 0;#define RENDER_CLIPPED_TILE(NORMAL, FLIPPED, N) \    if (!(Tile & (V_FLIP | H_FLIP))) \    { \	bp = pCache + StartLine; \	for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \	{ \	    if ((dd = (*(uint32 *) bp) & d1)) \		NORMAL (Offset, (uint8 *) &dd); \	    if ((dd = (*(uint32 *) (bp + 4)) & d2)) \		NORMAL (Offset + N, (uint8 *) &dd); \	} \    } \    else \    if (!(Tile & V_FLIP)) \    { \	bp = pCache + StartLine; \	SWAP_DWORD (d1); \	SWAP_DWORD (d2); \	for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \	{ \	    if ((dd = *(uint32 *) (bp + 4) & d1)) \		FLIPPED (Offset, (uint8 *) &dd); \	    if ((dd = *(uint32 *) bp & d2)) \		FLIPPED (Offset + N, (uint8 *) &dd); \	} \    } \    else \    if (Tile & H_FLIP) \    { \	bp = pCache + 56 - StartLine; \	SWAP_DWORD (d1); \	SWAP_DWORD (d2); \	for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \	{ \	    if ((dd = *(uint32 *) (bp + 4) & d1)) \		FLIPPED (Offset, (uint8 *) &dd); \	    if ((dd = *(uint32 *) bp & d2)) \		FLIPPED (Offset + N, (uint8 *) &dd); \	} \    } \    else \    { \	bp = pCache + 56 - StartLine; \	for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \	{ \	    if ((dd = (*(uint32 *) bp) & d1)) \		NORMAL (Offset, (uint8 *) &dd); \	    if ((dd = (*(uint32 *) (bp + 4)) & d2)) \		NORMAL (Offset + N, (uint8 *) &dd); \	} \    }#define RENDER_TILE_LARGE(PIXEL, FUNCTION) \    if (!(Tile & (V_FLIP | H_FLIP))) \    { \	if ((pixel = *(pCache + StartLine + StartPixel))) \	{ \	    pixel = PIXEL; \	    for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \	    { \		for (int z = Pixels - 1; z >= 0; z--) \		    if (GFX.Z1 > Depth [z]) \		    { \			sp [z] = FUNCTION(sp + z, pixel); \			Depth [z] = GFX.Z2; \		    }\	    } \	} \    } \    else \    if (!(Tile & V_FLIP)) \    { \	StartPixel = 7 - StartPixel; \	if ((pixel = *(pCache + StartLine + StartPixel))) \	{ \	    pixel = PIXEL; \	    for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \	    { \		for (int z = Pixels - 1; z >= 0; z--) \		    if (GFX.Z1 > Depth [z]) \		    { \			sp [z] = FUNCTION(sp + z, pixel); \			Depth [z] = GFX.Z2; \		    }\	    } \	} \    } \    else \    if (Tile & H_FLIP) \    { \	StartPixel = 7 - StartPixel; \	if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \	{ \	    pixel = PIXEL; \	    for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \	    { \		for (int z = Pixels - 1; z >= 0; z--) \		    if (GFX.Z1 > Depth [z]) \		    { \			sp [z] = FUNCTION(sp + z, pixel); \			Depth [z] = GFX.Z2; \		    }\	    } \	} \    } \    else \    { \	if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \	{ \	    pixel = PIXEL; \	    for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \	    { \		for (int z = Pixels - 1; z >= 0; z--) \		    if (GFX.Z1 > Depth [z]) \		    { \			sp [z] = FUNCTION(sp + z, pixel); \			Depth [z] = GFX.Z2; \		    }\	    } \	} \    }#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -