2 * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
4 * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and
5 * Jerremy Koot (jkoot@snes9x.com)
7 * Super FX C emulator code
8 * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and
10 * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_.
12 * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson.
13 * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_.
14 * C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com).
16 * DOS port code contains the works of other authors. See headers in
19 * Snes9x homepage: http://www.snes9x.com
21 * Permission to use, copy, modify and distribute Snes9x in both binary and
22 * source form, for non-commercial purposes, is hereby granted without fee,
23 * providing that this license information and copyright notice appear with
24 * all copies and any derived work.
26 * This software is provided 'as-is', without any express or implied
27 * warranty. In no event shall the authors be held liable for any damages
28 * arising from the use of this software.
30 * Snes9x is freeware for PERSONAL USE only. Commercial users should
31 * seek permission of the copyright holders first. Commercial use includes
32 * charging money for Snes9x or software derived from Snes9x.
34 * The copyright holders request that bug fixes and improvements to the code
35 * should be forwarded to them so everyone can benefit from the modifications
38 * Super NES and Super Nintendo Entertainment System are trademarks of
39 * Nintendo Co., Limited and its subsidiary companies.
48 #define TILE_PREAMBLE \
51 uint32 TileAddr = BG.TileAddress + ((Tile & 0x3ff) << BG.TileShift); \
52 if ((Tile & 0x1ff) >= 256) \
53 TileAddr += BG.NameSelect; \
58 pCache = &BG.Buffer[(TileNumber = (TileAddr >> BG.TileShift)) << 6]; \
60 if (!BG.Buffered [TileNumber]) \
61 BG.Buffered[TileNumber] = ConvertTile (pCache, TileAddr); \
63 if (BG.Buffered [TileNumber] == BLANK_TILE) \
67 if (BG.DirectColourMode) \
69 if (IPPU.DirectColourMapsNeedRebuild) \
70 S9xBuildDirectColourMaps (); \
71 GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & BG.PaletteMask]; \
74 GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & BG.PaletteMask) << BG.PaletteShift) + BG.StartPalette];
76 #define RENDER_TILE(NORMAL, FLIPPED, N) \
77 if (!(Tile & (V_FLIP | H_FLIP))) \
79 bp = pCache + StartLine; \
80 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
83 NORMAL (Offset, bp); \
84 if (*(uint32 *) (bp + 4)) \
85 NORMAL (Offset + N, bp + 4); \
89 if (!(Tile & V_FLIP)) \
91 bp = pCache + StartLine; \
92 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
94 if (*(uint32 *) (bp + 4)) \
95 FLIPPED (Offset, bp + 4); \
97 FLIPPED (Offset + N, bp); \
103 bp = pCache + 56 - StartLine; \
104 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
106 if (*(uint32 *) (bp + 4)) \
107 FLIPPED (Offset, bp + 4); \
108 if (*(uint32 *) bp) \
109 FLIPPED (Offset + N, bp); \
114 bp = pCache + 56 - StartLine; \
115 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
117 if (*(uint32 *) bp) \
118 NORMAL (Offset, bp); \
119 if (*(uint32 *) (bp + 4)) \
120 NORMAL (Offset + N, bp + 4); \
124 #define TILE_CLIP_PREAMBLE \
129 if (StartPixel < 4) \
131 d1 = HeadMask [StartPixel]; \
132 if (StartPixel + Width < 4) \
133 d1 &= TailMask [StartPixel + Width]; \
138 if (StartPixel + Width > 4) \
140 if (StartPixel > 4) \
141 d2 = HeadMask [StartPixel - 4]; \
145 d2 &= TailMask [(StartPixel + Width - 4)]; \
151 #define RENDER_CLIPPED_TILE(NORMAL, FLIPPED, N) \
152 if (!(Tile & (V_FLIP | H_FLIP))) \
154 bp = pCache + StartLine; \
155 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
157 if ((dd = (*(uint32 *) bp) & d1)) \
158 NORMAL (Offset, (uint8 *) &dd); \
159 if ((dd = (*(uint32 *) (bp + 4)) & d2)) \
160 NORMAL (Offset + N, (uint8 *) &dd); \
164 if (!(Tile & V_FLIP)) \
166 bp = pCache + StartLine; \
169 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
171 if ((dd = *(uint32 *) (bp + 4) & d1)) \
172 FLIPPED (Offset, (uint8 *) &dd); \
173 if ((dd = *(uint32 *) bp & d2)) \
174 FLIPPED (Offset + N, (uint8 *) &dd); \
180 bp = pCache + 56 - StartLine; \
183 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
185 if ((dd = *(uint32 *) (bp + 4) & d1)) \
186 FLIPPED (Offset, (uint8 *) &dd); \
187 if ((dd = *(uint32 *) bp & d2)) \
188 FLIPPED (Offset + N, (uint8 *) &dd); \
193 bp = pCache + 56 - StartLine; \
194 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
196 if ((dd = (*(uint32 *) bp) & d1)) \
197 NORMAL (Offset, (uint8 *) &dd); \
198 if ((dd = (*(uint32 *) (bp + 4)) & d2)) \
199 NORMAL (Offset + N, (uint8 *) &dd); \
203 #define RENDER_TILE_LARGE(PIXEL, FUNCTION) \
204 if (!(Tile & (V_FLIP | H_FLIP))) \
206 if ((pixel = *(pCache + StartLine + StartPixel))) \
209 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
211 for (int z = Pixels - 1; z >= 0; z--) \
212 if (GFX.Z1 > Depth [z]) \
214 sp [z] = FUNCTION(sp + z, pixel); \
215 Depth [z] = GFX.Z2; \
221 if (!(Tile & V_FLIP)) \
223 StartPixel = 7 - StartPixel; \
224 if ((pixel = *(pCache + StartLine + StartPixel))) \
227 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
229 for (int z = Pixels - 1; z >= 0; z--) \
230 if (GFX.Z1 > Depth [z]) \
232 sp [z] = FUNCTION(sp + z, pixel); \
233 Depth [z] = GFX.Z2; \
241 StartPixel = 7 - StartPixel; \
242 if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \
245 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
247 for (int z = Pixels - 1; z >= 0; z--) \
248 if (GFX.Z1 > Depth [z]) \
250 sp [z] = FUNCTION(sp + z, pixel); \
251 Depth [z] = GFX.Z2; \
258 if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \
261 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
263 for (int z = Pixels - 1; z >= 0; z--) \
264 if (GFX.Z1 > Depth [z]) \
266 sp [z] = FUNCTION(sp + z, pixel); \
267 Depth [z] = GFX.Z2; \
273 #define RENDER_TILEHI(NORMAL, FLIPPED, N) \
274 if (!(Tile & (V_FLIP | H_FLIP))) \
276 bp = pCache + StartLine; \
277 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
279 /*if (*(uint32 *) bp)*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
280 NORMAL (Offset, bp); \
284 if (!(Tile & V_FLIP)) \
286 bp = pCache + StartLine; \
287 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
289 /*if (*(uint32 *) (bp + 4))*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
290 FLIPPED (Offset, bp); \
296 bp = pCache + 56 - StartLine; \
297 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
299 /*if (*(uint32 *) (bp + 4))*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
300 FLIPPED (Offset, bp); \
305 bp = pCache + 56 - StartLine; \
306 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
308 /*if (*(uint32 *) bp)*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
309 NORMAL (Offset, bp); \
315 #define RENDER_CLIPPED_TILEHI(NORMAL, FLIPPED, N) \
316 d1=(d1&0xFF)|((d1&0xFF0000)>>8)|((d2&0xFF)<<16)|((d2&0xFF0000)<<8);\
317 if (!(Tile & (V_FLIP | H_FLIP))) \
319 bp = pCache + StartLine; \
320 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
322 /*if ((dd = (*(uint32 *) bp) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
323 NORMAL (Offset, (uint8 *) &dd); \
327 if (!(Tile & V_FLIP)) \
329 bp = pCache + StartLine; \
331 /*SWAP_DWORD (d2);*/ \
332 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
334 /*if ((dd = *(uint32 *) (bp + 4) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
335 FLIPPED (Offset, (uint8 *) &dd); \
341 bp = pCache + 56 - StartLine; \
343 /*SWAP_DWORD (d2);*/ \
344 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
346 /*if ((dd = *(uint32 *) (bp + 4) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
347 FLIPPED (Offset, (uint8 *) &dd); \
352 bp = pCache + 56 - StartLine; \
353 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
355 /*if ((dd = (*(uint32 *) bp) & d1))*/ if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
356 NORMAL (Offset, (uint8 *) &dd); \
360 #define PLOT_PIXEL(screen, pixel) (pixel)
362 extern uint32 HeadMask [4];
363 extern uint32 TailMask [5];
365 uint8 ConvertTile (uint8 *pCache, uint32 TileAddr)
367 register uint8 *tp = &Memory.VRAM[TileAddr];
368 uint32 *p = (uint32 *) pCache;
378 for (line = 8; line != 0; line--, tp += 2)
381 if ((pix = *(tp + 0)))
383 p1 |= odd_high[0][pix >> 4];
384 p2 |= odd_low[0][pix & 0xf];
386 if ((pix = *(tp + 1)))
388 p1 |= even_high[0][pix >> 4];
389 p2 |= even_low[0][pix & 0xf];
391 if ((pix = *(tp + 16)))
393 p1 |= odd_high[1][pix >> 4];
394 p2 |= odd_low[1][pix & 0xf];
396 if ((pix = *(tp + 17)))
398 p1 |= even_high[1][pix >> 4];
399 p2 |= even_low[1][pix & 0xf];
401 if ((pix = *(tp + 32)))
403 p1 |= odd_high[2][pix >> 4];
404 p2 |= odd_low[2][pix & 0xf];
406 if ((pix = *(tp + 33)))
408 p1 |= even_high[2][pix >> 4];
409 p2 |= even_low[2][pix & 0xf];
411 if ((pix = *(tp + 48)))
413 p1 |= odd_high[3][pix >> 4];
414 p2 |= odd_low[3][pix & 0xf];
416 if ((pix = *(tp + 49)))
418 p1 |= even_high[3][pix >> 4];
419 p2 |= even_low[3][pix & 0xf];
428 for (line = 8; line != 0; line--, tp += 2)
431 if ((pix = *(tp + 0)))
433 p1 |= odd_high[0][pix >> 4];
434 p2 |= odd_low[0][pix & 0xf];
436 if ((pix = *(tp + 1)))
438 p1 |= even_high[0][pix >> 4];
439 p2 |= even_low[0][pix & 0xf];
441 if ((pix = *(tp + 16)))
443 p1 |= odd_high[1][pix >> 4];
444 p2 |= odd_low[1][pix & 0xf];
446 if ((pix = *(tp + 17)))
448 p1 |= even_high[1][pix >> 4];
449 p2 |= even_low[1][pix & 0xf];
458 for (line = 8; line != 0; line--, tp += 2)
461 if ((pix = *(tp + 0)))
463 p1 |= odd_high[0][pix >> 4];
464 p2 |= odd_low[0][pix & 0xf];
466 if ((pix = *(tp + 1)))
468 p1 |= even_high[0][pix >> 4];
469 p2 |= even_low[0][pix & 0xf];
477 return (non_zero ? TRUE : BLANK_TILE);
480 inline void WRITE_4PIXELSHI16 (tile_offset_t Offset, uint8 *Pixels)
483 uint16 *Screen = (uint16 *) GFX.S + Offset;
484 uint8 *Depth = GFX.DB + Offset;
487 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[2*N])) \
489 Screen [N] = GFX.ScreenColors [Pixel]; \
490 Depth [N] = GFX.Z2; \
500 inline void WRITE_4PIXELSHI16_FLIPPED (tile_offset_t Offset, uint8 *Pixels)
503 uint16 *Screen = (uint16 *) GFX.S + Offset;
504 uint8 *Depth = GFX.DB + Offset;
507 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[6 - 2*N])) \
509 Screen [N] = GFX.ScreenColors [Pixel]; \
510 Depth [N] = GFX.Z2; \
520 STATIC INLINE void WRITE_4PIXELS16 (tile_offset_t Offset, uint8 *Pixels)
522 register uint32 Pixel;
523 uint16 *Screen = (uint16 *) GFX.S + Offset;
524 uint8 *Depth = GFX.DB + Offset;
527 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
529 Screen [N] = GFX.ScreenColors [Pixel]; \
530 Depth [N] = GFX.Z2; \
540 STATIC INLINE void WRITE_4PIXELS16_FLIPPED (tile_offset_t Offset, uint8 *Pixels)
542 register uint32 Pixel;
543 uint16 *Screen = (uint16 *) GFX.S + Offset;
544 uint8 *Depth = GFX.DB + Offset;
547 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
549 Screen [N] = GFX.ScreenColors [Pixel]; \
550 Depth [N] = GFX.Z2; \
560 void DrawTile16 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
566 RENDER_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4)
569 void DrawClippedTile16 (uint32 Tile, tile_offset_t Offset,
570 uint32 StartPixel, uint32 Width,
571 uint32 StartLine, uint32 LineCount)
577 RENDER_CLIPPED_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4)
580 void DrawLargePixel16 (uint32 Tile, tile_offset_t Offset,
581 uint32 StartPixel, uint32 Pixels,
582 uint32 StartLine, uint32 LineCount)
586 register uint16 *sp = (uint16 *) GFX.S + Offset;
587 uint8 *Depth = GFX.DB + Offset;
590 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], PLOT_PIXEL)
593 STATIC INLINE void WRITE_4PIXELS16_ADD (tile_offset_t Offset, uint8 *Pixels)
595 register uint32 Pixel;
596 uint16 *Screen = (uint16 *) GFX.S + Offset;
597 uint8 *Depth = GFX.ZBuffer + Offset;
598 uint8 *SubDepth = GFX.SubZBuffer + Offset;
601 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
605 if (SubDepth [N] != 1) \
606 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
607 Screen [GFX.Delta + N]); \
609 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
613 Screen [N] = GFX.ScreenColors [Pixel]; \
614 Depth [N] = GFX.Z2; \
625 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADD (tile_offset_t Offset, uint8 *Pixels)
627 register uint32 Pixel;
628 uint16 *Screen = (uint16 *) GFX.S + Offset;
629 uint8 *Depth = GFX.ZBuffer + Offset;
630 uint8 *SubDepth = GFX.SubZBuffer + Offset;
633 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
637 if (SubDepth [N] != 1) \
638 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
639 Screen [GFX.Delta + N]); \
641 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
645 Screen [N] = GFX.ScreenColors [Pixel]; \
646 Depth [N] = GFX.Z2; \
657 STATIC INLINE void WRITE_4PIXELS16_ADD1_2 (tile_offset_t Offset, uint8 *Pixels)
659 register uint32 Pixel;
660 uint16 *Screen = (uint16 *) GFX.S + Offset;
661 uint8 *Depth = GFX.ZBuffer + Offset;
662 uint8 *SubDepth = GFX.SubZBuffer + Offset;
665 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
669 if (SubDepth [N] != 1) \
670 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
671 Screen [GFX.Delta + N])); \
673 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
677 Screen [N] = GFX.ScreenColors [Pixel]; \
678 Depth [N] = GFX.Z2; \
689 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADD1_2 (tile_offset_t Offset, uint8 *Pixels)
691 register uint32 Pixel;
692 uint16 *Screen = (uint16 *) GFX.S + Offset;
693 uint8 *Depth = GFX.ZBuffer + Offset;
694 uint8 *SubDepth = GFX.SubZBuffer + Offset;
697 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
701 if (SubDepth [N] != 1) \
702 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
703 Screen [GFX.Delta + N])); \
705 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
709 Screen [N] = GFX.ScreenColors [Pixel]; \
710 Depth [N] = GFX.Z2; \
721 STATIC INLINE void WRITE_4PIXELS16_SUB (tile_offset_t Offset, uint8 *Pixels)
723 register uint32 Pixel;
724 uint16 *Screen = (uint16 *) GFX.S + Offset;
725 uint8 *Depth = GFX.ZBuffer + Offset;
726 uint8 *SubDepth = GFX.SubZBuffer + Offset;
729 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
733 if (SubDepth [N] != 1) \
734 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
735 Screen [GFX.Delta + N]); \
737 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
741 Screen [N] = GFX.ScreenColors [Pixel]; \
742 Depth [N] = GFX.Z2; \
753 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUB (tile_offset_t Offset, uint8 *Pixels)
755 register uint32 Pixel;
756 uint16 *Screen = (uint16 *) GFX.S + Offset;
757 uint8 *Depth = GFX.ZBuffer + Offset;
758 uint8 *SubDepth = GFX.SubZBuffer + Offset;
761 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
765 if (SubDepth [N] != 1) \
766 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
767 Screen [GFX.Delta + N]); \
769 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
773 Screen [N] = GFX.ScreenColors [Pixel]; \
774 Depth [N] = GFX.Z2; \
785 STATIC INLINE void WRITE_4PIXELS16_SUB1_2 (tile_offset_t Offset, uint8 *Pixels)
787 register uint32 Pixel;
788 uint16 *Screen = (uint16 *) GFX.S + Offset;
789 uint8 *Depth = GFX.ZBuffer + Offset;
790 uint8 *SubDepth = GFX.SubZBuffer + Offset;
793 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
797 if (SubDepth [N] != 1) \
798 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
799 Screen [GFX.Delta + N]); \
801 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
805 Screen [N] = GFX.ScreenColors [Pixel]; \
806 Depth [N] = GFX.Z2; \
817 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUB1_2 (tile_offset_t Offset, uint8 *Pixels)
819 register uint32 Pixel;
820 uint16 *Screen = (uint16 *) GFX.S + Offset;
821 uint8 *Depth = GFX.ZBuffer + Offset;
822 uint8 *SubDepth = GFX.SubZBuffer + Offset;
825 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
829 if (SubDepth [N] != 1) \
830 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
831 Screen [GFX.Delta + N]); \
833 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
837 Screen [N] = GFX.ScreenColors [Pixel]; \
838 Depth [N] = GFX.Z2; \
850 void DrawTile16Add (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
856 RENDER_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4)
859 void DrawClippedTile16Add (uint32 Tile, tile_offset_t Offset,
860 uint32 StartPixel, uint32 Width,
861 uint32 StartLine, uint32 LineCount)
867 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4)
870 void DrawTile16Add1_2 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
876 RENDER_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4)
879 void DrawClippedTile16Add1_2 (uint32 Tile, tile_offset_t Offset,
880 uint32 StartPixel, uint32 Width,
881 uint32 StartLine, uint32 LineCount)
887 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4)
890 void DrawTile16Sub (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
896 RENDER_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4)
899 void DrawClippedTile16Sub (uint32 Tile, tile_offset_t Offset,
900 uint32 StartPixel, uint32 Width,
901 uint32 StartLine, uint32 LineCount)
907 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4)
910 void DrawTile16Sub1_2 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
916 RENDER_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4)
919 void DrawClippedTile16Sub1_2 (uint32 Tile, tile_offset_t Offset,
920 uint32 StartPixel, uint32 Width,
921 uint32 StartLine, uint32 LineCount)
927 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4)
930 STATIC INLINE void WRITE_4PIXELS16_ADDF1_2 (tile_offset_t Offset, uint8 *Pixels)
932 register uint32 Pixel;
933 uint16 *Screen = (uint16 *) GFX.S + Offset;
934 uint8 *Depth = GFX.ZBuffer + Offset;
935 uint8 *SubDepth = GFX.SubZBuffer + Offset;
938 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
940 if (SubDepth [N] == 1) \
941 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
944 Screen [N] = GFX.ScreenColors [Pixel];\
945 Depth [N] = GFX.Z2; \
956 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (tile_offset_t Offset, uint8 *Pixels)
958 register uint32 Pixel;
959 uint16 *Screen = (uint16 *) GFX.S + Offset;
960 uint8 *Depth = GFX.ZBuffer + Offset;
961 uint8 *SubDepth = GFX.SubZBuffer + Offset;
964 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
966 if (SubDepth [N] == 1) \
967 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
970 Screen [N] = GFX.ScreenColors [Pixel];\
971 Depth [N] = GFX.Z2; \
982 STATIC INLINE void WRITE_4PIXELS16_SUBF1_2 (tile_offset_t Offset, uint8 *Pixels)
984 register uint32 Pixel;
985 uint16 *Screen = (uint16 *) GFX.S + Offset;
986 uint8 *Depth = GFX.ZBuffer + Offset;
987 uint8 *SubDepth = GFX.SubZBuffer + Offset;
990 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
992 if (SubDepth [N] == 1) \
993 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
996 Screen [N] = GFX.ScreenColors [Pixel]; \
997 Depth [N] = GFX.Z2; \
1008 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (tile_offset_t Offset, uint8 *Pixels)
1010 register uint32 Pixel;
1011 uint16 *Screen = (uint16 *) GFX.S + Offset;
1012 uint8 *Depth = GFX.ZBuffer + Offset;
1013 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1016 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1018 if (SubDepth [N] == 1) \
1019 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
1022 Screen [N] = GFX.ScreenColors [Pixel]; \
1023 Depth [N] = GFX.Z2; \
1034 void DrawTile16FixedAdd1_2 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
1040 RENDER_TILE(WRITE_4PIXELS16_ADDF1_2, WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4)
1043 void DrawClippedTile16FixedAdd1_2 (uint32 Tile, tile_offset_t Offset,
1044 uint32 StartPixel, uint32 Width,
1045 uint32 StartLine, uint32 LineCount)
1051 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADDF1_2,
1052 WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4)
1055 void DrawTile16FixedSub1_2 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
1061 RENDER_TILE(WRITE_4PIXELS16_SUBF1_2, WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4)
1064 void DrawClippedTile16FixedSub1_2 (uint32 Tile, tile_offset_t Offset,
1065 uint32 StartPixel, uint32 Width,
1066 uint32 StartLine, uint32 LineCount)
1072 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUBF1_2,
1073 WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4)
1076 void DrawLargePixel16Add (uint32 Tile, tile_offset_t Offset,
1077 uint32 StartPixel, uint32 Pixels,
1078 uint32 StartLine, uint32 LineCount)
1082 register uint16 *sp = (uint16 *) GFX.S + Offset;
1083 uint8 *Depth = GFX.ZBuffer + Offset;
1084 register uint16 pixel;
1086 #define LARGE_ADD_PIXEL(s, p) \
1087 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1088 COLOR_ADD (p, *(s + GFX.Delta)) : \
1089 COLOR_ADD (p, GFX.FixedColour)) \
1092 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL)
1095 void DrawLargePixel16Add1_2 (uint32 Tile, tile_offset_t Offset,
1096 uint32 StartPixel, uint32 Pixels,
1097 uint32 StartLine, uint32 LineCount)
1101 register uint16 *sp = (uint16 *) GFX.S + Offset;
1102 uint8 *Depth = GFX.ZBuffer + Offset;
1103 register uint16 pixel;
1105 #define LARGE_ADD_PIXEL1_2(s, p) \
1106 ((uint16) (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1107 COLOR_ADD1_2 (p, *(s + GFX.Delta)) : \
1108 COLOR_ADD (p, GFX.FixedColour)) \
1111 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL1_2)
1114 void DrawLargePixel16Sub (uint32 Tile, tile_offset_t Offset,
1115 uint32 StartPixel, uint32 Pixels,
1116 uint32 StartLine, uint32 LineCount)
1120 register uint16 *sp = (uint16 *) GFX.S + Offset;
1121 uint8 *Depth = GFX.ZBuffer + Offset;
1122 register uint16 pixel;
1124 #define LARGE_SUB_PIXEL(s, p) \
1125 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1126 COLOR_SUB (p, *(s + GFX.Delta)) : \
1127 COLOR_SUB (p, GFX.FixedColour)) \
1130 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL)
1133 void DrawLargePixel16Sub1_2 (uint32 Tile, tile_offset_t Offset,
1134 uint32 StartPixel, uint32 Pixels,
1135 uint32 StartLine, uint32 LineCount)
1139 register uint16 *sp = (uint16 *) GFX.S + Offset;
1140 uint8 *Depth = GFX.ZBuffer + Offset;
1143 #define LARGE_SUB_PIXEL1_2(s, p) \
1144 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1145 COLOR_SUB1_2 (p, *(s + GFX.Delta)) : \
1146 COLOR_SUB (p, GFX.FixedColour)) \
1149 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL1_2)
1152 void DrawHiResTile16 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
1158 RENDER_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4)
1161 void DrawHiResClippedTile16 (uint32 Tile, tile_offset_t Offset,
1162 uint32 StartPixel, uint32 Width,
1163 uint32 StartLine, uint32 LineCount)
1169 RENDER_CLIPPED_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4)