diff options
Diffstat (limited to 'source/ppu.h')
-rw-r--r-- | source/ppu.h | 447 |
1 files changed, 227 insertions, 220 deletions
diff --git a/source/ppu.h b/source/ppu.h index efb892e..c01135f 100644 --- a/source/ppu.h +++ b/source/ppu.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. *******************************************************************************/ @@ -103,220 +103,226 @@ extern uint16 SignExtend [2]; #define MAX_4BIT_TILES 2048 #define MAX_8BIT_TILES 1024 -#define PPU_H_BEAM_IRQ_SOURCE (1 << 0) -#define PPU_V_BEAM_IRQ_SOURCE (1 << 1) -#define GSU_IRQ_SOURCE (1 << 2) -#define SA1_IRQ_SOURCE (1 << 7) -#define SA1_DMA_IRQ_SOURCE (1 << 5) +#define PPU_H_BEAM_IRQ_SOURCE (1 << 0) +#define PPU_V_BEAM_IRQ_SOURCE (1 << 1) +#define GSU_IRQ_SOURCE (1 << 2) +#define SA1_IRQ_SOURCE (1 << 7) +#define SA1_DMA_IRQ_SOURCE (1 << 5) -struct ClipData { - uint32 Count [6]; - uint32 Left [6][6]; - uint32 Right [6][6]; +struct ClipData +{ + uint32 Count [6]; + uint32 Left [6][6]; + uint32 Right [6][6]; }; -typedef struct { - bool8 ColorsChanged; - uint8 HDMA; - bool8 HDMAStarted; - uint8 MaxBrightness; - bool8 LatchedBlanking; - bool8 OBJChanged; - bool8 RenderThisFrame; - bool8 DirectColourMapsNeedRebuild; - uint32 FrameCount; - uint32 RenderedFramesCount; - uint32 DisplayedRenderedFrameCount; - uint32 SkippedFrames; - uint32 FrameSkip; - uint8 *TileCache [3]; - uint8 *TileCached [3]; +typedef struct +{ + bool8 ColorsChanged; + uint8 HDMA; + bool8 HDMAStarted; + uint8 MaxBrightness; + bool8 LatchedBlanking; + bool8 OBJChanged; + bool8 RenderThisFrame; + bool8 DirectColourMapsNeedRebuild; + uint32 FrameCount; + uint32 RenderedFramesCount; + uint32 DisplayedRenderedFrameCount; + uint32 SkippedFrames; + uint32 FrameSkip; + uint8* TileCache [3]; + uint8* TileCached [3]; #ifdef CORRECT_VRAM_READS - uint16 VRAMReadBuffer; + uint16 VRAMReadBuffer; #else - bool8 FirstVRAMRead; + bool8 FirstVRAMRead; #endif - bool8 DoubleHeightPixels; - bool8 Interlace; - bool8 InterlaceSprites; - bool8 DoubleWidthPixels; - bool8 HalfWidthPixels; - int RenderedScreenHeight; - int RenderedScreenWidth; - uint32 Red [256]; - uint32 Green [256]; - uint32 Blue [256]; - uint8 *XB; - uint16 ScreenColors [256]; - int PreviousLine; - int CurrentLine; - int Controller; - uint32 Joypads[5]; - uint32 SuperScope; - uint32 Mouse[2]; - int PrevMouseX[2]; - int PrevMouseY[2]; - struct ClipData Clip [2]; + bool8 DoubleHeightPixels; + bool8 Interlace; + bool8 InterlaceSprites; + bool8 DoubleWidthPixels; + bool8 HalfWidthPixels; + int RenderedScreenHeight; + int RenderedScreenWidth; + uint32 Red [256]; + uint32 Green [256]; + uint32 Blue [256]; + uint8* XB; + uint16 ScreenColors [256]; + int PreviousLine; + int CurrentLine; + int Controller; + uint32 Joypads[5]; + uint32 SuperScope; + uint32 Mouse[2]; + int PrevMouseX[2]; + int PrevMouseY[2]; + struct ClipData Clip [2]; } InternalPPU; struct SOBJ { - short HPos; - uint16 VPos; - uint16 Name; - uint8 VFlip; - uint8 HFlip; - uint8 Priority; - uint8 Palette; - uint8 Size; + short HPos; + uint16 VPos; + uint16 Name; + uint8 VFlip; + uint8 HFlip; + uint8 Priority; + uint8 Palette; + uint8 Size; }; -typedef struct{ - uint8 BGMode; - uint8 BG3Priority; - uint8 Brightness; - - struct { - bool8 High; - uint8 Increment; - uint16 Address; - uint16 Mask1; - uint16 FullGraphicCount; - uint16 Shift; - } VMA; - - struct { - uint16 SCBase; - uint16 VOffset; - uint16 HOffset; - uint8 BGSize; - uint16 NameBase; - uint16 SCSize; - } BG [4]; - - bool8 CGFLIP; - uint16 CGDATA [256]; - uint8 FirstSprite; - uint8 LastSprite; - struct SOBJ OBJ [128]; - uint8 OAMPriorityRotation; - uint16 OAMAddr; - uint8 RangeTimeOver; - - uint8 OAMFlip; - uint16 OAMTileAddress; - uint16 IRQVBeamPos; - uint16 IRQHBeamPos; - uint16 VBeamPosLatched; - uint16 HBeamPosLatched; - - uint8 HBeamFlip; - uint8 VBeamFlip; - uint8 HVBeamCounterLatched; - - short MatrixA; - short MatrixB; - short MatrixC; - short MatrixD; - short CentreX; - short CentreY; - uint8 Joypad1ButtonReadPos; - uint8 Joypad2ButtonReadPos; - - uint8 CGADD; - uint8 FixedColourRed; - uint8 FixedColourGreen; - uint8 FixedColourBlue; - uint16 SavedOAMAddr; - uint16 ScreenHeight; - uint32 WRAM; - uint8 BG_Forced; - bool8 ForcedBlanking; - bool8 OBJThroughMain; - bool8 OBJThroughSub; - uint8 OBJSizeSelect; - uint16 OBJNameBase; - bool8 OBJAddition; - uint8 OAMReadFlip; - uint8 OAMData [512 + 32]; - bool8 VTimerEnabled; - bool8 HTimerEnabled; - short HTimerPosition; - uint8 Mosaic; - bool8 BGMosaic [4]; - bool8 Mode7HFlip; - bool8 Mode7VFlip; - uint8 Mode7Repeat; - uint8 Window1Left; - uint8 Window1Right; - uint8 Window2Left; - uint8 Window2Right; - uint8 ClipCounts [6]; - uint8 ClipWindowOverlapLogic [6]; - uint8 ClipWindow1Enable [6]; - uint8 ClipWindow2Enable [6]; - bool8 ClipWindow1Inside [6]; - bool8 ClipWindow2Inside [6]; - bool8 RecomputeClipWindows; - uint8 CGFLIPRead; - uint16 OBJNameSelect; - bool8 Need16x8Mulitply; - uint8 Joypad3ButtonReadPos; - uint8 MouseSpeed[2]; - - // XXX Do these need to be added to snapshot.cpp? - uint16 OAMWriteRegister; - uint8 BGnxOFSbyte; - uint8 OpenBus1; - uint8 OpenBus2; -}SPPU; +typedef struct +{ + uint8 BGMode; + uint8 BG3Priority; + uint8 Brightness; + + struct + { + bool8 High; + uint8 Increment; + uint16 Address; + uint16 Mask1; + uint16 FullGraphicCount; + uint16 Shift; + } VMA; + + struct + { + uint16 SCBase; + uint16 VOffset; + uint16 HOffset; + uint8 BGSize; + uint16 NameBase; + uint16 SCSize; + } BG [4]; + + bool8 CGFLIP; + uint16 CGDATA [256]; + uint8 FirstSprite; + uint8 LastSprite; + struct SOBJ OBJ [128]; + uint8 OAMPriorityRotation; + uint16 OAMAddr; + uint8 RangeTimeOver; + + uint8 OAMFlip; + uint16 OAMTileAddress; + uint16 IRQVBeamPos; + uint16 IRQHBeamPos; + uint16 VBeamPosLatched; + uint16 HBeamPosLatched; + + uint8 HBeamFlip; + uint8 VBeamFlip; + uint8 HVBeamCounterLatched; + + short MatrixA; + short MatrixB; + short MatrixC; + short MatrixD; + short CentreX; + short CentreY; + uint8 Joypad1ButtonReadPos; + uint8 Joypad2ButtonReadPos; + + uint8 CGADD; + uint8 FixedColourRed; + uint8 FixedColourGreen; + uint8 FixedColourBlue; + uint16 SavedOAMAddr; + uint16 ScreenHeight; + uint32 WRAM; + uint8 BG_Forced; + bool8 ForcedBlanking; + bool8 OBJThroughMain; + bool8 OBJThroughSub; + uint8 OBJSizeSelect; + uint16 OBJNameBase; + bool8 OBJAddition; + uint8 OAMReadFlip; + uint8 OAMData [512 + 32]; + bool8 VTimerEnabled; + bool8 HTimerEnabled; + short HTimerPosition; + uint8 Mosaic; + bool8 BGMosaic [4]; + bool8 Mode7HFlip; + bool8 Mode7VFlip; + uint8 Mode7Repeat; + uint8 Window1Left; + uint8 Window1Right; + uint8 Window2Left; + uint8 Window2Right; + uint8 ClipCounts [6]; + uint8 ClipWindowOverlapLogic [6]; + uint8 ClipWindow1Enable [6]; + uint8 ClipWindow2Enable [6]; + bool8 ClipWindow1Inside [6]; + bool8 ClipWindow2Inside [6]; + bool8 RecomputeClipWindows; + uint8 CGFLIPRead; + uint16 OBJNameSelect; + bool8 Need16x8Mulitply; + uint8 Joypad3ButtonReadPos; + uint8 MouseSpeed[2]; + + // XXX Do these need to be added to snapshot.cpp? + uint16 OAMWriteRegister; + uint8 BGnxOFSbyte; + uint8 OpenBus1; + uint8 OpenBus2; +} SPPU; #define CLIP_OR 0 #define CLIP_AND 1 #define CLIP_XOR 2 #define CLIP_XNOR 3 -typedef struct { - bool8 TransferDirection; - bool8 AAddressFixed; - bool8 AAddressDecrement; - uint8 TransferMode; - - uint8 ABank; - uint16 AAddress; - uint16 Address; - uint8 BAddress; - - // General DMA only: - uint16 TransferBytes; - - // H-DMA only: - bool8 HDMAIndirectAddressing; - uint16 IndirectAddress; - uint8 IndirectBank; - uint8 Repeat; - uint8 LineCount; - uint8 FirstLine; -}SDMA; - -void S9xUpdateScreen (); -void S9xResetPPU (); -void S9xSoftResetPPU (); -void S9xFixColourBrightness (); -void S9xUpdateJoypads (); +typedef struct +{ + bool8 TransferDirection; + bool8 AAddressFixed; + bool8 AAddressDecrement; + uint8 TransferMode; + + uint8 ABank; + uint16 AAddress; + uint16 Address; + uint8 BAddress; + + // General DMA only: + uint16 TransferBytes; + + // H-DMA only: + bool8 HDMAIndirectAddressing; + uint16 IndirectAddress; + uint8 IndirectBank; + uint8 Repeat; + uint8 LineCount; + uint8 FirstLine; +} SDMA; + +void S9xUpdateScreen(); +void S9xResetPPU(); +void S9xSoftResetPPU(); +void S9xFixColourBrightness(); +void S9xUpdateJoypads(); void S9xProcessMouse(int which1); -void S9xSuperFXExec (); +void S9xSuperFXExec(); -void S9xSetPPU (uint8 Byte, uint16 Address); -uint8 S9xGetPPU (uint16 Address); -void S9xSetCPU (uint8 Byte, uint16 Address); -uint8 S9xGetCPU (uint16 Address); +void S9xSetPPU(uint8 Byte, uint16 Address); +uint8 S9xGetPPU(uint16 Address); +void S9xSetCPU(uint8 Byte, uint16 Address); +uint8 S9xGetCPU(uint16 Address); -void S9xInitC4 (); -void S9xSetC4 (uint8 Byte, uint16 Address); -uint8 S9xGetC4 (uint16 Address); -void S9xSetC4RAM (uint8 Byte, uint16 Address); -uint8 S9xGetC4RAM (uint16 Address); +void S9xInitC4(); +void S9xSetC4(uint8 Byte, uint16 Address); +uint8 S9xGetC4(uint16 Address); +void S9xSetC4RAM(uint8 Byte, uint16 Address); +uint8 S9xGetC4RAM(uint16 Address); extern SPPU PPU; extern SDMA DMA [8]; @@ -325,10 +331,11 @@ extern InternalPPU IPPU; #include "gfx.h" #include "memmap.h" -typedef struct{ - uint8 _5C77; - uint8 _5C78; - uint8 _5A22; +typedef struct +{ + uint8 _5C77; + uint8 _5C78; + uint8 _5A22; } SnesModel; extern SnesModel* Model; @@ -340,19 +347,19 @@ extern SnesModel M2SNES; #define MAX_5A22_VERSION 0x02 extern uint8 REGISTER_4212(); -extern void FLUSH_REDRAW (); -extern void REGISTER_2104 (uint8 byte); -extern void REGISTER_2118 (uint8 Byte); -extern void REGISTER_2118_tile (uint8 Byte); -extern void REGISTER_2118_linear (uint8 Byte); -extern void REGISTER_2119 (uint8 Byte); -extern void REGISTER_2119_tile (uint8 Byte); -extern void REGISTER_2119_linear (uint8 Byte); +extern void FLUSH_REDRAW(); +extern void REGISTER_2104(uint8 byte); +extern void REGISTER_2118(uint8 Byte); +extern void REGISTER_2118_tile(uint8 Byte); +extern void REGISTER_2118_linear(uint8 Byte); +extern void REGISTER_2119(uint8 Byte); +extern void REGISTER_2119_tile(uint8 Byte); +extern void REGISTER_2119_linear(uint8 Byte); extern void REGISTER_2122(uint8 Byte); extern void REGISTER_2180(uint8 Byte); //Platform specific input functions used by PPU.CPP -void JustifierButtons(uint32 *); +void JustifierButtons(uint32*); bool JustifierOffscreen(); #endif |