From 3c2142c3234778f8455e7c6fcf2782327975e98a Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 28 Jul 2015 17:17:56 +0200 Subject: [PATCH] added Bandai Pengo and Burgertime tabletops (also marked not working until tested with external artwork) [hap, Kevin Horton, Rik] --- src/mame/mess.lst | 2 + src/mess/drivers/hh_hmcs40.c | 292 +++++++++++++++++++++++++++++++++-- src/mess/drivers/hh_melps4.c | 2 +- src/mess/drivers/hh_ucom4.c | 6 +- 4 files changed, 284 insertions(+), 18 deletions(-) diff --git a/src/mame/mess.lst b/src/mame/mess.lst index b27f215da71..e1d86f829e1 100644 --- a/src/mame/mess.lst +++ b/src/mame/mess.lst @@ -2155,6 +2155,8 @@ packmon // Bandai msthawk // Bandai/Mattel bzaxxon // Bandai zackman // Bandai +bpengo // Bandai +bbtime // Bandai bdoramon // Bandai bultrman // Bandai machiman // Bandai diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 1628595f2be..748d15d4389 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -50,8 +50,8 @@ @45 HD38820A 1982, Coleco Donkey Kong @49 HD38820A 1983, Bandai Zackman @61 HD38820A 1983, Coleco Ms. Pac-Man - *63 HD38820A 1983, Bandai Pengo - *65 HD38820A 1983, Bandai Burger Time + @63 HD38820A 1983, Bandai Pengo + @65 HD38820A 1983, Bandai Burger Time (PT-389) @69 HD38820A 1983, Gakken Dig Dug @70 HD38820A 1983, Parker Brothers Q*Bert @85 HD38820A 1984, Bandai Machine Man (PT-438) @@ -95,6 +95,7 @@ public: hh_hmcs40_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), m_inp_matrix(*this, "IN"), m_speaker(*this, "speaker"), m_display_wait(33), @@ -104,6 +105,7 @@ public: // devices required_device m_maincpu; + optional_device m_audiocpu; optional_ioport_array<7> m_inp_matrix; // max 7 optional_device m_speaker; @@ -974,14 +976,8 @@ WRITE8_MEMBER(bzaxxon_state::plate_w) m_plate = (m_plate & ~(0xf << shift)) | (data << shift); // update display - - // hmm plate desc. wrong? - // x, 7, 8, 9, 6, 5, 4, 3, 0, 3, 1, 2,16,10,17,11,12,13,14,15 - // 19,18,17,16,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - // , , , , , , , , , , , , , , , , , , , - UINT16 grid = BITSWAP16(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0); - UINT32 plate = m_plate;//BITSWAP24(m_plate,23,22,21,20, + UINT32 plate = BITSWAP24(m_plate,23,22,21,20,5,7,0,1,2,3,4,6,19,16,17,18,15,14,13,12,10,8,9,11) | 0x800; display_matrix(20, 11, plate, grid); } @@ -1007,7 +1003,7 @@ WRITE16_MEMBER(bzaxxon_state::grid_w) void bzaxxon_state::update_int1() { - // INT0 on multiplexed inputs + // INT1 on multiplexed inputs set_interrupt(1, read_inputs(4)); } @@ -1185,6 +1181,258 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Bandai Pengo (manufactured in Japan, licensed from Sega) + * PCB label FL Pengo(in katakana) + * Hitachi QFP HD38820A63 MCU + * cyan/red/blue VFD display Futaba DM-68ZK 3D DM-63 + + NOTE!: MESS external artwork is recommended + +***************************************************************************/ + +class bpengo_state : public hh_hmcs40_state +{ +public: + bpengo_state(const machine_config &mconfig, device_type type, const char *tag) + : hh_hmcs40_state(mconfig, type, tag) + { } + + void prepare_display(); + DECLARE_WRITE8_MEMBER(plate_w); + DECLARE_WRITE16_MEMBER(grid_w); + + void update_int0(); + DECLARE_INPUT_CHANGED_MEMBER(input_changed); +}; + +// handlers + +void bpengo_state::prepare_display() +{ + UINT8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7); + UINT32 plate = BITSWAP32(m_plate,31,30,29,28,23,22,21,16,17,18,19,20,27,26,25,24,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); + display_matrix(25, 8, plate, grid); +} + +WRITE8_MEMBER(bpengo_state::plate_w) +{ + // R0x-R6x: vfd matrix plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + prepare_display(); +} + +WRITE16_MEMBER(bpengo_state::grid_w) +{ + // D10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // D12-D15: input mux + UINT8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D0-D7: vfd matrix grid + m_grid = data & 0xff; + prepare_display(); +} + +void bpengo_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + + +// config + +static INPUT_PORTS_START( bpengo ) + PORT_START("IN.0") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, NULL) + + PORT_START("IN.1") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, NULL) + + PORT_START("IN.2") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, NULL) + + PORT_START("IN.3") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, NULL) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1) + + PORT_START("IN.5") // port D + PORT_CONFNAME( 0x0800, 0x0000, "Factory Test" ) + PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x0800, DEF_STR( On ) ) + PORT_BIT( 0xf7ff, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +INPUT_CHANGED_MEMBER(bpengo_state::input_changed) +{ + update_int0(); +} + + +static MACHINE_CONFIG_START( bpengo, bpengo_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", HD38820, 400000) // approximation + MCFG_HMCS40_WRITE_R_CB(0, WRITE8(bpengo_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(1, WRITE8(bpengo_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(2, WRITE8(bpengo_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(3, WRITE8(bpengo_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(4, WRITE8(bpengo_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(5, WRITE8(bpengo_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(6, WRITE8(bpengo_state, plate_w)) + MCFG_HMCS40_WRITE_D_CB(WRITE16(bpengo_state, grid_w)) + MCFG_HMCS40_READ_D_CB(IOPORT("IN.5")) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + +/*************************************************************************** + + Bandai Burger Time (manufactured in Japan, licensed from Data East) + * PCB label Kaken Corp. PT-389 Burger Time + * Hitachi QFP HD38820A65 MCU + * cyan/red/green VFD display NEC FIP6AM25T no. 21-21 + + NOTE!: MESS external artwork is recommended + +***************************************************************************/ + +class bbtime_state : public hh_hmcs40_state +{ +public: + bbtime_state(const machine_config &mconfig, device_type type, const char *tag) + : hh_hmcs40_state(mconfig, type, tag) + { } + + void prepare_display(); + DECLARE_WRITE8_MEMBER(plate_w); + DECLARE_WRITE16_MEMBER(grid_w); + + void update_int0(); + DECLARE_INPUT_CHANGED_MEMBER(input_changed); +}; + +// handlers + +void bbtime_state::prepare_display() +{ + UINT8 grid = BITSWAP8(m_grid,7,6,0,1,2,3,4,5); + UINT32 plate = BITSWAP32(m_plate,31,30,29,28,25,24,26,27,22,23,15,14,12,11,10,8,7,6,4,1,5,9,13,3,2,16,17,18,19,20,0,21) | 0x1; + display_matrix(28, 6, plate, grid); +} + +WRITE8_MEMBER(bbtime_state::plate_w) +{ + // R0x-R6x: vfd matrix plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + prepare_display(); +} + +WRITE16_MEMBER(bbtime_state::grid_w) +{ + // D3: speaker out + m_speaker->level_w(data >> 3 & 1); + + // D10-D14: input mux + UINT8 inp_mux = data >> 10 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D4-D9: vfd matrix grid + m_grid = data >> 4 & 0x3f; + prepare_display(); +} + +void bbtime_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(5)); +} + + +// config + +static INPUT_PORTS_START( bbtime ) + PORT_START("IN.0") // D10 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, NULL) + + PORT_START("IN.1") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, NULL) + + PORT_START("IN.2") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, NULL) + + PORT_START("IN.3") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, NULL) + + PORT_START("IN.4") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, NULL) + + PORT_START("IN.5") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1) +INPUT_PORTS_END + +INPUT_CHANGED_MEMBER(bbtime_state::input_changed) +{ + update_int0(); +} + + +static MACHINE_CONFIG_START( bbtime, bbtime_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", HD38820, 400000) // approximation + MCFG_HMCS40_WRITE_R_CB(0, WRITE8(bbtime_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(1, WRITE8(bbtime_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(2, WRITE8(bbtime_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(3, WRITE8(bbtime_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(4, WRITE8(bbtime_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(5, WRITE8(bbtime_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(6, WRITE8(bbtime_state, plate_w)) + MCFG_HMCS40_WRITE_D_CB(WRITE16(bbtime_state, grid_w)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + /*************************************************************************** Bandai Dokodemo Dorayaki Doraemon (FL LSI Game Push Up) (manufactured in Japan) @@ -1622,7 +1870,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim) void cdkong_state::prepare_display() { - UINT32 plate = BITSWAP32(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4); + UINT32 plate = BITSWAP32(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4) | 0x800800; display_matrix(29, 11, plate, m_grid); } @@ -1991,7 +2239,7 @@ WRITE8_MEMBER(cmspacmn_state::plate_w) // update display UINT16 grid = BITSWAP16(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1); - UINT64 plate = BIT(m_plate,15)<<32 | BITSWAP32(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16); + UINT64 plate = BIT(m_plate,15)<<32 | BITSWAP32(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080; display_matrix(33, 12, plate, grid); } @@ -2703,7 +2951,7 @@ WRITE8_MEMBER(gckong_state::plate_w) // update display UINT16 grid = BITSWAP16(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); - UINT32 plate = BITSWAP32(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0); + UINT32 plate = BITSWAP32(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0) | 0x8000; display_matrix(32, 11, plate, grid); } @@ -3105,7 +3353,7 @@ WRITE8_MEMBER(pbqbert_state::plate_w) m_plate = (m_plate & ~(0xf << shift)) | (data << shift); // update display - UINT32 plate = BITSWAP32(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23); + UINT32 plate = BITSWAP32(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23) | 0x400000; display_matrix(30, 8, plate, m_grid); } @@ -3553,6 +3801,20 @@ ROM_START( zackman ) ROM_END +ROM_START( bpengo ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a63", 0x0000, 0x1000, CRC(ebd6bc64) SHA1(0a322c47b9553a2739a85908ce64b9650cf93d49) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + +ROM_START( bbtime ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a65", 0x0000, 0x1000, CRC(33611faf) SHA1(29b6a30ed543688d31ec2aa18f7938fa4eef30b0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + ROM_START( bdoramon ) ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "hd38800b43", 0x0000, 0x1000, CRC(9387ca42) SHA1(8937e208934b34bd9f49700aa50287dfc8bda76c) ) @@ -3715,6 +3977,8 @@ CONS( 1981, packmon, 0, 0, packmon, packmon, driver_device, 0, "Banda CONS( 1982, msthawk, 0, 0, msthawk, msthawk, driver_device, 0, "Bandai (Mattel license)", "Star Hawk (Mattel)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1982, bzaxxon, 0, 0, bzaxxon, bzaxxon, driver_device, 0, "Bandai", "Zaxxon (Bandai)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1983, zackman, 0, 0, zackman, zackman, driver_device, 0, "Bandai", "Zackman", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) +CONS( 1983, bpengo, 0, 0, bpengo, bpengo, driver_device, 0, "Bandai", "Pengo (Bandai)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) +CONS( 1983, bbtime, 0, 0, bbtime, bbtime, driver_device, 0, "Bandai", "Burger Time (Bandai)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1983, bdoramon, 0, 0, bdoramon, bdoramon, driver_device, 0, "Bandai", "Dokodemo Dorayaki Doraemon", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1983, bultrman, 0, 0, bultrman, bultrman, driver_device, 0, "Bandai", "Ultra Man (Bandai)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1984, machiman, 0, 0, machiman, machiman, driver_device, 0, "Bandai", "Machine Man", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) diff --git a/src/mess/drivers/hh_melps4.c b/src/mess/drivers/hh_melps4.c index 3b76ce24243..b9db9475c2f 100644 --- a/src/mess/drivers/hh_melps4.c +++ b/src/mess/drivers/hh_melps4.c @@ -362,7 +362,7 @@ public: void gjungler_state::prepare_display() { UINT16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0,1); - UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,8,9,10,11,17,16,15,14,13,12,0,7,1,6,2,5,3,4); + UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,8,9,10,11,17,16,15,14,13,12,0,7,1,6,2,5,3,4) | 0x2000; display_matrix(18, 12, plate, grid); } diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index f2bbe1685f3..a6c9301e988 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -1871,7 +1871,7 @@ public: void tmpacman_state::prepare_display() { UINT8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7); - UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15); + UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15) | 0x100; display_matrix(19, 8, plate, grid); } @@ -1974,7 +1974,7 @@ public: void tmscramb_state::prepare_display() { - UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7); + UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7) | 0x400; display_matrix(17, 10, plate, m_grid); } @@ -2076,7 +2076,7 @@ public: void tcaveman_state::prepare_display() { UINT8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7); - UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1); + UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1) | 0x40; display_matrix(19, 8, plate, grid); }