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:
CasualPokePlayer 2024-04-30 20:04:22 -07:00
parent 5fc8dd6690
commit 1b742cf356
3 changed files with 143 additions and 25 deletions

Binary file not shown.

@ -1 +1 @@
Subproject commit c8aeb3624b027339722255e849b910cfc11113e1
Subproject commit 351b83dd49a028c1743afab734b392aa61fd04c5

View File

@ -12,6 +12,12 @@
#include <vdp_render.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;
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_US[256] = "CD_BIOS_US";
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_EU[256] = "MS_BIOS_EU";
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;
}
extern int eeprom_i2c_get_size(void);
// internal: computes sram size (no brams)
static int saveramsize(void)
{
@ -316,6 +321,13 @@ GPGX_EX void* gpgx_get_sram(int *size)
{
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();
return sram.sram;
}
@ -393,7 +405,11 @@ GPGX_EX void gpgx_poke_cram(int addr, uint8 val)
p = (uint16 *)&cram[addr & 0x7E];
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)
{
@ -406,7 +422,10 @@ GPGX_EX void gpgx_poke_cram(int addr, uint8 val)
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)
{
@ -460,19 +479,51 @@ GPGX_EX const char* gpgx_get_memdom(int which, void **area, int *size)
switch (which)
{
case 0:
*area = work_ram;
*size = 0x10000;
return "68K RAM";
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
{
*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:
*area = zram;
*size = 0x2000;
return "Z80 RAM";
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
{
*area = zram;
*size = 0x2000;
return "Z80 RAM";
}
else return NULL;
case 2:
if (!cdd.loaded)
{
*area = ext.md_cart.rom;
*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)
{
@ -530,39 +581,80 @@ GPGX_EX const char* gpgx_get_memdom(int which, void **area, int *size)
}
else return NULL;
case 9:
*area = boot_rom;
*size = 0x800;
return "BOOT ROM";
default:
return NULL;
if (system_bios & SYSTEM_MD)
{
*area = boot_rom;
*size = 0x800;
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:
// these should be mutually exclusive
if (sram.on)
{
*area = sram.sram;
*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";
}
else if ((system_hw & SYSTEM_PBC) != SYSTEM_MD)
{
*area = &work_ram[0x2000];
*size = sms_cart_ram_size();
return "Cart (Volatile) RAM";
}
else return NULL;
case 11:
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
{
// MD has more CRAM
*size = 0x80;
}
else
{
*size = 0x40;
}
*area = cram;
*size = 128;
return "CRAM";
case 12:
*area = vsram;
*size = 128;
return "VSRAM";
case 13:
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
{
// MD has more VRAM
*size = 0x10000;
}
else
{
*size = 0x4000;
}
*area = vram;
*size = 65536;
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];
if (m.base && !m.write8)
m.base[(addr & 0xffff) ^ 1] = data;
// note: this is not valid for MD
z80_writemap[addr >> 10][addr & 0x3FF] = 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)
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)
{
cpu_memory_map m = m68k.memory_map[addr >> 16 & 0xff];
@ -579,6 +678,7 @@ GPGX_EX unsigned gpgx_peek_m68k_bus(unsigned addr)
else
return 0xff;
}
GPGX_EX unsigned gpgx_peek_s68k_bus(unsigned addr)
{
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++)
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
if (system_hw == SYSTEM_SMS || system_hw == SYSTEM_SMS2 || system_hw == SYSTEM_GG || system_hw == SYSTEM_SG)
// Hacky but effective. Setting the correct controller type here if this is sms or GG
// 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++)
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
if (!load_rom("PRIMARY_CD"))
@ -961,6 +1076,8 @@ GPGX_EX int gpgx_getregs(gpregister_t *regs)
int ret = 0;
// 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++;
MAKEREG(D0);
MAKEREG(D1);
@ -985,6 +1102,7 @@ GPGX_EX int gpgx_getregs(gpregister_t *regs)
MAKEREG(ISP);
MAKEREG(IR);
#undef MAKEREG
}
// 13
#define MAKEREG(x) regs->name = "Z80 " #x; regs->value = Z80.x.d; regs++; ret++;