Improved memory banking in Puzzle Star (Sang Ho Soft) [Mariusz Wojcieszek]

This commit is contained in:
mariuszw1 2010-08-10 20:30:09 +00:00
parent 6a8b6d7df8
commit a0d7414de9

View File

@ -45,31 +45,120 @@ is a YM2413 compatible chip.
static UINT8* sangho_ram;
static UINT8 sexyboom_bank[8];
static WRITE8_HANDLER(sangho_ram_w)
static UINT8 pzlestar_mem_bank = 0;
static UINT8 pzlestar_rom_bank = 0;
static void pzlestar_map_banks(running_machine *machine)
{
sangho_ram[offset]=data;
int slot_select;
// page 0
slot_select = (pzlestar_mem_bank >> 0) & 0x03;
switch(slot_select)
{
case 0:
memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0000, 0x3fff, 0, 0, "bank1");
memory_install_write_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0000, 0x3fff, 0, 0, "bank5");
memory_set_bankptr(machine, "bank1", sangho_ram);
memory_set_bankptr(machine, "bank5", sangho_ram);
break;
case 2:
memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0000, 0x3fff, 0, 0, "bank1");
memory_unmap_write(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0000, 0x3fff, 0, 0);
memory_set_bankptr(machine, "bank1", memory_region(machine, "user1")+ 0x10000);
break;
case 1:
case 3:
memory_unmap_read(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0000, 0x3fff, 0, 0);
memory_unmap_write(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0000, 0x3fff, 0, 0);
break;
}
// page 1
slot_select = (pzlestar_mem_bank >> 2) & 0x03;
switch(slot_select)
{
case 0:
memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x4000, 0x7fff, 0, 0, "bank2");
memory_install_write_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x4000, 0x7fff, 0, 0, "bank6");
memory_set_bankptr(machine, "bank2", sangho_ram + 0x4000);
memory_set_bankptr(machine, "bank6", sangho_ram + 0x4000);
break;
case 2:
memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x4000, 0x7fff, 0, 0, "bank2");
memory_unmap_write(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x4000, 0x7fff, 0, 0);
memory_set_bankptr(machine, "bank2", memory_region(machine, "user1")+ 0x18000);
break;
case 3:
memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x4000, 0x7fff, 0, 0, "bank2");
memory_unmap_write(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x4000, 0x7fff, 0, 0);
memory_set_bankptr(machine, "bank2", memory_region(machine, "user1")+ 0x20000 + (pzlestar_rom_bank*0x8000) + 0x4000);
break;
case 1:
memory_unmap_read(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x4000, 0x7fff, 0, 0);
memory_unmap_write(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x4000, 0x7fff, 0, 0);
break;
}
// page 2
slot_select = (pzlestar_mem_bank >> 4) & 0x03;
switch(slot_select)
{
case 0:
memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0xbfff, 0, 0, "bank3");
memory_install_write_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0xbfff, 0, 0, "bank7");
memory_set_bankptr(machine, "bank3", sangho_ram + 0x8000);
memory_set_bankptr(machine, "bank7", sangho_ram + 0x8000);
break;
case 3:
memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0xbfff, 0, 0, "bank3");
memory_unmap_write(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0xbfff, 0, 0);
memory_set_bankptr(machine, "bank3", memory_region(machine, "user1")+ 0x20000 + (pzlestar_rom_bank*0x8000));
break;
case 1:
case 2:
memory_unmap_read(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0xbfff, 0, 0);
memory_unmap_write(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0xbfff, 0, 0);
break;
}
// page 3
slot_select = (pzlestar_mem_bank >> 6) & 0x03;
switch(slot_select)
{
case 0:
memory_install_read_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xffff, 0, 0, "bank4");
memory_install_write_bank(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xffff, 0, 0, "bank8");
memory_set_bankptr(machine, "bank4", sangho_ram + 0xc000);
memory_set_bankptr(machine, "bank8", sangho_ram + 0xc000);
break;
case 1:
case 2:
case 3:
memory_unmap_read(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xffff, 0, 0);
memory_unmap_write(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xc000, 0xffff, 0, 0);
break;
}
}
static ADDRESS_MAP_START( pzlestar_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xffff) AM_WRITE(sangho_ram_w)
AM_RANGE(0x0000, 0x3fff) AM_ROMBANK("bank1")
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank2")
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank3")
AM_RANGE(0xc000, 0xffff) AM_ROMBANK("bank4")
ADDRESS_MAP_END
static ADDRESS_MAP_START( sexyboom_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank5")
AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank2") AM_WRITE_BANK("bank6")
AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank3") AM_WRITE_BANK("bank7")
AM_RANGE(0xc000, 0xffff) AM_READ_BANK("bank4") AM_WRITE_BANK("bank8")
ADDRESS_MAP_END
/* Wrong ! */
static WRITE8_HANDLER(pzlestar_bank_w)
{
memory_set_bankptr(space->machine, "bank2",&memory_region(space->machine, "user1")[0x20000+ ( ((0x8000*data)^0x10000)) ]);
memory_set_bankptr(space->machine, "bank3",&memory_region(space->machine, "user1")[ 0x18000 ]);
logerror("rom bank %02x\n", data);
pzlestar_rom_bank = data;
pzlestar_map_banks(space->machine);
}
static WRITE8_HANDLER(pzlestar_mem_bank_w)
{
logerror("mem bank %02x\n", data);
pzlestar_mem_bank = data;
pzlestar_map_banks(space->machine);
}
static READ8_HANDLER(pzlestar_mem_bank_r)
{
return pzlestar_mem_bank;
}
static void sexyboom_map_bank(running_machine *machine, int bank)
@ -120,6 +209,13 @@ static WRITE8_HANDLER(sexyboom_bank_w)
sexyboom_map_bank(space->machine, offset>>1);
}
static ADDRESS_MAP_START( sangho_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank5")
AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank2") AM_WRITE_BANK("bank6")
AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank3") AM_WRITE_BANK("bank7")
AM_RANGE(0xc000, 0xffff) AM_READ_BANK("bank4") AM_WRITE_BANK("bank8")
ADDRESS_MAP_END
/* Puzzle Star Ports */
static ADDRESS_MAP_START( pzlestar_io_map, ADDRESS_SPACE_IO, 8 )
@ -132,6 +228,7 @@ static ADDRESS_MAP_START( pzlestar_io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE( 0x9b, 0x9b) AM_WRITE( v9938_0_register_w )
AM_RANGE( 0xa0, 0xa0) AM_READ_PORT("P1")
AM_RANGE( 0xa1, 0xa1) AM_READ_PORT("P2")
AM_RANGE( 0xa8, 0xa8) AM_READWRITE( pzlestar_mem_bank_r, pzlestar_mem_bank_w )
AM_RANGE( 0xf7, 0xf7) AM_READ_PORT("DSW")
ADDRESS_MAP_END
@ -210,26 +307,12 @@ static INPUT_PORTS_START( sangho )
INPUT_PORTS_END
static void sangho_common_machine_reset(running_machine *machine)
{
memory_set_bankptr(machine, "bank1",&sangho_ram[0]);
memory_set_bankptr(machine, "bank2",&sangho_ram[0x4000]);
memory_set_bankptr(machine, "bank3",&sangho_ram[0x8000]);
memory_set_bankptr(machine, "bank4",&sangho_ram[0xc000]);
v9938_reset(0);
}
static MACHINE_RESET(pzlestar)
{
/* give it some code to run, note this isn't at 0 in the rom! */
memcpy(sangho_ram,&memory_region(machine, "user1")[0x10000],0x8000);
pzlestar_mem_bank = 2;
pzlestar_map_banks(machine);
/* patch out rom check (it fails, due to bad banking) */
sangho_ram[0x25c1]=0xaf;
sangho_ram[0x25c2]=0xc9;
sangho_common_machine_reset(machine);
v9938_reset(0);
}
static MACHINE_RESET(sexyboom)
@ -258,7 +341,7 @@ static void msx_vdp_interrupt(running_machine *machine, int i)
static INTERRUPT_GEN( sangho_interrupt )
{
v9938_set_sprite_limit(0, 0);
v9938_set_resolution(0, 2);
v9938_set_resolution(0, RENDER_HIGH);
v9938_interrupt(device->machine, 0);
}
@ -272,7 +355,7 @@ static VIDEO_START( sangho )
static MACHINE_DRIVER_START(pzlestar)
MDRV_CPU_ADD("maincpu", Z80,8000000) // ?
MDRV_CPU_PROGRAM_MAP(pzlestar_map)
MDRV_CPU_PROGRAM_MAP(sangho_map)
MDRV_CPU_IO_MAP(pzlestar_io_map)
MDRV_CPU_VBLANK_INT_HACK(sangho_interrupt,262)
@ -305,7 +388,7 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START(sexyboom )
MDRV_CPU_ADD("maincpu", Z80,8000000) // ?
MDRV_CPU_PROGRAM_MAP(sexyboom_map)
MDRV_CPU_PROGRAM_MAP(sangho_map)
MDRV_CPU_IO_MAP(sexyboom_io_map)
MDRV_CPU_VBLANK_INT_HACK(sangho_interrupt,262)
@ -341,8 +424,8 @@ ROM_START( pzlestar )
ROM_LOAD( "rom04.bin", 0x060000, 0x20000, CRC(929e7491) SHA1(fb700d3e1d50fefa9b85ccd3702a9854df53a210) )
ROM_LOAD( "rom05.bin", 0x080000, 0x20000, CRC(8c6f71e5) SHA1(3597b03fe61216256437c56c583d55c7d59b5525) )
ROM_LOAD( "rom06.bin", 0x0a0000, 0x20000, CRC(84599227) SHA1(d47c6cdbf3b64f83627c768059148e31f8de1f36) )
ROM_LOAD( "rom07.bin", 0x0c0000, 0x20000, CRC(6f64cc35) SHA1(3e3270834ad31e8240748c2b61f9b8f138d22f68) )
ROM_LOAD( "rom08.bin", 0x0e0000, 0x20000, CRC(18d2bfe2) SHA1(cb92ee51d061bc053e296fcba10708f69ba12a61) )
ROM_LOAD( "rom08.bin", 0x0c0000, 0x20000, CRC(18d2bfe2) SHA1(cb92ee51d061bc053e296fcba10708f69ba12a61) )
ROM_LOAD( "rom07.bin", 0x0e0000, 0x20000, CRC(6f64cc35) SHA1(3e3270834ad31e8240748c2b61f9b8f138d22f68) )
ROM_LOAD( "rom09.bin", 0x100000, 0x20000, CRC(19a31115) SHA1(fa6ead5c8bf6be21d07797f74fcba13f0d041937) )
ROM_LOAD( "rom10.bin", 0x120000, 0x20000, CRC(c003328b) SHA1(5172e2c48e118ac9f9b9dd4f4df8804245047b33) )
ROM_LOAD( "rom11.bin", 0x140000, 0x20000, CRC(d36c1f92) SHA1(42b412c1ab99cb14f2e15bd80fede34c0df414b9) )