Fixup GPGX memory domains / getregister when not emulating a Genesis; fix bug using system_hw when not yet set; add TMSS bootrom support (closes #2230)
This commit is contained in:
parent
5fc8dd6690
commit
1b742cf356
Binary file not shown.
|
@ -1 +1 @@
|
||||||
Subproject commit c8aeb3624b027339722255e849b910cfc11113e1
|
Subproject commit 351b83dd49a028c1743afab734b392aa61fd04c5
|
|
@ -12,6 +12,12 @@
|
||||||
#include <vdp_render.h>
|
#include <vdp_render.h>
|
||||||
#include <debug/cpuhook.h>
|
#include <debug/cpuhook.h>
|
||||||
|
|
||||||
|
// Functions added by us to peek at static structs
|
||||||
|
// (this is much less invasive than not making them static FYI)
|
||||||
|
extern int eeprom_i2c_get_size(void);
|
||||||
|
extern int sms_cart_is_codies(void);
|
||||||
|
extern int sms_cart_bootrom_size(void);
|
||||||
|
|
||||||
struct config_t config;
|
struct config_t config;
|
||||||
|
|
||||||
char GG_ROM[256] = "GG_ROM"; // game genie rom
|
char GG_ROM[256] = "GG_ROM"; // game genie rom
|
||||||
|
@ -22,6 +28,7 @@ char GG_BIOS[256] = "GG_BIOS"; // game gear bootrom
|
||||||
char CD_BIOS_EU[256] = "CD_BIOS_EU"; // cd bioses
|
char CD_BIOS_EU[256] = "CD_BIOS_EU"; // cd bioses
|
||||||
char CD_BIOS_US[256] = "CD_BIOS_US";
|
char CD_BIOS_US[256] = "CD_BIOS_US";
|
||||||
char CD_BIOS_JP[256] = "CD_BIOS_JP";
|
char CD_BIOS_JP[256] = "CD_BIOS_JP";
|
||||||
|
char MD_BIOS[256] = "MD_BIOS"; // genesis tmss bootrom
|
||||||
char MS_BIOS_US[256] = "MS_BIOS_US"; // master system bioses
|
char MS_BIOS_US[256] = "MS_BIOS_US"; // master system bioses
|
||||||
char MS_BIOS_EU[256] = "MS_BIOS_EU";
|
char MS_BIOS_EU[256] = "MS_BIOS_EU";
|
||||||
char MS_BIOS_JP[256] = "MS_BIOS_JP";
|
char MS_BIOS_JP[256] = "MS_BIOS_JP";
|
||||||
|
@ -249,8 +256,6 @@ GPGX_EX void gpgx_get_vdp_view(vdpview_t *view)
|
||||||
view->ntw.baseaddr = ntwb;
|
view->ntw.baseaddr = ntwb;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int eeprom_i2c_get_size(void);
|
|
||||||
|
|
||||||
// internal: computes sram size (no brams)
|
// internal: computes sram size (no brams)
|
||||||
static int saveramsize(void)
|
static int saveramsize(void)
|
||||||
{
|
{
|
||||||
|
@ -316,6 +321,13 @@ GPGX_EX void* gpgx_get_sram(int *size)
|
||||||
{
|
{
|
||||||
if (sram.on)
|
if (sram.on)
|
||||||
{
|
{
|
||||||
|
// codies is not actually battery backed, don't expose it as SRAM
|
||||||
|
if (sms_cart_is_codies())
|
||||||
|
{
|
||||||
|
*size = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
*size = saveramsize();
|
*size = saveramsize();
|
||||||
return sram.sram;
|
return sram.sram;
|
||||||
}
|
}
|
||||||
|
@ -393,7 +405,11 @@ GPGX_EX void gpgx_poke_cram(int addr, uint8 val)
|
||||||
|
|
||||||
p = (uint16 *)&cram[addr & 0x7E];
|
p = (uint16 *)&cram[addr & 0x7E];
|
||||||
data = *p;
|
data = *p;
|
||||||
data = ((data & 0x1C0) << 3) | ((data & 0x038) << 2) | ((data & 0x007) << 1);
|
|
||||||
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
|
{
|
||||||
|
data = ((data & 0x1C0) << 3) | ((data & 0x038) << 2) | ((data & 0x007) << 1);
|
||||||
|
}
|
||||||
|
|
||||||
if (addr & 1)
|
if (addr & 1)
|
||||||
{
|
{
|
||||||
|
@ -406,7 +422,10 @@ GPGX_EX void gpgx_poke_cram(int addr, uint8 val)
|
||||||
data |= val << 8;
|
data |= val << 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = ((data & 0xE00) >> 3) | ((data & 0x0E0) >> 2) | ((data & 0x00E) >> 1);
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
|
{
|
||||||
|
data = ((data & 0xE00) >> 3) | ((data & 0x0E0) >> 2) | ((data & 0x00E) >> 1);
|
||||||
|
}
|
||||||
|
|
||||||
if (*p != data)
|
if (*p != data)
|
||||||
{
|
{
|
||||||
|
@ -460,19 +479,51 @@ GPGX_EX const char* gpgx_get_memdom(int which, void **area, int *size)
|
||||||
switch (which)
|
switch (which)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
*area = work_ram;
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
*size = 0x10000;
|
{
|
||||||
return "68K RAM";
|
*area = work_ram;
|
||||||
|
*size = 0x10000;
|
||||||
|
return "68K RAM";
|
||||||
|
}
|
||||||
|
else if (system_hw == SYSTEM_SG)
|
||||||
|
{
|
||||||
|
*area = work_ram;
|
||||||
|
*size = 0x400;
|
||||||
|
return "Main RAM";
|
||||||
|
}
|
||||||
|
else if (system_hw == SYSTEM_SGII)
|
||||||
|
{
|
||||||
|
*area = work_ram;
|
||||||
|
*size = 0x800;
|
||||||
|
return "Main RAM";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*area = work_ram;
|
||||||
|
*size = 0x2000;
|
||||||
|
return "Main RAM";
|
||||||
|
}
|
||||||
case 1:
|
case 1:
|
||||||
*area = zram;
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
*size = 0x2000;
|
{
|
||||||
return "Z80 RAM";
|
*area = zram;
|
||||||
|
*size = 0x2000;
|
||||||
|
return "Z80 RAM";
|
||||||
|
}
|
||||||
|
else return NULL;
|
||||||
case 2:
|
case 2:
|
||||||
if (!cdd.loaded)
|
if (!cdd.loaded)
|
||||||
{
|
{
|
||||||
*area = ext.md_cart.rom;
|
*area = ext.md_cart.rom;
|
||||||
*size = ext.md_cart.romsize;
|
*size = ext.md_cart.romsize;
|
||||||
return "MD CART";
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
|
{
|
||||||
|
return "MD CART";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "ROM";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (scd.cartridge.id)
|
else if (scd.cartridge.id)
|
||||||
{
|
{
|
||||||
|
@ -530,39 +581,80 @@ GPGX_EX const char* gpgx_get_memdom(int which, void **area, int *size)
|
||||||
}
|
}
|
||||||
else return NULL;
|
else return NULL;
|
||||||
case 9:
|
case 9:
|
||||||
*area = boot_rom;
|
if (system_bios & SYSTEM_MD)
|
||||||
*size = 0x800;
|
{
|
||||||
return "BOOT ROM";
|
*area = boot_rom;
|
||||||
default:
|
*size = 0x800;
|
||||||
return NULL;
|
return "MD BOOT ROM";
|
||||||
|
}
|
||||||
|
else if (system_bios & (SYSTEM_SMS | SYSTEM_GG))
|
||||||
|
{
|
||||||
|
*area = &ext.md_cart.rom[0x400000];
|
||||||
|
*size = sms_cart_bootrom_size();
|
||||||
|
return "BOOT ROM";
|
||||||
|
}
|
||||||
|
else return NULL;
|
||||||
case 10:
|
case 10:
|
||||||
|
// these should be mutually exclusive
|
||||||
if (sram.on)
|
if (sram.on)
|
||||||
{
|
{
|
||||||
*area = sram.sram;
|
*area = sram.sram;
|
||||||
*size = saveramsize();
|
*size = saveramsize();
|
||||||
|
|
||||||
|
// Codemasters mapper SRAM is only used by 1 game
|
||||||
|
// and that 1 game does not actually have a battery
|
||||||
|
// (this also mimics SMSHawk's behavior)
|
||||||
|
if (sms_cart_is_codies())
|
||||||
|
{
|
||||||
|
return "Cart (Volatile) RAM";
|
||||||
|
}
|
||||||
|
|
||||||
return "SRAM";
|
return "SRAM";
|
||||||
}
|
}
|
||||||
|
else if ((system_hw & SYSTEM_PBC) != SYSTEM_MD)
|
||||||
|
{
|
||||||
|
*area = &work_ram[0x2000];
|
||||||
|
*size = sms_cart_ram_size();
|
||||||
|
return "Cart (Volatile) RAM";
|
||||||
|
}
|
||||||
else return NULL;
|
else return NULL;
|
||||||
case 11:
|
case 11:
|
||||||
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
|
{
|
||||||
|
// MD has more CRAM
|
||||||
|
*size = 0x80;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*size = 0x40;
|
||||||
|
}
|
||||||
*area = cram;
|
*area = cram;
|
||||||
*size = 128;
|
|
||||||
return "CRAM";
|
return "CRAM";
|
||||||
case 12:
|
case 12:
|
||||||
*area = vsram;
|
*area = vsram;
|
||||||
*size = 128;
|
*size = 128;
|
||||||
return "VSRAM";
|
return "VSRAM";
|
||||||
case 13:
|
case 13:
|
||||||
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
|
{
|
||||||
|
// MD has more VRAM
|
||||||
|
*size = 0x10000;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*size = 0x4000;
|
||||||
|
}
|
||||||
*area = vram;
|
*area = vram;
|
||||||
*size = 65536;
|
|
||||||
return "VRAM";
|
return "VRAM";
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GPGX_EX void gpgx_write_m68k_bus(unsigned addr, unsigned data)
|
GPGX_EX void gpgx_write_z80_bus(unsigned addr, unsigned data)
|
||||||
{
|
{
|
||||||
cpu_memory_map m = m68k.memory_map[addr >> 16 & 0xff];
|
// note: this is not valid for MD
|
||||||
if (m.base && !m.write8)
|
z80_writemap[addr >> 10][addr & 0x3FF] = data;
|
||||||
m.base[(addr & 0xffff) ^ 1] = data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GPGX_EX void gpgx_write_s68k_bus(unsigned addr, unsigned data)
|
GPGX_EX void gpgx_write_s68k_bus(unsigned addr, unsigned data)
|
||||||
|
@ -571,6 +663,13 @@ GPGX_EX void gpgx_write_s68k_bus(unsigned addr, unsigned data)
|
||||||
if (m.base && !m.write8)
|
if (m.base && !m.write8)
|
||||||
m.base[(addr & 0xffff) ^ 1] = data;
|
m.base[(addr & 0xffff) ^ 1] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GPGX_EX unsigned gpgx_peek_z80_bus(unsigned addr)
|
||||||
|
{
|
||||||
|
// note: this is not valid for MD
|
||||||
|
return z80_readmap[addr >> 10][addr & 0x3FF];
|
||||||
|
}
|
||||||
|
|
||||||
GPGX_EX unsigned gpgx_peek_m68k_bus(unsigned addr)
|
GPGX_EX unsigned gpgx_peek_m68k_bus(unsigned addr)
|
||||||
{
|
{
|
||||||
cpu_memory_map m = m68k.memory_map[addr >> 16 & 0xff];
|
cpu_memory_map m = m68k.memory_map[addr >> 16 & 0xff];
|
||||||
|
@ -579,6 +678,7 @@ GPGX_EX unsigned gpgx_peek_m68k_bus(unsigned addr)
|
||||||
else
|
else
|
||||||
return 0xff;
|
return 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
GPGX_EX unsigned gpgx_peek_s68k_bus(unsigned addr)
|
GPGX_EX unsigned gpgx_peek_s68k_bus(unsigned addr)
|
||||||
{
|
{
|
||||||
cpu_memory_map m = s68k.memory_map[addr >> 16 & 0xff];
|
cpu_memory_map m = s68k.memory_map[addr >> 16 & 0xff];
|
||||||
|
@ -847,10 +947,25 @@ GPGX_EX int gpgx_init(const char* feromextension,
|
||||||
for (int i = 0; i < MAX_INPUTS; i++)
|
for (int i = 0; i < MAX_INPUTS; i++)
|
||||||
config.input[i].padtype = settings->SixButton ? DEVICE_PAD6B : DEVICE_PAD3B;
|
config.input[i].padtype = settings->SixButton ? DEVICE_PAD6B : DEVICE_PAD3B;
|
||||||
|
|
||||||
// Hacky but effective. Setting the correct controller type here if this is sms or GG
|
// Hacky but effective. Setting the correct controller type here if this is sms or GG
|
||||||
if (system_hw == SYSTEM_SMS || system_hw == SYSTEM_SMS2 || system_hw == SYSTEM_GG || system_hw == SYSTEM_SG)
|
// note that we can't use system_hw yet, that's set in load_rom
|
||||||
|
if (memcmp("GEN", &romextension[0], 3) != 0)
|
||||||
|
{
|
||||||
for (int i = 0; i < MAX_INPUTS; i++)
|
for (int i = 0; i < MAX_INPUTS; i++)
|
||||||
config.input[i].padtype = DEVICE_PAD2B;
|
config.input[i].padtype = DEVICE_PAD2B;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// gpgx won't load the genesis bootrom itself, we have to do that manually
|
||||||
|
if (config.bios & 1)
|
||||||
|
{
|
||||||
|
// not fatal if this fails (unless we're recording a movie, which we handle elsewhere)
|
||||||
|
if (load_archive(MD_BIOS, boot_rom, sizeof(boot_rom), NULL) != 0)
|
||||||
|
{
|
||||||
|
system_bios |= SYSTEM_MD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// first try to load our main CD
|
// first try to load our main CD
|
||||||
if (!load_rom("PRIMARY_CD"))
|
if (!load_rom("PRIMARY_CD"))
|
||||||
|
@ -961,6 +1076,8 @@ GPGX_EX int gpgx_getregs(gpregister_t *regs)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
// 22
|
// 22
|
||||||
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
|
{
|
||||||
#define MAKEREG(x) regs->name = "M68K " #x; regs->value = m68k_get_reg(M68K_REG_##x); regs++; ret++;
|
#define MAKEREG(x) regs->name = "M68K " #x; regs->value = m68k_get_reg(M68K_REG_##x); regs++; ret++;
|
||||||
MAKEREG(D0);
|
MAKEREG(D0);
|
||||||
MAKEREG(D1);
|
MAKEREG(D1);
|
||||||
|
@ -985,6 +1102,7 @@ GPGX_EX int gpgx_getregs(gpregister_t *regs)
|
||||||
MAKEREG(ISP);
|
MAKEREG(ISP);
|
||||||
MAKEREG(IR);
|
MAKEREG(IR);
|
||||||
#undef MAKEREG
|
#undef MAKEREG
|
||||||
|
}
|
||||||
|
|
||||||
// 13
|
// 13
|
||||||
#define MAKEREG(x) regs->name = "Z80 " #x; regs->value = Z80.x.d; regs++; ret++;
|
#define MAKEREG(x) regs->name = "Z80 " #x; regs->value = Z80.x.d; regs++; ret++;
|
||||||
|
|
Loading…
Reference in New Issue