diff options
Diffstat (limited to 'source/gfx.h')
-rw-r--r-- | source/gfx.h | 293 |
1 files changed, 150 insertions, 143 deletions
diff --git a/source/gfx.h b/source/gfx.h index 8280987..55b31bf 100644 --- a/source/gfx.h +++ b/source/gfx.h @@ -1,6 +1,6 @@ /******************************************************************************* Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and Jerremy Koot (jkoot@snes9x.com) @@ -43,46 +43,46 @@ S-DD1 C emulator code (c) Copyright 2003 Brad Jorsch with research by Andreas Naive and John Weidman - + S-RTC C emulator code (c) Copyright 2001 John Weidman - + ST010 C++ emulator code (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - Super FX C emulator code + Super FX C emulator code (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + - Specific ports contains the works of other authors. See headers in individual files. - + Snes9x homepage: http://www.snes9x.com - + Permission to use, copy, modify and distribute Snes9x in both binary and source form, for non-commercial purposes, is hereby granted without fee, providing that this license information and copyright notice appear with all copies and any derived work. - + This software is provided 'as-is', without any express or implied warranty. In no event shall the authors be held liable for any damages arising from the use of this software. - + Snes9x is freeware for PERSONAL USE only. Commercial users should seek permission of the copyright holders first. Commercial use includes charging money for Snes9x or software derived from Snes9x. - + The copyright holders request that bug fixes and improvements to the code should be forwarded to them so everyone can benefit from the modifications in future versions. - + Super NES and Super Nintendo Entertainment System are trademarks of Nintendo Co., Limited and its subsidiary companies. *******************************************************************************/ @@ -93,83 +93,88 @@ #include "port.h" #include "snes9x.h" -void S9xStartScreenRefresh (); -void S9xDrawScanLine (uint8 Line); -void S9xEndScreenRefresh (); -void S9xSetupOBJ (); -void S9xUpdateScreen (); -void RenderLine (uint8 line); -void S9xBuildDirectColourMaps (); +void S9xStartScreenRefresh(); +void S9xDrawScanLine(uint8 Line); +void S9xEndScreenRefresh(); +void S9xSetupOBJ(); +void S9xUpdateScreen(); +void RenderLine(uint8 line); +void S9xBuildDirectColourMaps(); // External port interface which must be implemented or initialised for each // port. extern struct SGFX GFX; -bool8 S9xGraphicsInit (); +bool8 S9xGraphicsInit(); void S9xGraphicsDeinit(); -bool8 S9xInitUpdate (void); -void S9xDeinitUpdate (int width, int height); -void S9xSyncSpeed (); - -struct SGFX{ - // Initialize these variables - uint8 *Screen; - uint8 *SubScreen; - uint8 *ZBuffer; - uint8 *SubZBuffer; - uint32 Pitch; - - // Setup in call to S9xGraphicsInit() - int Delta; - uint16 *X2; - uint16 *ZERO_OR_X2; - uint16 *ZERO; - uint32 RealPitch; // True pitch of Screen buffer. - uint32 Pitch2; // Same as RealPitch except while using speed up hack for Glide. - uint32 ZPitch; // Pitch of ZBuffer - uint32 PPL; // Number of pixels on each of Screen buffer - uint32 PPLx2; - uint32 PixSize; - uint8 S_safety_margin[8]; - uint8 *S; - uint8 DB_safety_margin[8]; - uint8 *DB; - uint32 DepthDelta; - uint8 Z1; // Depth for comparison - uint8 Z2; // Depth to save - uint8 ZSprite; // Used to ensure only 1st sprite is drawn per pixel - uint32 FixedColour; - const char *InfoString; - uint32 InfoStringTimeout; - uint32 StartY; - uint32 EndY; - struct ClipData *pCurrentClip; - uint32 Mode7Mask; - uint32 Mode7PriorityMask; - uint8 OBJWidths[128]; - uint8 OBJVisibleTiles[128]; - struct { - uint8 RTOFlags; - int16 Tiles; - struct { - int8 Sprite; - uint8 Line; - } OBJ[32]; - } OBJLines [SNES_HEIGHT_EXTENDED]; - - uint8 r212c; - uint8 r212d; - uint8 r2130; - uint8 r2131; - bool8 Pseudo; - +bool8 S9xInitUpdate(void); +void S9xDeinitUpdate(int width, int height); +void S9xSyncSpeed(); + +struct SGFX +{ + // Initialize these variables + uint8* Screen; + uint8* SubScreen; + uint8* ZBuffer; + uint8* SubZBuffer; + uint32 Pitch; + + // Setup in call to S9xGraphicsInit() + int Delta; + uint16* X2; + uint16* ZERO_OR_X2; + uint16* ZERO; + uint32 RealPitch; // True pitch of Screen buffer. + uint32 Pitch2; // Same as RealPitch except while using speed up hack for Glide. + uint32 ZPitch; // Pitch of ZBuffer + uint32 PPL; // Number of pixels on each of Screen buffer + uint32 PPLx2; + uint32 PixSize; + uint8 S_safety_margin[8]; + uint8* S; + uint8 DB_safety_margin[8]; + uint8* DB; + uint32 DepthDelta; + uint8 Z1; // Depth for comparison + uint8 Z2; // Depth to save + uint8 ZSprite; // Used to ensure only 1st sprite is drawn per pixel + uint32 FixedColour; + const char* InfoString; + uint32 InfoStringTimeout; + uint32 StartY; + uint32 EndY; + struct ClipData* pCurrentClip; + uint32 Mode7Mask; + uint32 Mode7PriorityMask; + uint8 OBJWidths[128]; + uint8 OBJVisibleTiles[128]; + struct + { + uint8 RTOFlags; + int16 Tiles; + struct + { + int8 Sprite; + uint8 Line; + } OBJ[32]; + } OBJLines [SNES_HEIGHT_EXTENDED]; + + uint8 r212c; + uint8 r212d; + uint8 r2130; + uint8 r2131; + bool8 Pseudo; + }; -struct SLineData { - struct { - uint16 VOffset; - uint16 HOffset; - } BG [4]; +struct SLineData +{ + struct + { + uint16 VOffset; + uint16 HOffset; + } BG [4]; }; #define H_FLIP 0x4000 @@ -178,30 +183,30 @@ struct SLineData { typedef struct { - uint32 TileSize; - uint32 BitShift; - uint32 TileShift; - uint32 TileAddress; - uint32 NameSelect; - uint32 SCBase; - - uint32 StartPalette; - uint32 PaletteShift; - uint32 PaletteMask; - - uint8 *Buffer; - uint8 *Buffered; - bool8 DirectColourMode; -}SBG; + uint32 TileSize; + uint32 BitShift; + uint32 TileShift; + uint32 TileAddress; + uint32 NameSelect; + uint32 SCBase; + + uint32 StartPalette; + uint32 PaletteShift; + uint32 PaletteMask; + + uint8* Buffer; + uint8* Buffered; + bool8 DirectColourMode; +} SBG; struct SLineMatrixData { - short MatrixA; - short MatrixB; - short MatrixC; - short MatrixD; - short CentreX; - short CentreY; + short MatrixA; + short MatrixB; + short MatrixC; + short MatrixD; + short CentreX; + short CentreY; }; extern uint32 odd_high [4][16]; @@ -219,7 +224,7 @@ extern uint8 mul_brightness [16][32]; // Could use BSWAP instruction on Intel port... #define SWAP_DWORD(dw) dw = ((dw & 0xff) << 24) | ((dw & 0xff00) << 8) | \ - ((dw & 0xff0000) >> 8) | ((dw & 0xff000000) >> 24) + ((dw & 0xff0000) >> 8) | ((dw & 0xff000000) >> 24) #ifdef FAST_LSB_WORD_ACCESS #define READ_2BYTES(s) (*(uint16 *) (s)) @@ -228,11 +233,11 @@ extern uint8 mul_brightness [16][32]; #ifdef LSB_FIRST #define READ_2BYTES(s) (*(uint8 *) (s) | (*((uint8 *) (s) + 1) << 8)) #define WRITE_2BYTES(s, d) *(uint8 *) (s) = (d), \ - *((uint8 *) (s) + 1) = (d) >> 8 + *((uint8 *) (s) + 1) = (d) >> 8 #else // else MSB_FISRT #define READ_2BYTES(s) (*(uint8 *) (s) | (*((uint8 *) (s) + 1) << 8)) #define WRITE_2BYTES(s, d) *(uint8 *) (s) = (d), \ - *((uint8 *) (s) + 1) = (d) >> 8 + *((uint8 *) (s) + 1) = (d) >> 8 #endif // LSB_FIRST #endif // i386 @@ -242,19 +247,21 @@ extern uint8 mul_brightness [16][32]; #if defined(OLD_COLOUR_BLENDING) #define COLOR_ADD(C1, C2) \ GFX.X2 [((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \ - ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \ - ((C1) & (C2) & RGB_LOW_BITS_MASK)] + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \ + ((C1) & (C2) & RGB_LOW_BITS_MASK)] #else -static inline uint16 COLOR_ADD (uint16, uint16); +static inline uint16 COLOR_ADD(uint16, uint16); -static inline uint16 COLOR_ADD (uint16 C1, uint16 C2) +static inline uint16 COLOR_ADD(uint16 C1, uint16 C2) { - if (C1 == 0) - return C2; - else if (C2 == 0) - return C1; - else - return GFX.X2 [(((C1 & RGB_REMOVE_LOW_BITS_MASK) + (C2 & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + (C1 & C2 & RGB_LOW_BITS_MASK)] | ((C1 ^ C2) & RGB_LOW_BITS_MASK); + if (C1 == 0) + return C2; + else if (C2 == 0) + return C1; + else + return GFX.X2 [(((C1 & RGB_REMOVE_LOW_BITS_MASK) + (C2 & + RGB_REMOVE_LOW_BITS_MASK)) >> 1) + (C1 & C2 & RGB_LOW_BITS_MASK)] | (( + C1 ^ C2) & RGB_LOW_BITS_MASK); } #endif @@ -266,7 +273,7 @@ static inline uint16 COLOR_ADD (uint16 C1, uint16 C2) #if defined(OLD_COLOUR_BLENDING) #define COLOR_SUB(C1, C2) \ GFX.ZERO_OR_X2 [(((C1) | RGB_HI_BITS_MASKx2) - \ - ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] #elif !defined(NEW_COLOUR_BLENDING) #define COLOR_SUB(C1, C2) \ (GFX.ZERO_OR_X2 [(((C1) | RGB_HI_BITS_MASKx2) - \ @@ -277,36 +284,36 @@ inline uint16 COLOR_SUB(uint16, uint16); inline uint16 COLOR_SUB(uint16 C1, uint16 C2) { - uint16 mC1, mC2, v = 0; - - mC1 = C1 & FIRST_COLOR_MASK; - mC2 = C2 & FIRST_COLOR_MASK; - if (mC1 > mC2) v += (mC1 - mC2); - - mC1 = C1 & SECOND_COLOR_MASK; - mC2 = C2 & SECOND_COLOR_MASK; - if (mC1 > mC2) v += (mC1 - mC2); - - mC1 = C1 & THIRD_COLOR_MASK; - mC2 = C2 & THIRD_COLOR_MASK; - if (mC1 > mC2) v += (mC1 - mC2); - - return v; + uint16 mC1, mC2, v = 0; + + mC1 = C1 & FIRST_COLOR_MASK; + mC2 = C2 & FIRST_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + mC1 = C1 & SECOND_COLOR_MASK; + mC2 = C2 & SECOND_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + mC1 = C1 & THIRD_COLOR_MASK; + mC2 = C2 & THIRD_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + return v; } #endif #define COLOR_SUB1_2(C1, C2) \ GFX.ZERO [(((C1) | RGB_HI_BITS_MASKx2) - \ - ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] - -typedef void (*NormalTileRenderer) (uint32 Tile, int32 Offset, - uint32 StartLine, uint32 LineCount); -typedef void (*ClippedTileRenderer) (uint32 Tile, int32 Offset, - uint32 StartPixel, uint32 Width, - uint32 StartLine, uint32 LineCount); -typedef void (*LargePixelRenderer) (uint32 Tile, int32 Offset, - uint32 StartPixel, uint32 Pixels, - uint32 StartLine, uint32 LineCount); + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] + +typedef void (*NormalTileRenderer)(uint32 Tile, int32 Offset, + uint32 StartLine, uint32 LineCount); +typedef void (*ClippedTileRenderer)(uint32 Tile, int32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +typedef void (*LargePixelRenderer)(uint32 Tile, int32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); #endif |