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.
49 #define TILE_PREAMBLE \
52 uint32 TileAddr = BG.TileAddress + ((Tile & 0x3ff) << BG.TileShift); \
53 if ((Tile & 0x1ff) >= 256) \
54 TileAddr += BG.NameSelect; \
59 pCache = &BG.Buffer[(TileNumber = (TileAddr >> BG.TileShift)) << 6]; \
61 if (!BG.Buffered [TileNumber]) \
62 BG.Buffered[TileNumber] = ConvertTile (pCache, TileAddr); \
64 if (BG.Buffered [TileNumber] == BLANK_TILE) \
68 if (BG.DirectColourMode) \
70 if (IPPU.DirectColourMapsNeedRebuild) \
71 S9xBuildDirectColourMaps (); \
72 GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & BG.PaletteMask]; \
75 GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & BG.PaletteMask) << BG.PaletteShift) + BG.StartPalette];
77 #define RENDER_TILE(NORMAL, FLIPPED, N) \
78 if (!(Tile & (V_FLIP | H_FLIP))) \
80 bp = pCache + StartLine; \
81 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
84 NORMAL (Offset, bp); \
85 if (*(uint32 *) (bp + 4)) \
86 NORMAL (Offset + N, bp + 4); \
90 if (!(Tile & V_FLIP)) \
92 bp = pCache + StartLine; \
93 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
95 if (*(uint32 *) (bp + 4)) \
96 FLIPPED (Offset, bp + 4); \
98 FLIPPED (Offset + N, bp); \
104 bp = pCache + 56 - StartLine; \
105 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
107 if (*(uint32 *) (bp + 4)) \
108 FLIPPED (Offset, bp + 4); \
109 if (*(uint32 *) bp) \
110 FLIPPED (Offset + N, bp); \
115 bp = pCache + 56 - StartLine; \
116 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
118 if (*(uint32 *) bp) \
119 NORMAL (Offset, bp); \
120 if (*(uint32 *) (bp + 4)) \
121 NORMAL (Offset + N, bp + 4); \
125 #define TILE_CLIP_PREAMBLE \
130 if (StartPixel < 4) \
132 d1 = HeadMask [StartPixel]; \
133 if (StartPixel + Width < 4) \
134 d1 &= TailMask [StartPixel + Width]; \
139 if (StartPixel + Width > 4) \
141 if (StartPixel > 4) \
142 d2 = HeadMask [StartPixel - 4]; \
146 d2 &= TailMask [(StartPixel + Width - 4)]; \
152 #define RENDER_CLIPPED_TILE(NORMAL, FLIPPED, N) \
153 if (!(Tile & (V_FLIP | H_FLIP))) \
155 bp = pCache + StartLine; \
156 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
158 if ((dd = (*(uint32 *) bp) & d1)) \
159 NORMAL (Offset, (uint8 *) &dd); \
160 if ((dd = (*(uint32 *) (bp + 4)) & d2)) \
161 NORMAL (Offset + N, (uint8 *) &dd); \
165 if (!(Tile & V_FLIP)) \
167 bp = pCache + StartLine; \
170 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
172 if ((dd = *(uint32 *) (bp + 4) & d1)) \
173 FLIPPED (Offset, (uint8 *) &dd); \
174 if ((dd = *(uint32 *) bp & d2)) \
175 FLIPPED (Offset + N, (uint8 *) &dd); \
181 bp = pCache + 56 - StartLine; \
184 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
186 if ((dd = *(uint32 *) (bp + 4) & d1)) \
187 FLIPPED (Offset, (uint8 *) &dd); \
188 if ((dd = *(uint32 *) bp & d2)) \
189 FLIPPED (Offset + N, (uint8 *) &dd); \
194 bp = pCache + 56 - StartLine; \
195 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
197 if ((dd = (*(uint32 *) bp) & d1)) \
198 NORMAL (Offset, (uint8 *) &dd); \
199 if ((dd = (*(uint32 *) (bp + 4)) & d2)) \
200 NORMAL (Offset + N, (uint8 *) &dd); \
204 #define RENDER_TILE_LARGE(PIXEL, FUNCTION) \
205 if (!(Tile & (V_FLIP | H_FLIP))) \
207 if ((pixel = *(pCache + StartLine + StartPixel))) \
210 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
212 for (int z = Pixels - 1; z >= 0; z--) \
213 if (GFX.Z1 > Depth [z]) \
215 sp [z] = FUNCTION(sp + z, pixel); \
216 Depth [z] = GFX.Z2; \
222 if (!(Tile & V_FLIP)) \
224 StartPixel = 7 - StartPixel; \
225 if ((pixel = *(pCache + StartLine + StartPixel))) \
228 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
230 for (int z = Pixels - 1; z >= 0; z--) \
231 if (GFX.Z1 > Depth [z]) \
233 sp [z] = FUNCTION(sp + z, pixel); \
234 Depth [z] = GFX.Z2; \
242 StartPixel = 7 - StartPixel; \
243 if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \
246 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
248 for (int z = Pixels - 1; z >= 0; z--) \
249 if (GFX.Z1 > Depth [z]) \
251 sp [z] = FUNCTION(sp + z, pixel); \
252 Depth [z] = GFX.Z2; \
259 if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \
262 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
264 for (int z = Pixels - 1; z >= 0; z--) \
265 if (GFX.Z1 > Depth [z]) \
267 sp [z] = FUNCTION(sp + z, pixel); \
268 Depth [z] = GFX.Z2; \
274 #define RENDER_TILEHI(NORMAL, FLIPPED, N) \
275 if (!(Tile & (V_FLIP | H_FLIP))) \
277 bp = pCache + StartLine; \
278 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
280 /*if (*(uint32 *) bp)*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
281 NORMAL (Offset, bp); \
285 if (!(Tile & V_FLIP)) \
287 bp = pCache + StartLine; \
288 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
290 /*if (*(uint32 *) (bp + 4))*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
291 FLIPPED (Offset, bp); \
297 bp = pCache + 56 - StartLine; \
298 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
300 /*if (*(uint32 *) (bp + 4))*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
301 FLIPPED (Offset, bp); \
306 bp = pCache + 56 - StartLine; \
307 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
309 /*if (*(uint32 *) bp)*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
310 NORMAL (Offset, bp); \
316 #define RENDER_CLIPPED_TILEHI(NORMAL, FLIPPED, N) \
317 d1=(d1&0xFF)|((d1&0xFF0000)>>8)|((d2&0xFF)<<16)|((d2&0xFF0000)<<8);\
318 if (!(Tile & (V_FLIP | H_FLIP))) \
320 bp = pCache + StartLine; \
321 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
323 /*if ((dd = (*(uint32 *) bp) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
324 NORMAL (Offset, (uint8 *) &dd); \
328 if (!(Tile & V_FLIP)) \
330 bp = pCache + StartLine; \
332 /*SWAP_DWORD (d2);*/ \
333 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
335 /*if ((dd = *(uint32 *) (bp + 4) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
336 FLIPPED (Offset, (uint8 *) &dd); \
342 bp = pCache + 56 - StartLine; \
344 /*SWAP_DWORD (d2);*/ \
345 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
347 /*if ((dd = *(uint32 *) (bp + 4) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
348 FLIPPED (Offset, (uint8 *) &dd); \
353 bp = pCache + 56 - StartLine; \
354 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
356 /*if ((dd = (*(uint32 *) bp) & d1))*/ if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
357 NORMAL (Offset, (uint8 *) &dd); \
361 #define PLOT_PIXEL(screen, pixel) (pixel)
363 extern uint32 HeadMask [4];
364 extern uint32 TailMask [5];
366 uint8 ConvertTile (uint8 *pCache, uint32 TileAddr)
368 register uint8 *tp = &Memory.VRAM[TileAddr];
369 uint32 *p = (uint32 *) pCache;
379 for (line = 8; line != 0; line--, tp += 2)
382 if ((pix = *(tp + 0)))
384 p1 |= odd_high[0][pix >> 4];
385 p2 |= odd_low[0][pix & 0xf];
387 if ((pix = *(tp + 1)))
389 p1 |= even_high[0][pix >> 4];
390 p2 |= even_low[0][pix & 0xf];
392 if ((pix = *(tp + 16)))
394 p1 |= odd_high[1][pix >> 4];
395 p2 |= odd_low[1][pix & 0xf];
397 if ((pix = *(tp + 17)))
399 p1 |= even_high[1][pix >> 4];
400 p2 |= even_low[1][pix & 0xf];
402 if ((pix = *(tp + 32)))
404 p1 |= odd_high[2][pix >> 4];
405 p2 |= odd_low[2][pix & 0xf];
407 if ((pix = *(tp + 33)))
409 p1 |= even_high[2][pix >> 4];
410 p2 |= even_low[2][pix & 0xf];
412 if ((pix = *(tp + 48)))
414 p1 |= odd_high[3][pix >> 4];
415 p2 |= odd_low[3][pix & 0xf];
417 if ((pix = *(tp + 49)))
419 p1 |= even_high[3][pix >> 4];
420 p2 |= even_low[3][pix & 0xf];
429 for (line = 8; line != 0; line--, tp += 2)
432 if ((pix = *(tp + 0)))
434 p1 |= odd_high[0][pix >> 4];
435 p2 |= odd_low[0][pix & 0xf];
437 if ((pix = *(tp + 1)))
439 p1 |= even_high[0][pix >> 4];
440 p2 |= even_low[0][pix & 0xf];
442 if ((pix = *(tp + 16)))
444 p1 |= odd_high[1][pix >> 4];
445 p2 |= odd_low[1][pix & 0xf];
447 if ((pix = *(tp + 17)))
449 p1 |= even_high[1][pix >> 4];
450 p2 |= even_low[1][pix & 0xf];
459 for (line = 8; line != 0; line--, tp += 2)
462 if ((pix = *(tp + 0)))
464 p1 |= odd_high[0][pix >> 4];
465 p2 |= odd_low[0][pix & 0xf];
467 if ((pix = *(tp + 1)))
469 p1 |= even_high[0][pix >> 4];
470 p2 |= even_low[0][pix & 0xf];
478 return (non_zero ? TRUE : BLANK_TILE);
481 inline void WRITE_4PIXELSHI16 (tile_offset_t Offset, uint8 *Pixels)
484 uint16 *Screen = (uint16 *) GFX.S + Offset;
485 uint8 *Depth = GFX.DB + Offset;
488 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[2*N])) \
490 Screen [N] = GFX.ScreenColors [Pixel]; \
491 Depth [N] = GFX.Z2; \
501 inline void WRITE_4PIXELSHI16_FLIPPED (tile_offset_t Offset, uint8 *Pixels)
504 uint16 *Screen = (uint16 *) GFX.S + Offset;
505 uint8 *Depth = GFX.DB + Offset;
508 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[6 - 2*N])) \
510 Screen [N] = GFX.ScreenColors [Pixel]; \
511 Depth [N] = GFX.Z2; \
521 STATIC INLINE void WRITE_4PIXELS16 (tile_offset_t Offset, uint8 *Pixels)
523 register uint32 Pixel;
524 uint16 *Screen = (uint16 *) GFX.S + Offset;
525 uint8 *Depth = GFX.DB + Offset;
528 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
530 Screen [N] = GFX.ScreenColors [Pixel]; \
531 Depth [N] = GFX.Z2; \
541 STATIC INLINE void WRITE_4PIXELS16_FLIPPED (tile_offset_t Offset, uint8 *Pixels)
543 register uint32 Pixel;
544 uint16 *Screen = (uint16 *) GFX.S + Offset;
545 uint8 *Depth = GFX.DB + Offset;
548 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
550 Screen [N] = GFX.ScreenColors [Pixel]; \
551 Depth [N] = GFX.Z2; \
561 void DrawTile16 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
567 RENDER_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4)
570 void DrawClippedTile16 (uint32 Tile, tile_offset_t Offset,
571 uint32 StartPixel, uint32 Width,
572 uint32 StartLine, uint32 LineCount)
578 RENDER_CLIPPED_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4)
581 void DrawLargePixel16 (uint32 Tile, tile_offset_t Offset,
582 uint32 StartPixel, uint32 Pixels,
583 uint32 StartLine, uint32 LineCount)
587 register uint16 *sp = (uint16 *) GFX.S + Offset;
588 uint8 *Depth = GFX.DB + Offset;
591 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], PLOT_PIXEL)
594 STATIC INLINE void WRITE_4PIXELS16_ADD (tile_offset_t Offset, uint8 *Pixels)
596 register uint32 Pixel;
597 uint16 *Screen = (uint16 *) GFX.S + Offset;
598 uint8 *Depth = GFX.ZBuffer + Offset;
599 uint8 *SubDepth = GFX.SubZBuffer + Offset;
602 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
606 if (SubDepth [N] != 1) \
607 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
608 Screen [GFX.Delta + N]); \
610 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
614 Screen [N] = GFX.ScreenColors [Pixel]; \
615 Depth [N] = GFX.Z2; \
626 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADD (tile_offset_t Offset, uint8 *Pixels)
628 register uint32 Pixel;
629 uint16 *Screen = (uint16 *) GFX.S + Offset;
630 uint8 *Depth = GFX.ZBuffer + Offset;
631 uint8 *SubDepth = GFX.SubZBuffer + Offset;
634 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
638 if (SubDepth [N] != 1) \
639 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
640 Screen [GFX.Delta + N]); \
642 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
646 Screen [N] = GFX.ScreenColors [Pixel]; \
647 Depth [N] = GFX.Z2; \
658 STATIC INLINE void WRITE_4PIXELS16_ADD1_2 (tile_offset_t Offset, uint8 *Pixels)
660 register uint32 Pixel;
661 uint16 *Screen = (uint16 *) GFX.S + Offset;
662 uint8 *Depth = GFX.ZBuffer + Offset;
663 uint8 *SubDepth = GFX.SubZBuffer + Offset;
666 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
670 if (SubDepth [N] != 1) \
671 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
672 Screen [GFX.Delta + N])); \
674 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
678 Screen [N] = GFX.ScreenColors [Pixel]; \
679 Depth [N] = GFX.Z2; \
690 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADD1_2 (tile_offset_t Offset, uint8 *Pixels)
692 register uint32 Pixel;
693 uint16 *Screen = (uint16 *) GFX.S + Offset;
694 uint8 *Depth = GFX.ZBuffer + Offset;
695 uint8 *SubDepth = GFX.SubZBuffer + Offset;
698 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
702 if (SubDepth [N] != 1) \
703 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
704 Screen [GFX.Delta + N])); \
706 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
710 Screen [N] = GFX.ScreenColors [Pixel]; \
711 Depth [N] = GFX.Z2; \
722 STATIC INLINE void WRITE_4PIXELS16_SUB (tile_offset_t Offset, uint8 *Pixels)
724 register uint32 Pixel;
725 uint16 *Screen = (uint16 *) GFX.S + Offset;
726 uint8 *Depth = GFX.ZBuffer + Offset;
727 uint8 *SubDepth = GFX.SubZBuffer + Offset;
730 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
734 if (SubDepth [N] != 1) \
735 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
736 Screen [GFX.Delta + N]); \
738 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
742 Screen [N] = GFX.ScreenColors [Pixel]; \
743 Depth [N] = GFX.Z2; \
754 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUB (tile_offset_t Offset, uint8 *Pixels)
756 register uint32 Pixel;
757 uint16 *Screen = (uint16 *) GFX.S + Offset;
758 uint8 *Depth = GFX.ZBuffer + Offset;
759 uint8 *SubDepth = GFX.SubZBuffer + Offset;
762 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
766 if (SubDepth [N] != 1) \
767 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
768 Screen [GFX.Delta + N]); \
770 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
774 Screen [N] = GFX.ScreenColors [Pixel]; \
775 Depth [N] = GFX.Z2; \
786 STATIC INLINE void WRITE_4PIXELS16_SUB1_2 (tile_offset_t Offset, uint8 *Pixels)
788 register uint32 Pixel;
789 uint16 *Screen = (uint16 *) GFX.S + Offset;
790 uint8 *Depth = GFX.ZBuffer + Offset;
791 uint8 *SubDepth = GFX.SubZBuffer + Offset;
794 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
798 if (SubDepth [N] != 1) \
799 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
800 Screen [GFX.Delta + N]); \
802 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
806 Screen [N] = GFX.ScreenColors [Pixel]; \
807 Depth [N] = GFX.Z2; \
818 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUB1_2 (tile_offset_t Offset, uint8 *Pixels)
820 register uint32 Pixel;
821 uint16 *Screen = (uint16 *) GFX.S + Offset;
822 uint8 *Depth = GFX.ZBuffer + Offset;
823 uint8 *SubDepth = GFX.SubZBuffer + Offset;
826 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
830 if (SubDepth [N] != 1) \
831 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
832 Screen [GFX.Delta + N]); \
834 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
838 Screen [N] = GFX.ScreenColors [Pixel]; \
839 Depth [N] = GFX.Z2; \
851 void DrawTile16Add (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
857 RENDER_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4)
860 void DrawClippedTile16Add (uint32 Tile, tile_offset_t Offset,
861 uint32 StartPixel, uint32 Width,
862 uint32 StartLine, uint32 LineCount)
868 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4)
871 void DrawTile16Add1_2 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
877 RENDER_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4)
880 void DrawClippedTile16Add1_2 (uint32 Tile, tile_offset_t Offset,
881 uint32 StartPixel, uint32 Width,
882 uint32 StartLine, uint32 LineCount)
888 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4)
891 void DrawTile16Sub (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
897 RENDER_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4)
900 void DrawClippedTile16Sub (uint32 Tile, tile_offset_t Offset,
901 uint32 StartPixel, uint32 Width,
902 uint32 StartLine, uint32 LineCount)
908 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4)
911 void DrawTile16Sub1_2 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
917 RENDER_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4)
920 void DrawClippedTile16Sub1_2 (uint32 Tile, tile_offset_t Offset,
921 uint32 StartPixel, uint32 Width,
922 uint32 StartLine, uint32 LineCount)
928 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4)
931 STATIC INLINE void WRITE_4PIXELS16_ADDF1_2 (tile_offset_t Offset, uint8 *Pixels)
933 register uint32 Pixel;
934 uint16 *Screen = (uint16 *) GFX.S + Offset;
935 uint8 *Depth = GFX.ZBuffer + Offset;
936 uint8 *SubDepth = GFX.SubZBuffer + Offset;
939 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
941 if (SubDepth [N] == 1) \
942 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
945 Screen [N] = GFX.ScreenColors [Pixel];\
946 Depth [N] = GFX.Z2; \
957 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (tile_offset_t Offset, uint8 *Pixels)
959 register uint32 Pixel;
960 uint16 *Screen = (uint16 *) GFX.S + Offset;
961 uint8 *Depth = GFX.ZBuffer + Offset;
962 uint8 *SubDepth = GFX.SubZBuffer + Offset;
965 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
967 if (SubDepth [N] == 1) \
968 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
971 Screen [N] = GFX.ScreenColors [Pixel];\
972 Depth [N] = GFX.Z2; \
983 STATIC INLINE void WRITE_4PIXELS16_SUBF1_2 (tile_offset_t Offset, uint8 *Pixels)
985 register uint32 Pixel;
986 uint16 *Screen = (uint16 *) GFX.S + Offset;
987 uint8 *Depth = GFX.ZBuffer + Offset;
988 uint8 *SubDepth = GFX.SubZBuffer + Offset;
991 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
993 if (SubDepth [N] == 1) \
994 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
997 Screen [N] = GFX.ScreenColors [Pixel]; \
998 Depth [N] = GFX.Z2; \
1009 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (tile_offset_t Offset, uint8 *Pixels)
1011 register uint32 Pixel;
1012 uint16 *Screen = (uint16 *) GFX.S + Offset;
1013 uint8 *Depth = GFX.ZBuffer + Offset;
1014 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1017 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1019 if (SubDepth [N] == 1) \
1020 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
1023 Screen [N] = GFX.ScreenColors [Pixel]; \
1024 Depth [N] = GFX.Z2; \
1035 void DrawTile16FixedAdd1_2 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
1041 RENDER_TILE(WRITE_4PIXELS16_ADDF1_2, WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4)
1044 void DrawClippedTile16FixedAdd1_2 (uint32 Tile, tile_offset_t Offset,
1045 uint32 StartPixel, uint32 Width,
1046 uint32 StartLine, uint32 LineCount)
1052 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADDF1_2,
1053 WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4)
1056 void DrawTile16FixedSub1_2 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
1062 RENDER_TILE(WRITE_4PIXELS16_SUBF1_2, WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4)
1065 void DrawClippedTile16FixedSub1_2 (uint32 Tile, tile_offset_t Offset,
1066 uint32 StartPixel, uint32 Width,
1067 uint32 StartLine, uint32 LineCount)
1073 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUBF1_2,
1074 WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4)
1077 void DrawLargePixel16Add (uint32 Tile, tile_offset_t Offset,
1078 uint32 StartPixel, uint32 Pixels,
1079 uint32 StartLine, uint32 LineCount)
1083 register uint16 *sp = (uint16 *) GFX.S + Offset;
1084 uint8 *Depth = GFX.ZBuffer + Offset;
1085 register uint16 pixel;
1087 #define LARGE_ADD_PIXEL(s, p) \
1088 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1089 COLOR_ADD (p, *(s + GFX.Delta)) : \
1090 COLOR_ADD (p, GFX.FixedColour)) \
1093 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL)
1096 void DrawLargePixel16Add1_2 (uint32 Tile, tile_offset_t Offset,
1097 uint32 StartPixel, uint32 Pixels,
1098 uint32 StartLine, uint32 LineCount)
1102 register uint16 *sp = (uint16 *) GFX.S + Offset;
1103 uint8 *Depth = GFX.ZBuffer + Offset;
1104 register uint16 pixel;
1106 #define LARGE_ADD_PIXEL1_2(s, p) \
1107 ((uint16) (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1108 COLOR_ADD1_2 (p, *(s + GFX.Delta)) : \
1109 COLOR_ADD (p, GFX.FixedColour)) \
1112 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL1_2)
1115 void DrawLargePixel16Sub (uint32 Tile, tile_offset_t Offset,
1116 uint32 StartPixel, uint32 Pixels,
1117 uint32 StartLine, uint32 LineCount)
1121 register uint16 *sp = (uint16 *) GFX.S + Offset;
1122 uint8 *Depth = GFX.ZBuffer + Offset;
1123 register uint16 pixel;
1125 #define LARGE_SUB_PIXEL(s, p) \
1126 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1127 COLOR_SUB (p, *(s + GFX.Delta)) : \
1128 COLOR_SUB (p, GFX.FixedColour)) \
1131 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL)
1134 void DrawLargePixel16Sub1_2 (uint32 Tile, tile_offset_t Offset,
1135 uint32 StartPixel, uint32 Pixels,
1136 uint32 StartLine, uint32 LineCount)
1140 register uint16 *sp = (uint16 *) GFX.S + Offset;
1141 uint8 *Depth = GFX.ZBuffer + Offset;
1144 #define LARGE_SUB_PIXEL1_2(s, p) \
1145 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1146 COLOR_SUB1_2 (p, *(s + GFX.Delta)) : \
1147 COLOR_SUB (p, GFX.FixedColour)) \
1150 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL1_2)
1153 void DrawHiResTile16 (uint32 Tile, tile_offset_t Offset, uint32 StartLine,
1159 RENDER_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4)
1162 void DrawHiResClippedTile16 (uint32 Tile, tile_offset_t Offset,
1163 uint32 StartPixel, uint32 Width,
1164 uint32 StartLine, uint32 LineCount)
1170 RENDER_CLIPPED_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4)