diff options
author | Dirk Best <mail@dirk-best.de> | 2018-02-10 20:10:56 +0100 |
---|---|---|
committer | Dirk Best <mail@dirk-best.de> | 2018-02-10 20:11:52 +0100 |
commit | cebab066bac08cd0e801fc55d5e68d727a3cff40 (patch) | |
tree | 30606643b49c383ae689176429d2a9935a03b22c | |
parent | 668410eabfbbfe75711f94fb3efcc5fcfb021de5 (diff) |
megaphx: Mark Hammer Boy working
- Patch PIC ROM to shorten timer or the game times out waiting for an
answer from the PIC
- Start fixing dip switches for Hammer Boy
- Various cleanups
-rw-r--r-- | src/mame/drivers/megaphx.cpp | 112 |
1 files changed, 81 insertions, 31 deletions
diff --git a/src/mame/drivers/megaphx.cpp b/src/mame/drivers/megaphx.cpp index c155e8d14d6..d79db75989c 100644 --- a/src/mame/drivers/megaphx.cpp +++ b/src/mame/drivers/megaphx.cpp @@ -4,9 +4,9 @@ Dinamic / Inder arcade hardware Mega Phoenix + Hammer Boy also known to exist on this hardware: - Hammer Boy Nonamed 2 (ever finished? only code seen has 1991 date and is vastly incomplete) (versions exist for Amstrad CPC, MSX and Spectrum) After The War @@ -227,19 +227,64 @@ static INPUT_PORTS_START( megaphx ) PORT_DIPSETTING( 0x14, "5") PORT_DIPSETTING( 0x18, "6") PORT_DIPSETTING( 0x1c, "7") - PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:!6") // something to do with time in hammer boy?? + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:!6") PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW2:!7") PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:!8") INPUT_PORTS_END +static INPUT_PORTS_START( hamboy ) + PORT_INCLUDE(megaphx) + + PORT_MODIFY("DSW1") + PORT_DIPNAME(0x07, 0x06, DEF_STR( Coin_A )) PORT_DIPLOCATION("SW1:!1,!2,!3") + PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C )) + PORT_DIPSETTING( 0x03, DEF_STR( 4C_1C )) + PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C )) + PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C )) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_1C )) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C )) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C )) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_4C )) + PORT_DIPNAME(0x38, 0x30, DEF_STR( Coin_B )) PORT_DIPLOCATION("SW1:!4,!5,!6") + PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C )) + PORT_DIPSETTING( 0x18, DEF_STR( 4C_1C )) + PORT_DIPSETTING( 0x28, DEF_STR( 3C_1C )) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C )) + PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C )) + PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C )) + PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C )) + PORT_DIPSETTING( 0x38, DEF_STR( 1C_4C )) + PORT_DIPNAME(0xc0, 0x80, DEF_STR( Lives )) PORT_DIPLOCATION("SW1:!7,!8") + PORT_DIPSETTING( 0x00, "1") + PORT_DIPSETTING( 0x40, "2") + PORT_DIPSETTING( 0x80, "3") + PORT_DIPSETTING( 0xc0, "4") + + PORT_MODIFY("DSW2") + PORT_DIPNAME(0x01, 0x00, DEF_STR( Demo_Sounds )) PORT_DIPLOCATION("SW2:!1") + PORT_DIPSETTING( 0x01, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_SERVICE_DIPLOC(0x02, IP_ACTIVE_HIGH, "SW2:!2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x00, "SW2:!3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x00, "SW2:!4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x00, "SW2:!5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x00, "SW2:!6") // 6 or 7 needs to be off or the timer runs at ridiculous speed + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x00, "SW2:!7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:!8") +INPUT_PORTS_END + + +// pic port a +// +// 3--- r serial clock +// -2-- w serial clock +// --1- w not used +// ---0 rw serial data READ8_MEMBER( megaphx_state::pic_porta_r ) { uint8_t data = 0; - // 3- serial clock - // -0 serial data - // clear when the pic starts reading the command m_ppi_to_pic_command = 0; @@ -251,23 +296,25 @@ READ8_MEMBER( megaphx_state::pic_porta_r ) WRITE8_MEMBER( megaphx_state::pic_porta_w ) { - // 2-- serial clock - // -1- not used - // --0 serial data - m_pic_to_ppi_data = BIT(data, 0); m_pic_to_ppi_clock = BIT(data, 2); } +// pic port b +// +// 7------- w not used +// -6------ w watchdog (not enabled by megaphx) +// --5----- r start2 +// ---4---- r start1 +// ----3--- w dsw clock +// -----2-- w dsw shift/load +// ------1- r dip switch data +// -------0 r ppi to pic command incoming + READ8_MEMBER( megaphx_state::pic_portb_r ) { uint8_t data = 0; - // 5--- start2 - // -4-- start1 - // --1- dip switch data - // ---0 ppi to pic command incoming - data |= m_ppi_to_pic_command << 0; data |= m_dsw_data << 1; data |= ioport("START")->read() << 4; @@ -277,10 +324,6 @@ READ8_MEMBER( megaphx_state::pic_portb_r ) WRITE8_MEMBER( megaphx_state::pic_portb_w ) { - // 7--- not used - // -6-- watchdog (not enabled by megaphx) - // --3- dsw clock - // ---2 dsw shift/load m_dsw_shifter[0]->shift_load_w(BIT(data, 2)); m_dsw_shifter[1]->shift_load_w(BIT(data, 2)); @@ -288,15 +331,21 @@ WRITE8_MEMBER( megaphx_state::pic_portb_w ) m_dsw_shifter[1]->clock_w(BIT(data, 3)); } +// ppi port c +// +// 7------- w ppi to pic clock +// -6------ w ppi to pic data +// --5----- w unknown +// ---4---- w ppi to pic command +// ----3--- r pic to ppi clock +// -----2-- r unknown +// ------1- r pic to ppi data +// -------0 r unknown + READ8_MEMBER( megaphx_state::ppi_portc_r ) { uint8_t data = 0; - // 3--- pic to ppi clock - // -2-- unknown - // --1- pic to ppi data - // ---0 unknown - data |= m_pic_to_ppi_data << 1; data |= m_pic_to_ppi_clock << 3; @@ -305,10 +354,9 @@ READ8_MEMBER( megaphx_state::ppi_portc_r ) WRITE8_MEMBER( megaphx_state::ppi_portc_w ) { - // 7--- ppi to pic clock - // -6-- ppi to pic data - // --5- unknown - // ---4 ppi to pic command + // avoid bogus write on reset + if (data == 0xff) + return; // only set, don't clear here. otherwise the pic has no chance to pick it up if (BIT(data, 4)) @@ -324,10 +372,10 @@ WRITE_LINE_MEMBER( megaphx_state::dsw_w ) } MACHINE_CONFIG_START(megaphx_state::megaphx) - MCFG_CPU_ADD("maincpu", M68000, 8000000) // ?? can't read xtal due to reflections, CPU is an 8Mhz part + MCFG_CPU_ADD("maincpu", M68000, 16_MHz_XTAL / 2) MCFG_CPU_PROGRAM_MAP(megaphx_68k_map) - MCFG_CPU_ADD("pic", PIC16C54, 12000000) /* 3MHz */ + MCFG_CPU_ADD("pic", PIC16C54, 6_MHz_XTAL) // correct? MCFG_PIC16C5x_READ_A_CB(READ8(megaphx_state, pic_porta_r)) MCFG_PIC16C5x_WRITE_A_CB(WRITE8(megaphx_state, pic_porta_w)) MCFG_PIC16C5x_READ_B_CB(READ8(megaphx_state, pic_portb_r)) @@ -384,6 +432,7 @@ ROM_START( megaphx ) ROM_REGION( 0x100000, "pic", 0 ) ROM_LOAD( "pic16c54-xt.bin", 0x000000, 0x430, CRC(21f396fb) SHA1(c8badb9b3681e684bced0ced1de4c3a15641de8b) ) + ROM_FILL(0x2c, 1, 0x01) // patch timer length or its too slow (pic issue?) ROM_REGION( 0x100000, "pals", 0 ) // jedutil won't convert these? are they bad? ROM_LOAD( "p31_u31_palce16v8h-25.jed", 0x000, 0xbd4, CRC(05ef04b7) SHA1(330dd81a832b6675fb0473868c26fe9bec2da854) ) @@ -413,8 +462,9 @@ ROM_START( hamboy ) ROM_LOAD( "HammerBoy - U35.bin", 0x000000, 0x2000, CRC(cd22f2a4) SHA1(c5cf5b1ce528412493e2b5f565ed38e3e9123d37) ) ROM_REGION( 0x100000, "pic", 0 ) - ROM_LOAD( "pic16c54-xt.bin", 0x000000, 0x430, BAD_DUMP CRC(21f396fb) SHA1(c8badb9b3681e684bced0ced1de4c3a15641de8b) ) // from Mega Phoenix, probably wrong for this + ROM_LOAD( "pic16c54-xt.bin", 0x000000, 0x430, CRC(21f396fb) SHA1(c8badb9b3681e684bced0ced1de4c3a15641de8b) ) + ROM_FILL(0x2c, 1, 0x01) // patch timer length or its too slow (pic issue?) ROM_END GAME( 1991, megaphx, 0, megaphx, megaphx, megaphx_state, megaphx, ROT0, "Dinamic / Inder", "Mega Phoenix", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -GAME( 1990, hamboy, 0, megaphx, megaphx, hamboy_state, megaphx, ROT0, "Dinamic / Inder", "Hammer Boy", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +GAME( 1990, hamboy, 0, megaphx, hamboy, hamboy_state, megaphx, ROT0, "Dinamic / Inder", "Hammer Boy", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) |