#include "shared.h"
#include "eeprom_i2c.h"
#include "eeprom_spi.h"
#include "gamepad.h"
#define CART_CNT (55)
typedef struct
{
uint16 chk_1;
uint16 chk_2;
uint8 bank_start;
uint8 bank_end;
cart_hw_t cart_hw;
} md_entry_t;
static void mapper_sega_w(uint32 data);
static void mapper_ssf2_w(uint32 address, uint32 data);
static void mapper_sf001_w(uint32 address, uint32 data);
static void mapper_sf002_w(uint32 address, uint32 data);
static void mapper_sf004_w(uint32 address, uint32 data);
static uint32 mapper_sf004_r(uint32 address);
static void mapper_t5740_w(uint32 address, uint32 data);
static uint32 mapper_t5740_r(uint32 address);
static uint32 mapper_smw_64_r(uint32 address);
static void mapper_smw_64_w(uint32 address, uint32 data);
static void mapper_realtec_w(uint32 address, uint32 data);
static void mapper_seganet_w(uint32 address, uint32 data);
static void mapper_32k_w(uint32 data);
static void mapper_64k_w(uint32 data);
static void mapper_64k_multi_w(uint32 address);
static uint32 mapper_radica_r(uint32 address);
static void default_time_w(uint32 address, uint32 data);
static void default_regs_w(uint32 address, uint32 data);
static uint32 default_regs_r(uint32 address);
static uint32 default_regs_r_16(uint32 address);
static uint32 custom_regs_r(uint32 address);
static void custom_regs_w(uint32 address, uint32 data);
static void custom_alt_regs_w(uint32 address, uint32 data);
static uint32 topshooter_r(uint32 address);
static void topshooter_w(uint32 address, uint32 data);
static uint32 tekken_regs_r(uint32 address);
static void tekken_regs_w(uint32 address, uint32 data);
static const md_entry_t rom_database[CART_CNT] =
{
{0x0000,0x06ab,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}},
{0xffff,0xf863,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}},
{0xffff,0x44fb,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}},
{0x0000,0x2326,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,1,mapper_radica_r,NULL,NULL,NULL}},
{0x24f4,0xfc84,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,mapper_radica_r,NULL,NULL,NULL}},
{0x104f,0x32e9,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,mapper_radica_r,NULL,NULL,NULL}},
{0x9490,0x8180,0x40,0x6f,{{0x00,0x00,0x00,0x00},{0xf0000c,0xf0000c,0xf0000c,0xf0000c},{0x400000,0x400004,0x400008,0x40000c},0,1,NULL,NULL,default_regs_r,custom_alt_regs_w}},
{0x4eb9,0x5d8b,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x00ff,0x5d34,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0404,0x1b40,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x47f9,0x17e5,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0000,0x507c,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0000,0x7d6e,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0000,0x6ff8,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0000,0x843c,0x70,0x7f,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,1,NULL,NULL,NULL,custom_regs_w}},
{0x0000,0xc2f0,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,NULL,tekken_regs_r,tekken_regs_w}},
{0xffff,0x1d9b,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x0000,0x8ec8,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x2020,0xed9c,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x30b9,0x1c2a,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x6001,0x0211,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0xffff,0x5d98,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x3332,0x872b,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0xa697,0xa697,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x000000,0x000000,0x000000},0,0,NULL,NULL,NULL,default_regs_w}},
{0x8104,0x0517,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400001,0x000000,0x000000,0x000000},0,0,NULL,NULL,NULL,default_regs_w}},
{0x0000,0x9c5e,0x40,0x40,{{0xab,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400046,0x000000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x7037,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x3b95,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x9dc4,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0c44,0xba81,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}},
{0xfb40,0x4bed,0x40,0x40,{{0x00,0xaa,0x00,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x400002,0x000000,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}},
{0xffff,0x0903,0x40,0x40,{{0x00,0x00,0xc9,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x400004,0x000000},0,0,NULL,NULL,default_regs_r_16,NULL}},
{0x0000,0x1585,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}},
{0x0000,0x16cd,0x40,0x40,{{0x55,0x0f,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0xed61,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x1a28,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x5843,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x2288,0x40,0x40,{{0x55,0x0f,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0080,0x3dba,0x40,0x40,{{0x55,0x0f,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0xffff,0xd472,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0xf8d9,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x19ff,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x0c5b,0x40,0x40,{{0x63,0x98,0xc9,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0xd0a0,0x48,0x4f,{{0x00,0x00,0xaa,0xf0},{0xffffff,0xffffff,0xfc0000,0xfc0000},{0x000000,0x000000,0x480000,0x4c0000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x9d0e,0x40,0x40,{{0x0c,0x00,0xc9,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x400004,0x400006},0,0,default_regs_r,NULL,default_regs_r,NULL}},
{0xc65a,0xc65a,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}},
{0x0000,0x96b0,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}},
{0xffff,0x0474,0x00,0x00,{{0x0a,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}},
{0x2020,0xb4eb,0x00,0x00,{{0x1c,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}},
{0x0000,0x021e,0x00,0x00,{{0x00,0x01,0x1f,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0xa13002,0xa1303e,0x000000},0,0,custom_regs_r,default_regs_w,NULL,NULL}},
{0xd6fc,0x1eb1,0x00,0x00,{{0x00,0x01,0x1f,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0xa13002,0xa1303e,0x000000},0,0,custom_regs_r,default_regs_w,NULL,NULL}},
{0xd6fc,0x6319,0x00,0x00,{{0x14,0x01,0x1f,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0xa13002,0xa1303e,0x000000},0,0,default_regs_r,m68k_unused_8_w,NULL,NULL}},
{0x7f7f,0x2aad,0x00,0x00,{{0x28,0x01,0x1f,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0xa13002,0xa1303e,0x000000},0,0,default_regs_r,m68k_unused_8_w,NULL,NULL}},
{0x0000,0xf9d1,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,mapper_seganet_w,NULL,NULL}},
{0xffff,0x3632,0x20,0x20,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,NULL,topshooter_r,topshooter_w}}
};
void md_cart_init(void)
{
int i;
unsigned int size = 0x10000;
while (cart.romsize > size)
size <<= 1;
if (strstr(rominfo.international,"SONIC & KNUCKLES"))
{
size = 0x400000;
}
if (cart.romsize < size)
{
if (size < MAXROMSIZE)
{
memset(cart.rom + cart.romsize, 0xff, size - cart.romsize);
}
else
{
memset(cart.rom + cart.romsize, 0xff, MAXROMSIZE - cart.romsize);
}
}
cart.mask = size - 1;
for (i=0; i<0x40; i++)
{
m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask);
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].read = NULL;
zbank_memory_map[i].write = zbank_unused_w;
}
for (i=0x40; i<0x80; i++)
{
m68k.memory_map[i].base = cart.rom + (i<<16);
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].read = zbank_unused_r;
zbank_memory_map[i].write = zbank_unused_w;
}
if (strstr(rominfo.product,"00004054-01") && (cart.romsize == 0x80000))
{
for (i=0x00; i<0x10; i++)
{
m68k.memory_map[i].base = m68k.memory_map[i + 0x20].base = cart.rom + ((i & 0x03) << 16);
}
for (i=0x10; i<0x20; i++)
{
m68k.memory_map[i].base = m68k.memory_map[i + 0x20].base = cart.rom + 0x40000 + ((i & 0x03) << 16);
}
}
sram_init();
eeprom_i2c_init();
if (sram.on && !sram.custom)
{
if (cart.romsize <= sram.start)
{
m68k.memory_map[sram.start >> 16].base = sram.sram;
m68k.memory_map[sram.start >> 16].read8 = sram_read_byte;
m68k.memory_map[sram.start >> 16].read16 = sram_read_word;
m68k.memory_map[sram.start >> 16].write8 = sram_write_byte;
m68k.memory_map[sram.start >> 16].write16 = sram_write_word;
zbank_memory_map[sram.start >> 16].read = sram_read_byte;
zbank_memory_map[sram.start >> 16].write = sram_write_byte;
}
}
svp = NULL;
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;
}
cart.special = 0;
if ((strstr(rominfo.product,"00000000") && (rominfo.checksum == 0x168b)) ||
(strstr(rominfo.product,"00000000") && (rominfo.checksum == 0x165e)) ||
(strstr(rominfo.product,"00000000") && (rominfo.checksum == 0xcee0)) ||
(strstr(rominfo.product,"00000000") && (rominfo.checksum == 0x2c41)) ||
(strstr(rominfo.product,"XXXXXXXX") && (rominfo.checksum == 0xdf39)) ||
(strstr(rominfo.product,"T-123456") && (rominfo.checksum == 0x1eae)) ||
(strstr(rominfo.product,"T-120066") && (rominfo.checksum == 0x16a4)) ||
strstr(rominfo.product,"T-120096"))
{
if (cart.romsize <= 0x380000)
{
cart.special |= HW_J_CART;
if (input.system[1] != SYSTEM_WAYPLAY)
{
old_system[1] = input.system[1];
input.system[1] = SYSTEM_MD_GAMEPAD;
}
m68k.memory_map[0x38].read16 = jcart_read;
m68k.memory_map[0x38].write16 = jcart_write;
m68k.memory_map[0x3f].read16 = jcart_read;
m68k.memory_map[0x3f].write16 = jcart_write;
}
}
ggenie_shutdown();
areplay_shutdown();
switch (config.lock_on)
{
case TYPE_GG:
{
ggenie_init();
break;
}
case TYPE_AR:
{
areplay_init();
break;
}
case TYPE_SK:
{
FILE *f;
if (cart.romsize > 0x600000) break;
f = fopen(SK_ROM,"rb");
if (!f) break;
for (i=0; i<0x200000; i+=0x1000)
{
fread(cart.rom + 0x600000 + i, 0x1000, 1, f);
}
fclose(f);
f = fopen(SK_UPMEM,"rb");
if (!f) break;
for (i=0; i<0x40000; i+=0x1000)
{
fread(cart.rom + 0x900000 + i, 0x1000, 1, f);
}
fclose(f);
#ifdef LSB_FIRST
for (i=0; i<0x200000; i+=2)
{
uint8 temp = cart.rom[i + 0x600000];
cart.rom[i + 0x600000] = cart.rom[i + 0x600000 + 1];
cart.rom[i + 0x600000 + 1] = temp;
}
for (i=0; i<0x40000; i+=2)
{
uint8 temp = cart.rom[i + 0x900000];
cart.rom[i + 0x900000] = cart.rom[i + 0x900000 + 1];
cart.rom[i + 0x900000 + 1] = temp;
}
#endif
for (i=0x00; i<0x20; i++)
{
m68k.memory_map[i].base = cart.rom + 0x600000 + (i << 16);
}
cart.special |= HW_LOCK_ON;
break;
}
default:
{
break;
}
}
memset(&cart.hw, 0, sizeof(cart.hw));
for (i=0; i<CART_CNT; i++)
{
if ((rominfo.checksum == rom_database[i].chk_1) &&
(rominfo.realchecksum == rom_database[i].chk_2))
{
int j = rom_database[i].bank_start;
memcpy(&cart.hw, &(rom_database[i].cart_hw), sizeof(cart.hw));
while (j <= rom_database[i].bank_end)
{
if (cart.hw.regs_r)
{
m68k.memory_map[j].read8 = cart.hw.regs_r;
m68k.memory_map[j].read16 = cart.hw.regs_r;
zbank_memory_map[j].read = cart.hw.regs_r;
}
if (cart.hw.regs_w)
{
m68k.memory_map[j].write8 = cart.hw.regs_w;
m68k.memory_map[j].write16 = cart.hw.regs_w;
zbank_memory_map[j].write = cart.hw.regs_w;
}
j++;
}
i = CART_CNT;
}
}
if (cart.hw.realtec)
{
for (i=0; i<8; i++)
{
memcpy(cart.rom + 0x900000 + i*0x2000, cart.rom + 0x7e000, 0x2000);
}
for (i=0x00; i<0x40; i++)
{
m68k.memory_map[i].base = cart.rom + 0x900000;
}
}
if (strstr(rominfo.domestic,"SUPER STREET FIGHTER2"))
{
cart.hw.bankshift = 1;
cart.hw.time_w = mapper_ssf2_w;
}
else if (strstr(rominfo.product,"T-5740"))
{
cart.hw.bankshift = 1;
m68k.memory_map[0x01].read8 = mapper_t5740_r;
zbank_memory_map[0x01].read = mapper_t5740_r;
cart.hw.time_w = mapper_t5740_w;
cart.hw.time_r = eeprom_spi_read;
eeprom_spi_init();
}
else if (strstr(rominfo.ROMType,"SF") && strstr(rominfo.product,"001"))
{
m68k.memory_map[0x00].write8 = mapper_sf001_w;
m68k.memory_map[0x00].write16 = mapper_sf001_w;
zbank_memory_map[0x00].write = mapper_sf001_w;
cart.hw.time_w = m68k_unused_8_w;
}
else if (strstr(rominfo.ROMType,"SF") && strstr(rominfo.product,"002"))
{
m68k.memory_map[0x00].write8 = mapper_sf002_w;
m68k.memory_map[0x00].write16 = mapper_sf002_w;
zbank_memory_map[0x00].write = mapper_sf002_w;
cart.hw.time_w = m68k_unused_8_w;
}
else if (strstr(rominfo.ROMType,"SF") && strstr(rominfo.product,"004"))
{
m68k.memory_map[0x00].write8 = mapper_sf004_w;
m68k.memory_map[0x00].write16 = mapper_sf004_w;
zbank_memory_map[0x00].write = mapper_sf004_w;
cart.hw.time_r = mapper_sf004_r;
cart.hw.time_w = m68k_unused_8_w;
for (i=0x00; i<0x20; i++)
{
m68k.memory_map[i].base = cart.rom + ((i & 0x03) << 16);
}
for (i=0x20; i<0x30; i++)
{
m68k.memory_map[i].base = sram.sram;
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].read = m68k_read_bus_8;
zbank_memory_map[i].write = zbank_unused_w;
}
for (i=0x30; i<0x40; i++)
{
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].read = m68k_read_bus_8;
zbank_memory_map[i].write = zbank_unused_w;
}
}
else if ((*(uint16 *)(cart.rom + 0x08) == 0x6000) && (*(uint16 *)(cart.rom + 0x0a) == 0x01f6) && (rominfo.realchecksum == 0xf894))
{
for (i=0x08; i<0x10; i++)
{
m68k.memory_map[i].base = cart.rom + ((i & 7) << 16);
}
for (i=0x10; i<0x40; i++)
{
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].read = m68k_read_bus_8;
zbank_memory_map[i].write = zbank_unused_w;
}
for (i=0x60; i<0x70; i++)
{
m68k.memory_map[i].base = cart.rom + 0x0f0000;
m68k.memory_map[i].read8 = ((i & 0x07) < 0x04) ? NULL : mapper_smw_64_r;
m68k.memory_map[i].read16 = ((i & 0x07) < 0x04) ? NULL : mapper_smw_64_r;
m68k.memory_map[i].write8 = mapper_smw_64_w;
m68k.memory_map[i].write16 = mapper_smw_64_w;
zbank_memory_map[i].read = ((i & 0x07) < 0x04) ? NULL : mapper_smw_64_r;
zbank_memory_map[i].write = mapper_smw_64_w;
}
}
else if (cart.romsize > 0x400000)
{
for (i=0x40; i<0xA0; i++)
{
m68k.memory_map[i].base = cart.rom + (i<<16);
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
zbank_memory_map[i].read = NULL;
}
}
if (!cart.hw.time_w)
{
cart.hw.time_w = default_time_w;
}
}
void md_cart_reset(int hard_reset)
{
int i;
if (cart.hw.bankshift)
{
for (i=0x00; i<0x40; i++)
{
m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask);
}
}
if (svp)
{
svp_reset();
}
switch (config.lock_on)
{
case TYPE_GG:
{
ggenie_reset(hard_reset);
break;
}
case TYPE_AR:
{
areplay_reset(hard_reset);
break;
}
case TYPE_SK:
{
if (cart.special & HW_LOCK_ON)
{
for (i=0x30; i<0x40; i++)
{
m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask);
}
}
break;
}
default:
{
break;
}
}
}
int md_cart_context_save(uint8 *state)
{
int i;
int bufferptr = 0;
uint8 *base;
for (i=0; i<0x40; i++)
{
base = m68k.memory_map[i].base;
if (base == sram.sram)
{
state[bufferptr++] = 0xff;
}
else
{
state[bufferptr++] = ((base - cart.rom) >> 16) & 0xff;
}
}
save_param(cart.hw.regs, sizeof(cart.hw.regs));
if (svp)
{
save_param(svp->iram_rom, 0x800);
save_param(svp->dram,sizeof(svp->dram));
save_param(&svp->ssp1601,sizeof(ssp1601_t));
}
return bufferptr;
}
int md_cart_context_load(uint8 *state)
{
int i;
int bufferptr = 0;
uint8 offset;
for (i=0; i<0x40; i++)
{
offset = state[bufferptr++];
if (offset == 0xff)
{
m68k.memory_map[i].base = sram.sram;
m68k.memory_map[i].read8 = sram_read_byte;
m68k.memory_map[i].read16 = sram_read_word;
m68k.memory_map[i].write8 = sram_write_byte;
m68k.memory_map[i].write16 = sram_write_word;
zbank_memory_map[i].read = sram_read_byte;
zbank_memory_map[i].write = sram_write_byte;
}
else
{
if (m68k.memory_map[i].base == sram.sram)
{
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].read = NULL;
zbank_memory_map[i].write = zbank_unused_w;
}
m68k.memory_map[i].base = cart.rom + (offset << 16);
}
}
load_param(cart.hw.regs, sizeof(cart.hw.regs));
if (svp)
{
load_param(svp->iram_rom, 0x800);
load_param(svp->dram,sizeof(svp->dram));
load_param(&svp->ssp1601,sizeof(ssp1601_t));
}
return bufferptr;
}
static void mapper_sega_w(uint32 data)
{
int i;
if (data & 1)
{
if (sram.on)
{
m68k.memory_map[0x20].base = sram.sram;
m68k.memory_map[0x20].read8 = sram_read_byte;
m68k.memory_map[0x20].read16 = sram_read_word;
zbank_memory_map[0x20].read = sram_read_byte;
if (data & 2)
{
m68k.memory_map[0x20].write8 = m68k_unused_8_w;
m68k.memory_map[0x20].write16 = m68k_unused_16_w;
zbank_memory_map[0x20].write = zbank_unused_w;
}
else
{
m68k.memory_map[0x20].write8 = sram_write_byte;
m68k.memory_map[0x20].write16 = sram_write_word;
zbank_memory_map[0x20].write = sram_write_byte;
}
}
if ((cart.special & HW_LOCK_ON) && (config.lock_on == TYPE_SK))
{
for (i=0x30; i<0x40; i++)
{
m68k.memory_map[i].base = (cart.rom + 0x900000) + ((i & 3) << 16);
}
}
}
else
{
for (i=0x20; i<0x40; i++)
{
m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask);
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
zbank_memory_map[i].read = NULL;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].write = zbank_unused_w;
}
}
}
static void mapper_ssf2_w(uint32 address, uint32 data)
{
address = (address << 2) & 0x38;
if (address)
{
uint32 i;
uint8 *src = cart.rom + (data << 19);
for (i=0; i<8; i++)
{
m68k.memory_map[address++].base = src + (i<<16);
}
}
}
static void mapper_sf001_w(uint32 address, uint32 data)
{
switch ((address >> 8) & 0xf)
{
case 0xe:
{
int i;
if (data & 0x40)
{
for (i=0x00; i<0x40; i++)
{
m68k.memory_map[i].base = cart.rom + (i << 16);
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
m68k.memory_map[i].write8 = (i > 0x00) ? m68k_unused_8_w : mapper_sf001_w;
m68k.memory_map[i].write16 = (i > 0x00) ? m68k_unused_16_w : mapper_sf001_w;
zbank_memory_map[i].read = zbank_unused_r;
zbank_memory_map[i].write = (i > 0x00) ? m68k_unused_8_w : mapper_sf001_w;
}
}
else if (data & 0x80)
{
for (i=0x00; i<0x04; i++)
{
m68k.memory_map[i].base = cart.rom + ((0x38 + i) << 16);
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
zbank_memory_map[i].read = NULL;
}
for (i=0x04; i<(sram.start >> 16); i++)
{
m68k.memory_map[i].base = cart.rom + (i << 16);
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
zbank_memory_map[i].read = NULL;
}
while (i<0x40)
{
m68k.memory_map[i].base = sram.sram;
m68k.memory_map[i].read8 = sram_read_byte;
m68k.memory_map[i].read16 = sram_read_word;
m68k.memory_map[i].write8 = sram_write_byte;
m68k.memory_map[i].write16 = sram_write_word;
zbank_memory_map[i].read = sram_read_byte;
zbank_memory_map[i].write = sram_write_byte;
i++;
}
}
else
{
for (i=0x00; i<0x40; i++)
{
m68k.memory_map[i].base = cart.rom + (i << 16);
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
m68k.memory_map[i].write8 = (i > 0x00) ? m68k_unused_8_w : mapper_sf001_w;
m68k.memory_map[i].write16 = (i > 0x00) ? m68k_unused_16_w : mapper_sf001_w;
zbank_memory_map[i].read = NULL;
zbank_memory_map[i].write = (i > 0x00) ? m68k_unused_8_w : mapper_sf001_w;
}
}
if (data & 0x20)
{
m68k.memory_map[0x00].write8 = m68k_unused_8_w;
m68k.memory_map[0x00].write16 = m68k_unused_16_w;
zbank_memory_map[0x00].write = m68k_unused_8_w;
}
return;
}
default:
{
m68k_unused_8_w(address, data);
return;
}
}
}
static void mapper_sf002_w(uint32 address, uint32 data)
{
int i;
if (data & 0x80)
{
for (i=0x20; i<0x3C; i++)
{
m68k.memory_map[i].base = cart.rom + ((i & 0x1F) << 16);
}
}
else
{
for (i=0x20; i<0x3C; i++)
{
m68k.memory_map[i].base = cart.rom + (i << 16);
}
}
}
static void mapper_sf004_w(uint32 address, uint32 data)
{
int i;
switch ((address >> 8) & 0xf)
{
case 0xd:
{
if (data & 0x80)
{
for (i=0x20; i<0x30; i++)
{
m68k.memory_map[i].read8 = sram_read_byte;
m68k.memory_map[i].read16 = sram_read_word;
m68k.memory_map[i].write8 = sram_write_byte;
m68k.memory_map[i].write16 = sram_write_word;
zbank_memory_map[i].read = sram_read_byte;
zbank_memory_map[i].write = sram_write_byte;
}
}
else
{
for (i=0x20; i<0x30; i++)
{
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].read = m68k_read_bus_8;
zbank_memory_map[i].write = m68k_unused_8_w;
}
}
return;
}
case 0x0e:
{
if (data & 0x20)
{
for (i=0x00; i<0x20; i++)
{
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
zbank_memory_map[i].read = m68k_read_bus_8;
}
}
else if (data & 0x40)
{
uint8 base = (m68k.memory_map[0x00].base - cart.rom) >> 16;
for (i=0x00; i<0x14; i++)
{
m68k.memory_map[i].base = cart.rom + (((base + i) & 0x1f) << 16);
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
zbank_memory_map[i].read = NULL;
}
for (i=0x14; i<0x20; i++)
{
m68k.memory_map[i].read8 = m68k_read_bus_8;
m68k.memory_map[i].read16 = m68k_read_bus_16;
zbank_memory_map[i].read = m68k_read_bus_8;
}
}
else
{
for (i=0x00; i<0x20; i++)
{
m68k.memory_map[i].base = m68k.memory_map[0].base + ((i & 0x03) << 16);
m68k.memory_map[i].read8 = NULL;
m68k.memory_map[i].read16 = NULL;
zbank_memory_map[i].read = NULL;
}
}
if (!(data & 0x80))
{
m68k.memory_map[0x00].write8 = m68k_unused_8_w;
m68k.memory_map[0x00].write16 = m68k_unused_16_w;
zbank_memory_map[0x00].write = m68k_unused_8_w;
}
return;
}
case 0x0f:
{
uint8 base = ((data >> 4) & 7) << 2;
if (m68k.memory_map[0].base == m68k.memory_map[4].base)
{
for (i=0x00; i<0x20; i++)
{
m68k.memory_map[i].base = cart.rom + ((base + (i & 0x03)) << 16);
}
}
else
{
for (i=0x00; i<0x14; i++)
{
m68k.memory_map[i].base = cart.rom + (((base + i) & 0x1f) << 16);
}
}
return;
}
default:
{
m68k_unused_8_w(address, data);
return;
}
}
}
static uint32 mapper_sf004_r(uint32 address)
{
return (((m68k.memory_map[0x00].base - cart.rom) >> 18) << 4);
}
static void mapper_t5740_w(uint32 address, uint32 data)
{
int i;
uint8 *base;
switch (address & 0xff)
{
case 0x01:
{
return;
}
case 0x03:
{
base = cart.rom + ((data & 0x0f) << 19);
for (i=0x28; i<0x30; i++)
{
m68k.memory_map[i].base = base + ((i & 0x07) << 16);
}
return;
}
case 0x05:
{
base = cart.rom + ((data & 0x0f) << 19);
for (i=0x30; i<0x38; i++)
{
m68k.memory_map[i].base = base + ((i & 0x07) << 16);
}
return;
}
case 0x07:
{
base = cart.rom + ((data & 0x0f) << 19);
for (i=0x38; i<0x40; i++)
{
m68k.memory_map[i].base = base + ((i & 0x07) << 16);
}
return;
}
case 0x09:
{
eeprom_spi_write(data);
return;
}
default:
{
m68k_unused_8_w(address, data);
return;
}
}
}
static uint32 mapper_t5740_r(uint32 address)
{
if ((address & 0xff00) == 0x8100)
{
return READ_BYTE(cart.rom , (address & 0x7fff));
}
return READ_BYTE(cart.rom, address);
}
static void mapper_smw_64_w(uint32 address, uint32 data)
{
switch ((address >> 16) & 0x07)
{
case 0x00:
{
if (address & 2)
{
switch (sram.sram[0x00] & 0x07)
{
case 0x00:
{
sram.sram[0x06] = ((sram.sram[0x06] ^ sram.sram[0x01]) ^ data) & 0xFE;
break;
}
case 0x01:
{
sram.sram[0x07] = data & 0xFE;
break;
}
case 0x07:
{
m68k.memory_map[0x61].base = m68k.memory_map[0x69].base = cart.rom + 0x080000 + ((data & 0x1c) << 14);
break;
}
default:
{
break;
}
}
sram.sram[0x01] = data;
}
else
{
sram.sram[0x00] = data;
}
return;
}
case 0x01:
{
if (address & 2)
{
sram.sram[0x02] = data;
}
return;
}
case 0x04:
{
if (address & 2)
{
sram.sram[0x04] = data;
}
else
{
sram.sram[0x03] = data;
}
return;
}
case 0x06:
{
return;
}
case 0x07:
{
if (!(address & 2))
{
sram.sram[0x05] = data;
if (sram.sram[0x02] & 0x80)
{
m68k.memory_map[0x60].base = m68k.memory_map[0x68].base = cart.rom + 0x080000 + ((data & 0x1c) << 14);
}
}
return;
}
default:
{
m68k_unused_8_w(address, data);
return;
}
}
}
static uint32 mapper_smw_64_r(uint32 address)
{
switch ((address >> 16) & 0x03)
{
case 0x02:
{
switch ((address >> 1) & 7)
{
case 0x00: return sram.sram[0x06];
case 0x01: return sram.sram[0x06] + 1;
case 0x02: return sram.sram[0x07];
case 0x03: return sram.sram[0x07] + 1;
case 0x04: return sram.sram[0x08];
case 0x05: return sram.sram[0x08] + 1;
case 0x06: return sram.sram[0x08] + 2;
case 0x07: return sram.sram[0x08] + 3;
}
}
case 0x03:
{
uint8 data = (sram.sram[0x02] & 0x80) ? ((sram.sram[0x05] & 0x40) ? (sram.sram[0x03] & sram.sram[0x04]) : (sram.sram[0x03] ^ 0xFF)) : 0x00;
if (address & 2)
{
data &= 0x7f;
}
else
{
if (sram.sram[0x05] & 0x80)
{
if (sram.sram[0x05] & 0x20)
{
sram.sram[0x08] = (sram.sram[0x04] << 2) & 0xFC;
}
else
{
sram.sram[0x06] = (sram.sram[0x01] ^ (sram.sram[0x03] << 1)) & 0xFE;
}
}
}
return data;
}
default:
{
return 0x00;
}
}
}
static void mapper_realtec_w(uint32 address, uint32 data)
{
switch (address)
{
case 0x402000:
{
cart.hw.regs[2] = data << 1;
return;
}
case 0x404000:
{
cart.hw.regs[0] = data & 7;
return;
}
case 0x400000:
{
cart.hw.regs[1] = data & 6;
if (cart.hw.regs[2])
{
uint32 base = (cart.hw.regs[0] << 1) | (cart.hw.regs[1] << 3);
int i;
for (i=0x00; i<0x40; i++)
{
m68k.memory_map[i].base = &cart.rom[(base + (i % cart.hw.regs[2])) << 16];
}
}
return;
}
}
}
static void mapper_seganet_w(uint32 address, uint32 data)
{
if ((address & 0xff) == 0xf1)
{
int i;
if (data & 1)
{
for (i=0; i<0x40; i++)
{
m68k.memory_map[i].write8 = m68k_unused_8_w;
m68k.memory_map[i].write16 = m68k_unused_16_w;
zbank_memory_map[i].write = zbank_unused_w;
}
}
else
{
for (i=0; i<0x40; i++)
{
m68k.memory_map[i].write8 = NULL;
m68k.memory_map[i].write16 = NULL;
zbank_memory_map[i].write = NULL;
}
}
}
}
static void mapper_32k_w(uint32 data)
{
int i;
if (data)
{
for (i=0; i<0x10; i++)
{
m68k.memory_map[i].base = &cart.rom[0x400000 + (i << 16)];
memcpy(m68k.memory_map[i].base, cart.rom + ((i << 16) | (data & 0x3f) << 15), 0x8000);
memcpy(m68k.memory_map[i].base + 0x8000, cart.rom + ((i << 16) | ((data | 1) & 0x3f) << 15), 0x8000);
}
}
else
{
for (i=0; i<16; i++)
{
m68k.memory_map[i].base = &cart.rom[i << 16];
}
}
}
static void mapper_64k_w(uint32 data)
{
int i;
if (data)
{
for (i=0; i<16; i++)
{
m68k.memory_map[i].base = &cart.rom[(data & 0xf) << 16];
}
}
else
{
for (i=0; i<16; i++)
{
m68k.memory_map[i].base = &cart.rom[(i & 0xf) << 16];
}
}
}
static void mapper_64k_multi_w(uint32 address)
{
int i;
for (i=0; i<64; i++)
{
m68k.memory_map[i].base = &cart.rom[((address++) & 0x3f) << 16];
}
}
static uint32 mapper_radica_r(uint32 address)
{
int i = 0;
address = (address >> 1);
for (i = 0; i < 64; i++)
{
m68k.memory_map[i].base = &cart.rom[((address++)& 0x3f)<< 16];
}
return 0xffff;
}
static void default_time_w(uint32 address, uint32 data)
{
if (address < 0xa13040)
{
mapper_64k_multi_w(address);
return;
}
mapper_sega_w(data);
}
static uint32 default_regs_r(uint32 address)
{
int i;
for (i=0; i<4; i++)
{
if ((address & cart.hw.mask[i]) == cart.hw.addr[i])
{
return cart.hw.regs[i];
}
}
return m68k_read_bus_8(address);
}
static uint32 default_regs_r_16(uint32 address)
{
int i;
for (i=0; i<4; i++)
{
if ((address & cart.hw.mask[i]) == cart.hw.addr[i])
{
return (cart.hw.regs[i] << 8);
}
}
return m68k_read_bus_16(address);
}
static void default_regs_w(uint32 address, uint32 data)
{
int i;
for (i=0; i<4; i++)
{
if ((address & cart.hw.mask[i]) == cart.hw.addr[i])
{
cart.hw.regs[i] = data;
return;
}
}
m68k_unused_8_w(address, data);
}
static uint32 custom_regs_r(uint32 address)
{
int i;
for (i=0; i<4; i++)
{
if ((address & cart.hw.mask[i]) == cart.hw.addr[i])
{
return cart.hw.regs[i] >> 1;
}
}
return m68k_read_bus_8(address);
}
static void custom_regs_w(uint32 address, uint32 data)
{
uint8 temp;
if ((address >> 16) > 0x6f)
{
mapper_32k_w(data);
return;
}
default_regs_w(address, data);
temp = cart.hw.regs[0];
switch (cart.hw.regs[1] & 3)
{
case 0:
cart.hw.regs[2] = (temp << 1);
break;
case 1:
cart.hw.regs[2] = (temp >> 1);
return;
case 2:
cart.hw.regs[2] = ((temp >> 4) | ((temp & 0x0F) << 4));
return;
default:
cart.hw.regs[2] = (((temp >> 7) & 0x01) | ((temp >> 5) & 0x02) |
((temp >> 3) & 0x04) | ((temp >> 1) & 0x08) |
((temp << 1) & 0x10) | ((temp << 3) & 0x20) |
((temp << 5) & 0x40) | ((temp << 7) & 0x80));
return;
}
}
static void custom_alt_regs_w(uint32 address, uint32 data)
{
if ((address >> 16) > 0x5f)
{
mapper_64k_w(data);
return;
}
default_regs_w(address, data);
}
static uint32 tekken_regs_r(uint32 address)
{
if ((address & 0x0e) == 0x02)
{
return (cart.hw.regs[0] - 1);
}
return m68k_read_bus_16(address);
}
static void tekken_regs_w(uint32 address, uint32 data)
{
switch (address & 0x0e)
{
case 0x00:
{
cart.hw.regs[0]= 0x00;
break;
}
case 0x02:
{
break;
}
case 0x0c:
{
break;
}
case 0x0e:
{
break;
}
default:
{
if (data & 1)
{
cart.hw.regs[0] |= 1 << (((address - 0x04) >> 1) & 3);
}
break;
}
}
}
static uint32 topshooter_r(uint32 address)
{
if (address < 0x202000)
{
uint8 temp = 0xff;
switch (address & 0xff)
{
case 0x43:
{
if (input.pad[0] & INPUT_A) temp &= ~0x80;
if (input.pad[0] & INPUT_B) temp &= ~0x10;
if (input.pad[0] & INPUT_START) temp &= ~0x20;
break;
}
case 0x45:
{
if (input.pad[0] & INPUT_UP) temp &= ~0x08;
if (input.pad[0] & INPUT_DOWN) temp &= ~0x10;
break;
}
case 0x47:
{
if (input.pad[0] & INPUT_RIGHT) temp &= ~0x03;
break;
}
case 0x49:
{
if (input.pad[0] & INPUT_LEFT) temp &= ~0x03;
if (input.pad[0] & INPUT_C) temp &= ~0x01;
break;
}
case 0x51:
{
temp = 0xA5;
break;
}
default:
{
temp = m68k_read_bus_8(address);
break;
}
}
return temp;
}
return READ_BYTE(sram.sram , address & 0xffff);
}
static void topshooter_w(uint32 address, uint32 data)
{
if (address >= 0x202000)
{
WRITE_BYTE(sram.sram , address & 0xffff, data);
return;
}
m68k_unused_8_w(address, data);
}