From e3dbf33f0a4c7e4256772b7c5da7e909e5424819 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 25 Dec 2017 06:42:01 +0100 Subject: Turn getset into C file --- source/getset.c | 418 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ source/getset.h | 424 -------------------------------------------------------- source/memmap.c | 2 - source/ppu.h | 2 + 4 files changed, 420 insertions(+), 426 deletions(-) create mode 100644 source/getset.c delete mode 100644 source/getset.h (limited to 'source') diff --git a/source/getset.c b/source/getset.c new file mode 100644 index 0000000..eefc5b5 --- /dev/null +++ b/source/getset.c @@ -0,0 +1,418 @@ +#include "../copyright" + +#include "ppu.h" +#include "dsp1.h" +#include "cpuexec.h" +#include "sa1.h" +#include "spc7110.h" +#include "obc1.h" +#include "seta.h" + +extern uint8_t OpenBus; + +uint8_t S9xGetByte(uint32_t Address) +{ + int32_t block; + uint8_t* GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + + if ((intptr_t) GetAddress != MAP_CPU || !CPU.InDMA) + CPU.Cycles += Memory.MemorySpeed [block]; + + if (GetAddress >= (uint8_t*) MAP_LAST) + { + if (Memory.BlockIsRAM [block]) + CPU.WaitAddress = CPU.PCAtOpcodeStart; + return GetAddress[Address & 0xffff]; + } + + switch ((intptr_t) GetAddress) + { + case MAP_PPU: + return S9xGetPPU(Address & 0xffff); + case MAP_CPU: + return S9xGetCPU(Address & 0xffff); + case MAP_DSP: + return S9xGetDSP(Address & 0xffff); + case MAP_SA1RAM: + case MAP_LOROM_SRAM: + /*Address & 0x7FFF - offset into bank + *Address & 0xFF0000 - bank + *bank >> 1 | offset = s-ram address, unbound + *unbound & SRAMMask = Sram offset */ + return Memory.SRAM[(((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) &Memory.SRAMMask]; + case MAP_RONLY_SRAM: + case MAP_HIROM_SRAM: + return Memory.SRAM[((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask]; + case MAP_BWRAM: + return Memory.BWRAM[(Address & 0x7fff) - 0x6000]; + case MAP_C4: + return S9xGetC4(Address & 0xffff); + case MAP_SPC7110_ROM: + return S9xGetSPC7110Byte(Address); + case MAP_SPC7110_DRAM: + return S9xGetSPC7110(0x4800); + case MAP_OBC_RAM: + return GetOBC1(Address & 0xffff); + case MAP_SETA_DSP: + return S9xGetSetaDSP(Address); + case MAP_SETA_RISC: + return S9xGetST018(Address); + default: + return OpenBus; + } +} + +uint16_t S9xGetWord(uint32_t Address) +{ + int32_t block; + uint8_t* GetAddress; + if ((Address & 0x0fff) == 0x0fff) + { + OpenBus = S9xGetByte(Address); + return OpenBus | (S9xGetByte(Address + 1) << 8); + } + + GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + + if ((intptr_t) GetAddress != MAP_CPU || !CPU.InDMA) + CPU.Cycles += (Memory.MemorySpeed [block] << 1); + + if (GetAddress >= (uint8_t*) MAP_LAST) + { + if (Memory.BlockIsRAM [block]) + CPU.WaitAddress = CPU.PCAtOpcodeStart; +#ifdef FAST_LSB_WORD_ACCESS + return *(uint16_t*) (GetAddress + (Address & 0xffff)); +#else + return *(GetAddress + (Address & 0xffff)) | (*(GetAddress + (Address & 0xffff) + 1) << 8); +#endif + } + + switch ((intptr_t) GetAddress) + { + case MAP_PPU: + return S9xGetPPU(Address & 0xffff) | (S9xGetPPU((Address + 1) & 0xffff) << 8); + case MAP_CPU: + return S9xGetCPU(Address & 0xffff) | (S9xGetCPU((Address + 1) & 0xffff) << 8); + case MAP_DSP: + return S9xGetDSP(Address & 0xffff) | (S9xGetDSP((Address + 1) & 0xffff) << 8); + case MAP_SA1RAM: + case MAP_LOROM_SRAM: + /*Address & 0x7FFF - offset into bank + *Address & 0xFF0000 - bank + *bank >> 1 | offset = s-ram address, unbound + *unbound & SRAMMask = Sram offset */ + /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff + * then the high byte doesn't follow the low byte. */ + return *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask)) | ((*(Memory.SRAM + (((((Address + 1) & 0xFF0000) >> 1) | ((Address + 1) & 0x7FFF)) & Memory.SRAMMask))) << 8); + case MAP_RONLY_SRAM: + case MAP_HIROM_SRAM: + /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff + * then the high byte doesn't follow the low byte. */ + return *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) | (*(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask)) << 8); + case MAP_BWRAM: +#ifdef FAST_LSB_WORD_ACCESS + return *(uint16_t*) (Memory.BWRAM + ((Address & 0x7fff) - 0x6000)); +#else + return *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) | (*(Memory.BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) << 8); +#endif + case MAP_C4: + return S9xGetC4(Address & 0xffff) | (S9xGetC4((Address + 1) & 0xffff) << 8); + case MAP_SPC7110_ROM: + return S9xGetSPC7110Byte(Address) | (S9xGetSPC7110Byte(Address + 1)) << 8; + case MAP_SPC7110_DRAM: + return S9xGetSPC7110(0x4800) | (S9xGetSPC7110(0x4800) << 8); + case MAP_OBC_RAM: + return GetOBC1(Address & 0xFFFF) | (GetOBC1((Address + 1) & 0xFFFF) << 8); + case MAP_SETA_DSP: + return S9xGetSetaDSP(Address) | (S9xGetSetaDSP((Address + 1)) << 8); + case MAP_SETA_RISC: + return S9xGetST018(Address) | (S9xGetST018((Address + 1)) << 8); + default: + return OpenBus | (OpenBus << 8); + } +} + +void S9xSetByte(uint8_t Byte, uint32_t Address) +{ + int32_t block; + uint8_t* SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)]; + CPU.WaitAddress = NULL; + + if ((intptr_t) SetAddress != MAP_CPU || !CPU.InDMA) + CPU.Cycles += Memory.MemorySpeed [block]; + + if (SetAddress >= (uint8_t*) MAP_LAST) + { + SetAddress += Address & 0xffff; + if (SetAddress == SA1.WaitByteAddress1 || SetAddress == SA1.WaitByteAddress2) + { + SA1.Executing = SA1.S9xOpcodes != NULL; + SA1.WaitCounter = 0; + } + *SetAddress = Byte; + return; + } + + switch ((intptr_t) SetAddress) + { + case MAP_PPU: + S9xSetPPU(Byte, Address & 0xffff); + return; + case MAP_CPU: + S9xSetCPU(Byte, Address & 0xffff); + return; + case MAP_DSP: + S9xSetDSP(Byte, Address & 0xffff); + return; + case MAP_LOROM_SRAM: + if (Memory.SRAMMask) + { + *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask)) = Byte; + CPU.SRAMModified = true; + } + return; + case MAP_HIROM_SRAM: + if (Memory.SRAMMask) + { + *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = Byte; + CPU.SRAMModified = true; + } + return; + case MAP_BWRAM: + *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = Byte; + CPU.SRAMModified = true; + return; + case MAP_SA1RAM: + *(Memory.SRAM + (Address & 0xffff)) = Byte; + SA1.Executing = !SA1.Waiting; + break; + case MAP_C4: + S9xSetC4(Byte, Address & 0xffff); + return; + case MAP_OBC_RAM: + SetOBC1(Byte, Address & 0xFFFF); + return; + case MAP_SETA_DSP: + S9xSetSetaDSP(Byte, Address); + return; + case MAP_SETA_RISC: + S9xSetST018(Byte, Address); + return; + default: + return; + } +} + +void S9xSetWord(uint16_t Word, uint32_t Address) +{ + int32_t block; + uint8_t* SetAddress; + + if ((Address & 0x0FFF) == 0x0FFF) + { + S9xSetByte(Word & 0x00FF, Address); + S9xSetByte(Word >> 8, Address + 1); + return; + } + + CPU.WaitAddress = NULL; + SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)]; + + if ((intptr_t) SetAddress != MAP_CPU || !CPU.InDMA) + CPU.Cycles += Memory.MemorySpeed [block] << 1; + + if (SetAddress >= (uint8_t*) MAP_LAST) + { + SetAddress += Address & 0xffff; + if (SetAddress == SA1.WaitByteAddress1 || SetAddress == SA1.WaitByteAddress2) + { + SA1.Executing = SA1.S9xOpcodes != NULL; + SA1.WaitCounter = 0; + } +#ifdef FAST_LSB_WORD_ACCESS + *(uint16_t*)SetAddress = Word; +#else + *SetAddress = (uint8_t) Word; + *(SetAddress + 1) = Word >> 8; +#endif + return; + } + + switch ((intptr_t) SetAddress) + { + case MAP_PPU: + S9xSetPPU((uint8_t) Word, Address & 0xffff); + S9xSetPPU(Word >> 8, (Address & 0xffff) + 1); + return; + case MAP_CPU: + S9xSetCPU((uint8_t) Word, Address & 0xffff); + S9xSetCPU(Word >> 8, (Address & 0xffff) + 1); + return; + case MAP_DSP: + S9xSetDSP((uint8_t) Word, Address & 0xffff); + S9xSetDSP(Word >> 8, (Address & 0xffff) + 1); + return; + case MAP_LOROM_SRAM: + if (Memory.SRAMMask) + { + /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff + * then the high byte doesn't follow the low byte. */ + *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask)) = (uint8_t) Word; + *(Memory.SRAM + (((((Address + 1) & 0xFF0000) >> 1) | ((Address + 1) & 0x7FFF))& Memory.SRAMMask)) = Word >> 8; + CPU.SRAMModified = true; + } + return; + case MAP_HIROM_SRAM: + if (Memory.SRAMMask) + { + /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff + * then the high byte doesn't follow the low byte. */ + *(Memory.SRAM + (((((Address & 0x7fff) - 0x6000) + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask))) = (uint8_t) Word; + *(Memory.SRAM + ((((((Address + 1) & 0x7fff) - 0x6000) + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask))) = (uint8_t)(Word >> 8); + CPU.SRAMModified = true; + } + return; + case MAP_BWRAM: +#ifdef FAST_LSB_WORD_ACCESS + *(uint16_t*)(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = Word; +#else + *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = (uint8_t) Word; + *(Memory.BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) = (uint8_t) (Word >> 8); +#endif + CPU.SRAMModified = true; + return; + case MAP_SA1RAM: + *(Memory.SRAM + (Address & 0xffff)) = (uint8_t) Word; + *(Memory.SRAM + ((Address + 1) & 0xffff)) = (uint8_t)(Word >> 8); + SA1.Executing = !SA1.Waiting; + break; + case MAP_C4: + S9xSetC4(Word & 0xff, Address & 0xffff); + S9xSetC4((uint8_t)(Word >> 8), (Address + 1) & 0xffff); + return; + case MAP_OBC_RAM: + SetOBC1(Word & 0xff, Address & 0xFFFF); + SetOBC1((uint8_t)(Word >> 8), (Address + 1) & 0xffff); + return; + case MAP_SETA_DSP: + S9xSetSetaDSP(Word & 0xff, Address); + S9xSetSetaDSP((uint8_t)(Word >> 8), (Address + 1)); + return; + case MAP_SETA_RISC: + S9xSetST018(Word & 0xff, Address); + S9xSetST018((uint8_t)(Word >> 8), (Address + 1)); + return; + default: + return; + } +} + +uint8_t* GetBasePointer(uint32_t Address) +{ + uint8_t* GetAddress = Memory.Map [(Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + if (GetAddress >= (uint8_t*) MAP_LAST) + return GetAddress; + if (Settings.SPC7110 && ((Address & 0x7FFFFF) == 0x4800)) + return s7r.bank50; + switch ((intptr_t) GetAddress) + { + case MAP_SPC7110_DRAM: + return s7r.bank50; + case MAP_SPC7110_ROM: + return Get7110BasePtr(Address); + case MAP_PPU: /*just a guess, but it looks like this should match the CPU as a source. */ + case MAP_CPU: /*fixes Ogre Battle's green lines */ + case MAP_OBC_RAM: + return Memory.FillRAM; + case MAP_DSP: + return Memory.FillRAM - 0x6000; + case MAP_SA1RAM: + case MAP_LOROM_SRAM: + case MAP_SETA_DSP: + return Memory.SRAM; + case MAP_BWRAM: + return Memory.BWRAM - 0x6000; + case MAP_HIROM_SRAM: + return Memory.SRAM - 0x6000; + case MAP_C4: + return Memory.C4RAM - 0x6000; + default: + return NULL; + } +} + +uint8_t* S9xGetMemPointer(uint32_t Address) +{ + uint8_t* GetAddress = Memory.Map [(Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + if (GetAddress >= (uint8_t*) MAP_LAST) + return GetAddress + (Address & 0xffff); + + if (Settings.SPC7110 && ((Address & 0x7FFFFF) == 0x4800)) + return s7r.bank50; + + switch ((intptr_t) GetAddress) + { + case MAP_SPC7110_DRAM: + return &s7r.bank50[Address & 0xffff]; + case MAP_PPU: + return Memory.FillRAM + (Address & 0xffff); + case MAP_CPU: + return Memory.FillRAM + (Address & 0xffff); + case MAP_DSP: + return Memory.FillRAM - 0x6000 + (Address & 0xffff); + case MAP_SA1RAM: + case MAP_LOROM_SRAM: + return Memory.SRAM + (Address & 0xffff); + case MAP_BWRAM: + return Memory.BWRAM - 0x6000 + (Address & 0xffff); + case MAP_HIROM_SRAM: + return Memory.SRAM - 0x6000 + (Address & 0xffff); + case MAP_C4: + return Memory.C4RAM - 0x6000 + (Address & 0xffff); + case MAP_OBC_RAM: + return GetMemPointerOBC1(Address); + case MAP_SETA_DSP: + return Memory.SRAM + ((Address & 0xffff) & Memory.SRAMMask); + default: + return NULL; + } +} + +void S9xSetPCBase(uint32_t Address) +{ + int32_t block; + uint8_t* GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + CPU.MemSpeed = Memory.MemorySpeed [block]; + CPU.MemSpeedx2 = CPU.MemSpeed << 1; + + if (GetAddress >= (uint8_t*) MAP_LAST) + CPU.PCBase = GetAddress; + else + { + switch ((intptr_t) GetAddress) + { + case MAP_PPU: + case MAP_CPU: + CPU.PCBase = Memory.FillRAM; + break; + case MAP_DSP: + CPU.PCBase = Memory.FillRAM - 0x6000; + break; + case MAP_BWRAM: + CPU.PCBase = Memory.BWRAM - 0x6000; + break; + case MAP_HIROM_SRAM: + CPU.PCBase = Memory.SRAM - 0x6000; + break; + case MAP_C4: + CPU.PCBase = Memory.C4RAM - 0x6000; + break; + default: + CPU.PCBase = Memory.SRAM; + break; + } + } + + CPU.PC = CPU.PCBase + (Address & 0xffff); +} diff --git a/source/getset.h b/source/getset.h deleted file mode 100644 index 6c4142a..0000000 --- a/source/getset.h +++ /dev/null @@ -1,424 +0,0 @@ -#include "../copyright" - -#ifndef _GETSET_H_ -#define _GETSET_H_ - -#include "ppu.h" -#include "dsp1.h" -#include "cpuexec.h" -#include "sa1.h" -#include "spc7110.h" -#include "obc1.h" -#include "seta.h" - -#include - -extern uint8_t OpenBus; - -static INLINE uint8_t S9xGetByte(uint32_t Address) -{ - int32_t block; - uint8_t* GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; - - if ((intptr_t) GetAddress != MAP_CPU || !CPU.InDMA) - CPU.Cycles += Memory.MemorySpeed [block]; - - if (GetAddress >= (uint8_t*) MAP_LAST) - { - if (Memory.BlockIsRAM [block]) - CPU.WaitAddress = CPU.PCAtOpcodeStart; - return GetAddress[Address & 0xffff]; - } - - switch ((intptr_t) GetAddress) - { - case MAP_PPU: - return S9xGetPPU(Address & 0xffff); - case MAP_CPU: - return S9xGetCPU(Address & 0xffff); - case MAP_DSP: - return S9xGetDSP(Address & 0xffff); - case MAP_SA1RAM: - case MAP_LOROM_SRAM: - /*Address & 0x7FFF - offset into bank - *Address & 0xFF0000 - bank - *bank >> 1 | offset = s-ram address, unbound - *unbound & SRAMMask = Sram offset */ - return Memory.SRAM[(((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) &Memory.SRAMMask]; - case MAP_RONLY_SRAM: - case MAP_HIROM_SRAM: - return Memory.SRAM[((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask]; - case MAP_BWRAM: - return Memory.BWRAM[(Address & 0x7fff) - 0x6000]; - case MAP_C4: - return S9xGetC4(Address & 0xffff); - case MAP_SPC7110_ROM: - return S9xGetSPC7110Byte(Address); - case MAP_SPC7110_DRAM: - return S9xGetSPC7110(0x4800); - case MAP_OBC_RAM: - return GetOBC1(Address & 0xffff); - case MAP_SETA_DSP: - return S9xGetSetaDSP(Address); - case MAP_SETA_RISC: - return S9xGetST018(Address); - default: - return OpenBus; - } -} - -static INLINE uint16_t S9xGetWord(uint32_t Address) -{ - int32_t block; - uint8_t* GetAddress; - if ((Address & 0x0fff) == 0x0fff) - { - OpenBus = S9xGetByte(Address); - return OpenBus | (S9xGetByte(Address + 1) << 8); - } - - GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; - - if ((intptr_t) GetAddress != MAP_CPU || !CPU.InDMA) - CPU.Cycles += (Memory.MemorySpeed [block] << 1); - - if (GetAddress >= (uint8_t*) MAP_LAST) - { - if (Memory.BlockIsRAM [block]) - CPU.WaitAddress = CPU.PCAtOpcodeStart; -#ifdef FAST_LSB_WORD_ACCESS - return *(uint16_t*) (GetAddress + (Address & 0xffff)); -#else - return *(GetAddress + (Address & 0xffff)) | (*(GetAddress + (Address & 0xffff) + 1) << 8); -#endif - } - - switch ((intptr_t) GetAddress) - { - case MAP_PPU: - return S9xGetPPU(Address & 0xffff) | (S9xGetPPU((Address + 1) & 0xffff) << 8); - case MAP_CPU: - return S9xGetCPU(Address & 0xffff) | (S9xGetCPU((Address + 1) & 0xffff) << 8); - case MAP_DSP: - return S9xGetDSP(Address & 0xffff) | (S9xGetDSP((Address + 1) & 0xffff) << 8); - case MAP_SA1RAM: - case MAP_LOROM_SRAM: - /*Address & 0x7FFF - offset into bank - *Address & 0xFF0000 - bank - *bank >> 1 | offset = s-ram address, unbound - *unbound & SRAMMask = Sram offset */ - /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff - * then the high byte doesn't follow the low byte. */ - return *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask)) | ((*(Memory.SRAM + (((((Address + 1) & 0xFF0000) >> 1) | ((Address + 1) & 0x7FFF)) & Memory.SRAMMask))) << 8); - case MAP_RONLY_SRAM: - case MAP_HIROM_SRAM: - /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff - * then the high byte doesn't follow the low byte. */ - return *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) | (*(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask)) << 8); - case MAP_BWRAM: -#ifdef FAST_LSB_WORD_ACCESS - return *(uint16_t*) (Memory.BWRAM + ((Address & 0x7fff) - 0x6000)); -#else - return *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) | (*(Memory.BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) << 8); -#endif - case MAP_C4: - return S9xGetC4(Address & 0xffff) | (S9xGetC4((Address + 1) & 0xffff) << 8); - case MAP_SPC7110_ROM: - return S9xGetSPC7110Byte(Address) | (S9xGetSPC7110Byte(Address + 1)) << 8; - case MAP_SPC7110_DRAM: - return S9xGetSPC7110(0x4800) | (S9xGetSPC7110(0x4800) << 8); - case MAP_OBC_RAM: - return GetOBC1(Address & 0xFFFF) | (GetOBC1((Address + 1) & 0xFFFF) << 8); - case MAP_SETA_DSP: - return S9xGetSetaDSP(Address) | (S9xGetSetaDSP((Address + 1)) << 8); - case MAP_SETA_RISC: - return S9xGetST018(Address) | (S9xGetST018((Address + 1)) << 8); - default: - return OpenBus | (OpenBus << 8); - } -} - -static INLINE void S9xSetByte(uint8_t Byte, uint32_t Address) -{ - int32_t block; - uint8_t* SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)]; - CPU.WaitAddress = NULL; - - if ((intptr_t) SetAddress != MAP_CPU || !CPU.InDMA) - CPU.Cycles += Memory.MemorySpeed [block]; - - if (SetAddress >= (uint8_t*) MAP_LAST) - { - SetAddress += Address & 0xffff; - if (SetAddress == SA1.WaitByteAddress1 || SetAddress == SA1.WaitByteAddress2) - { - SA1.Executing = SA1.S9xOpcodes != NULL; - SA1.WaitCounter = 0; - } - *SetAddress = Byte; - return; - } - - switch ((intptr_t) SetAddress) - { - case MAP_PPU: - S9xSetPPU(Byte, Address & 0xffff); - return; - case MAP_CPU: - S9xSetCPU(Byte, Address & 0xffff); - return; - case MAP_DSP: - S9xSetDSP(Byte, Address & 0xffff); - return; - case MAP_LOROM_SRAM: - if (Memory.SRAMMask) - { - *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask)) = Byte; - CPU.SRAMModified = true; - } - return; - case MAP_HIROM_SRAM: - if (Memory.SRAMMask) - { - *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = Byte; - CPU.SRAMModified = true; - } - return; - case MAP_BWRAM: - *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = Byte; - CPU.SRAMModified = true; - return; - case MAP_SA1RAM: - *(Memory.SRAM + (Address & 0xffff)) = Byte; - SA1.Executing = !SA1.Waiting; - break; - case MAP_C4: - S9xSetC4(Byte, Address & 0xffff); - return; - case MAP_OBC_RAM: - SetOBC1(Byte, Address & 0xFFFF); - return; - case MAP_SETA_DSP: - S9xSetSetaDSP(Byte, Address); - return; - case MAP_SETA_RISC: - S9xSetST018(Byte, Address); - return; - default: - return; - } -} - -static INLINE void S9xSetWord(uint16_t Word, uint32_t Address) -{ - int32_t block; - uint8_t* SetAddress; - - if ((Address & 0x0FFF) == 0x0FFF) - { - S9xSetByte(Word & 0x00FF, Address); - S9xSetByte(Word >> 8, Address + 1); - return; - } - - CPU.WaitAddress = NULL; - SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)]; - - if ((intptr_t) SetAddress != MAP_CPU || !CPU.InDMA) - CPU.Cycles += Memory.MemorySpeed [block] << 1; - - if (SetAddress >= (uint8_t*) MAP_LAST) - { - SetAddress += Address & 0xffff; - if (SetAddress == SA1.WaitByteAddress1 || SetAddress == SA1.WaitByteAddress2) - { - SA1.Executing = SA1.S9xOpcodes != NULL; - SA1.WaitCounter = 0; - } -#ifdef FAST_LSB_WORD_ACCESS - *(uint16_t*)SetAddress = Word; -#else - *SetAddress = (uint8_t) Word; - *(SetAddress + 1) = Word >> 8; -#endif - return; - } - - switch ((intptr_t) SetAddress) - { - case MAP_PPU: - S9xSetPPU((uint8_t) Word, Address & 0xffff); - S9xSetPPU(Word >> 8, (Address & 0xffff) + 1); - return; - case MAP_CPU: - S9xSetCPU((uint8_t) Word, Address & 0xffff); - S9xSetCPU(Word >> 8, (Address & 0xffff) + 1); - return; - case MAP_DSP: - S9xSetDSP((uint8_t) Word, Address & 0xffff); - S9xSetDSP(Word >> 8, (Address & 0xffff) + 1); - return; - case MAP_LOROM_SRAM: - if (Memory.SRAMMask) - { - /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff - * then the high byte doesn't follow the low byte. */ - *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask)) = (uint8_t) Word; - *(Memory.SRAM + (((((Address + 1) & 0xFF0000) >> 1) | ((Address + 1) & 0x7FFF))& Memory.SRAMMask)) = Word >> 8; - CPU.SRAMModified = true; - } - return; - case MAP_HIROM_SRAM: - if (Memory.SRAMMask) - { - /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff - * then the high byte doesn't follow the low byte. */ - *(Memory.SRAM + (((((Address & 0x7fff) - 0x6000) + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask))) = (uint8_t) Word; - *(Memory.SRAM + ((((((Address + 1) & 0x7fff) - 0x6000) + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask))) = (uint8_t)(Word >> 8); - CPU.SRAMModified = true; - } - return; - case MAP_BWRAM: -#ifdef FAST_LSB_WORD_ACCESS - *(uint16_t*)(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = Word; -#else - *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = (uint8_t) Word; - *(Memory.BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) = (uint8_t) (Word >> 8); -#endif - CPU.SRAMModified = true; - return; - case MAP_SA1RAM: - *(Memory.SRAM + (Address & 0xffff)) = (uint8_t) Word; - *(Memory.SRAM + ((Address + 1) & 0xffff)) = (uint8_t)(Word >> 8); - SA1.Executing = !SA1.Waiting; - break; - case MAP_C4: - S9xSetC4(Word & 0xff, Address & 0xffff); - S9xSetC4((uint8_t)(Word >> 8), (Address + 1) & 0xffff); - return; - case MAP_OBC_RAM: - SetOBC1(Word & 0xff, Address & 0xFFFF); - SetOBC1((uint8_t)(Word >> 8), (Address + 1) & 0xffff); - return; - case MAP_SETA_DSP: - S9xSetSetaDSP(Word & 0xff, Address); - S9xSetSetaDSP((uint8_t)(Word >> 8), (Address + 1)); - return; - case MAP_SETA_RISC: - S9xSetST018(Word & 0xff, Address); - S9xSetST018((uint8_t)(Word >> 8), (Address + 1)); - return; - default: - return; - } -} - -static INLINE uint8_t* GetBasePointer(uint32_t Address) -{ - uint8_t* GetAddress = Memory.Map [(Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; - if (GetAddress >= (uint8_t*) MAP_LAST) - return GetAddress; - if (Settings.SPC7110 && ((Address & 0x7FFFFF) == 0x4800)) - return s7r.bank50; - switch ((intptr_t) GetAddress) - { - case MAP_SPC7110_DRAM: - return s7r.bank50; - case MAP_SPC7110_ROM: - return Get7110BasePtr(Address); - case MAP_PPU: /*just a guess, but it looks like this should match the CPU as a source. */ - case MAP_CPU: /*fixes Ogre Battle's green lines */ - case MAP_OBC_RAM: - return Memory.FillRAM; - case MAP_DSP: - return Memory.FillRAM - 0x6000; - case MAP_SA1RAM: - case MAP_LOROM_SRAM: - case MAP_SETA_DSP: - return Memory.SRAM; - case MAP_BWRAM: - return Memory.BWRAM - 0x6000; - case MAP_HIROM_SRAM: - return Memory.SRAM - 0x6000; - case MAP_C4: - return Memory.C4RAM - 0x6000; - default: - return NULL; - } -} - -static INLINE uint8_t* S9xGetMemPointer(uint32_t Address) -{ - uint8_t* GetAddress = Memory.Map [(Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; - if (GetAddress >= (uint8_t*) MAP_LAST) - return GetAddress + (Address & 0xffff); - - if (Settings.SPC7110 && ((Address & 0x7FFFFF) == 0x4800)) - return s7r.bank50; - - switch ((intptr_t) GetAddress) - { - case MAP_SPC7110_DRAM: - return &s7r.bank50[Address & 0xffff]; - case MAP_PPU: - return Memory.FillRAM + (Address & 0xffff); - case MAP_CPU: - return Memory.FillRAM + (Address & 0xffff); - case MAP_DSP: - return Memory.FillRAM - 0x6000 + (Address & 0xffff); - case MAP_SA1RAM: - case MAP_LOROM_SRAM: - return Memory.SRAM + (Address & 0xffff); - case MAP_BWRAM: - return Memory.BWRAM - 0x6000 + (Address & 0xffff); - case MAP_HIROM_SRAM: - return Memory.SRAM - 0x6000 + (Address & 0xffff); - case MAP_C4: - return Memory.C4RAM - 0x6000 + (Address & 0xffff); - case MAP_OBC_RAM: - return GetMemPointerOBC1(Address); - case MAP_SETA_DSP: - return Memory.SRAM + ((Address & 0xffff) & Memory.SRAMMask); - default: - return NULL; - } -} - -static INLINE void S9xSetPCBase(uint32_t Address) -{ - int32_t block; - uint8_t* GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; - CPU.MemSpeed = Memory.MemorySpeed [block]; - CPU.MemSpeedx2 = CPU.MemSpeed << 1; - - if (GetAddress >= (uint8_t*) MAP_LAST) - CPU.PCBase = GetAddress; - else - { - switch ((intptr_t) GetAddress) - { - case MAP_PPU: - case MAP_CPU: - CPU.PCBase = Memory.FillRAM; - break; - case MAP_DSP: - CPU.PCBase = Memory.FillRAM - 0x6000; - break; - case MAP_BWRAM: - CPU.PCBase = Memory.BWRAM - 0x6000; - break; - case MAP_HIROM_SRAM: - CPU.PCBase = Memory.SRAM - 0x6000; - break; - case MAP_C4: - CPU.PCBase = Memory.C4RAM - 0x6000; - break; - default: - CPU.PCBase = Memory.SRAM; - break; - } - } - - CPU.PC = CPU.PCBase + (Address & 0xffff); -} -#endif diff --git a/source/memmap.c b/source/memmap.c index cfdc997..209b6cd 100644 --- a/source/memmap.c +++ b/source/memmap.c @@ -3044,5 +3044,3 @@ void ParseSNESHeader(uint8_t* RomHeader) else sprintf(Memory.CompanyId, "%02X", RomHeader[0x2A]); } - -#include "getset.h" diff --git a/source/ppu.h b/source/ppu.h index e04c4ad..447f7f1 100644 --- a/source/ppu.h +++ b/source/ppu.h @@ -2,6 +2,8 @@ #define _PPU_H_ #include "../copyright" +#include +#include #include #define FIRST_VISIBLE_LINE 1 -- cgit v1.2.3