From bcaf44c511efaad9d803dde9b0fdbb046498c66f Mon Sep 17 00:00:00 2001 From: João Silva Date: Sun, 18 Jun 2017 16:16:19 +0100 Subject: Support for savestate versioning. Plenty of cleanups. --- source/gfx.h | 197 ++++++++++++++++++++++++----------------------------------- 1 file changed, 79 insertions(+), 118 deletions(-) (limited to 'source/gfx.h') diff --git a/source/gfx.h b/source/gfx.h index 230d692..c6b01cc 100644 --- a/source/gfx.h +++ b/source/gfx.h @@ -4,66 +4,56 @@ #define _GFX_H_ #include "port.h" +#include "ppu.h" #include "snes9x.h" -void S9xStartScreenRefresh(); +void S9xStartScreenRefresh(void); void S9xDrawScanLine(uint8_t Line); -void S9xEndScreenRefresh(); -void S9xSetupOBJ(); -void S9xUpdateScreen(); +void S9xEndScreenRefresh(void); +void S9xSetupOBJ(void); +void S9xUpdateScreen(void); void RenderLine(uint8_t line); -void S9xBuildDirectColourMaps(); +void S9xBuildDirectColourMaps(void); -// External port interface which must be implemented or initialised for each port. -extern struct SGFX GFX; - -bool S9xInitGFX(); -void S9xDeinitGFX(); -bool S9xInitUpdate(); +bool S9xInitGFX(void); +void S9xDeinitGFX(void); +bool S9xInitUpdate(void); -struct SGFX +typedef struct { - // Initialize these variables - uint8_t* Screen_buffer; - uint8_t* SubScreen_buffer; - uint8_t* ZBuffer_buffer; - uint8_t* SubZBuffer_buffer; - - uint8_t* Screen; - uint8_t* SubScreen; - uint8_t* ZBuffer; - uint8_t* SubZBuffer; - uint32_t Pitch; - - // Setup in call to S9xInitGFX() - int32_t Delta; - uint16_t* X2; - uint16_t* ZERO_OR_X2; - uint16_t* ZERO; - uint32_t RealPitch; // True pitch of Screen buffer. - uint32_t Pitch2; // Same as RealPitch except while using speed up hack for Glide. - uint32_t ZPitch; // Pitch of ZBuffer - uint32_t PPL; // Number of pixels on each of Screen buffer - uint32_t PPLx2; - uint32_t PixSize; - uint8_t S_safety_margin[8]; - uint8_t* S; - uint8_t DB_safety_margin[8]; - uint8_t* DB; - ptrdiff_t DepthDelta; - uint8_t Z1; // Depth for comparison - uint8_t Z2; // Depth to save - uint8_t ZSprite; // Used to ensure only 1st sprite is drawn per pixel - uint32_t FixedColour; - const char* InfoString; - uint32_t InfoStringTimeout; - uint32_t StartY; - uint32_t EndY; - struct ClipData* pCurrentClip; - uint32_t Mode7Mask; - uint32_t Mode7PriorityMask; - uint8_t OBJWidths[128]; - uint8_t OBJVisibleTiles[128]; + uint8_t* Screen_buffer; + uint8_t* SubScreen_buffer; + uint8_t* ZBuffer_buffer; + uint8_t* SubZBuffer_buffer; + uint8_t* Screen; + uint8_t* SubScreen; + uint8_t* ZBuffer; + uint8_t* SubZBuffer; + uint32_t Pitch; + + int32_t Delta; + uint16_t* X2; + uint16_t* ZERO_OR_X2; + uint16_t* ZERO; + uint32_t RealPitch; // True pitch of Screen buffer. + uint32_t Pitch2; // Same as RealPitch except while using speed up hack for Glide. + uint32_t ZPitch; // Pitch of ZBuffer + uint32_t PPL; // Number of pixels on each of Screen buffer + uint32_t PPLx2; + uint32_t PixSize; + uint8_t* S; + uint8_t* DB; + ptrdiff_t DepthDelta; + uint8_t Z1; // Depth for comparison + uint8_t Z2; // Depth to save + uint32_t FixedColour; + uint32_t StartY; + uint32_t EndY; + ClipData* pCurrentClip; + uint32_t Mode7Mask; + uint32_t Mode7PriorityMask; + uint8_t OBJWidths[128]; + uint8_t OBJVisibleTiles[128]; struct { @@ -72,26 +62,29 @@ struct SGFX struct { - int8_t Sprite; + int8_t Sprite; uint8_t Line; } OBJ[32]; } OBJLines [SNES_HEIGHT_EXTENDED]; - uint8_t r212c; - uint8_t r212d; - uint8_t r2130; - uint8_t r2131; - bool Pseudo; -}; + uint8_t r212c; + uint8_t r212d; + uint8_t r2130; + uint8_t r2131; + bool Pseudo; +} SGFX; -struct SLineData +// External port interface which must be implemented or initialised for each port. +extern SGFX GFX; + +typedef struct { struct { uint16_t VOffset; uint16_t HOffset; } BG [4]; -}; +} SLineData; #define H_FLIP 0x4000 #define V_FLIP 0x8000 @@ -105,17 +98,15 @@ typedef struct uint32_t TileAddress; uint32_t NameSelect; uint32_t SCBase; - uint32_t StartPalette; uint32_t PaletteShift; uint32_t PaletteMask; - uint8_t* Buffer; uint8_t* Buffered; bool DirectColourMode; } SBG; -struct SLineMatrixData +typedef struct { int16_t MatrixA; int16_t MatrixB; @@ -123,41 +114,37 @@ struct SLineMatrixData int16_t MatrixD; int16_t CentreX; int16_t CentreY; -}; +} SLineMatrixData; -extern uint32_t odd_high [4][16]; -extern uint32_t odd_low [4][16]; extern uint32_t even_high [4][16]; -extern uint32_t even_low [4][16]; +extern uint32_t even_low [4][16]; +extern uint32_t odd_high [4][16]; +extern uint32_t odd_low [4][16]; extern SBG BG; extern uint16_t DirectColourMaps [8][256]; extern uint8_t 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) +#define SWAP_DWORD(dword) dword = ((((dword) & 0x000000ff) << 24) \ + | (((dword) & 0x0000ff00) << 8) \ + | (((dword) & 0x00ff0000) >> 8) \ + | (((dword) & 0xff000000) >> 24)) #ifdef FAST_LSB_WORD_ACCESS -#define READ_2BYTES(s) (*(uint16_t *) (s)) -#define WRITE_2BYTES(s, d) *(uint16_t *) (s) = (d) +#define READ_2BYTES(s) (*(uint16_t *) (s)) +#define WRITE_2BYTES(s, d) *(uint16_t *) (s) = (d) +#elif defined(MSB_FIRST) +#define READ_2BYTES(s) (*(uint8_t *) (s) | (*((uint8_t *) (s) + 1) << 8)) +#define WRITE_2BYTES(s, d) *(uint8_t *) (s) = (d), *((uint8_t *) (s) + 1) = (d) >> 8 #else -#define READ_2BYTES(s) (*(uint8_t *) (s) | (*((uint8_t *) (s) + 1) << 8)) -#define WRITE_2BYTES(s, d) *(uint8_t *) (s) = (d), \ - *((uint8_t *) (s) + 1) = (d) >> 8 -#endif // i386 +#define READ_2BYTES(s) (*(uint16_t *) (s)) +#define WRITE_2BYTES(s, d) *(uint16_t *) (s) = (d) +#endif #define SUB_SCREEN_DEPTH 0 #define MAIN_SCREEN_DEPTH 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)] -#else -static inline uint16_t COLOR_ADD(uint16_t, uint16_t); - static inline uint16_t COLOR_ADD(uint16_t C1, uint16_t C2) { if (C1 == 0) @@ -165,52 +152,26 @@ static inline uint16_t COLOR_ADD(uint16_t C1, uint16_t 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); + 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 #define COLOR_ADD1_2(C1, C2) \ (((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \ ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \ (((C1) & (C2) & RGB_LOW_BITS_MASK) | ALPHA_BITS_MASK)) -#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] -#elif !defined(NEW_COLOUR_BLENDING) #define COLOR_SUB(C1, C2) \ (GFX.ZERO_OR_X2 [(((C1) | RGB_HI_BITS_MASKx2) - \ ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] + \ -((C1) & RGB_LOW_BITS_MASK) - ((C2) & RGB_LOW_BITS_MASK)) -#else -inline uint16_t COLOR_SUB(uint16_t, uint16_t); - -inline uint16_t COLOR_SUB(uint16_t C1, uint16_t C2) -{ - uint16_t 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 + ((C1) & RGB_LOW_BITS_MASK) - \ + ((C2) & RGB_LOW_BITS_MASK)) #define COLOR_SUB1_2(C1, C2) \ GFX.ZERO [(((C1) | RGB_HI_BITS_MASKx2) - \ - ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] typedef void (*NormalTileRenderer)(uint32_t Tile, int32_t Offset, uint32_t StartLine, uint32_t LineCount); -- cgit v1.2.3