Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
995 lines (847 sloc)
24.4 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. | |
| * | |
| * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) 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.henderson@ntlworld.com). | |
| * | |
| * DOS port code contains the works of other authors. See headers in | |
| * individual files. | |
| * | |
| * Snes9x homepage: http://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. | |
| */ | |
| #include "snes9x.h" | |
| #include "memmap.h" | |
| #include "ppu.h" | |
| #include "display.h" | |
| #include "gfx.h" | |
| #include "tile_org.h" | |
| extern uint32 HeadMask [4]; | |
| extern uint32 TailMask [5]; | |
| uint8 orgConvertTile (uint8 *pCache, uint32 TileAddr) | |
| { | |
| register uint8 *tp = &VRAM[TileAddr]; | |
| uint32 *p = (uint32 *) pCache; | |
| uint32 non_zero = 0; | |
| uint8 line; | |
| switch (GPUPack.BG.BitShift) | |
| { | |
| case 8: | |
| for (line = 8; line != 0; line--, tp += 2) | |
| { | |
| uint32 p1 = 0; | |
| uint32 p2 = 0; | |
| register uint8 pix; | |
| if ((pix = *(tp + 0))) | |
| { | |
| p1 |= odd_high[0][pix >> 4]; | |
| p2 |= odd_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 1))) | |
| { | |
| p1 |= even_high[0][pix >> 4]; | |
| p2 |= even_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 16))) | |
| { | |
| p1 |= odd_high[1][pix >> 4]; | |
| p2 |= odd_low[1][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 17))) | |
| { | |
| p1 |= even_high[1][pix >> 4]; | |
| p2 |= even_low[1][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 32))) | |
| { | |
| p1 |= odd_high[2][pix >> 4]; | |
| p2 |= odd_low[2][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 33))) | |
| { | |
| p1 |= even_high[2][pix >> 4]; | |
| p2 |= even_low[2][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 48))) | |
| { | |
| p1 |= odd_high[3][pix >> 4]; | |
| p2 |= odd_low[3][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 49))) | |
| { | |
| p1 |= even_high[3][pix >> 4]; | |
| p2 |= even_low[3][pix & 0xf]; | |
| } | |
| *p++ = p1; | |
| *p++ = p2; | |
| non_zero |= p1 | p2; | |
| } | |
| break; | |
| case 4: | |
| for (line = 8; line != 0; line--, tp += 2) | |
| { | |
| uint32 p1 = 0; | |
| uint32 p2 = 0; | |
| register uint8 pix; | |
| if ((pix = *(tp + 0))) | |
| { | |
| p1 |= odd_high[0][pix >> 4]; | |
| p2 |= odd_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 1))) | |
| { | |
| p1 |= even_high[0][pix >> 4]; | |
| p2 |= even_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 16))) | |
| { | |
| p1 |= odd_high[1][pix >> 4]; | |
| p2 |= odd_low[1][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 17))) | |
| { | |
| p1 |= even_high[1][pix >> 4]; | |
| p2 |= even_low[1][pix & 0xf]; | |
| } | |
| *p++ = p1; | |
| *p++ = p2; | |
| non_zero |= p1 | p2; | |
| } | |
| break; | |
| case 2: | |
| for (line = 8; line != 0; line--, tp += 2) | |
| { | |
| uint32 p1 = 0; | |
| uint32 p2 = 0; | |
| register uint8 pix; | |
| if ((pix = *(tp + 0))) | |
| { | |
| p1 |= odd_high[0][pix >> 4]; | |
| p2 |= odd_low[0][pix & 0xf]; | |
| } | |
| if ((pix = *(tp + 1))) | |
| { | |
| p1 |= even_high[0][pix >> 4]; | |
| p2 |= even_low[0][pix & 0xf]; | |
| } | |
| *p++ = p1; | |
| *p++ = p2; | |
| non_zero |= p1 | p2; | |
| } | |
| break; | |
| } | |
| return (non_zero ? TRUE : BLANK_TILE); | |
| } | |
| #define PLOT_PIXEL(screen, pixel) (pixel) | |
| inline void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ | |
| { \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELSHI16 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[2*N])) \ | |
| { \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELSHI16_FLIPPED (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[6 - 2*N])) \ | |
| { \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[N])) \ | |
| { \ | |
| Screen [N * 2] = Screen [N * 2 + 1] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N * 2] = Depth [N * 2 + 1] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| Screen [N * 2] = Screen [N * 2 + 1] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N * 2] = Depth [N * 2 + 1] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[N])) \ | |
| { \ | |
| Screen [N * 2] = Screen [N * 2 + 1] = Screen [(GPUPack.GFX.RealPitch >> 1) + N * 2] = \ | |
| Screen [(GPUPack.GFX.RealPitch >> 1) + N * 2 + 1] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N * 2] = Depth [N * 2 + 1] = Depth [(GPUPack.GFX.RealPitch >> 1) + N * 2] = \ | |
| Depth [(GPUPack.GFX.RealPitch >> 1) + N * 2 + 1] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| Screen [N * 2] = Screen [N * 2 + 1] = Screen [(GPUPack.GFX.RealPitch >> 1) + N * 2] = \ | |
| Screen [(GPUPack.GFX.RealPitch >> 1) + N * 2 + 1] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N * 2] = Depth [N * 2 + 1] = Depth [(GPUPack.GFX.RealPitch >> 1) + N * 2] = \ | |
| Depth [(GPUPack.GFX.RealPitch >> 1) + N * 2 + 1] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| void orgDrawTile16 (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4) | |
| } | |
| void orgDrawClippedTile16 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4) | |
| } | |
| void orgDrawTileHi16 (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4) | |
| } | |
| void orgDrawClippedTileHi16 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4) | |
| } | |
| void orgDrawTile16x2 (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16x2, WRITE_4PIXELS16_FLIPPEDx2, 8) | |
| } | |
| void orgDrawClippedTile16x2 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16x2, WRITE_4PIXELS16_FLIPPEDx2, 8) | |
| } | |
| void orgDrawTile16x2x2 (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16x2x2, WRITE_4PIXELS16_FLIPPEDx2x2, 8) | |
| } | |
| void orgDrawClippedTile16x2x2 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16x2x2, WRITE_4PIXELS16_FLIPPEDx2x2, 8) | |
| } | |
| void orgDrawLargePixel16 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Pixels, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint16 *sp = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.DB + Offset; | |
| uint16 pixel; | |
| RENDER_TILE_LARGE (GPUPack.GFX.ScreenColors [pixel], PLOT_PIXEL) | |
| } | |
| inline void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ | |
| { \ | |
| if (SubDepth [N]) \ | |
| { \ | |
| if (SubDepth [N] != 1) \ | |
| Screen [N] = COLOR_ADD (GPUPack.GFX.ScreenColors [Pixel], \ | |
| Screen [GPUPack.GFX.Delta + N]); \ | |
| else \ | |
| Screen [N] = COLOR_ADD (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| } \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| if (SubDepth [N]) \ | |
| { \ | |
| if (SubDepth [N] != 1) \ | |
| Screen [N] = COLOR_ADD (GPUPack.GFX.ScreenColors [Pixel], \ | |
| Screen [GPUPack.GFX.Delta + N]); \ | |
| else \ | |
| Screen [N] = COLOR_ADD (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| } \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ | |
| { \ | |
| if (SubDepth [N]) \ | |
| { \ | |
| if (SubDepth [N] != 1) \ | |
| Screen [N] = (uint16) (COLOR_ADD1_2 (GPUPack.GFX.ScreenColors [Pixel], \ | |
| Screen [GPUPack.GFX.Delta + N])); \ | |
| else \ | |
| Screen [N] = COLOR_ADD (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| } \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| if (SubDepth [N]) \ | |
| { \ | |
| if (SubDepth [N] != 1) \ | |
| Screen [N] = (uint16) (COLOR_ADD1_2 (GPUPack.GFX.ScreenColors [Pixel], \ | |
| Screen [GPUPack.GFX.Delta + N])); \ | |
| else \ | |
| Screen [N] = COLOR_ADD (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| } \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ | |
| { \ | |
| if (SubDepth [N]) \ | |
| { \ | |
| if (SubDepth [N] != 1) \ | |
| Screen [N] = (uint16) COLOR_SUB (GPUPack.GFX.ScreenColors [Pixel], \ | |
| Screen [GPUPack.GFX.Delta + N]); \ | |
| else \ | |
| Screen [N] = (uint16) COLOR_SUB (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| } \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| if (SubDepth [N]) \ | |
| { \ | |
| if (SubDepth [N] != 1) \ | |
| Screen [N] = (uint16) COLOR_SUB (GPUPack.GFX.ScreenColors [Pixel], \ | |
| Screen [GPUPack.GFX.Delta + N]); \ | |
| else \ | |
| Screen [N] = (uint16) COLOR_SUB (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| } \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ | |
| { \ | |
| if (SubDepth [N]) \ | |
| { \ | |
| if (SubDepth [N] != 1) \ | |
| Screen [N] = (uint16) COLOR_SUB1_2 (GPUPack.GFX.ScreenColors [Pixel], \ | |
| Screen [GPUPack.GFX.Delta + N]); \ | |
| else \ | |
| Screen [N] = (uint16) COLOR_SUB (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| } \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPED_SUB1_2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| if (SubDepth [N]) \ | |
| { \ | |
| if (SubDepth [N] != 1) \ | |
| Screen [N] = (uint16) COLOR_SUB1_2 (GPUPack.GFX.ScreenColors [Pixel], \ | |
| Screen [GPUPack.GFX.Delta + N]); \ | |
| else \ | |
| Screen [N] = (uint16) COLOR_SUB (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| } \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| void orgDrawTile16Add (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4) | |
| } | |
| void orgDrawClippedTile16Add (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4) | |
| } | |
| void orgDrawTile16Add1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4) | |
| } | |
| void orgDrawClippedTile16Add1_2 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4) | |
| } | |
| void orgDrawTile16Sub (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4) | |
| } | |
| void orgDrawClippedTile16Sub (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4) | |
| } | |
| void orgDrawTile16Sub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4) | |
| } | |
| void orgDrawClippedTile16Sub1_2 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4) | |
| } | |
| inline void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ | |
| { \ | |
| if (SubDepth [N] == 1) \ | |
| Screen [N] = (uint16) (COLOR_ADD1_2 (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour)); \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel];\ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| if (SubDepth [N] == 1) \ | |
| Screen [N] = (uint16) (COLOR_ADD1_2 (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour)); \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel];\ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ | |
| { \ | |
| if (SubDepth [N] == 1) \ | |
| Screen [N] = (uint16) COLOR_SUB1_2 (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| inline void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (uint32 Offset, uint8 *Pixels) | |
| { | |
| uint32 Pixel; | |
| uint16 *Screen = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint8 *SubDepth = GPUPack.GFX.SubZBuffer + Offset; | |
| #define FN(N) \ | |
| if (GPUPack.GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ | |
| { \ | |
| if (SubDepth [N] == 1) \ | |
| Screen [N] = (uint16) COLOR_SUB1_2 (GPUPack.GFX.ScreenColors [Pixel], \ | |
| GPUPack.GFX.FixedColour); \ | |
| else \ | |
| Screen [N] = GPUPack.GFX.ScreenColors [Pixel]; \ | |
| Depth [N] = GPUPack.GFX.Z2; \ | |
| } | |
| FN(0) | |
| FN(1) | |
| FN(2) | |
| FN(3) | |
| #undef FN | |
| } | |
| void orgDrawTile16FixedAdd1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16_ADDF1_2, WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4) | |
| } | |
| void orgDrawClippedTile16FixedAdd1_2 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADDF1_2, | |
| WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4) | |
| } | |
| void orgDrawTile16FixedSub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, | |
| uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| RENDER_TILE(WRITE_4PIXELS16_SUBF1_2, WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4) | |
| } | |
| void orgDrawClippedTile16FixedSub1_2 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Width, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint8 *bp; | |
| TILE_CLIP_PREAMBLE | |
| RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUBF1_2, | |
| WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4) | |
| } | |
| void orgDrawLargePixel16Add (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Pixels, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint16 *sp = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint16 pixel; | |
| #define LARGE_ADD_PIXEL(s, p) \ | |
| (Depth [z + GPUPack.GFX.DepthDelta] ? (Depth [z + GPUPack.GFX.DepthDelta] != 1 ? \ | |
| COLOR_ADD (p, *(s + GPUPack.GFX.Delta)) : \ | |
| COLOR_ADD (p, GPUPack.GFX.FixedColour)) \ | |
| : p) | |
| RENDER_TILE_LARGE (GPUPack.GFX.ScreenColors [pixel], LARGE_ADD_PIXEL) | |
| } | |
| void orgDrawLargePixel16Add1_2 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Pixels, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint16 *sp = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint16 pixel; | |
| #define LARGE_ADD_PIXEL1_2(s, p) \ | |
| ((uint16) (Depth [z + GPUPack.GFX.DepthDelta] ? (Depth [z + GPUPack.GFX.DepthDelta] != 1 ? \ | |
| COLOR_ADD1_2 (p, *(s + GPUPack.GFX.Delta)) : \ | |
| COLOR_ADD (p, GPUPack.GFX.FixedColour)) \ | |
| : p)) | |
| RENDER_TILE_LARGE (GPUPack.GFX.ScreenColors [pixel], LARGE_ADD_PIXEL1_2) | |
| } | |
| void orgDrawLargePixel16Sub (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Pixels, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint16 *sp = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint16 pixel; | |
| #define LARGE_SUB_PIXEL(s, p) \ | |
| (Depth [z + GPUPack.GFX.DepthDelta] ? (Depth [z + GPUPack.GFX.DepthDelta] != 1 ? \ | |
| COLOR_SUB (p, *(s + GPUPack.GFX.Delta)) : \ | |
| COLOR_SUB (p, GPUPack.GFX.FixedColour)) \ | |
| : p) | |
| RENDER_TILE_LARGE (GPUPack.GFX.ScreenColors [pixel], LARGE_SUB_PIXEL) | |
| } | |
| void orgDrawLargePixel16Sub1_2 (uint32 Tile, uint32 Offset, | |
| uint32 StartPixel, uint32 Pixels, | |
| uint32 StartLine, uint32 LineCount) | |
| { | |
| TILE_PREAMBLE | |
| register uint16 *sp = (uint16 *) GPUPack.GFX.S + Offset; | |
| uint8 *Depth = GPUPack.GFX.ZBuffer + Offset; | |
| uint16 pixel; | |
| #define LARGE_SUB_PIXEL1_2(s, p) \ | |
| (Depth [z + GPUPack.GFX.DepthDelta] ? (Depth [z + GPUPack.GFX.DepthDelta] != 1 ? \ | |
| COLOR_SUB1_2 (p, *(s + GPUPack.GFX.Delta)) : \ | |
| COLOR_SUB (p, GPUPack.GFX.FixedColour)) \ | |
| : p) | |
| RENDER_TILE_LARGE (GPUPack.GFX.ScreenColors [pixel], LARGE_SUB_PIXEL1_2) | |
| } | |