217 lines
6.5 KiB
C++
217 lines
6.5 KiB
C++
#include <src/types.h>
|
|
#include "nyma.h"
|
|
#include <emulibc.h>
|
|
#include "mednafen/src/snes_faust/snes.h"
|
|
#include <waterboxcore.h>
|
|
#include "mednafen/src/snes_faust/ppu.h"
|
|
#include "mednafen/src/snes_faust/input.h"
|
|
#include "mednafen/src/snes_faust/cart.h"
|
|
#include "mednafen/src/snes_faust/cart-private.h"
|
|
#include "mednafen/src/snes_faust/apu.h"
|
|
#include "mednafen/src/snes_faust/cart/sa1cpu.h"
|
|
|
|
using namespace MDFN_IEN_SNES_FAUST;
|
|
|
|
extern Mednafen::MDFNGI EmulatedSNES_Faust;
|
|
|
|
void SetupMDFNGameInfo()
|
|
{
|
|
Mednafen::MDFNGameInfo = &EmulatedSNES_Faust;
|
|
}
|
|
|
|
#define MemoryDomainFunctions(N,R,W)\
|
|
static void Access##N(uint8_t* buffer, int64_t address, int64_t count, bool write)\
|
|
{\
|
|
if (write)\
|
|
{\
|
|
while (count--)\
|
|
W(address++, *buffer++);\
|
|
}\
|
|
else\
|
|
{\
|
|
while (count--)\
|
|
*buffer++ = R(address++);\
|
|
}\
|
|
}
|
|
#define MemoryDomainFunctions16(N,R,W)\
|
|
static void Access##N(uint8_t* buffer, int64_t address, int64_t count, bool write)\
|
|
{\
|
|
auto address16 = address >> 1;\
|
|
if (address & 1 && count)\
|
|
{\
|
|
auto scratch = R(address16);\
|
|
if (write)\
|
|
{\
|
|
scratch = scratch & 0xff | buffer[0] << 8;\
|
|
W(address16, scratch);\
|
|
}\
|
|
else\
|
|
{\
|
|
buffer[0] = scratch >> 8;\
|
|
}\
|
|
buffer++;\
|
|
address16++;\
|
|
count--;\
|
|
}\
|
|
auto buffer16 = (uint16_t*)buffer;\
|
|
if (write)\
|
|
{\
|
|
for (; count > 1; count -= 2)\
|
|
W(address16++, *buffer16++);\
|
|
}\
|
|
else\
|
|
{\
|
|
for (; count > 1; count -= 2)\
|
|
*buffer16++ = R(address16++);\
|
|
}\
|
|
if (count)\
|
|
{\
|
|
buffer = (uint8_t*)buffer16;\
|
|
auto scratch = R(address16);\
|
|
if (write)\
|
|
{\
|
|
scratch = scratch & 0xff00 | buffer[0];\
|
|
W(address16, scratch);\
|
|
}\
|
|
else\
|
|
{\
|
|
buffer[0] = scratch;\
|
|
}\
|
|
}\
|
|
}
|
|
|
|
MemoryDomainFunctions(WRAM, PeekWRAM, PokeWRAM);
|
|
MemoryDomainFunctions(SRAM, CART_PeekRAM, CART_PokeRAM);
|
|
|
|
MemoryDomainFunctions16(VRAM, PPU_ST::PPU_PeekVRAM, PPU_ST::PPU_PokeVRAM);
|
|
MemoryDomainFunctions16(CGRAM, PPU_ST::PPU_PeekCGRAM, PPU_ST::PPU_PokeCGRAM);
|
|
|
|
MemoryDomainFunctions(OAMLO, PPU_ST::PPU_PeekOAM, PPU_ST::PPU_PokeOAM);
|
|
MemoryDomainFunctions(OAMHI, PPU_ST::PPU_PeekOAMHI, PPU_ST::PPU_PokeOAMHI);
|
|
|
|
MemoryDomainFunctions(APU, APU_PeekRAM, APU_PokeRAM);
|
|
|
|
namespace MDFN_IEN_SNES_FAUST
|
|
{
|
|
namespace SA1CPU
|
|
{
|
|
extern CPU_Misc CPUM;
|
|
}
|
|
extern unsigned ppu_renderer;
|
|
}
|
|
|
|
|
|
ECL_EXPORT void GetMemoryAreas(MemoryArea* m)
|
|
{
|
|
int i = 0;
|
|
|
|
// Sufami not supported on this core
|
|
// m[i].Name = "CARTRAM B";
|
|
// m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_SAVERAMMABLE;
|
|
|
|
// spc7110 not supported on this core
|
|
// m[i].Name = "RTC";
|
|
// m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_SAVERAMMABLE;
|
|
|
|
m[i].Data = (void*)(MemoryFunctionHook)AccessWRAM;
|
|
m[i].Name = "WRAM";
|
|
m[i].Size = 128 * 1024;
|
|
m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_PRIMARY | MEMORYAREA_FLAGS_FUNCTIONHOOK;
|
|
i++;
|
|
|
|
m[i].Data = Cart.ROM;
|
|
m[i].Name = "CARTROM";
|
|
m[i].Size = Cart.ROM_Size;
|
|
m[i].Flags = MEMORYAREA_FLAGS_WORDSIZE2;
|
|
i++;
|
|
|
|
if (CART_GetRAMSize())
|
|
{
|
|
m[i].Data = (void*)(MemoryFunctionHook)AccessSRAM;
|
|
m[i].Name = "CARTRAM";
|
|
m[i].Size = CART_GetRAMSize();
|
|
m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_FUNCTIONHOOK | MEMORYAREA_FLAGS_ONEFILLED | MEMORYAREA_FLAGS_SAVERAMMABLE;
|
|
i++;
|
|
}
|
|
|
|
if (ppu_renderer == PPU_RENDERER_ST)
|
|
{
|
|
m[i].Data = (void*)(MemoryFunctionHook)AccessVRAM;
|
|
m[i].Name = "VRAM";
|
|
m[i].Size = 64 * 1024;
|
|
m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_FUNCTIONHOOK;
|
|
i++;
|
|
|
|
m[i].Data = (void*)(MemoryFunctionHook)AccessCGRAM;
|
|
m[i].Name = "CGRAM";
|
|
m[i].Size = 512;
|
|
m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_FUNCTIONHOOK;
|
|
i++;
|
|
|
|
m[i].Data = (void*)(MemoryFunctionHook)AccessOAMLO;
|
|
m[i].Name = "OAMLO";
|
|
m[i].Size = 512;
|
|
m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_FUNCTIONHOOK;
|
|
i++;
|
|
|
|
m[i].Data = (void*)(MemoryFunctionHook)AccessOAMHI;
|
|
m[i].Name = "OAMHI";
|
|
m[i].Size = 32;
|
|
m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_FUNCTIONHOOK;
|
|
i++;
|
|
}
|
|
|
|
m[i].Data = (void*)(MemoryFunctionHook)AccessAPU;
|
|
m[i].Name = "APURAM";
|
|
m[i].Size = 64 * 1024;
|
|
m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_FUNCTIONHOOK;
|
|
i++;
|
|
|
|
if (SA1CPU::CPUM.ReadFuncs[0])
|
|
{
|
|
m[i].Data = SA1CPU::CPUM.IRAM;
|
|
m[i].Name = "SA1 IRAM";
|
|
m[i].Size = sizeof(SA1CPU::CPUM.IRAM);
|
|
m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2;
|
|
i++;
|
|
}
|
|
|
|
// TODO: "System Bus"
|
|
}
|
|
|
|
namespace MDFN_IEN_SNES_FAUST
|
|
{
|
|
static MDFN_COLD uint32 DummyEventHandler(uint32 timestamp)
|
|
{
|
|
return SNES_EVENT_MAXTS;
|
|
}
|
|
// uncomment to stub ppu mt, instead of including our hacked up version.
|
|
namespace PPU_MT
|
|
{
|
|
// void PPU_Init(const bool IsPAL, const bool IsPALPPUBit, const bool WantFrameBeginVBlank, const uint64 affinity){}
|
|
// void PPU_SetGetVideoParams(MDFNGI* gi, const unsigned caspect, const unsigned hfilter, const unsigned sls, const unsigned sle){}
|
|
// snes_event_handler PPU_GetEventHandler(void){ return DummyEventHandler; }
|
|
// snes_event_handler PPU_GetLineIRQEventHandler(void){ return DummyEventHandler; }
|
|
// void PPU_Kill(void){}
|
|
// void PPU_StartFrame(EmulateSpecStruct* espec){}
|
|
// void PPU_SyncMT(void){}
|
|
// void PPU_Reset(bool powering_up){}
|
|
// void PPU_ResetTS(void){}
|
|
// void PPU_StateAction(StateMem* sm, const unsigned load, const bool data_only){}
|
|
// uint16 PPU_PeekVRAM(uint32 addr){ return 0; }
|
|
// uint16 PPU_PeekCGRAM(uint32 addr){ return 0; }
|
|
// uint8 PPU_PeekOAM(uint32 addr){ return 0; }
|
|
// uint8 PPU_PeekOAMHI(uint32 addr){ return 0; }
|
|
// uint32 PPU_GetRegister(const unsigned id, char* const special, const uint32 special_len){ return 0; }
|
|
}
|
|
// stub msu1 because it uses MT readers
|
|
void MSU1_Init(GameFile* gf, double* IdealSoundRate, uint64 affinity_audio, uint64 affinity_data){}
|
|
void MSU1_Kill(void){}
|
|
void MSU1_Reset(bool powering_up){}
|
|
void MSU1_StateAction(StateMem* sm, const unsigned load, const bool data_only){}
|
|
void MSU1_StartFrame(double master_clock, double rate, int32 apu_clock_multiplier, int32 resamp_num, int32 resamp_denom, bool resamp_clear_buf){}
|
|
void MSU1_EndFrame(int16* SoundBuf, int32 SoundBufSize){}
|
|
void MSU1_AdjustTS(const int32 delta){}
|
|
snes_event_handler MSU1_GetEventHandler(void){ return DummyEventHandler; }
|
|
}
|