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.
53 #define TILE_PREAMBLE \
56 uint32 TileAddr = BG.TileAddress + ((Tile & 0x3ff) << BG.TileShift); \
57 if ((Tile & 0x1ff) >= 256) \
58 TileAddr += BG.NameSelect; \
63 pCache = &BG.Buffer[(TileNumber = (TileAddr >> BG.TileShift)) << 6]; \
65 if (!BG.Buffered [TileNumber]) \
66 BG.Buffered[TileNumber] = ConvertTile (pCache, TileAddr); \
68 if (BG.Buffered [TileNumber] == BLANK_TILE) \
72 if (BG.DirectColourMode) \
74 if (IPPU.DirectColourMapsNeedRebuild) \
75 S9xBuildDirectColourMaps (); \
76 GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & BG.PaletteMask]; \
79 GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & BG.PaletteMask) << BG.PaletteShift) + BG.StartPalette];
81 #define RENDER_TILE(NORMAL, FLIPPED, N) \
82 if (!(Tile & (V_FLIP | H_FLIP))) \
84 bp = pCache + StartLine; \
85 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
88 NORMAL (Offset, bp); \
89 if (*(uint32 *) (bp + 4)) \
90 NORMAL (Offset + N, bp + 4); \
94 if (!(Tile & V_FLIP)) \
96 bp = pCache + StartLine; \
97 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
99 if (*(uint32 *) (bp + 4)) \
100 FLIPPED (Offset, bp + 4); \
101 if (*(uint32 *) bp) \
102 FLIPPED (Offset + N, bp); \
108 bp = pCache + 56 - StartLine; \
109 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
111 if (*(uint32 *) (bp + 4)) \
112 FLIPPED (Offset, bp + 4); \
113 if (*(uint32 *) bp) \
114 FLIPPED (Offset + N, bp); \
119 bp = pCache + 56 - StartLine; \
120 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
122 if (*(uint32 *) bp) \
123 NORMAL (Offset, bp); \
124 if (*(uint32 *) (bp + 4)) \
125 NORMAL (Offset + N, bp + 4); \
129 #define TILE_CLIP_PREAMBLE \
134 if (StartPixel < 4) \
136 d1 = HeadMask [StartPixel]; \
137 if (StartPixel + Width < 4) \
138 d1 &= TailMask [StartPixel + Width]; \
143 if (StartPixel + Width > 4) \
145 if (StartPixel > 4) \
146 d2 = HeadMask [StartPixel - 4]; \
150 d2 &= TailMask [(StartPixel + Width - 4)]; \
156 #define RENDER_CLIPPED_TILE(NORMAL, FLIPPED, N) \
157 if (!(Tile & (V_FLIP | H_FLIP))) \
159 bp = pCache + StartLine; \
160 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
162 if ((dd = (*(uint32 *) bp) & d1)) \
163 NORMAL (Offset, (uint8 *) &dd); \
164 if ((dd = (*(uint32 *) (bp + 4)) & d2)) \
165 NORMAL (Offset + N, (uint8 *) &dd); \
169 if (!(Tile & V_FLIP)) \
171 bp = pCache + StartLine; \
174 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
176 if ((dd = *(uint32 *) (bp + 4) & d1)) \
177 FLIPPED (Offset, (uint8 *) &dd); \
178 if ((dd = *(uint32 *) bp & d2)) \
179 FLIPPED (Offset + N, (uint8 *) &dd); \
185 bp = pCache + 56 - StartLine; \
188 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
190 if ((dd = *(uint32 *) (bp + 4) & d1)) \
191 FLIPPED (Offset, (uint8 *) &dd); \
192 if ((dd = *(uint32 *) bp & d2)) \
193 FLIPPED (Offset + N, (uint8 *) &dd); \
198 bp = pCache + 56 - StartLine; \
199 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
201 if ((dd = (*(uint32 *) bp) & d1)) \
202 NORMAL (Offset, (uint8 *) &dd); \
203 if ((dd = (*(uint32 *) (bp + 4)) & d2)) \
204 NORMAL (Offset + N, (uint8 *) &dd); \
208 #define RENDER_TILE_LARGE(PIXEL, FUNCTION) \
209 if (!(Tile & (V_FLIP | H_FLIP))) \
211 if ((pixel = *(pCache + StartLine + StartPixel))) \
214 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
216 for (int z = Pixels - 1; z >= 0; z--) \
217 if (GFX.Z1 > Depth [z]) \
219 sp [z] = FUNCTION(sp + z, pixel); \
220 Depth [z] = GFX.Z2; \
226 if (!(Tile & V_FLIP)) \
228 StartPixel = 7 - StartPixel; \
229 if ((pixel = *(pCache + StartLine + StartPixel))) \
232 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
234 for (int z = Pixels - 1; z >= 0; z--) \
235 if (GFX.Z1 > Depth [z]) \
237 sp [z] = FUNCTION(sp + z, pixel); \
238 Depth [z] = GFX.Z2; \
246 StartPixel = 7 - StartPixel; \
247 if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \
250 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
252 for (int z = Pixels - 1; z >= 0; z--) \
253 if (GFX.Z1 > Depth [z]) \
255 sp [z] = FUNCTION(sp + z, pixel); \
256 Depth [z] = GFX.Z2; \
263 if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \
266 for (l = LineCount; l != 0; l--, sp += GFX.PPL, Depth += GFX.PPL) \
268 for (int z = Pixels - 1; z >= 0; z--) \
269 if (GFX.Z1 > Depth [z]) \
271 sp [z] = FUNCTION(sp + z, pixel); \
272 Depth [z] = GFX.Z2; \
278 #define RENDER_TILEHI(NORMAL, FLIPPED, N) \
279 if (!(Tile & (V_FLIP | H_FLIP))) \
281 bp = pCache + StartLine; \
282 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
284 /*if (*(uint32 *) bp)*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
285 NORMAL (Offset, bp); \
289 if (!(Tile & V_FLIP)) \
291 bp = pCache + StartLine; \
292 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
294 /*if (*(uint32 *) (bp + 4))*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
295 FLIPPED (Offset, bp); \
301 bp = pCache + 56 - StartLine; \
302 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
304 /*if (*(uint32 *) (bp + 4))*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
305 FLIPPED (Offset, bp); \
310 bp = pCache + 56 - StartLine; \
311 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
313 /*if (*(uint32 *) bp)*/if (((uint32)bp[0])|((uint32)bp[2])|((uint32)bp[4])|((uint32)bp[6])) \
314 NORMAL (Offset, bp); \
320 #define RENDER_CLIPPED_TILEHI(NORMAL, FLIPPED, N) \
321 d1=(d1&0xFF)|((d1&0xFF0000)>>8)|((d2&0xFF)<<16)|((d2&0xFF0000)<<8);\
322 if (!(Tile & (V_FLIP | H_FLIP))) \
324 bp = pCache + StartLine; \
325 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
327 /*if ((dd = (*(uint32 *) bp) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
328 NORMAL (Offset, (uint8 *) &dd); \
332 if (!(Tile & V_FLIP)) \
334 bp = pCache + StartLine; \
336 /*SWAP_DWORD (d2);*/ \
337 for (l = LineCount; l != 0; l--, bp += 8, Offset += GFX.PPL) \
339 /*if ((dd = *(uint32 *) (bp + 4) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
340 FLIPPED (Offset, (uint8 *) &dd); \
346 bp = pCache + 56 - StartLine; \
348 /*SWAP_DWORD (d2);*/ \
349 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
351 /*if ((dd = *(uint32 *) (bp + 4) & d1))*/if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
352 FLIPPED (Offset, (uint8 *) &dd); \
357 bp = pCache + 56 - StartLine; \
358 for (l = LineCount; l != 0; l--, bp -= 8, Offset += GFX.PPL) \
360 /*if ((dd = (*(uint32 *) bp) & d1))*/ if ((dd = (((((uint32)bp[6])<<24)|(((uint32)bp[4])<<16)|(((uint32)bp[2])<<8)|((uint32)bp[0]))&d1))) \
361 NORMAL (Offset, (uint8 *) &dd); \
365 extern uint32 HeadMask [4];
366 extern uint32 TailMask [5];
368 uint8 ConvertTile (uint8 *pCache, uint32 TileAddr)
370 register uint8 *tp = &Memory.VRAM[TileAddr];
371 uint32 *p = (uint32 *) pCache;
381 for (line = 8; line != 0; line--, tp += 2)
384 if ((pix = *(tp + 0)))
386 p1 |= odd_high[0][pix >> 4];
387 p2 |= odd_low[0][pix & 0xf];
389 if ((pix = *(tp + 1)))
391 p1 |= even_high[0][pix >> 4];
392 p2 |= even_low[0][pix & 0xf];
394 if ((pix = *(tp + 16)))
396 p1 |= odd_high[1][pix >> 4];
397 p2 |= odd_low[1][pix & 0xf];
399 if ((pix = *(tp + 17)))
401 p1 |= even_high[1][pix >> 4];
402 p2 |= even_low[1][pix & 0xf];
404 if ((pix = *(tp + 32)))
406 p1 |= odd_high[2][pix >> 4];
407 p2 |= odd_low[2][pix & 0xf];
409 if ((pix = *(tp + 33)))
411 p1 |= even_high[2][pix >> 4];
412 p2 |= even_low[2][pix & 0xf];
414 if ((pix = *(tp + 48)))
416 p1 |= odd_high[3][pix >> 4];
417 p2 |= odd_low[3][pix & 0xf];
419 if ((pix = *(tp + 49)))
421 p1 |= even_high[3][pix >> 4];
422 p2 |= even_low[3][pix & 0xf];
431 for (line = 8; line != 0; line--, tp += 2)
434 if ((pix = *(tp + 0)))
436 p1 |= odd_high[0][pix >> 4];
437 p2 |= odd_low[0][pix & 0xf];
439 if ((pix = *(tp + 1)))
441 p1 |= even_high[0][pix >> 4];
442 p2 |= even_low[0][pix & 0xf];
444 if ((pix = *(tp + 16)))
446 p1 |= odd_high[1][pix >> 4];
447 p2 |= odd_low[1][pix & 0xf];
449 if ((pix = *(tp + 17)))
451 p1 |= even_high[1][pix >> 4];
452 p2 |= even_low[1][pix & 0xf];
461 for (line = 8; line != 0; line--, tp += 2)
464 if ((pix = *(tp + 0)))
466 p1 |= odd_high[0][pix >> 4];
467 p2 |= odd_low[0][pix & 0xf];
469 if ((pix = *(tp + 1)))
471 p1 |= even_high[0][pix >> 4];
472 p2 |= even_low[0][pix & 0xf];
480 return (non_zero ? TRUE : BLANK_TILE);
483 INLINE void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels)
485 register uint8 Pixel;
486 uint8 *Screen = GFX.S + Offset;
487 uint8 *Depth = GFX.DB + Offset;
490 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
492 Screen [N] = (uint8) GFX.ScreenColors [Pixel]; \
493 Depth [N] = GFX.Z2; \
503 INLINE void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels)
505 register uint8 Pixel;
506 uint8 *Screen = GFX.S + Offset;
507 uint8 *Depth = GFX.DB + Offset;
510 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
512 Screen [N] = (uint8) GFX.ScreenColors [Pixel]; \
513 Depth [N] = GFX.Z2; \
523 inline void WRITE_4PIXELSHI16 (uint32 Offset, uint8 *Pixels)
526 uint16 *Screen = (uint16 *) GFX.S + Offset;
527 uint8 *Depth = GFX.DB + Offset;
530 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[2*N])) \
532 Screen [N] = GFX.ScreenColors [Pixel]; \
533 Depth [N] = GFX.Z2; \
543 inline void WRITE_4PIXELSHI16_FLIPPED (uint32 Offset, uint8 *Pixels)
546 uint16 *Screen = (uint16 *) GFX.S + Offset;
547 uint8 *Depth = GFX.DB + Offset;
550 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[6 - 2*N])) \
552 Screen [N] = GFX.ScreenColors [Pixel]; \
553 Depth [N] = GFX.Z2; \
563 INLINE void WRITE_4PIXELSx2 (uint32 Offset, uint8 *Pixels)
565 register uint8 Pixel;
566 uint8 *Screen = GFX.S + Offset;
567 uint8 *Depth = GFX.DB + Offset;
570 if (GFX.Z1 > Depth [0] && (Pixel = Pixels[N])) \
572 Screen [N * 2] = Screen [N * 2 + 1] = (uint8) GFX.ScreenColors [Pixel]; \
573 Depth [N * 2] = Depth [N * 2 + 1] = GFX.Z2; \
583 INLINE void WRITE_4PIXELS_FLIPPEDx2 (uint32 Offset, uint8 *Pixels)
585 register uint8 Pixel;
586 uint8 *Screen = GFX.S + Offset;
587 uint8 *Depth = GFX.DB + Offset;
590 if (GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[3 - N])) \
592 Screen [N * 2] = Screen [N * 2 + 1] = (uint8) GFX.ScreenColors [Pixel]; \
593 Depth [N * 2] = Depth [N * 2 + 1] = GFX.Z2; \
603 INLINE void WRITE_4PIXELSx2x2 (uint32 Offset, uint8 *Pixels)
605 register uint8 Pixel;
606 uint8 *Screen = GFX.S + Offset;
607 uint8 *Depth = GFX.DB + Offset;
610 if (GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[N])) \
612 Screen [N * 2] = Screen [N * 2 + 1] = Screen [GFX.RealPitch + N * 2] = \
613 Screen [GFX.RealPitch + N * 2 + 1] = (uint8) GFX.ScreenColors [Pixel]; \
614 Depth [N * 2] = Depth [N * 2 + 1] = Depth [GFX.RealPitch + N * 2] = \
615 Depth [GFX.RealPitch + N * 2 + 1] = GFX.Z2; \
625 INLINE void WRITE_4PIXELS_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels)
627 register uint8 Pixel;
628 uint8 *Screen = GFX.S + Offset;
629 uint8 *Depth = GFX.DB + Offset;
632 if (GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[3 - N])) \
634 Screen [N * 2] = Screen [N * 2 + 1] = Screen [GFX.RealPitch + N * 2] = \
635 Screen [GFX.RealPitch + N * 2 + 1] = (uint8) GFX.ScreenColors [Pixel]; \
636 Depth [N * 2] = Depth [N * 2 + 1] = Depth [GFX.RealPitch + N * 2] = \
637 Depth [GFX.RealPitch + N * 2 + 1] = GFX.Z2; \
647 void DrawTile(uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount)
653 RENDER_TILE(WRITE_4PIXELS, WRITE_4PIXELS_FLIPPED, 4)
656 void DrawClippedTile(uint32 Tile, uint32 Offset,
657 uint32 StartPixel, uint32 Width,
658 uint32 StartLine, uint32 LineCount)
664 RENDER_CLIPPED_TILE(WRITE_4PIXELS, WRITE_4PIXELS_FLIPPED, 4)
667 void DrawTilex2 (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount)
673 RENDER_TILE(WRITE_4PIXELSx2, WRITE_4PIXELS_FLIPPEDx2, 8)
676 void DrawClippedTilex2 (uint32 Tile, uint32 Offset,
677 uint32 StartPixel, uint32 Width,
678 uint32 StartLine, uint32 LineCount)
684 RENDER_CLIPPED_TILE(WRITE_4PIXELSx2, WRITE_4PIXELS_FLIPPEDx2, 8)
687 void DrawTilex2x2 (uint32 Tile, uint32 Offset, uint32 StartLine,
694 RENDER_TILE(WRITE_4PIXELSx2x2, WRITE_4PIXELS_FLIPPEDx2x2, 8)
697 void DrawClippedTilex2x2 (uint32 Tile, uint32 Offset,
698 uint32 StartPixel, uint32 Width,
699 uint32 StartLine, uint32 LineCount)
705 RENDER_CLIPPED_TILE(WRITE_4PIXELSx2x2, WRITE_4PIXELS_FLIPPEDx2x2, 8)
708 void DrawLargePixel (uint32 Tile, uint32 Offset,
709 uint32 StartPixel, uint32 Pixels,
710 uint32 StartLine, uint32 LineCount)
714 register uint8 *sp = GFX.S + Offset;
715 uint8 *Depth = GFX.DB + Offset;
717 #define PLOT_PIXEL(screen, pixel) (pixel)
719 RENDER_TILE_LARGE (((uint8) GFX.ScreenColors [pixel]), PLOT_PIXEL)
722 INLINE void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels)
724 register uint32 Pixel;
725 uint16 *Screen = (uint16 *) GFX.S + Offset;
726 uint8 *Depth = GFX.DB + Offset;
729 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
731 Screen [N] = GFX.ScreenColors [Pixel]; \
732 Depth [N] = GFX.Z2; \
742 INLINE void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels)
744 register uint32 Pixel;
745 uint16 *Screen = (uint16 *) GFX.S + Offset;
746 uint8 *Depth = GFX.DB + Offset;
749 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
751 Screen [N] = GFX.ScreenColors [Pixel]; \
752 Depth [N] = GFX.Z2; \
762 INLINE void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels)
764 register uint32 Pixel;
765 uint16 *Screen = (uint16 *) GFX.S + Offset;
766 uint8 *Depth = GFX.DB + Offset;
769 if (GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[N])) \
771 Screen [N * 2] = Screen [N * 2 + 1] = GFX.ScreenColors [Pixel]; \
772 Depth [N * 2] = Depth [N * 2 + 1] = GFX.Z2; \
782 INLINE void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels)
784 register uint32 Pixel;
785 uint16 *Screen = (uint16 *) GFX.S + Offset;
786 uint8 *Depth = GFX.DB + Offset;
789 if (GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[3 - N])) \
791 Screen [N * 2] = Screen [N * 2 + 1] = GFX.ScreenColors [Pixel]; \
792 Depth [N * 2] = Depth [N * 2 + 1] = GFX.Z2; \
802 INLINE void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels)
804 register uint32 Pixel;
805 uint16 *Screen = (uint16 *) GFX.S + Offset;
806 uint8 *Depth = GFX.DB + Offset;
809 if (GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[N])) \
811 Screen [N * 2] = Screen [N * 2 + 1] = Screen [(GFX.RealPitch >> 1) + N * 2] = \
812 Screen [(GFX.RealPitch >> 1) + N * 2 + 1] = GFX.ScreenColors [Pixel]; \
813 Depth [N * 2] = Depth [N * 2 + 1] = Depth [(GFX.RealPitch >> 1) + N * 2] = \
814 Depth [(GFX.RealPitch >> 1) + N * 2 + 1] = GFX.Z2; \
824 INLINE void WRITE_4PIXELS16_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels)
826 register uint32 Pixel;
827 uint16 *Screen = (uint16 *) GFX.S + Offset;
828 uint8 *Depth = GFX.DB + Offset;
831 if (GFX.Z1 > Depth [N * 2] && (Pixel = Pixels[3 - N])) \
833 Screen [N * 2] = Screen [N * 2 + 1] = Screen [(GFX.RealPitch >> 1) + N * 2] = \
834 Screen [(GFX.RealPitch >> 1) + N * 2 + 1] = GFX.ScreenColors [Pixel]; \
835 Depth [N * 2] = Depth [N * 2 + 1] = Depth [(GFX.RealPitch >> 1) + N * 2] = \
836 Depth [(GFX.RealPitch >> 1) + N * 2 + 1] = GFX.Z2; \
846 void DrawTile16 (uint32 Tile, uint32 Offset, uint32 StartLine,
852 RENDER_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4)
855 void DrawClippedTile16 (uint32 Tile, uint32 Offset,
856 uint32 StartPixel, uint32 Width,
857 uint32 StartLine, uint32 LineCount)
863 RENDER_CLIPPED_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4)
866 void DrawTile16x2 (uint32 Tile, uint32 Offset, uint32 StartLine,
872 RENDER_TILE(WRITE_4PIXELS16x2, WRITE_4PIXELS16_FLIPPEDx2, 8)
875 void DrawClippedTile16x2 (uint32 Tile, uint32 Offset,
876 uint32 StartPixel, uint32 Width,
877 uint32 StartLine, uint32 LineCount)
883 RENDER_CLIPPED_TILE(WRITE_4PIXELS16x2, WRITE_4PIXELS16_FLIPPEDx2, 8)
886 void DrawTile16x2x2 (uint32 Tile, uint32 Offset, uint32 StartLine,
892 RENDER_TILE(WRITE_4PIXELS16x2x2, WRITE_4PIXELS16_FLIPPEDx2x2, 8)
895 void DrawClippedTile16x2x2 (uint32 Tile, uint32 Offset,
896 uint32 StartPixel, uint32 Width,
897 uint32 StartLine, uint32 LineCount)
903 RENDER_CLIPPED_TILE(WRITE_4PIXELS16x2x2, WRITE_4PIXELS16_FLIPPEDx2x2, 8)
906 void DrawLargePixel16 (uint32 Tile, uint32 Offset,
907 uint32 StartPixel, uint32 Pixels,
908 uint32 StartLine, uint32 LineCount)
912 register uint16 *sp = (uint16 *) GFX.S + Offset;
913 uint8 *Depth = GFX.DB + Offset;
916 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], PLOT_PIXEL)
919 INLINE void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels)
921 register uint32 Pixel;
922 uint16 *Screen = (uint16 *) GFX.S + Offset;
923 uint8 *Depth = GFX.ZBuffer + Offset;
924 uint8 *SubDepth = GFX.SubZBuffer + Offset;
927 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
931 if (SubDepth [N] != 1) \
932 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
933 Screen [GFX.Delta + N]); \
935 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
939 Screen [N] = GFX.ScreenColors [Pixel]; \
940 Depth [N] = GFX.Z2; \
951 INLINE void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels)
953 register uint32 Pixel;
954 uint16 *Screen = (uint16 *) GFX.S + Offset;
955 uint8 *Depth = GFX.ZBuffer + Offset;
956 uint8 *SubDepth = GFX.SubZBuffer + Offset;
959 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
963 if (SubDepth [N] != 1) \
964 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
965 Screen [GFX.Delta + N]); \
967 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
971 Screen [N] = GFX.ScreenColors [Pixel]; \
972 Depth [N] = GFX.Z2; \
983 INLINE void WRITE_4PIXELS16_ADD1_2 (uint32 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])) \
995 if (SubDepth [N] != 1) \
996 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
997 Screen [GFX.Delta + N])); \
999 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
1003 Screen [N] = GFX.ScreenColors [Pixel]; \
1004 Depth [N] = GFX.Z2; \
1015 INLINE void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels)
1017 register uint32 Pixel;
1018 uint16 *Screen = (uint16 *) GFX.S + Offset;
1019 uint8 *Depth = GFX.ZBuffer + Offset;
1020 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1023 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1027 if (SubDepth [N] != 1) \
1028 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
1029 Screen [GFX.Delta + N])); \
1031 Screen [N] = COLOR_ADD (GFX.ScreenColors [Pixel], \
1035 Screen [N] = GFX.ScreenColors [Pixel]; \
1036 Depth [N] = GFX.Z2; \
1047 INLINE void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels)
1049 register uint32 Pixel;
1050 uint16 *Screen = (uint16 *) GFX.S + Offset;
1051 uint8 *Depth = GFX.ZBuffer + Offset;
1052 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1055 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
1059 if (SubDepth [N] != 1) \
1060 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
1061 Screen [GFX.Delta + N]); \
1063 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
1067 Screen [N] = GFX.ScreenColors [Pixel]; \
1068 Depth [N] = GFX.Z2; \
1079 INLINE void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels)
1081 register uint32 Pixel;
1082 uint16 *Screen = (uint16 *) GFX.S + Offset;
1083 uint8 *Depth = GFX.ZBuffer + Offset;
1084 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1087 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1091 if (SubDepth [N] != 1) \
1092 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
1093 Screen [GFX.Delta + N]); \
1095 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
1099 Screen [N] = GFX.ScreenColors [Pixel]; \
1100 Depth [N] = GFX.Z2; \
1111 INLINE void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels)
1113 register uint32 Pixel;
1114 uint16 *Screen = (uint16 *) GFX.S + Offset;
1115 uint8 *Depth = GFX.ZBuffer + Offset;
1116 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1119 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
1123 if (SubDepth [N] != 1) \
1124 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
1125 Screen [GFX.Delta + N]); \
1127 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
1131 Screen [N] = GFX.ScreenColors [Pixel]; \
1132 Depth [N] = GFX.Z2; \
1143 INLINE void WRITE_4PIXELS16_FLIPPED_SUB1_2 (uint32 Offset, uint8 *Pixels)
1145 register uint32 Pixel;
1146 uint16 *Screen = (uint16 *) GFX.S + Offset;
1147 uint8 *Depth = GFX.ZBuffer + Offset;
1148 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1151 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1155 if (SubDepth [N] != 1) \
1156 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
1157 Screen [GFX.Delta + N]); \
1159 Screen [N] = (uint16) COLOR_SUB (GFX.ScreenColors [Pixel], \
1163 Screen [N] = GFX.ScreenColors [Pixel]; \
1164 Depth [N] = GFX.Z2; \
1176 void DrawTile16Add (uint32 Tile, uint32 Offset, uint32 StartLine,
1182 RENDER_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4)
1185 void DrawClippedTile16Add (uint32 Tile, uint32 Offset,
1186 uint32 StartPixel, uint32 Width,
1187 uint32 StartLine, uint32 LineCount)
1193 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4)
1196 void DrawTile16Add1_2 (uint32 Tile, uint32 Offset, uint32 StartLine,
1202 RENDER_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4)
1205 void DrawClippedTile16Add1_2 (uint32 Tile, uint32 Offset,
1206 uint32 StartPixel, uint32 Width,
1207 uint32 StartLine, uint32 LineCount)
1213 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4)
1216 void DrawTile16Sub (uint32 Tile, uint32 Offset, uint32 StartLine,
1222 RENDER_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4)
1225 void DrawClippedTile16Sub (uint32 Tile, uint32 Offset,
1226 uint32 StartPixel, uint32 Width,
1227 uint32 StartLine, uint32 LineCount)
1233 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4)
1236 void DrawTile16Sub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine,
1242 RENDER_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4)
1245 void DrawClippedTile16Sub1_2 (uint32 Tile, uint32 Offset,
1246 uint32 StartPixel, uint32 Width,
1247 uint32 StartLine, uint32 LineCount)
1253 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4)
1256 INLINE void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels)
1258 register uint32 Pixel;
1259 uint16 *Screen = (uint16 *) GFX.S + Offset;
1260 uint8 *Depth = GFX.ZBuffer + Offset;
1261 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1264 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
1266 if (SubDepth [N] == 1) \
1267 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
1268 GFX.FixedColour)); \
1270 Screen [N] = GFX.ScreenColors [Pixel];\
1271 Depth [N] = GFX.Z2; \
1282 INLINE void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels)
1284 register uint32 Pixel;
1285 uint16 *Screen = (uint16 *) GFX.S + Offset;
1286 uint8 *Depth = GFX.ZBuffer + Offset;
1287 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1290 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1292 if (SubDepth [N] == 1) \
1293 Screen [N] = (uint16) (COLOR_ADD1_2 (GFX.ScreenColors [Pixel], \
1294 GFX.FixedColour)); \
1296 Screen [N] = GFX.ScreenColors [Pixel];\
1297 Depth [N] = GFX.Z2; \
1308 INLINE void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels)
1310 register uint32 Pixel;
1311 uint16 *Screen = (uint16 *) GFX.S + Offset;
1312 uint8 *Depth = GFX.ZBuffer + Offset;
1313 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1316 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \
1318 if (SubDepth [N] == 1) \
1319 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
1322 Screen [N] = GFX.ScreenColors [Pixel]; \
1323 Depth [N] = GFX.Z2; \
1334 INLINE void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (uint32 Offset, uint8 *Pixels)
1336 register uint32 Pixel;
1337 uint16 *Screen = (uint16 *) GFX.S + Offset;
1338 uint8 *Depth = GFX.ZBuffer + Offset;
1339 uint8 *SubDepth = GFX.SubZBuffer + Offset;
1342 if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \
1344 if (SubDepth [N] == 1) \
1345 Screen [N] = (uint16) COLOR_SUB1_2 (GFX.ScreenColors [Pixel], \
1348 Screen [N] = GFX.ScreenColors [Pixel]; \
1349 Depth [N] = GFX.Z2; \
1360 void DrawTile16FixedAdd1_2 (uint32 Tile, uint32 Offset, uint32 StartLine,
1366 RENDER_TILE(WRITE_4PIXELS16_ADDF1_2, WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4)
1369 void DrawClippedTile16FixedAdd1_2 (uint32 Tile, uint32 Offset,
1370 uint32 StartPixel, uint32 Width,
1371 uint32 StartLine, uint32 LineCount)
1377 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADDF1_2,
1378 WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4)
1381 void DrawTile16FixedSub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine,
1387 RENDER_TILE(WRITE_4PIXELS16_SUBF1_2, WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4)
1390 void DrawClippedTile16FixedSub1_2 (uint32 Tile, uint32 Offset,
1391 uint32 StartPixel, uint32 Width,
1392 uint32 StartLine, uint32 LineCount)
1398 RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUBF1_2,
1399 WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4)
1402 void DrawLargePixel16Add (uint32 Tile, uint32 Offset,
1403 uint32 StartPixel, uint32 Pixels,
1404 uint32 StartLine, uint32 LineCount)
1408 register uint16 *sp = (uint16 *) GFX.S + Offset;
1409 uint8 *Depth = GFX.ZBuffer + Offset;
1410 register uint16 pixel;
1412 #define LARGE_ADD_PIXEL(s, p) \
1413 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1414 COLOR_ADD (p, *(s + GFX.Delta)) : \
1415 COLOR_ADD (p, GFX.FixedColour)) \
1418 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL)
1421 void DrawLargePixel16Add1_2 (uint32 Tile, uint32 Offset,
1422 uint32 StartPixel, uint32 Pixels,
1423 uint32 StartLine, uint32 LineCount)
1427 register uint16 *sp = (uint16 *) GFX.S + Offset;
1428 uint8 *Depth = GFX.ZBuffer + Offset;
1429 register uint16 pixel;
1431 #define LARGE_ADD_PIXEL1_2(s, p) \
1432 ((uint16) (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1433 COLOR_ADD1_2 (p, *(s + GFX.Delta)) : \
1434 COLOR_ADD (p, GFX.FixedColour)) \
1437 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL1_2)
1440 void DrawLargePixel16Sub (uint32 Tile, uint32 Offset,
1441 uint32 StartPixel, uint32 Pixels,
1442 uint32 StartLine, uint32 LineCount)
1446 register uint16 *sp = (uint16 *) GFX.S + Offset;
1447 uint8 *Depth = GFX.ZBuffer + Offset;
1448 register uint16 pixel;
1450 #define LARGE_SUB_PIXEL(s, p) \
1451 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1452 COLOR_SUB (p, *(s + GFX.Delta)) : \
1453 COLOR_SUB (p, GFX.FixedColour)) \
1456 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL)
1459 void DrawLargePixel16Sub1_2 (uint32 Tile, uint32 Offset,
1460 uint32 StartPixel, uint32 Pixels,
1461 uint32 StartLine, uint32 LineCount)
1465 register uint16 *sp = (uint16 *) GFX.S + Offset;
1466 uint8 *Depth = GFX.ZBuffer + Offset;
1469 #define LARGE_SUB_PIXEL1_2(s, p) \
1470 (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \
1471 COLOR_SUB1_2 (p, *(s + GFX.Delta)) : \
1472 COLOR_SUB (p, GFX.FixedColour)) \
1475 RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL1_2)
1478 void DrawHiResTile16 (uint32 Tile, uint32 Offset, uint32 StartLine,
1484 RENDER_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4)
1487 void DrawHiResClippedTile16 (uint32 Tile, uint32 Offset,
1488 uint32 StartPixel, uint32 Width,
1489 uint32 StartLine, uint32 LineCount)
1495 RENDER_CLIPPED_TILEHI(WRITE_4PIXELSHI16, WRITE_4PIXELSHI16_FLIPPED, 4)