gpgx memory domains

This commit is contained in:
goyuken 2013-12-19 03:33:53 +00:00
parent b2210f3dfe
commit 3e389a93b0
4 changed files with 136 additions and 15 deletions

View File

@ -53,8 +53,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
}
AttachedCore = this;
MemoryDomains = MemoryDomainList.GetDummyList();
LoadCallback = new LibGPGX.load_archive_cb(load_archive);
this.romfile = romfile;
@ -111,6 +109,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
// pull the default video size from the core
update_video();
SetMemoryDomains();
}
catch
{
@ -472,6 +472,38 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
public MemoryDomainList MemoryDomains { get; private set; }
unsafe void SetMemoryDomains()
{
var mm = new List<MemoryDomain>();
for (int i = LibGPGX.MIN_MEM_DOMAIN; i <= LibGPGX.MAX_MEM_DOMAIN; i++)
{
IntPtr area = IntPtr.Zero;
int size = 0;
IntPtr pname = LibGPGX.gpgx_get_memdom(i, ref area, ref size);
if (area == IntPtr.Zero || pname == IntPtr.Zero || size == 0)
continue;
string name = Marshal.PtrToStringAnsi(pname);
byte *p = (byte*) area;
mm.Add(new MemoryDomain(name, size, MemoryDomain.Endian.Unknown,
delegate(int addr)
{
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
return p[addr];
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
p[addr] = val;
}));
}
MemoryDomains = new MemoryDomainList(mm, 0);
}
public List<KeyValuePair<string, int>> GetCpuFlagsAndRegisters()
{
return new List<KeyValuePair<string, int>>();

View File

@ -44,6 +44,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
[DllImport("libgenplusgx.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void gpgx_clear_sram();
public const int MIN_MEM_DOMAIN = 0;
public const int MAX_MEM_DOMAIN = 9;
[DllImport("libgenplusgx.dll", CallingConvention = CallingConvention.Cdecl)]
// apparently, if you use built in string marshalling, the interop will assume that
// the unmanaged char pointer was allocated in hglobal and try to free it that way
public static extern IntPtr gpgx_get_memdom(int which, ref IntPtr area, ref int size);
// call this before reading sram returned by gpgx_get_sram()
[DllImport("libgenplusgx.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void gpgx_sram_prepread();

View File

@ -177,7 +177,6 @@ GPGX_EX void gpgx_advance(void)
nsamples = audio_update(soundbuffer);
}
GPGX_EX void gpgx_clear_sram(void)
{
// clear sram
@ -225,28 +224,110 @@ GPGX_EX void gpgx_sram_commitwrite(void)
}
}
GPGX_EX const char* gpgx_get_memdom(int which, void **area, int *size)
{
if (!area || !size)
return NULL;
switch (which)
{
case 0:
*area = work_ram;
*size = 0x10000;
return "68K RAM";
case 1:
*area = zram;
*size = 0x2000;
return "Z80 RAM";
case 2:
if (!cdd.loaded)
{
*area = ext.md_cart.rom;
*size = ext.md_cart.romsize;
return "MD CART";
}
else if (scd.cartridge.id)
{
*area = scd.cartridge.area;
*size = scd.cartridge.mask + 1;
return "EBRAM";
}
else return NULL;
case 3:
if (cdd.loaded)
{
*area = scd.bootrom;
*size = 0x20000;
return "CD BOOT ROM";
}
else return NULL;
case 4:
if (cdd.loaded)
{
*area = scd.prg_ram;
*size = 0x80000;
return "CD PRG RAM";
}
else return NULL;
case 5:
if (cdd.loaded)
{
*area = scd.word_ram[0];
*size = 0x20000;
return "CD WORD RAM[0] (1M)";
}
else return NULL;
case 6:
if (cdd.loaded)
{
*area = scd.word_ram[1];
*size = 0x20000;
return "CD WORD RAM[1] (1M)";
}
else return NULL;
case 7:
if (cdd.loaded)
{
*area = scd.word_ram_2M;
*size = 0x40000;
return "CD WORD RAM (2M)";
}
else return NULL;
case 8:
if (cdd.loaded)
{
*area = scd.bram;
*size = 0x2000;
return "CD BRAM";
}
else return NULL;
case 9:
*area = boot_rom;
*size = 0x800;
return "BOOT ROM";
default:
return NULL;
}
}
GPGX_EX void gpgx_get_sram(void **area, int *size)
{
if (!area || !size)
return;
if (sram.on)
{
if (area)
*area = sram.sram;
if (size)
*size = 0x10000;
*area = sram.sram;
*size = 0x10000;
}
else if (scd.cartridge.id)
{
if (area)
*area = scd.cartridge.area;
if (size)
*size = scd.cartridge.mask + 1 + 0x2000;
*area = scd.cartridge.area;
*size = scd.cartridge.mask + 1 + 0x2000;
}
else if (cdd.loaded)
{
if (area)
*area = scd.bram;
if (size)
*size = 0x2000;
*area = scd.bram;
*size = 0x2000;
}
else
{

Binary file not shown.