mirror of
https://github.com/holub/mame
synced 2025-05-22 05:38:52 +03:00
some notes, cleanups, accuracy improvements
This commit is contained in:
parent
08d47383fa
commit
a2c8d6832f
@ -1,11 +1,13 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Penguin Adventure bootleg
|
Penguin Adventure bootleg (tagged 'Screen', 1988)
|
||||||
|
Original release was on MSX, by Konami in 1986. There is no official arcade release of this game.
|
||||||
|
|
||||||
Driver by Mariusz Wojcieszek
|
Driver by Mariusz Wojcieszek
|
||||||
|
|
||||||
This seems to be the MSX version possibly hacked
|
This seems to be the MSX version hacked to run on cheap Korean(?) bootleg hardware.
|
||||||
to run on cheap Korean bootleg hardware.
|
Bosses are at wrong stages when compared to the original, probably to make the game more
|
||||||
|
difficult early on. This is also the cause of some gfx glitches when reaching a boss.
|
||||||
|
|
||||||
Basic components include.....
|
Basic components include.....
|
||||||
Z80 @ 3.579533MHz [10.7386/3]
|
Z80 @ 3.579533MHz [10.7386/3]
|
||||||
@ -15,7 +17,7 @@ AY-3-8910 @ 1.789766MHz [10.7386/6]
|
|||||||
4416 RAM x2
|
4416 RAM x2
|
||||||
4164 RAM x8
|
4164 RAM x8
|
||||||
10.7386 XTAL
|
10.7386 XTAL
|
||||||
10 position DIPSW
|
10 position DIPSW (where are they read??)
|
||||||
NOTE! switches 1, 3 & 5 must be ON or the game will not boot.
|
NOTE! switches 1, 3 & 5 must be ON or the game will not boot.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -42,96 +44,82 @@ public:
|
|||||||
static void mem_map_banks(running_machine &machine)
|
static void mem_map_banks(running_machine &machine)
|
||||||
{
|
{
|
||||||
pengadvb_state *state = machine.driver_data<pengadvb_state>();
|
pengadvb_state *state = machine.driver_data<pengadvb_state>();
|
||||||
int slot_select;
|
/* memorymap: (rest is assumed unmapped)
|
||||||
|
slot 0
|
||||||
|
0000-7fff BIOS ROM
|
||||||
|
slot 1
|
||||||
|
4000-bfff game ROM
|
||||||
|
slot 3
|
||||||
|
c000-ffff RAM
|
||||||
|
*/
|
||||||
|
|
||||||
// page 0
|
// page 0 (0000-3fff)
|
||||||
slot_select = (state->m_mem_map >> 0) & 0x03;
|
switch(state->m_mem_map & 3)
|
||||||
switch(slot_select)
|
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
{
|
// BIOS
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x0000, 0x3fff, "bank1" );
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x0000, 0x3fff, "bank1" );
|
||||||
memory_set_bankptr(machine, "bank1", machine.region("maincpu")->base());
|
memory_set_bankptr(machine, "bank1", machine.region("maincpu")->base());
|
||||||
break;
|
break;
|
||||||
};
|
|
||||||
case 1:
|
default:
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->unmap_read(0x0000, 0x3fff);
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->unmap_read(0x0000, 0x3fff);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// page 1
|
// page 1 (4000-7fff)
|
||||||
slot_select = (state->m_mem_map >> 2) & 0x03;
|
switch(state->m_mem_map >> 2 & 3)
|
||||||
switch(slot_select)
|
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
{
|
// BIOS
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x4000, 0x5fff, "bank21" );
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x4000, 0x5fff, "bank21" );
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x6000, 0x7fff, "bank22" );
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x6000, 0x7fff, "bank22" );
|
||||||
memory_set_bankptr(machine, "bank21", machine.region("maincpu")->base() + 0x4000);
|
memory_set_bankptr(machine, "bank21", machine.region("maincpu")->base() + 0x4000);
|
||||||
memory_set_bankptr(machine, "bank22", machine.region("maincpu")->base() + 0x4000 + 0x2000);
|
memory_set_bankptr(machine, "bank22", machine.region("maincpu")->base() + 0x4000 + 0x2000);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
// game
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x4000, 0x5fff, "bank21" );
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x4000, 0x5fff, "bank21" );
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x6000, 0x7fff, "bank22" );
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x6000, 0x7fff, "bank22" );
|
||||||
memory_set_bankptr(machine, "bank21", machine.region("game")->base() + state->m_mem_banks[0]*0x2000);
|
memory_set_bankptr(machine, "bank21", machine.region("game")->base() + state->m_mem_banks[0]*0x2000);
|
||||||
memory_set_bankptr(machine, "bank22", machine.region("game")->base() + state->m_mem_banks[1]*0x2000);
|
memory_set_bankptr(machine, "bank22", machine.region("game")->base() + state->m_mem_banks[1]*0x2000);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case 2:
|
default:
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->unmap_read(0x4000, 0x7fff);
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->unmap_read(0x4000, 0x7fff);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// page 2
|
// page 2 (8000-bfff)
|
||||||
slot_select = (state->m_mem_map >> 4) & 0x03;
|
switch(state->m_mem_map >> 4 & 3)
|
||||||
switch(slot_select)
|
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
{
|
// game
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x8000, 0x9fff, "bank31" );
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x8000, 0x9fff, "bank31" );
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0xa000, 0xbfff, "bank32" );
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0xa000, 0xbfff, "bank32" );
|
||||||
memory_set_bankptr(machine, "bank31", machine.region("game")->base() + state->m_mem_banks[2]*0x2000);
|
memory_set_bankptr(machine, "bank31", machine.region("game")->base() + state->m_mem_banks[2]*0x2000);
|
||||||
memory_set_bankptr(machine, "bank32", machine.region("game")->base() + state->m_mem_banks[3]*0x2000);
|
memory_set_bankptr(machine, "bank32", machine.region("game")->base() + state->m_mem_banks[3]*0x2000);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case 0:
|
default:
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->unmap_read(0x8000, 0xbfff);
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->unmap_read(0x8000, 0xbfff);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// page 3
|
// page 3 (c000-ffff)
|
||||||
slot_select = (state->m_mem_map >> 6) & 0x03;
|
switch(state->m_mem_map >> 6 & 3)
|
||||||
|
|
||||||
switch(slot_select)
|
|
||||||
{
|
{
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->unmap_read(0xc000, 0xffff);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
// RAM
|
||||||
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0xc000, 0xffff, "bank4" );
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0xc000, 0xffff, "bank4" );
|
||||||
memory_set_bankptr(machine, "bank4", state->m_main_mem);
|
memory_set_bankptr(machine, "bank4", state->m_main_mem);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
machine.device("maincpu")->memory().space(AS_PROGRAM)->unmap_read(0xc000, 0xffff);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static WRITE8_HANDLER(mem_w)
|
static WRITE8_HANDLER(mem_w)
|
||||||
@ -139,22 +127,15 @@ static WRITE8_HANDLER(mem_w)
|
|||||||
pengadvb_state *state = space->machine().driver_data<pengadvb_state>();
|
pengadvb_state *state = space->machine().driver_data<pengadvb_state>();
|
||||||
if (offset >= 0xc000)
|
if (offset >= 0xc000)
|
||||||
{
|
{
|
||||||
int slot_select = (state->m_mem_map >> 6) & 0x03;
|
// write to RAM
|
||||||
|
if ((state->m_mem_map >> 6 & 3) == 3)
|
||||||
if ( slot_select == 3 )
|
|
||||||
{
|
|
||||||
state->m_main_mem[offset - 0xc000] = data;
|
state->m_main_mem[offset - 0xc000] = data;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else if (offset >= 0x4000 && (state->m_mem_map >> (offset >> 13 & 6) & 3) == 1 && (state->m_mem_banks[(offset - 0x4000) >> 13] != (data & 0xf)))
|
||||||
{
|
{
|
||||||
switch(offset)
|
// ROM bankswitch
|
||||||
{
|
state->m_mem_banks[(offset - 0x4000) >> 13] = data & 0xf;
|
||||||
case 0x4000: state->m_mem_banks[0] = data; mem_map_banks(space->machine()); break;
|
mem_map_banks(space->machine());
|
||||||
case 0x6000: state->m_mem_banks[1] = data; mem_map_banks(space->machine()); break;
|
|
||||||
case 0x8000: state->m_mem_banks[2] = data; mem_map_banks(space->machine()); break;
|
|
||||||
case 0xa000: state->m_mem_banks[3] = data; mem_map_banks(space->machine()); break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,11 +191,20 @@ static const ay8910_interface pengadvb_ay8910_interface =
|
|||||||
DEVCB_NULL
|
DEVCB_NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static READ8_DEVICE_HANDLER( pengadvb_ppi_port_a_r )
|
||||||
|
{
|
||||||
|
pengadvb_state *state = device->machine().driver_data<pengadvb_state>();
|
||||||
|
return state->m_mem_map;
|
||||||
|
}
|
||||||
|
|
||||||
static WRITE8_DEVICE_HANDLER ( pengadvb_ppi_port_a_w )
|
static WRITE8_DEVICE_HANDLER ( pengadvb_ppi_port_a_w )
|
||||||
{
|
{
|
||||||
pengadvb_state *state = device->machine().driver_data<pengadvb_state>();
|
pengadvb_state *state = device->machine().driver_data<pengadvb_state>();
|
||||||
state->m_mem_map = data;
|
if (data != state->m_mem_map)
|
||||||
mem_map_banks(device->machine());
|
{
|
||||||
|
state->m_mem_map = data;
|
||||||
|
mem_map_banks(device->machine());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static READ8_DEVICE_HANDLER( pengadvb_ppi_port_b_r )
|
static READ8_DEVICE_HANDLER( pengadvb_ppi_port_b_r )
|
||||||
@ -229,7 +219,7 @@ static READ8_DEVICE_HANDLER( pengadvb_ppi_port_b_r )
|
|||||||
|
|
||||||
static I8255A_INTERFACE(pengadvb_ppi8255_interface)
|
static I8255A_INTERFACE(pengadvb_ppi8255_interface)
|
||||||
{
|
{
|
||||||
DEVCB_NULL,
|
DEVCB_HANDLER(pengadvb_ppi_port_a_r),
|
||||||
DEVCB_HANDLER(pengadvb_ppi_port_a_w),
|
DEVCB_HANDLER(pengadvb_ppi_port_a_w),
|
||||||
DEVCB_HANDLER(pengadvb_ppi_port_b_r),
|
DEVCB_HANDLER(pengadvb_ppi_port_b_r),
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
@ -239,7 +229,7 @@ static I8255A_INTERFACE(pengadvb_ppi8255_interface)
|
|||||||
|
|
||||||
static WRITE_LINE_DEVICE_HANDLER(vdp_interrupt)
|
static WRITE_LINE_DEVICE_HANDLER(vdp_interrupt)
|
||||||
{
|
{
|
||||||
cputag_set_input_line(device->machine(), "maincpu", 0, (state ? HOLD_LINE : CLEAR_LINE));
|
cputag_set_input_line(device->machine(), "maincpu", 0, (state ? ASSERT_LINE : CLEAR_LINE));
|
||||||
}
|
}
|
||||||
|
|
||||||
static TMS9928A_INTERFACE(pengadvb_tms9928a_interface)
|
static TMS9928A_INTERFACE(pengadvb_tms9928a_interface)
|
||||||
@ -326,7 +316,6 @@ static void pengadvb_decrypt(running_machine &machine, const char* region)
|
|||||||
mem[i] = buf[BITSWAP24(i,23,22,21,20,19,18,17,16,15,14,13,5,11,10,9,8,7,6,12,4,3,2,1,0)];
|
mem[i] = buf[BITSWAP24(i,23,22,21,20,19,18,17,16,15,14,13,5,11,10,9,8,7,6,12,4,3,2,1,0)];
|
||||||
}
|
}
|
||||||
auto_free(machine, buf);
|
auto_free(machine, buf);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static DRIVER_INIT(pengadvb)
|
static DRIVER_INIT(pengadvb)
|
||||||
@ -350,4 +339,4 @@ ROM_START( pengadvb )
|
|||||||
|
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
GAME( 1988, pengadvb, 0, pengadvb, pengadvb, pengadvb, ROT0, "bootleg / Konami", "Penguin Adventure (bootleg of MSX version)", GAME_SUPPORTS_SAVE )
|
GAME( 1988, pengadvb, 0, pengadvb, pengadvb, pengadvb, ROT0, "bootleg (Screen) / Konami", "Penguin Adventure (bootleg of MSX version)", GAME_SUPPORTS_SAVE )
|
||||||
|
Loading…
Reference in New Issue
Block a user