fixed Realtec Mapper support (fixes missing sound in Balloon Boy / Funny World)

This commit is contained in:
ekeeke31 2009-10-06 07:36:08 +00:00
parent 824b33fea9
commit c2c79c0eb3
2 changed files with 27 additions and 29 deletions

View File

@ -601,45 +601,45 @@ static void special_mapper_w(uint32 address, uint32 data)
/* /*
Realtec ROM Bankswitch (Earth Defend, Balloon Boy & Funny World, Whac-A-Critter) Realtec ROM Bankswitch (Earth Defend, Balloon Boy & Funny World, Whac-A-Critter)
(Note: register usage is inverted in TascoDlx documentation)
*/ */
static void realtec_mapper_w(uint32 address, uint32 data) static void realtec_mapper_w(uint32 address, uint32 data)
{ {
int i;
uint32 base;
/* 32 x 128k banks */
switch (address) switch (address)
{ {
case 0x404000: /* three lower bits of ROM base address */ case 0x402000:
{
/* number of mapped 64k blocks (the written value is a number of 128k blocks) */
cart.hw.regs[2] = data << 1;
return;
}
case 0x404000:
{
/* 00000xxx */
cart.hw.regs[0] = data & 7; cart.hw.regs[0] = data & 7;
base = ((data & 7) | (cart.hw.regs[1] << 2));
for (i=0; i<=cart.hw.regs[2]; i++)
{
m68k_memory_map[i*2].base = &cart.rom[((base + i)*2 & 0x3f) << 16];
m68k_memory_map[i*2+1].base = &cart.rom[(((base + i)*2 + 1) & 0x3f) << 16];
}
return; return;
}
case 0x400000: /* two higher bits of ROM base address */ case 0x400000:
{
/* 00000yy1 */
cart.hw.regs[1] = data & 6; cart.hw.regs[1] = data & 6;
base = cart.hw.regs[0] | ((data & 6) << 2);
for (i=0; i<=cart.hw.regs[2]; i++) /* mapped start address is 00yy xxx0 0000 0000 0000 0000 */
uint32 base = (cart.hw.regs[0] << 1) | (cart.hw.regs[1] << 3);
/* ensure mapped size is not null */
if (!cart.hw.regs[2]) return;
/* selected blocks are mirrored into the whole cartridge area */
int i;
for (i=0x00; i<0x40; i++)
{ {
m68k_memory_map[i*2].base = &cart.rom[((base + i)*2 & 0x3f) << 16]; m68k_memory_map[i].base = &cart.rom[(base + (i % cart.hw.regs[2])) << 16];
m68k_memory_map[i*2+1].base = &cart.rom[(((base + i)*2 + 1) & 0x3f) << 16];
} }
return; return;
case 0x402000: /* number of 128k blocks to map */
cart.hw.regs[2] = data & 0x1f;
base = cart.hw.regs[0] | (cart.hw.regs[1] << 2);
for (i=0; i<=(data & 0x1f); i++)
{
m68k_memory_map[i*2].base = &cart.rom[((base + i)*2 & 0x3f) << 16];
m68k_memory_map[i*2+1].base = &cart.rom[(((base + i)*2 + 1) & 0x3f) << 16];
} }
return;
} }
} }

View File

@ -2230,9 +2230,7 @@ void MainMenu (void)
GUI_DeleteMenu(m); GUI_DeleteMenu(m);
gxClearScreen((GXColor)BLACK); gxClearScreen((GXColor)BLACK);
gxSetScreen(); gxSetScreen();
system_init();
system_reset(); system_reset();
memfile_autoload(config.sram_auto,-1);
quit = 1; quit = 1;
break; break;