gpgx: port some svp changes from old branch. that game sucked
This commit is contained in:
parent
23345eb7d3
commit
e231cd5084
|
@ -48,7 +48,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx64
|
|||
SbrkHeapSizeKB = 256,
|
||||
SealedHeapSizeKB = 36 * 1024,
|
||||
InvisibleHeapSizeKB = 4 * 1024,
|
||||
PlainHeapSizeKB = 64
|
||||
PlainHeapSizeKB = 64,
|
||||
MmapHeapSizeKB = 512
|
||||
});
|
||||
|
||||
using (_elf.EnterExit())
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -393,17 +393,6 @@ void md_cart_init(void)
|
|||
if (strstr(rominfo.international,"Virtua Racing"))
|
||||
{
|
||||
svp_init();
|
||||
|
||||
m68k.memory_map[0x30].base = svp->dram;
|
||||
m68k.memory_map[0x30].read16 = NULL;
|
||||
m68k.memory_map[0x30].write16 = svp_write_dram;
|
||||
|
||||
m68k.memory_map[0x31].base = svp->dram + 0x10000;
|
||||
m68k.memory_map[0x31].read16 = NULL;
|
||||
m68k.memory_map[0x31].write16 = svp_write_dram;
|
||||
|
||||
m68k.memory_map[0x39].read16 = svp_read_cell_1;
|
||||
m68k.memory_map[0x3a].read16 = svp_read_cell_2;
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
|
|
|
@ -1,23 +1,79 @@
|
|||
/*
|
||||
basic, incomplete SSP160x (SSP1601?) interpreter
|
||||
with SVP memory controller emu
|
||||
|
||||
(c) Copyright 2008, Grazvydas "notaz" Ignotas
|
||||
Free for non-commercial use.
|
||||
|
||||
For commercial use, separate licencing terms must be obtained.
|
||||
|
||||
Modified for Genesis Plus GX (Eke-Eke): added BIG ENDIAN support, fixed addr/code inversion
|
||||
basic, incomplete SSP160x (SSP1601?) interpreter
|
||||
with SVP memory controller emu
|
||||
(c) Copyright 2008, Grazvydas "notaz" Ignotas
|
||||
Free for non-commercial use.
|
||||
For commercial use, separate licencing terms must be obtained.
|
||||
Modified for Genesis Plus GX (Eke-Eke): added BIG ENDIAN support, fixed addr/code inversion
|
||||
*/
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
svp_t *svp = NULL;
|
||||
svp_t *svp;
|
||||
|
||||
static void svp_write_dram(uint32 address, uint32 data)
|
||||
{
|
||||
*(uint16 *)(svp->dram + (address & 0x1fffe)) = data;
|
||||
if (data)
|
||||
{
|
||||
if (address == 0x30fe06)
|
||||
svp->ssp1601.emu_status &= ~SSP_WAIT_30FE06;
|
||||
else if (address == 0x30fe08)
|
||||
svp->ssp1601.emu_status &= ~SSP_WAIT_30FE08;
|
||||
}
|
||||
}
|
||||
|
||||
static uint32 svp_read_cell_1(uint32 address)
|
||||
{
|
||||
address = (address & 0xe002) | ((address & 0x7c) << 6) | ((address & 0x1f80) >> 5);
|
||||
return *(uint16 *)(svp->dram + address);
|
||||
}
|
||||
|
||||
static uint32 svp_read_cell_2(uint32 address)
|
||||
{
|
||||
address = (address & 0xf002) | ((address & 0x3c) << 6) | ((address & 0xfc0) >> 4);
|
||||
return *(uint16 *)(svp->dram + address);
|
||||
}
|
||||
|
||||
static uint32 svp_read_cell_byte(uint32 address)
|
||||
{
|
||||
uint16 data = m68k.memory_map[address >> 16].read16(address);
|
||||
|
||||
if (address & 0x01)
|
||||
{
|
||||
return (data & 0xff);
|
||||
}
|
||||
|
||||
return (data >> 8);
|
||||
}
|
||||
|
||||
void svp_init(void)
|
||||
{
|
||||
svp = malloc(sizeof(svp_t));
|
||||
svp = malloc(sizeof(*svp));
|
||||
memset(svp, 0, sizeof(*svp));
|
||||
|
||||
m68k.memory_map[0x30].base = svp->dram;
|
||||
m68k.memory_map[0x30].read8 = NULL;
|
||||
m68k.memory_map[0x30].read16 = NULL;
|
||||
m68k.memory_map[0x30].write8 = NULL;
|
||||
m68k.memory_map[0x30].write16 = svp_write_dram;
|
||||
zbank_memory_map[0x30].read = NULL;
|
||||
zbank_memory_map[0x30].write = NULL;
|
||||
|
||||
m68k.memory_map[0x31].base = svp->dram + 0x10000;
|
||||
m68k.memory_map[0x31].read8 = NULL;
|
||||
m68k.memory_map[0x31].read16 = NULL;
|
||||
m68k.memory_map[0x31].write8 = NULL;
|
||||
m68k.memory_map[0x31].write16 = NULL;
|
||||
zbank_memory_map[0x31].read = NULL;
|
||||
zbank_memory_map[0x31].write = NULL;
|
||||
|
||||
m68k.memory_map[0x39].read8 = svp_read_cell_byte;
|
||||
m68k.memory_map[0x39].read16 = svp_read_cell_1;
|
||||
zbank_memory_map[0x39].read = svp_read_cell_byte;
|
||||
m68k.memory_map[0x3a].read8 = svp_read_cell_byte;
|
||||
m68k.memory_map[0x3a].read16 = svp_read_cell_2;
|
||||
zbank_memory_map[0x3a].read = svp_read_cell_byte;
|
||||
}
|
||||
|
||||
void svp_reset(void)
|
||||
|
@ -25,25 +81,3 @@ void svp_reset(void)
|
|||
memcpy(svp->iram_rom + 0x800, cart.rom + 0x800, 0x20000 - 0x800);
|
||||
ssp1601_reset(&svp->ssp1601);
|
||||
}
|
||||
|
||||
void svp_write_dram(uint32 address, uint32 data)
|
||||
{
|
||||
*(uint16 *)(svp->dram + (address & 0x1fffe)) = data;
|
||||
if ((address == 0x30fe06) && data) svp->ssp1601.emu_status &= ~SSP_WAIT_30FE06;
|
||||
if ((address == 0x30fe08) && data) svp->ssp1601.emu_status &= ~SSP_WAIT_30FE08;
|
||||
}
|
||||
|
||||
uint32 svp_read_cell_1(uint32 address)
|
||||
{
|
||||
address >>= 1;
|
||||
address = (address & 0x7001) | ((address & 0x3e) << 6) | ((address & 0xfc0) >> 5);
|
||||
return *(uint16 *)(svp->dram + (address & 0x1fffe));
|
||||
}
|
||||
|
||||
uint32 svp_read_cell_2(uint32 address)
|
||||
{
|
||||
address >>= 1;
|
||||
address = (address & 0x7801) | ((address & 0x1e) << 6) | ((address & 0x7e0) >> 4);
|
||||
return *(uint16 *)(svp->dram + (address & 0x1fffe));
|
||||
}
|
||||
|
||||
|
|
|
@ -26,8 +26,5 @@ extern svp_t *svp;
|
|||
|
||||
extern void svp_init(void);
|
||||
extern void svp_reset(void);
|
||||
extern void svp_write_dram(uint32 address, uint32 data);
|
||||
extern uint32 svp_read_cell_1(uint32 address);
|
||||
extern uint32 svp_read_cell_2(uint32 address);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -416,6 +416,18 @@ unsigned int ctrl_io_read_byte(unsigned int address)
|
|||
case 0x44: /* RADICA */
|
||||
case 0x50: /* SVP */
|
||||
{
|
||||
if ((address & 0xFC) == 0x00)
|
||||
{
|
||||
unsigned int data = svp->ssp1601.gr[SSP_XST].byte.h;
|
||||
return (address & 1) ? (data & 0xFF) : (data >> 8);
|
||||
}
|
||||
|
||||
if ((address & 0xFE) == 0x04)
|
||||
{
|
||||
unsigned int data = svp->ssp1601.gr[SSP_PM0].byte.h;
|
||||
svp->ssp1601.gr[SSP_PM0].byte.h &= ~1;
|
||||
return (address & 1) ? (data & 0xFF) : (data >> 8);
|
||||
}
|
||||
return m68k_read_bus_8(address);
|
||||
}
|
||||
|
||||
|
@ -532,12 +544,12 @@ unsigned int ctrl_io_read_word(unsigned int address)
|
|||
|
||||
case 0x50: /* SVP */
|
||||
{
|
||||
if ((address & 0xFD) == 0)
|
||||
if ((address & 0xFC) == 0)
|
||||
{
|
||||
return svp->ssp1601.gr[SSP_XST].byte.h;
|
||||
}
|
||||
|
||||
if ((address & 0xFF) == 4)
|
||||
if ((address & 0xFE) == 4)
|
||||
{
|
||||
unsigned int data = svp->ssp1601.gr[SSP_PM0].byte.h;
|
||||
svp->ssp1601.gr[SSP_PM0].byte.h &= ~1;
|
||||
|
|
Loading…
Reference in New Issue