diff options
Diffstat (limited to 'src/ppu.h')
-rw-r--r-- | src/ppu.h | 916 |
1 files changed, 464 insertions, 452 deletions
@@ -4,7 +4,7 @@ * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and * Jerremy Koot (jkoot@snes9x.com) * - * Super FX C emulator code + * Super FX C emulator code * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and * Gary Henderson. * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. @@ -56,211 +56,216 @@ 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) - -typedef struct { - uint32 Count [6]; - uint32 Left [6][6]; - uint32 Right [6][6]; -}ClipData; - -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]; - bool8 FirstVRAMRead; - bool8 LatchedInterlace; - bool8 DoubleWidthPixels; - int RenderedScreenHeight; - int RenderedScreenWidth; - uint32 Red [256]; - uint32 Green [256]; - uint32 Blue [256]; - uint8 *XB; - uint32 ScreenColors [256]; - int PreviousLine; - int CurrentLine; - int Controller; - uint32 Joypads[5]; - uint32 SuperScope; - uint32 Mouse[2]; - int PrevMouseX[2]; - int PrevMouseY[2]; - ClipData Clip [2]; -}InternalPPU; +#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) typedef struct { - short HPos; - uint16 VPos; - uint16 Name; - uint8 VFlip; - uint8 HFlip; - uint8 Priority; - uint8 Palette; - uint8 Size; -}SOBJ; + uint32 Count [6]; + uint32 Left [6][6]; + uint32 Right [6][6]; +} ClipData; 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; - bool8 OffsetsChanged; //-chg - } BG [4]; - - bool8 CGFLIP; - uint16 CGDATA [256]; - uint8 FirstSprite; - uint8 LastSprite; - SOBJ OBJ [128]; - uint8 OAMPriorityRotation; - uint16 OAMAddr; - - 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]; - uint16 SavedOAMAddr2; - uint16 OAMWriteRegister; - uint8 BGnxOFSbyte; -}SPPU; + 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]; + bool8 FirstVRAMRead; + bool8 LatchedInterlace; + bool8 DoubleWidthPixels; + int RenderedScreenHeight; + int RenderedScreenWidth; + uint32 Red [256]; + uint32 Green [256]; + uint32 Blue [256]; + uint8* XB; + uint32 ScreenColors [256]; + int PreviousLine; + int CurrentLine; + int Controller; + uint32 Joypads[5]; + uint32 SuperScope; + uint32 Mouse[2]; + int PrevMouseX[2]; + int PrevMouseY[2]; + ClipData Clip [2]; +} InternalPPU; + +typedef struct +{ + short HPos; + uint16 VPos; + uint16 Name; + uint8 VFlip; + uint8 HFlip; + uint8 Priority; + uint8 Palette; + uint8 Size; +} SOBJ; + +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; + bool8 OffsetsChanged; //-chg + } BG [4]; + + bool8 CGFLIP; + uint16 CGDATA [256]; + uint8 FirstSprite; + uint8 LastSprite; + SOBJ OBJ [128]; + uint8 OAMPriorityRotation; + uint16 OAMAddr; + + 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]; + uint16 SavedOAMAddr2; + uint16 OAMWriteRegister; + uint8 BGnxOFSbyte; +} 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; +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; START_EXTERN_C //void S9xUpdateScreen (); -void S9xResetPPU (); -void S9xFixColourBrightness (); -void S9xUpdateJoypads (); +void S9xResetPPU(); +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]; @@ -272,230 +277,232 @@ END_EXTERN_C STATIC INLINE uint8 REGISTER_4212() { - GetBank = 0; - if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE && - CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE + 3) - GetBank = 1; + GetBank = 0; + if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE && + CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE + 3) + GetBank = 1; - GetBank |= CPU.Cycles >= Settings.HBlankStart ? 0x40 : 0; - if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) - GetBank |= 0x80; /* XXX: 0x80 or 0xc0 ? */ + GetBank |= CPU.Cycles >= Settings.HBlankStart ? 0x40 : 0; + if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) + GetBank |= 0x80; /* XXX: 0x80 or 0xc0 ? */ - return (GetBank); + return (GetBank); } /* STATIC INLINE void FLUSH_REDRAW () { if (IPPU.PreviousLine != IPPU.CurrentLine) - S9xUpdateScreen (); + S9xUpdateScreen (); } */ #define FLUSH_REDRAW() if (IPPU.PreviousLine != IPPU.CurrentLine) S9xUpdateScreen () -STATIC INLINE void REGISTER_2104 (uint8 byte) +STATIC INLINE void REGISTER_2104(uint8 byte) { - if (PPU.OAMAddr & 0x100) - { - int addr = ((PPU.OAMAddr & 0x10f) << 1) + (PPU.OAMFlip & 1); - if (byte != PPU.OAMData [addr]){ -#ifdef __DEBUG__ - printf("SetPPU_2104, PPU.OAMData. Byte : %x\n", byte); + if (PPU.OAMAddr & 0x100) + { + int addr = ((PPU.OAMAddr & 0x10f) << 1) + (PPU.OAMFlip & 1); + if (byte != PPU.OAMData [addr]) + { +#ifdef __DEBUG__ + printf("SetPPU_2104, PPU.OAMData. Byte : %x\n", byte); #endif - FLUSH_REDRAW (); - PPU.OAMData [addr] = byte; - IPPU.OBJChanged = TRUE; - - // X position high bit, and sprite size (x4) - SOBJ *pObj = &PPU.OBJ [(addr & 0x1f) * 4]; - - pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 0) & 1]; - pObj++->Size = byte & 2; - pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 2) & 1]; - pObj++->Size = byte & 8; - pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 4) & 1]; - pObj++->Size = byte & 32; - pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 6) & 1]; - pObj->Size = byte & 128; - } - PPU.OAMFlip ^= 1; - if(!(PPU.OAMFlip & 1)){ - ++PPU.OAMAddr; - PPU.OAMAddr &= 0x1ff; - } - } else if(!(PPU.OAMFlip & 1)){ - PPU.OAMWriteRegister &= 0xff00; - PPU.OAMWriteRegister |= byte; - PPU.OAMFlip |= 1; - } else { - PPU.OAMWriteRegister &= 0x00ff; - uint8 lowbyte = (uint8)(PPU.OAMWriteRegister); - uint8 highbyte = byte; - PPU.OAMWriteRegister |= byte << 8; - - int addr = (PPU.OAMAddr << 1); - - if (lowbyte != PPU.OAMData [addr] || - highbyte != PPU.OAMData [addr+1]) - { - FLUSH_REDRAW (); -#ifdef __DEBUG__ - printf("SetPPU_2104, PPU.OAMData. Byte : %x\n", byte); + FLUSH_REDRAW(); + PPU.OAMData [addr] = byte; + IPPU.OBJChanged = TRUE; + + // X position high bit, and sprite size (x4) + SOBJ* pObj = &PPU.OBJ [(addr & 0x1f) * 4]; + + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 0) & 1]; + pObj++->Size = byte & 2; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 2) & 1]; + pObj++->Size = byte & 8; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 4) & 1]; + pObj++->Size = byte & 32; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 6) & 1]; + pObj->Size = byte & 128; + } + PPU.OAMFlip ^= 1; + if (!(PPU.OAMFlip & 1)) + { + ++PPU.OAMAddr; + PPU.OAMAddr &= 0x1ff; + } + } + else if (!(PPU.OAMFlip & 1)) + { + PPU.OAMWriteRegister &= 0xff00; + PPU.OAMWriteRegister |= byte; + PPU.OAMFlip |= 1; + } + else + { + PPU.OAMWriteRegister &= 0x00ff; + uint8 lowbyte = (uint8)(PPU.OAMWriteRegister); + uint8 highbyte = byte; + PPU.OAMWriteRegister |= byte << 8; + + int addr = (PPU.OAMAddr << 1); + + if (lowbyte != PPU.OAMData [addr] || + highbyte != PPU.OAMData [addr + 1]) + { + FLUSH_REDRAW(); +#ifdef __DEBUG__ + printf("SetPPU_2104, PPU.OAMData. Byte : %x\n", byte); #endif - PPU.OAMData [addr] = lowbyte; - PPU.OAMData [addr+1] = highbyte; - IPPU.OBJChanged = TRUE; - if (addr & 2) - { - // Tile - PPU.OBJ[addr = PPU.OAMAddr >> 1].Name = PPU.OAMWriteRegister & 0x1ff; - - // priority, h and v flip. - PPU.OBJ[addr].Palette = (highbyte >> 1) & 7; - PPU.OBJ[addr].Priority = (highbyte >> 4) & 3; - PPU.OBJ[addr].HFlip = (highbyte >> 6) & 1; - PPU.OBJ[addr].VFlip = (highbyte >> 7) & 1; - } - else - { - // X position (low) - PPU.OBJ[addr = PPU.OAMAddr >> 1].HPos &= 0xFF00; - PPU.OBJ[addr].HPos |= lowbyte; - - // Sprite Y position - PPU.OBJ[addr].VPos = highbyte; - } - } - PPU.OAMFlip &= ~1; - ++PPU.OAMAddr; - } - - Memory.FillRAM [0x2104] = byte; + PPU.OAMData [addr] = lowbyte; + PPU.OAMData [addr + 1] = highbyte; + IPPU.OBJChanged = TRUE; + if (addr & 2) + { + // Tile + PPU.OBJ[addr = PPU.OAMAddr >> 1].Name = PPU.OAMWriteRegister & 0x1ff; + + // priority, h and v flip. + PPU.OBJ[addr].Palette = (highbyte >> 1) & 7; + PPU.OBJ[addr].Priority = (highbyte >> 4) & 3; + PPU.OBJ[addr].HFlip = (highbyte >> 6) & 1; + PPU.OBJ[addr].VFlip = (highbyte >> 7) & 1; + } + else + { + // X position (low) + PPU.OBJ[addr = PPU.OAMAddr >> 1].HPos &= 0xFF00; + PPU.OBJ[addr].HPos |= lowbyte; + + // Sprite Y position + PPU.OBJ[addr].VPos = highbyte; + } + } + PPU.OAMFlip &= ~1; + ++PPU.OAMAddr; + } + + Memory.FillRAM [0x2104] = byte; } -STATIC INLINE void REGISTER_2118 (uint8 Byte) +STATIC INLINE void REGISTER_2118(uint8 Byte) { - uint32 address; - if (PPU.VMA.FullGraphicCount) - { - uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; - address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; - Memory.VRAM [address] = Byte; - } - else - { - Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xFFFF] = Byte; - } - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (!PPU.VMA.High) - { + uint32 address; + if (PPU.VMA.FullGraphicCount) + { + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; + Memory.VRAM [address] = Byte; + } + else + Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xFFFF] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (!PPU.VMA.High) + { #ifdef DEBUGGER - if (Settings.TraceVRAM && !CPU.InDMA) - { - printf ("VRAM write byte: $%04X (%d,%d)\n", PPU.VMA.Address, - Memory.FillRAM[0x2115] & 3, - (Memory.FillRAM [0x2115] & 0x0c) >> 2); - } -#endif - PPU.VMA.Address += PPU.VMA.Increment; - } -// Memory.FillRAM [0x2118] = Byte; + if (Settings.TraceVRAM && !CPU.InDMA) + { + printf("VRAM write byte: $%04X (%d,%d)\n", PPU.VMA.Address, + Memory.FillRAM[0x2115] & 3, + (Memory.FillRAM [0x2115] & 0x0c) >> 2); + } +#endif + PPU.VMA.Address += PPU.VMA.Increment; + } + // Memory.FillRAM [0x2118] = Byte; } -STATIC INLINE void REGISTER_2118_tile (uint8 Byte) +STATIC INLINE void REGISTER_2118_tile(uint8 Byte) { - uint32 address; - uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; - address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; - Memory.VRAM [address] = Byte; - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (!PPU.VMA.High) - PPU.VMA.Address += PPU.VMA.Increment; -// Memory.FillRAM [0x2118] = Byte; + uint32 address; + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; + Memory.VRAM [address] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (!PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; + // Memory.FillRAM [0x2118] = Byte; } -STATIC INLINE void REGISTER_2118_linear (uint8 Byte) +STATIC INLINE void REGISTER_2118_linear(uint8 Byte) { - uint32 address; - Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xFFFF] = Byte; - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (!PPU.VMA.High) - PPU.VMA.Address += PPU.VMA.Increment; -// Memory.FillRAM [0x2118] = Byte; + uint32 address; + Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xFFFF] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (!PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; + // Memory.FillRAM [0x2118] = Byte; } -STATIC INLINE void REGISTER_2119 (uint8 Byte) +STATIC INLINE void REGISTER_2119(uint8 Byte) { - uint32 address; - if (PPU.VMA.FullGraphicCount) - { - uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; - address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; - Memory.VRAM [address] = Byte; - } - else - { - Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF] = Byte; - } - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (PPU.VMA.High) - { + uint32 address; + if (PPU.VMA.FullGraphicCount) + { + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; + Memory.VRAM [address] = Byte; + } + else + Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (PPU.VMA.High) + { #ifdef DEBUGGER - if (Settings.TraceVRAM && !CPU.InDMA) - { - printf ("VRAM write word: $%04X (%d,%d)\n", PPU.VMA.Address, - Memory.FillRAM[0x2115] & 3, - (Memory.FillRAM [0x2115] & 0x0c) >> 2); - } -#endif - PPU.VMA.Address += PPU.VMA.Increment; - } -// Memory.FillRAM [0x2119] = Byte; + if (Settings.TraceVRAM && !CPU.InDMA) + { + printf("VRAM write word: $%04X (%d,%d)\n", PPU.VMA.Address, + Memory.FillRAM[0x2115] & 3, + (Memory.FillRAM [0x2115] & 0x0c) >> 2); + } +#endif + PPU.VMA.Address += PPU.VMA.Increment; + } + // Memory.FillRAM [0x2119] = Byte; } -STATIC INLINE void REGISTER_2119_tile (uint8 Byte) +STATIC INLINE void REGISTER_2119_tile(uint8 Byte) { - uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; - uint32 address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; - Memory.VRAM [address] = Byte; - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (PPU.VMA.High) - PPU.VMA.Address += PPU.VMA.Increment; -// Memory.FillRAM [0x2119] = Byte; + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + uint32 address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; + Memory.VRAM [address] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; + // Memory.FillRAM [0x2119] = Byte; } -STATIC INLINE void REGISTER_2119_linear (uint8 Byte) +STATIC INLINE void REGISTER_2119_linear(uint8 Byte) { - uint32 address; - Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF] = Byte; - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (PPU.VMA.High) - PPU.VMA.Address += PPU.VMA.Increment; -// Memory.FillRAM [0x2119] = Byte; + uint32 address; + Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; + // Memory.FillRAM [0x2119] = Byte; } #ifdef __OLD_RASTER_FX__ @@ -504,103 +511,108 @@ STATIC INLINE void REGISTER_2122_delayedRasterFx(uint8 Byte) STATIC INLINE void REGISTER_2122(uint8 Byte) #endif { - // CG-RAM (palette) write + // CG-RAM (palette) write - if (PPU.CGFLIP) - { - if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) - { - PPU.CGDATA[PPU.CGADD] &= 0x00FF; - PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8; - if (!(Settings.os9x_hack&PPU_IGNORE_PALWRITE)){ -#ifdef __DEBUG__ - printf("SetPPU_2122, CG-RAM (palette) write. PPU.CFGFLIP. Byte : %x\n", Byte); + if (PPU.CGFLIP) + { + if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) + { + PPU.CGDATA[PPU.CGADD] &= 0x00FF; + PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8; + if (!(Settings.os9x_hack & PPU_IGNORE_PALWRITE)) + { +#ifdef __DEBUG__ + printf("SetPPU_2122, CG-RAM (palette) write. PPU.CFGFLIP. Byte : %x\n", Byte); #endif - ADD_ROP(ROP_PALETTE, PPU.CGADD | (PPU.CGDATA[PPU.CGADD] << 16)); - } - } - PPU.CGADD++; - } - else - { - if (Byte != (uint8) (PPU.CGDATA[PPU.CGADD] & 0xff)) - { - PPU.CGDATA[PPU.CGADD] &= 0x7F00; - PPU.CGDATA[PPU.CGADD] |= Byte; - if (!(Settings.os9x_hack&PPU_IGNORE_PALWRITE)){ -#ifdef __DEBUG__ - printf("SetPPU_2122, CG-RAM (palette) write. !PPU.CFGFLIP. Byte : %x\n", Byte); + ADD_ROP(ROP_PALETTE, PPU.CGADD | (PPU.CGDATA[PPU.CGADD] << 16)); + } + } + PPU.CGADD++; + } + else + { + if (Byte != (uint8)(PPU.CGDATA[PPU.CGADD] & 0xff)) + { + PPU.CGDATA[PPU.CGADD] &= 0x7F00; + PPU.CGDATA[PPU.CGADD] |= Byte; + if (!(Settings.os9x_hack & PPU_IGNORE_PALWRITE)) + { +#ifdef __DEBUG__ + printf("SetPPU_2122, CG-RAM (palette) write. !PPU.CFGFLIP. Byte : %x\n", Byte); #endif - ADD_ROP(ROP_PALETTE, PPU.CGADD | (PPU.CGDATA[PPU.CGADD] << 16)); - } - } - } - PPU.CGFLIP ^= 1; -// Memory.FillRAM [0x2122] = Byte; + ADD_ROP(ROP_PALETTE, PPU.CGADD | (PPU.CGDATA[PPU.CGADD] << 16)); + } + } + } + PPU.CGFLIP ^= 1; + // Memory.FillRAM [0x2122] = Byte; } #ifdef __OLD_RASTER_FX__ STATIC INLINE void REGISTER_2122_normalRasterFx(uint8 Byte) { - // CG-RAM (palette) write + // CG-RAM (palette) write - if (PPU.CGFLIP) - { - if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) - { - if (!(Settings.os9x_hack&PPU_IGNORE_PALWRITE)){ -#ifdef __DEBUG__ - printf("SetPPU_2122, CG-RAM (palette) write. PPU.CFGFLIP. Byte : %x\n", Byte); + if (PPU.CGFLIP) + { + if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) + { + if (!(Settings.os9x_hack & PPU_IGNORE_PALWRITE)) + { +#ifdef __DEBUG__ + printf("SetPPU_2122, CG-RAM (palette) write. PPU.CFGFLIP. Byte : %x\n", Byte); #endif - FLUSH_REDRAW (); - } - PPU.CGDATA[PPU.CGADD] &= 0x00FF; - PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8; - IPPU.ColorsChanged = TRUE; - IPPU.Blue [PPU.CGADD] = (Byte >> 2) & 0x1f; - IPPU.Green [PPU.CGADD] = (PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f; - IPPU.ScreenColors [PPU.CGADD] = (uint16) BUILD_PIXEL (IPPU.XB[IPPU.Red[PPU.CGADD]], - IPPU.XB[IPPU.Green[PPU.CGADD]], - IPPU.XB[IPPU.Blue [PPU.CGADD]]); - } - PPU.CGADD++; - } - else - { - if (Byte != (uint8) (PPU.CGDATA[PPU.CGADD] & 0xff)) - { - if (!(Settings.os9x_hack&PPU_IGNORE_PALWRITE)){ -#ifdef __DEBUG__ - printf("SetPPU_2122, CG-RAM (palette) write. !PPU.CFGFLIP. Byte : %x\n", Byte); + FLUSH_REDRAW(); + } + PPU.CGDATA[PPU.CGADD] &= 0x00FF; + PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8; + IPPU.ColorsChanged = TRUE; + IPPU.Blue [PPU.CGADD] = (Byte >> 2) & 0x1f; + IPPU.Green [PPU.CGADD] = (PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f; + IPPU.ScreenColors [PPU.CGADD] = (uint16) BUILD_PIXEL(IPPU.XB[IPPU.Red[PPU.CGADD]], + IPPU.XB[IPPU.Green[PPU.CGADD]], + IPPU.XB[IPPU.Blue [PPU.CGADD]]); + } + PPU.CGADD++; + } + else + { + if (Byte != (uint8)(PPU.CGDATA[PPU.CGADD] & 0xff)) + { + if (!(Settings.os9x_hack & PPU_IGNORE_PALWRITE)) + { +#ifdef __DEBUG__ + printf("SetPPU_2122, CG-RAM (palette) write. !PPU.CFGFLIP. Byte : %x\n", Byte); #endif - FLUSH_REDRAW (); - } - - PPU.CGDATA[PPU.CGADD] &= 0x7F00; - PPU.CGDATA[PPU.CGADD] |= Byte; - IPPU.ColorsChanged = TRUE; - IPPU.Red [PPU.CGADD] = Byte & 0x1f; - IPPU.Green [PPU.CGADD] = (PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f; - IPPU.ScreenColors [PPU.CGADD] = (uint16) BUILD_PIXEL (IPPU.XB[IPPU.Red[PPU.CGADD]], - IPPU.XB[IPPU.Green[PPU.CGADD]], - IPPU.XB[IPPU.Blue [PPU.CGADD]]); - } - } - PPU.CGFLIP ^= 1; -// Memory.FillRAM [0x2122] = Byte; + FLUSH_REDRAW(); + } + + PPU.CGDATA[PPU.CGADD] &= 0x7F00; + PPU.CGDATA[PPU.CGADD] |= Byte; + IPPU.ColorsChanged = TRUE; + IPPU.Red [PPU.CGADD] = Byte & 0x1f; + IPPU.Green [PPU.CGADD] = (PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f; + IPPU.ScreenColors [PPU.CGADD] = (uint16) BUILD_PIXEL(IPPU.XB[IPPU.Red[PPU.CGADD]], + IPPU.XB[IPPU.Green[PPU.CGADD]], + IPPU.XB[IPPU.Blue [PPU.CGADD]]); + } + } + PPU.CGFLIP ^= 1; + // Memory.FillRAM [0x2122] = Byte; } -STATIC INLINE void REGISTER_2122(uint8 Byte) { - if (snesMenuOptions.delayedRasterFX) REGISTER_2122_delayedRasterFx(Byte); - else REGISTER_2122_normalRasterFx(Byte); +STATIC INLINE void REGISTER_2122(uint8 Byte) +{ + if (snesMenuOptions.delayedRasterFX) REGISTER_2122_delayedRasterFx(Byte); + else REGISTER_2122_normalRasterFx(Byte); } #endif STATIC INLINE void REGISTER_2180(uint8 Byte) { - Memory.RAM[PPU.WRAM++] = Byte; - PPU.WRAM &= 0x1FFFF; - Memory.FillRAM [0x2180] = Byte; + Memory.RAM[PPU.WRAM++] = Byte; + PPU.WRAM &= 0x1FFFF; + Memory.FillRAM [0x2180] = Byte; } #endif |