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 extern uint32 HeadMask [4];
362 extern uint32 TailMask [5];
364 uint8 ConvertTile (uint8 *pCache, uint32 TileAddr)
366 register uint8 *tp = &Memory.VRAM[TileAddr];
367 uint32 *p = (uint32 *) pCache;
377 for (line = 8; line != 0; line--, tp += 2)
380 if ((pix = *(tp + 0)))
382 p1 |= odd_high[0][pix >> 4];
383 p2 |= odd_low[0][pix & 0xf];
385 if ((pix = *(tp + 1)))
387 p1 |= even_high[0][pix >> 4];
388 p2 |= even_low[0][pix & 0xf];
390 if ((pix = *(tp + 16)))
392 p1 |= odd_high[1][pix >> 4];
393 p2 |= odd_low[1][pix & 0xf];
395 if ((pix = *(tp + 17)))
397 p1 |= even_high[1][pix >> 4];
398 p2 |= even_low[1][pix & 0xf];
400 if ((pix = *(tp + 32)))
402 p1 |= odd_high[2][pix >> 4];
403 p2 |= odd_low[2][pix & 0xf];
405 if ((pix = *(tp + 33)))
407 p1 |= even_high[2][pix >> 4];
408 p2 |= even_low[2][pix & 0xf];
410 if ((pix = *(tp + 48)))
412 p1 |= odd_high[3][pix >> 4];
413 p2 |= odd_low[3][pix & 0xf];
415 if ((pix = *(tp + 49)))
417 p1 |= even_high[3][pix >> 4];
418 p2 |= even_low[3][pix & 0xf];
427 for (line = 8; line != 0; line--, tp += 2)
430 if ((pix = *(tp + 0)))
432 p1 |= odd_high[0][pix >> 4];
433 p2 |= odd_low[0][pix & 0xf];
435 if ((pix = *(tp + 1)))
437 p1 |= even_high[0][pix >> 4];
438 p2 |= even_low[0][pix & 0xf];
440 if ((pix = *(tp + 16)))
442 p1 |= odd_high[1][pix >> 4];
443 p2 |= odd_low[1][pix & 0xf];
445 if ((pix = *(tp + 17)))
447 p1 |= even_high[1][pix >> 4];
448 p2 |= even_low[1][pix & 0xf];
457 for (line = 8; line != 0; line--, tp += 2)
460 if ((pix = *(tp + 0)))
462 p1 |= odd_high[0][pix >> 4];
463 p2 |= odd_low[0][pix & 0xf];
465 if ((pix = *(tp + 1)))
467 p1 |= even_high[0][pix >> 4];
468 p2 |= even_low[0][pix & 0xf];
476 return (non_zero ? TRUE : BLANK_TILE);
479 INLINE void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels)
481 register uint8 Pixel;
482 uint8 *Screen = GFX.S + Offset;
483 uint8 *Depth = GFX.DB + Offset;
486 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
488 Screen [N] = (uint8) GFX.ScreenColors [Pixel]; \
489 Depth [N] = GFX.Z2; \
499 INLINE void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels)
501 register uint8 Pixel;
502 uint8 *Screen = GFX.S + Offset;
503 uint8 *Depth = GFX.DB + Offset;
506 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
508 Screen [N] = (uint8) GFX.ScreenColors [Pixel]; \
509 Depth [N] = GFX.Z2; \
519 inline void WRITE_4PIXELSHI16 (uint32 Offset, uint8 *Pixels)
522 uint16 *Screen = (uint16 *) GFX.S + Offset;
523 uint8 *Depth = GFX.DB + Offset;
526 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[2*N])) \
528 Screen [N] = GFX.ScreenColors [Pixel]; \
529 Depth [N] = GFX.Z2; \
539 inline void WRITE_4PIXELSHI16_FLIPPED (uint32 Offset, uint8 *Pixels)
542 uint16 *Screen = (uint16 *) GFX.S + Offset;
543 uint8 *Depth = GFX.DB + Offset;
546 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[6 - 2*N])) \
548 Screen [N] = GFX.ScreenColors [Pixel]; \
549 Depth [N] = GFX.Z2; \
559 void DrawTile(uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount)
565 RENDER_TILE(WRITE_4PIXELS, WRITE_4PIXELS_FLIPPED, 4)
568 void DrawClippedTile(uint32 Tile, uint32 Offset,
569 uint32 StartPixel, uint32 Width,
570 uint32 StartLine, uint32 LineCount)
576 RENDER_CLIPPED_TILE(WRITE_4PIXELS, WRITE_4PIXELS_FLIPPED, 4)
579 void DrawLargePixel (uint32 Tile, uint32 Offset,
580 uint32 StartPixel, uint32 Pixels,
581 uint32 StartLine, uint32 LineCount)
585 register uint8 *sp = GFX.S + Offset;
586 uint8 *Depth = GFX.DB + Offset;
588 #define PLOT_PIXEL(screen, pixel) (pixel)
590 RENDER_TILE_LARGE (((uint8) GFX.ScreenColors [pixel]), PLOT_PIXEL)
593 STATIC INLINE void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels)
595 register uint32 Pixel;
596 uint16 *Screen = (uint16 *) GFX.S + Offset;
597 uint8 *Depth = GFX.DB + Offset;
600 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
602 Screen [N] = GFX.ScreenColors [Pixel]; \
603 Depth [N] = GFX.Z2; \
613 STATIC INLINE void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels)
615 register uint32 Pixel;
616 uint16 *Screen = (uint16 *) GFX.S + Offset;
617 uint8 *Depth = GFX.DB + Offset;
620 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
622 Screen [N] = GFX.ScreenColors [Pixel]; \
623 Depth [N] = GFX.Z2; \
633 void DrawTile16 (uint32 Tile, uint32 Offset, uint32 StartLine,
639 RENDER_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4)
642 void DrawClippedTile16 (uint32 Tile, uint32 Offset,
643 uint32 StartPixel, uint32 Width,
644 uint32 StartLine, uint32 LineCount)
650 RENDER_CLIPPED_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4)
653 void DrawLargePixel16 (uint32 Tile, uint32 Offset,
654 uint32 StartPixel, uint32 Pixels,
655 uint32 StartLine, uint32 LineCount)
659 register uint16 *sp = (uint16 *) GFX.S + Offset;
660 uint8 *Depth = GFX.DB + Offset;
663 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], PLOT_PIXEL)
666 STATIC INLINE void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels)
668 register uint32 Pixel;
669 uint16 *Screen = (uint16 *) GFX.S + Offset;
670 uint8 *Depth = GFX.ZBuffer + Offset;
671 uint8 *SubDepth = GFX.SubZBuffer + Offset;
674 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
678 if (SubDepth [N] != 1) \
679 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
680 Screen [GFX.Delta + N]); \
682 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
686 Screen [N] = GFX.ScreenColors [Pixel]; \
687 Depth [N] = GFX.Z2; \
698 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels)
700 register uint32 Pixel;
701 uint16 *Screen = (uint16 *) GFX.S + Offset;
702 uint8 *Depth = GFX.ZBuffer + Offset;
703 uint8 *SubDepth = GFX.SubZBuffer + Offset;
706 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
710 if (SubDepth [N] != 1) \
711 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
712 Screen [GFX.Delta + N]); \
714 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
718 Screen [N] = GFX.ScreenColors [Pixel]; \
719 Depth [N] = GFX.Z2; \
730 STATIC INLINE void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels)
732 register uint32 Pixel;
733 uint16 *Screen = (uint16 *) GFX.S + Offset;
734 uint8 *Depth = GFX.ZBuffer + Offset;
735 uint8 *SubDepth = GFX.SubZBuffer + Offset;
738 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
742 if (SubDepth [N] != 1) \
743 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
744 Screen [GFX.Delta + N])); \
746 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
750 Screen [N] = GFX.ScreenColors [Pixel]; \
751 Depth [N] = GFX.Z2; \
762 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels)
764 register uint32 Pixel;
765 uint16 *Screen = (uint16 *) GFX.S + Offset;
766 uint8 *Depth = GFX.ZBuffer + Offset;
767 uint8 *SubDepth = GFX.SubZBuffer + Offset;
770 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
774 if (SubDepth [N] != 1) \
775 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
776 Screen [GFX.Delta + N])); \
778 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
782 Screen [N] = GFX.ScreenColors [Pixel]; \
783 Depth [N] = GFX.Z2; \
794 STATIC INLINE void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels)
796 register uint32 Pixel;
797 uint16 *Screen = (uint16 *) GFX.S + Offset;
798 uint8 *Depth = GFX.ZBuffer + Offset;
799 uint8 *SubDepth = GFX.SubZBuffer + Offset;
802 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
806 if (SubDepth [N] != 1) \
807 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
808 Screen [GFX.Delta + N]); \
810 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
814 Screen [N] = GFX.ScreenColors [Pixel]; \
815 Depth [N] = GFX.Z2; \
826 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels)
828 register uint32 Pixel;
829 uint16 *Screen = (uint16 *) GFX.S + Offset;
830 uint8 *Depth = GFX.ZBuffer + Offset;
831 uint8 *SubDepth = GFX.SubZBuffer + Offset;
834 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
838 if (SubDepth [N] != 1) \
839 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
840 Screen [GFX.Delta + N]); \
842 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
846 Screen [N] = GFX.ScreenColors [Pixel]; \
847 Depth [N] = GFX.Z2; \
858 STATIC INLINE void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels)
860 register uint32 Pixel;
861 uint16 *Screen = (uint16 *) GFX.S + Offset;
862 uint8 *Depth = GFX.ZBuffer + Offset;
863 uint8 *SubDepth = GFX.SubZBuffer + Offset;
866 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
870 if (SubDepth [N] != 1) \
871 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
872 Screen [GFX.Delta + N]); \
874 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
878 Screen [N] = GFX.ScreenColors [Pixel]; \
879 Depth [N] = GFX.Z2; \
890 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUB1_2 (uint32 Offset, uint8 *Pixels)
892 register uint32 Pixel;
893 uint16 *Screen = (uint16 *) GFX.S + Offset;
894 uint8 *Depth = GFX.ZBuffer + Offset;
895 uint8 *SubDepth = GFX.SubZBuffer + Offset;
898 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
902 if (SubDepth [N] != 1) \
903 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
904 Screen [GFX.Delta + N]); \
906 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
910 Screen [N] = GFX.ScreenColors [Pixel]; \
911 Depth [N] = GFX.Z2; \
923 void DrawTile16Add (uint32 Tile, uint32 Offset, uint32 StartLine,
929 RENDER_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4)
932 void DrawClippedTile16Add (uint32 Tile, uint32 Offset,
933 uint32 StartPixel, uint32 Width,
934 uint32 StartLine, uint32 LineCount)
940 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4)
943 void DrawTile16Add1_2 (uint32 Tile, uint32 Offset, uint32 StartLine,
949 RENDER_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4)
952 void DrawClippedTile16Add1_2 (uint32 Tile, uint32 Offset,
953 uint32 StartPixel, uint32 Width,
954 uint32 StartLine, uint32 LineCount)
960 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4)
963 void DrawTile16Sub (uint32 Tile, uint32 Offset, uint32 StartLine,
969 RENDER_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4)
972 void DrawClippedTile16Sub (uint32 Tile, uint32 Offset,
973 uint32 StartPixel, uint32 Width,
974 uint32 StartLine, uint32 LineCount)
980 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4)
983 void DrawTile16Sub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine,
989 RENDER_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4)
992 void DrawClippedTile16Sub1_2 (uint32 Tile, uint32 Offset,
993 uint32 StartPixel, uint32 Width,
994 uint32 StartLine, uint32 LineCount)
1000 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4)
1003 STATIC INLINE void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels)
1005 register uint32 Pixel;
1006 uint16 *Screen = (uint16 *) GFX.S + Offset;
1007 uint8 *Depth = GFX.ZBuffer + Offset;
1008 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1011 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
1013 if (SubDepth [N] == 1) \
1014 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
1015 GFX.FixedColour)); \
1017 Screen [N] = GFX.ScreenColors [Pixel];\
1018 Depth [N] = GFX.Z2; \
1029 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels)
1031 register uint32 Pixel;
1032 uint16 *Screen = (uint16 *) GFX.S + Offset;
1033 uint8 *Depth = GFX.ZBuffer + Offset;
1034 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1037 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1039 if (SubDepth [N] == 1) \
1040 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
1041 GFX.FixedColour)); \
1043 Screen [N] = GFX.ScreenColors [Pixel];\
1044 Depth [N] = GFX.Z2; \
1055 STATIC INLINE void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels)
1057 register uint32 Pixel;
1058 uint16 *Screen = (uint16 *) GFX.S + Offset;
1059 uint8 *Depth = GFX.ZBuffer + Offset;
1060 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1063 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
1065 if (SubDepth [N] == 1) \
1066 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
1069 Screen [N] = GFX.ScreenColors [Pixel]; \
1070 Depth [N] = GFX.Z2; \
1081 STATIC INLINE void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (uint32 Offset, uint8 *Pixels)
1083 register uint32 Pixel;
1084 uint16 *Screen = (uint16 *) GFX.S + Offset;
1085 uint8 *Depth = GFX.ZBuffer + Offset;
1086 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1089 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1091 if (SubDepth [N] == 1) \
1092 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
1095 Screen [N] = GFX.ScreenColors [Pixel]; \
1096 Depth [N] = GFX.Z2; \
1107 void DrawTile16FixedAdd1_2 (uint32 Tile, uint32 Offset, uint32 StartLine,
1113 RENDER_TILE(WRITE_4PIXELS16_ADDF1_2, WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4)
1116 void DrawClippedTile16FixedAdd1_2 (uint32 Tile, uint32 Offset,
1117 uint32 StartPixel, uint32 Width,
1118 uint32 StartLine, uint32 LineCount)
1124 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADDF1_2,
1125 WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4)
1128 void DrawTile16FixedSub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine,
1134 RENDER_TILE(WRITE_4PIXELS16_SUBF1_2, WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4)
1137 void DrawClippedTile16FixedSub1_2 (uint32 Tile, uint32 Offset,
1138 uint32 StartPixel, uint32 Width,
1139 uint32 StartLine, uint32 LineCount)
1145 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUBF1_2,
1146 WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4)
1149 void DrawLargePixel16Add (uint32 Tile, uint32 Offset,
1150 uint32 StartPixel, uint32 Pixels,
1151 uint32 StartLine, uint32 LineCount)
1155 register uint16 *sp = (uint16 *) GFX.S + Offset;
1156 uint8 *Depth = GFX.ZBuffer + Offset;
1157 register uint16 pixel;
1159 #define LARGE_ADD_PIXEL(s, p) \
1160 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1161 COLOR_ADD (p, *(s + GFX.Delta)) : \
1162 COLOR_ADD (p, GFX.FixedColour)) \
1165 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL)
1168 void DrawLargePixel16Add1_2 (uint32 Tile, uint32 Offset,
1169 uint32 StartPixel, uint32 Pixels,
1170 uint32 StartLine, uint32 LineCount)
1174 register uint16 *sp = (uint16 *) GFX.S + Offset;
1175 uint8 *Depth = GFX.ZBuffer + Offset;
1176 register uint16 pixel;
1178 #define LARGE_ADD_PIXEL1_2(s, p) \
1179 ((uint16) (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1180 COLOR_ADD1_2 (p, *(s + GFX.Delta)) : \
1181 COLOR_ADD (p, GFX.FixedColour)) \
1184 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL1_2)
1187 void DrawLargePixel16Sub (uint32 Tile, uint32 Offset,
1188 uint32 StartPixel, uint32 Pixels,
1189 uint32 StartLine, uint32 LineCount)
1193 register uint16 *sp = (uint16 *) GFX.S + Offset;
1194 uint8 *Depth = GFX.ZBuffer + Offset;
1195 register uint16 pixel;
1197 #define LARGE_SUB_PIXEL(s, p) \
1198 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1199 COLOR_SUB (p, *(s + GFX.Delta)) : \
1200 COLOR_SUB (p, GFX.FixedColour)) \
1203 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL)
1206 void DrawLargePixel16Sub1_2 (uint32 Tile, uint32 Offset,
1207 uint32 StartPixel, uint32 Pixels,
1208 uint32 StartLine, uint32 LineCount)
1212 register uint16 *sp = (uint16 *) GFX.S + Offset;
1213 uint8 *Depth = GFX.ZBuffer + Offset;
1216 #define LARGE_SUB_PIXEL1_2(s, p) \
1217 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1218 COLOR_SUB1_2 (p, *(s + GFX.Delta)) : \
1219 COLOR_SUB (p, GFX.FixedColour)) \
1222 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL1_2)
1225 void DrawHiResTile16 (uint32 Tile, uint32 Offset, uint32 StartLine,
1231 RENDER_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4)
1234 void DrawHiResClippedTile16 (uint32 Tile, uint32 Offset,
1235 uint32 StartPixel, uint32 Width,
1236 uint32 StartLine, uint32 LineCount)
1242 RENDER_CLIPPED_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4)