diff --git a/output/dll/faust.wbx b/output/dll/faust.wbx index 41bf0c8ecb..0e8dec3de2 100644 Binary files a/output/dll/faust.wbx and b/output/dll/faust.wbx differ diff --git a/src/BizHawk.Emulation.Cores/Waterbox/NymaCore.cs b/src/BizHawk.Emulation.Cores/Waterbox/NymaCore.cs index 0cf41424e4..d6643dd2e7 100644 --- a/src/BizHawk.Emulation.Cores/Waterbox/NymaCore.cs +++ b/src/BizHawk.Emulation.Cores/Waterbox/NymaCore.cs @@ -31,13 +31,13 @@ namespace BizHawk.Emulation.Cores.Waterbox { var t = PreInit(new WaterboxOptions { - // TODO fix these up Filename = wbxFilename, + // MemoryBlock understands reserve vs commit semantics, so nothing to be gained by making these precisely sized SbrkHeapSizeKB = 1024 * 16, - SealedHeapSizeKB = 1024 * 16, - InvisibleHeapSizeKB = 1024 * 16, - PlainHeapSizeKB = 1024 * 16, - MmapHeapSizeKB = 1024 * 16, + SealedHeapSizeKB = 1024 * 48, + InvisibleHeapSizeKB = 1024 * 48, + PlainHeapSizeKB = 1024 * 48, + MmapHeapSizeKB = 1024 * 48, SkipCoreConsistencyCheck = CoreComm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxCoreConsistencyCheck), SkipMemoryConsistencyCheck = CoreComm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxMemoryConsistencyCheck), }); diff --git a/waterbox/emulibc/emulibc.h b/waterbox/emulibc/emulibc.h index 9665e41237..f0466ae47b 100644 --- a/waterbox/emulibc/emulibc.h +++ b/waterbox/emulibc/emulibc.h @@ -43,6 +43,29 @@ void _debug_puts(const char *); #ifdef __cplusplus } + +// allocate memory from the "sealed" pool. this memory can never be freed, +// and can only be allocated or written to during the init phase. after that, the host +// seals the pool, making it read only and all of its contents frozen. good for LUTs and +// ROMs +template T* alloc_sealed(size_t nmemb) +{ + return (T*)alloc_sealed(nmemb * sizeof(T)); +} +// allocate memory from the "invisible" pool. this memory can never be freed. +// this memory is not savestated! this should only be used for a large buffer whose contents +// you are absolutely sure will not harm savestates +template T* alloc_invisible(size_t nmemb) +{ + return (T*)alloc_invisible(nmemb * sizeof(T)); +} +// allocate memory from the "plain" pool. this memory can never be freed. +// this memory is savestated normally. +// useful to avoid malloc() overhead for things that will never be freed +template T* alloc_plain(size_t nmemb) +{ + return (T*)alloc_plain(nmemb * sizeof(T)); +} #endif #endif diff --git a/waterbox/nyma/common.mak b/waterbox/nyma/common.mak index 719c3a629a..9d9a21d327 100644 --- a/waterbox/nyma/common.mak +++ b/waterbox/nyma/common.mak @@ -16,6 +16,7 @@ MEDNAFLAGS := \ -mno-indirect-branch-register \ -Wall -Wshadow -Wempty-body -Wignored-qualifiers \ -Wvla -Wvariadic-macros -Wdisabled-optimization -Werror=write-strings \ + --param max-gcse-memory=300000000 \ -Dprivate=public # the gods have abandoned us CCFLAGS := $(MEDNAFLAGS) -std=gnu99 diff --git a/waterbox/nyma/faust.cpp b/waterbox/nyma/faust.cpp index dd2419422e..870c71f2ba 100644 --- a/waterbox/nyma/faust.cpp +++ b/waterbox/nyma/faust.cpp @@ -6,6 +6,8 @@ #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" using namespace MDFN_IEN_SNES_FAUST; @@ -16,36 +18,6 @@ void SetupMDFNGameInfo() Mednafen::MDFNGameInfo = &EmulatedSNES_Faust; } -// ECL_EXPORT bool GetSaveRam() -// { -// try -// { -// FLASH_SaveNV(); -// return true; -// } -// catch(...) -// { -// return false; -// } -// } -// ECL_EXPORT bool PutSaveRam() -// { -// try -// { -// FLASH_LoadNV(); -// return true; -// } -// catch(...) -// { -// return false; -// } -// } - -// namespace MDFN_IEN_NGP -// { -// extern uint8 CPUExRAM[16384]; -// } - #define MemoryDomainFunctions(N,R,W)\ static void Access##N(uint8_t* buffer, int64_t address, int64_t count, bool write)\ {\ @@ -60,28 +32,75 @@ static void Access##N(uint8_t* buffer, int64_t address, int64_t count, bool writ *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); ECL_EXPORT void GetMemoryAreas(MemoryArea* m) { int i = 0; - // m[0].Data = Memory.SRAM; // sram, or sufami A sram - // m[0].Name = "CARTRAM"; - // m[0].Size = (unsigned)(Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0); - // if (m[0].Size > 0x20000) - // m[0].Size = 0x20000; - // m[0].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_SAVERAMMABLE; - // m[1].Data = Multi.sramB; // sufami B sram - // m[1].Name = "CARTRAM B"; - // m[1].Size = (unsigned)(Multi.cartType && Multi.sramSizeB ? (1 << (Multi.sramSizeB + 3)) * 128 : 0); - // m[1].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_SAVERAMMABLE; + // Sufami not supported on this core + // m[i].Name = "CARTRAM B"; + // m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_SAVERAMMABLE; - // m[2].Data = RTCData.reg; - // m[2].Name = "RTC"; - // m[2].Size = (Settings.SRTC || Settings.SPC7110RTC) ? 20 : 0; - // m[2].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE1 | 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"; @@ -89,20 +108,54 @@ ECL_EXPORT void GetMemoryAreas(MemoryArea* m) m[i].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_PRIMARY | MEMORYAREA_FLAGS_FUNCTIONHOOK; i++; - // m[4].Data = Memory.VRAM; - // m[4].Name = "VRAM"; - // m[4].Size = 64 * 1024; - // m[4].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2; + m[i].Data = Cart.ROM; + m[i].Name = "CARTROM"; + m[i].Size = Cart.ROM_Size; + m[i].Flags = MEMORYAREA_FLAGS_WORDSIZE2; + i++; - // m[5].Data = Memory.ROM; - // m[5].Name = "CARTROM"; - // m[5].Size = Memory.CalculatedSize; - // m[5].Flags = MEMORYAREA_FLAGS_WORDSIZE2; + 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++; + } + + 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++; + + // TODO: "System Bus" } - - - // stub ppu_mt since we can't support it namespace MDFN_IEN_SNES_FAUST { diff --git a/waterbox/nyma/mednafen b/waterbox/nyma/mednafen index 593da4feb3..92d22d2919 160000 --- a/waterbox/nyma/mednafen +++ b/waterbox/nyma/mednafen @@ -1 +1 @@ -Subproject commit 593da4feb3846c476973d93f44b20f493a44738f +Subproject commit 92d22d291998c3f51e49f9f213f520c50c1af5b3