From a42631fadc29c3a505f68af813b953c86fe8d905 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Thu, 8 Jun 2017 17:15:29 -0400 Subject: [PATCH] Saturnus: IMemoryDomains. Names match the old yahbooze names when applicable. --- .../Consoles/Sega/Saturn/LibSaturnus.cs | 4 + .../Consoles/Sega/Saturn/Saturnus.cs | 19 +++++ waterbox/ss/bizhawk.cpp | 7 ++ waterbox/ss/cart/backup.cpp | 79 ++++++++++--------- waterbox/ss/cart/cs1ram.cpp | 40 +++++----- waterbox/ss/cart/extram.cpp | 72 ++++++++--------- waterbox/ss/cart/rom.cpp | 30 +++---- waterbox/ss/defs.h | 2 + waterbox/ss/sound.cpp | 1 + waterbox/ss/ss.cpp | 6 +- waterbox/ss/vdp1.cpp | 2 + waterbox/ss/vdp2.cpp | 2 + 12 files changed, 152 insertions(+), 112 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/LibSaturnus.cs b/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/LibSaturnus.cs index aa7b73b53d..0dbd2dde8d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/LibSaturnus.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/LibSaturnus.cs @@ -71,6 +71,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn public delegate void CDSectorCallback(int disk, int lba, IntPtr dest); [UnmanagedFunctionPointer(CC)] public delegate void InputCallback(); + [UnmanagedFunctionPointer(CC)] + public delegate void AddMemoryDomainCallback(string name, IntPtr ptr, int size, bool writable); [BizImport(CC)] public abstract void SetFirmwareCallbacks(FirmwareSizeCallback sizecallback, FirmwareDataCallback datacallback); @@ -88,5 +90,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn public abstract void SetupInput(int[] portdevices, int[] multitaps); [BizImport(CC)] public abstract void SetInputCallback(InputCallback callback); + [BizImport(CC)] + public abstract void SetAddMemoryDomainCallback(AddMemoryDomainCallback callback); } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/Saturnus.cs b/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/Saturnus.cs index 7641a836df..eab587d999 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/Saturnus.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/Saturnus.cs @@ -80,6 +80,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn SetFirmwareCallbacks(); SetCdCallbacks(); + _core.SetAddMemoryDomainCallback(_addMemoryDomainCallback); if (!_core.Init(_disks.Length)) throw new InvalidOperationException("Core rejected the disks!"); ClearAllCallbacks(); @@ -95,6 +96,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn _exe.Seal(); SetCdCallbacks(); _core.SetDisk(0, false); + (ServiceProvider as BasicServiceProvider).Register(new MemoryDomainList(_memoryDomains.Values.ToList()) + { + MainMemory = _memoryDomains["Work Ram Low"] + }); } public unsafe void FrameAdvance(IController controller, bool render, bool rendersound = true) @@ -158,6 +163,17 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn public CoreComm CoreComm { get; } public ControllerDefinition ControllerDefinition { get; } + #region IMemoryDomains + + private readonly Dictionary _memoryDomains = new Dictionary(); + + private void AddMemoryDomain(string name, IntPtr ptr, int size, bool writable) + { + _memoryDomains.Add(name, new MemoryDomainIntPtrMonitor(name, MemoryDomain.Endian.Big, ptr, size, writable, 2, _exe)); + } + + #endregion + #region IStatable public bool BinarySaveStatesPreferred => true; @@ -218,6 +234,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn private LibSaturnus.CDTOCCallback _cdTocCallback; private LibSaturnus.CDSectorCallback _cdSectorCallback; private LibSaturnus.InputCallback _inputCallback; + private LibSaturnus.AddMemoryDomainCallback _addMemoryDomainCallback; private void InitCallbacks() { @@ -226,6 +243,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn _cdTocCallback = CDTOCCallback; _cdSectorCallback = CDSectorCallback; _inputCallback = InputCallbacks.Call; + _addMemoryDomainCallback = AddMemoryDomain; } private void SetFirmwareCallbacks() @@ -245,6 +263,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn _core.SetFirmwareCallbacks(null, null); _core.SetCDCallbacks(null, null); _core.SetInputCallback(null); + _core.SetAddMemoryDomainCallback(null); } private string TranslateFirmwareName(string filename) diff --git a/waterbox/ss/bizhawk.cpp b/waterbox/ss/bizhawk.cpp index b005d365a5..e605a035fe 100644 --- a/waterbox/ss/bizhawk.cpp +++ b/waterbox/ss/bizhawk.cpp @@ -222,6 +222,13 @@ EXPORT void SetInputCallback(void (*callback)()) InputCallback = callback; } +void (*AddMemoryDomain)(const char* name, const void* ptr, int size, bool writable); + +EXPORT void SetAddMemoryDomainCallback(void (*callback)(const char* name, const void* ptr, int size, bool writable)) +{ + AddMemoryDomain = callback; +} + // if (BackupRAM_Dirty)SaveBackupRAM(); // if (CART_GetClearNVDirty())SaveCartNV(); diff --git a/waterbox/ss/cart/backup.cpp b/waterbox/ss/cart/backup.cpp index a81cc85d9d..ac56c44351 100644 --- a/waterbox/ss/cart/backup.cpp +++ b/waterbox/ss/cart/backup.cpp @@ -25,66 +25,67 @@ namespace MDFN_IEN_SS { -static uint8* ExtBackupRAM; +static uint8 *ExtBackupRAM; static bool ExtBackupRAM_Dirty; // TODO: Check mirroring. -template -static MDFN_HOT void ExtBackupRAM_RW_DB(uint32 A, uint16* DB) +template +static MDFN_HOT void ExtBackupRAM_RW_DB(uint32 A, uint16 *DB) { - uint8* const ptr = ExtBackupRAM + ((A >> 1) & 0x7FFFF); + uint8 *const ptr = ExtBackupRAM + ((A >> 1) & 0x7FFFF); - if(IsWrite) - { - if(A & 1) - { - ExtBackupRAM_Dirty = true; - *ptr = *DB; - } - } - else - { - *DB = (*ptr << 0) | 0xFF00; + if (IsWrite) + { + if (A & 1) + { + ExtBackupRAM_Dirty = true; + *ptr = *DB; + } + } + else + { + *DB = (*ptr << 0) | 0xFF00; - if((A & ~1) == 0x04FFFFFE) - *DB = 0x21; - } + if ((A & ~1) == 0x04FFFFFE) + *DB = 0x21; + } } static MDFN_COLD bool GetClearNVDirty(void) { - bool ret = ExtBackupRAM_Dirty; + bool ret = ExtBackupRAM_Dirty; - ExtBackupRAM_Dirty = false; + ExtBackupRAM_Dirty = false; - return ret; + return ret; } -static MDFN_COLD void GetNVInfo(const char** ext, void** nv_ptr, uint64* nv_size) +static MDFN_COLD void GetNVInfo(const char **ext, void **nv_ptr, uint64 *nv_size) { - *ext = "bcr"; - *nv_ptr = ExtBackupRAM; - *nv_size = 524288; + *ext = "bcr"; + *nv_ptr = ExtBackupRAM; + *nv_size = 524288; } -void CART_Backup_Init(CartInfo* c) +void CART_Backup_Init(CartInfo *c) { - static const uint8 init[0x10] = { 0x42, 0x61, 0x63, 0x6B, 0x55, 0x70, 0x52, 0x61, 0x6D, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x61, 0x74 }; + static const uint8 init[0x10] = {0x42, 0x61, 0x63, 0x6B, 0x55, 0x70, 0x52, 0x61, 0x6D, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x61, 0x74}; - ExtBackupRAM = (uint8*)alloc_plain(524288); - memset(ExtBackupRAM, 0x00, 524288); - for(unsigned i = 0; i < 0x200; i += 0x10) - memcpy(ExtBackupRAM + i, init, 0x10); + ExtBackupRAM = (uint8 *)alloc_plain(524288); + memset(ExtBackupRAM, 0x00, 524288); + for (unsigned i = 0; i < 0x200; i += 0x10) + memcpy(ExtBackupRAM + i, init, 0x10); - ExtBackupRAM_Dirty = false; + ExtBackupRAM_Dirty = false; - c->CS01_SetRW8W16(0x04000000, 0x04FFFFFF, - ExtBackupRAM_RW_DB, - ExtBackupRAM_RW_DB, - ExtBackupRAM_RW_DB); + c->CS01_SetRW8W16(0x04000000, 0x04FFFFFF, + ExtBackupRAM_RW_DB, + ExtBackupRAM_RW_DB, + ExtBackupRAM_RW_DB); - c->GetClearNVDirty = GetClearNVDirty; - c->GetNVInfo = GetNVInfo; + c->GetClearNVDirty = GetClearNVDirty; + c->GetNVInfo = GetNVInfo; + + AddMemoryDomain("Backup Cart", ExtBackupRAM, 524288, true); } - } diff --git a/waterbox/ss/cart/cs1ram.cpp b/waterbox/ss/cart/cs1ram.cpp index 16bbb4ff99..f4d6785963 100644 --- a/waterbox/ss/cart/cs1ram.cpp +++ b/waterbox/ss/cart/cs1ram.cpp @@ -24,37 +24,37 @@ namespace MDFN_IEN_SS { -static uint16* CS1RAM = nullptr; +static uint16 *CS1RAM = nullptr; -template -static MDFN_HOT void CS1RAM_RW_DB(uint32 A, uint16* DB) +template +static MDFN_HOT void CS1RAM_RW_DB(uint32 A, uint16 *DB) { - const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3)); - uint16* const ptr = (uint16*)((uint8*)CS1RAM + (A & 0x00FFFFFE)); + const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3)); + uint16 *const ptr = (uint16 *)((uint8 *)CS1RAM + (A & 0x00FFFFFE)); - if(IsWrite) - *ptr = (*ptr & ~mask) | (*DB & mask); - else - *DB = *ptr; + if (IsWrite) + *ptr = (*ptr & ~mask) | (*DB & mask); + else + *DB = *ptr; } static MDFN_COLD void Reset(bool powering_up) { - if(powering_up) - memset(CS1RAM, 0, 0x1000000); + if (powering_up) + memset(CS1RAM, 0, 0x1000000); } -void CART_CS1RAM_Init(CartInfo* c) +void CART_CS1RAM_Init(CartInfo *c) { - CS1RAM = (uint16*)alloc_plain(0x1000000); + CS1RAM = (uint16 *)alloc_plain(0x1000000); - SS_SetPhysMemMap (0x04000000, 0x04FFFFFF, CS1RAM, 0x1000000, true); - c->CS01_SetRW8W16(0x04000000, 0x04FFFFFF, - CS1RAM_RW_DB, - CS1RAM_RW_DB, - CS1RAM_RW_DB); + SS_SetPhysMemMap(0x04000000, 0x04FFFFFF, CS1RAM, 0x1000000, true); + c->CS01_SetRW8W16(0x04000000, 0x04FFFFFF, + CS1RAM_RW_DB, + CS1RAM_RW_DB, + CS1RAM_RW_DB); - c->Reset = Reset; + c->Reset = Reset; + AddMemoryDomain("CS1 Cart", CS1RAM, 0x1000000, true); } - } diff --git a/waterbox/ss/cart/extram.cpp b/waterbox/ss/cart/extram.cpp index 9e917e9d1c..924e4e725d 100644 --- a/waterbox/ss/cart/extram.cpp +++ b/waterbox/ss/cart/extram.cpp @@ -24,61 +24,61 @@ namespace MDFN_IEN_SS { -static uint16* ExtRAM; //[0x200000]; +static uint16 *ExtRAM; //[0x200000]; static size_t ExtRAM_Mask; static uint8 Cart_ID; -template -static MDFN_HOT void ExtRAM_RW_DB(uint32 A, uint16* DB) +template +static MDFN_HOT void ExtRAM_RW_DB(uint32 A, uint16 *DB) { - const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3)); - uint16* const ptr = (uint16*)((uint8*)ExtRAM + (A & ExtRAM_Mask)); + const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3)); + uint16 *const ptr = (uint16 *)((uint8 *)ExtRAM + (A & ExtRAM_Mask)); - //printf("Barf %zu %d: %08x\n", sizeof(T), IsWrite, A); + //printf("Barf %zu %d: %08x\n", sizeof(T), IsWrite, A); - if(IsWrite) - *ptr = (*ptr & ~mask) | (*DB & mask); - else - *DB = *ptr; + if (IsWrite) + *ptr = (*ptr & ~mask) | (*DB & mask); + else + *DB = *ptr; } -static MDFN_HOT void CartID_Read_DB(uint32 A, uint16* DB) +static MDFN_HOT void CartID_Read_DB(uint32 A, uint16 *DB) { - if((A & ~1) == 0x04FFFFFE) - *DB = Cart_ID; + if ((A & ~1) == 0x04FFFFFE) + *DB = Cart_ID; } static MDFN_COLD void Reset(bool powering_up) { - if(powering_up) - memset(ExtRAM, 0, 0x400000); // TODO: Test. + if (powering_up) + memset(ExtRAM, 0, 0x400000); // TODO: Test. } -void CART_ExtRAM_Init(CartInfo* c, bool R4MiB) +void CART_ExtRAM_Init(CartInfo *c, bool R4MiB) { - ExtRAM = (uint16*)alloc_plain(0x400000); - if(R4MiB) - { - Cart_ID = 0x5C; - ExtRAM_Mask = 0x3FFFFE; - } - else - { - Cart_ID = 0x5A; - ExtRAM_Mask = 0x27FFFE; - } + ExtRAM = (uint16 *)alloc_plain(0x400000); + if (R4MiB) + { + Cart_ID = 0x5C; + ExtRAM_Mask = 0x3FFFFE; + } + else + { + Cart_ID = 0x5A; + ExtRAM_Mask = 0x27FFFE; + } - SS_SetPhysMemMap(0x02400000, 0x025FFFFF, ExtRAM + (0x000000 / sizeof(uint16)), (R4MiB ? 0x200000 : 0x080000), true); - SS_SetPhysMemMap(0x02600000, 0x027FFFFF, ExtRAM + (0x200000 / sizeof(uint16)), (R4MiB ? 0x200000 : 0x080000), true); + SS_SetPhysMemMap(0x02400000, 0x025FFFFF, ExtRAM + (0x000000 / sizeof(uint16)), (R4MiB ? 0x200000 : 0x080000), true); + SS_SetPhysMemMap(0x02600000, 0x027FFFFF, ExtRAM + (0x200000 / sizeof(uint16)), (R4MiB ? 0x200000 : 0x080000), true); - c->CS01_SetRW8W16(0x02400000, 0x027FFFFF, - ExtRAM_RW_DB, - ExtRAM_RW_DB, - ExtRAM_RW_DB); + c->CS01_SetRW8W16(0x02400000, 0x027FFFFF, + ExtRAM_RW_DB, + ExtRAM_RW_DB, + ExtRAM_RW_DB); - c->CS01_SetRW8W16(/*0x04FFFFFE*/0x04F00000, 0x04FFFFFF, CartID_Read_DB); + c->CS01_SetRW8W16(/*0x04FFFFFE*/ 0x04F00000, 0x04FFFFFF, CartID_Read_DB); - c->Reset = Reset; + c->Reset = Reset; + AddMemoryDomain("Ram Cart", ExtRAM, 0x400000, true); } - } diff --git a/waterbox/ss/cart/rom.cpp b/waterbox/ss/cart/rom.cpp index 2c99cf5940..c6aa299948 100644 --- a/waterbox/ss/cart/rom.cpp +++ b/waterbox/ss/cart/rom.cpp @@ -25,29 +25,29 @@ namespace MDFN_IEN_SS { -static uint16* ROM; //[0x100000]; +static uint16 *ROM; //[0x100000]; -static MDFN_HOT void ROM_Read(uint32 A, uint16* DB) +static MDFN_HOT void ROM_Read(uint32 A, uint16 *DB) { - // TODO: Check mirroring. - //printf("ROM: %08x\n", A); - *DB = *(uint16*)((uint8*)ROM + (A & 0x1FFFFE)); + // TODO: Check mirroring. + //printf("ROM: %08x\n", A); + *DB = *(uint16 *)((uint8 *)ROM + (A & 0x1FFFFE)); } -void CART_ROM_Init(CartInfo* c, const char* filename) +void CART_ROM_Init(CartInfo *c, const char *filename) { if (FirmwareSizeCallback(filename) != 0x200000) abort(); - ROM = (uint16*)alloc_sealed(0x200000); - FirmwareDataCallback(filename, (uint8*)ROM); + ROM = (uint16 *)alloc_sealed(0x200000); + FirmwareDataCallback(filename, (uint8 *)ROM); - for(unsigned i = 0; i < 0x100000; i++) - { - ROM[i] = MDFN_de16msb(&ROM[i]); - } + for (unsigned i = 0; i < 0x100000; i++) + { + ROM[i] = MDFN_de16msb(&ROM[i]); + } - SS_SetPhysMemMap (0x02000000, 0x03FFFFFF, ROM, 0x200000, false); - c->CS01_SetRW8W16(0x02000000, 0x03FFFFFF, ROM_Read); + SS_SetPhysMemMap(0x02000000, 0x03FFFFFF, ROM, 0x200000, false); + c->CS01_SetRW8W16(0x02000000, 0x03FFFFFF, ROM_Read); + AddMemoryDomain("Rom Cart", ROM, 0x200000, false); } - } diff --git a/waterbox/ss/defs.h b/waterbox/ss/defs.h index 7292fb4c78..e005e7f460 100644 --- a/waterbox/ss/defs.h +++ b/waterbox/ss/defs.h @@ -318,3 +318,5 @@ extern bool setting_ss_region_autodetect; extern bool InputLagged; extern void (*InputCallback)(); + +extern void (*AddMemoryDomain)(const char* name, const void* ptr, int size, bool writable); diff --git a/waterbox/ss/sound.cpp b/waterbox/ss/sound.cpp index b09da4bdc4..fbe7083e93 100644 --- a/waterbox/ss/sound.cpp +++ b/waterbox/ss/sound.cpp @@ -112,6 +112,7 @@ void SOUND_Init(void) SS_SetPhysMemMap(0x05A00000, 0x05A7FFFF, SCSP.GetRAMPtr(), 0x80000, true); // TODO: MEM4B: SS_SetPhysMemMap(0x05A00000, 0x05AFFFFF, SCSP.GetRAMPtr(), 0x40000, true); + AddMemoryDomain("Sound Ram", SCSP.GetRAMPtr(), 0x100000, true); } uint8 SOUND_PeekRAM(uint32 A) diff --git a/waterbox/ss/ss.cpp b/waterbox/ss/ss.cpp index c167b02ce8..5862d41cda 100644 --- a/waterbox/ss/ss.cpp +++ b/waterbox/ss/ss.cpp @@ -935,15 +935,17 @@ static bool MDFN_COLD InitCommon(const unsigned cart_type, const unsigned smpc_a memset(BackupRAM, 0x00, sizeof(BackupRAM)); for (unsigned i = 0; i < 0x40; i++) BackupRAM[i] = BRAM_Init_Data[i & 0x0F]; + AddMemoryDomain("Backup Ram", BackupRAM, sizeof(BackupRAM), true); // Call InitFastMemMap() before functions like SOUND_Init() InitFastMemMap(); BIOSROM = (uint16*)alloc_sealed(524288); + AddMemoryDomain("Boot Rom", BIOSROM, 524288, false); SS_SetPhysMemMap(0x00000000, 0x000FFFFF, BIOSROM, 524288); SS_SetPhysMemMap(0x00200000, 0x003FFFFF, WorkRAML, sizeof(WorkRAML), true); SS_SetPhysMemMap(0x06000000, 0x07FFFFFF, WorkRAMH, sizeof(WorkRAMH), true); - //MDFNMP_RegSearchable(0x00200000, sizeof(WorkRAML)); - //MDFNMP_RegSearchable(0x06000000, sizeof(WorkRAMH)); + AddMemoryDomain("Work Ram Low", WorkRAML, sizeof(WorkRAML), true); + AddMemoryDomain("Work Ram High", WorkRAMH, sizeof(WorkRAMH), true); CART_Init(cart_type); // diff --git a/waterbox/ss/vdp1.cpp b/waterbox/ss/vdp1.cpp index f61b568aab..7756a3341a 100644 --- a/waterbox/ss/vdp1.cpp +++ b/waterbox/ss/vdp1.cpp @@ -118,6 +118,8 @@ void Init(void) // // SS_SetPhysMemMap(0x05C00000, 0x05C7FFFF, VRAM, sizeof(VRAM), true); + AddMemoryDomain("VDP1 Ram", VRAM, sizeof(VRAM), true); + AddMemoryDomain("VDP1 Framebuffer", FB, sizeof(FB), true); //SS_SetPhysMemMap(0x05C80000, 0x05CFFFFF, FB[FBDrawWhich], sizeof(FB[0]), true); vb_status = false; diff --git a/waterbox/ss/vdp2.cpp b/waterbox/ss/vdp2.cpp index b50d5ba5c7..476371ebc9 100644 --- a/waterbox/ss/vdp2.cpp +++ b/waterbox/ss/vdp2.cpp @@ -789,6 +789,8 @@ void Init(const bool IsPAL) lastts = 0; SS_SetPhysMemMap(0x05E00000, 0x05EFFFFF, VRAM, 0x80000, true); + AddMemoryDomain("VDP2 Ram", VRAM, sizeof(VRAM), true); + AddMemoryDomain("VDP2 CRam", CRAM, sizeof(CRAM), true); VDP2REND_Init(IsPAL); }