diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp index 45e3f433897..beadd3ededd 100644 --- a/src/mame/drivers/hh_hmcs40.cpp +++ b/src/mame/drivers/hh_hmcs40.cpp @@ -19,9 +19,9 @@ @04 HD38800A 1980, Gakken Heiankyo Alien @25 HD38800A 1981, Coleco Alien Attack @27 HD38800A 1981, Bandai Packri Monster - *31 HD38800A 1981, Entex Select-a-Game cartridge: Space Invader 2 (have dump) - *37 HD38800A 1981, Entex Select-a-Game cartridge: Baseball 4 (have dump) - *38 HD38800A 1981, Entex Select-a-Game cartridge: Pinball (have dump) + @31 HD38800A 1981, Entex Select-a-Game cartridge: Space Invader 2 + @37 HD38800A 1981, Entex Select-a-Game cartridge: Baseball 4 + @38 HD38800A 1981, Entex Select-a-Game cartridge: Pinball *41 HD38800A 1982, Gakken Puck Monster *51 HD38800A 1981, Actronics(Hanzawa) Twinvader (larger white version) @70 HD38800A 1982, Coleco Galaxian @@ -147,6 +147,7 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void display_update(); void set_display_size(int maxx, int maxy); + void set_display_segmask(UINT32 digits, UINT32 mask); void display_matrix(int maxx, int maxy, UINT64 setx, UINT32 sety, bool update = true); protected: @@ -276,6 +277,17 @@ void hh_hmcs40_state::set_display_size(int maxx, int maxy) m_display_maxy = maxy; } +void hh_hmcs40_state::set_display_segmask(UINT32 digits, UINT32 mask) +{ + // set a segment mask per selected digit, but leave unselected ones alone + for (int i = 0; i < 0x20; i++) + { + if (digits & 1) + m_display_segmask[i] = mask; + digits >>= 1; + } +} + void hh_hmcs40_state::display_matrix(int maxx, int maxy, UINT64 setx, UINT32 sety, bool update) { set_display_size(maxx, maxy); @@ -2503,6 +2515,136 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Entex Select-A-Game (HMCS40 MCU cartridges) + * see gamelist for cartridge info + * cyan/red VFD display Futaba DM-16Z + cyan VFD 9-digit panel Futaba 9-ST-11A 1F + + The console is the peripheral, the heart of the system is the cartridge. + Cartridges with a HMCS40 MCU are implemented in this driver. + + MAME external artwork is recommended, needed for per-game VFD overlays. + +***************************************************************************/ + +class sag_state : public hh_hmcs40_state +{ +public: + sag_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); + DECLARE_READ16_MEMBER(input_r); +}; + +// handlers + +void sag_state::prepare_display() +{ + // grid 0-7 are the 'pixels' + for (int y = 0; y < 8; y++) + m_display_state[y] = (m_grid >> y & 1) ? m_plate : 0; + + // grid 8-11 are 7segs + set_display_segmask(0xf00, 0x7f); + UINT8 seg = BITSWAP8(m_plate,3,4,5,6,7,8,9,10); + for (int y = 8; y < 12; y++) + m_display_state[y] = (m_grid >> y & 1) ? seg : 0; + + set_display_size(14, 12); + display_update(); +} + +WRITE8_MEMBER(sag_state::plate_w) +{ + // R0x-R3x: vfd matrix plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + prepare_display(); +} + +WRITE16_MEMBER(sag_state::grid_w) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D2-D7: input mux + m_inp_mux = data >> 2 & 0x3f; + + // D1-D12: vfd matrix grid + m_grid = data >> 1 & 0xfff; + prepare_display(); +} + +READ16_MEMBER(sag_state::input_r) +{ + // D13-D15: multiplexed inputs + return read_inputs(6) << 13; +} + + +// config + +static INPUT_PORTS_START( sag ) + PORT_START("IN.0") // D2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("P1 Button 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Button 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // D3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Button 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Button 4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // D4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_NAME("P1 Button 3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Button 1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Button 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // D6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Button 5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Button 5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Button 7") + + PORT_START("IN.5") // D7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Button 6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Button 6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Button 7") +INPUT_PORTS_END + +static MACHINE_CONFIG_START( sag, sag_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", HD38800, 450000) // approximation + MCFG_HMCS40_WRITE_R_CB(0, WRITE8(sag_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(1, WRITE8(sag_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(2, WRITE8(sag_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(3, WRITE8(sag_state, plate_w)) + MCFG_HMCS40_WRITE_D_CB(WRITE16(sag_state, grid_w)) + MCFG_HMCS40_READ_D_CB(READ16(sag_state, input_r)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) + + /* 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 + + + + + /*************************************************************************** Entex Galaxian 2 (manufactured in Japan) @@ -4145,6 +4287,27 @@ ROM_START( cmspacmn ) ROM_END +ROM_START( sag_si2 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "inv2_hd38800a31", 0x0000, 0x1000, BAD_DUMP CRC(29c8c100) SHA1(41cd413065659c6d7d5b2408de2ca6d51c49629a) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + +ROM_START( sag_bb4 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b-b5_hd38800a37", 0x0000, 0x1000, CRC(64852bd5) SHA1(fb1c24ca43934ceb6fc35ac7c35b71e6e843dbc5) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + +ROM_START( sag_pb ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "pinb_hd38800a38", 0x0000, 0x1000, CRC(6e53a56b) SHA1(13f057eab2e4cfbb3ef1247a041abff15ae727c9) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + ROM_START( egalaxn2 ) ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "hd38820a13", 0x0000, 0x1000, CRC(112b721b) SHA1(4a185bc57ea03fe64f61f7db4da37b16eeb0cb54) ) @@ -4304,6 +4467,9 @@ CONS( 1981, cpacman, 0, 0, cpacman, cpacman, driver_device, 0, "Colec CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, driver_device, 0, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE ) CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, driver_device, 0, "Coleco", "Ms. Pac-Man (Coleco)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, sag_si2, 0, 0, sag, sag, driver_device, 0, "Entex", "Select-A-Game: Space Invader 2", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) // suspect bad dump +CONS( 1981, sag_bb4, 0, 0, sag, sag, driver_device, 0, "Entex", "Select-A-Game: Baseball 4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, sag_pb, 0, 0, sag, sag, driver_device, 0, "Entex", "Select-A-Game: Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, driver_device, 0, "Entex", "Galaxian 2 (Entex)", MACHINE_SUPPORTS_SAVE ) CONS( 1981, epacman2, 0, 0, epacman2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex, cyan Pacman)", MACHINE_SUPPORTS_SAVE ) CONS( 1981, epacman2r, epacman2, 0, epacman2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex, red Pacman)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 32e3aa6f14e..39d7101fcb8 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -14042,6 +14042,9 @@ mwcbaseb // Mattel packmon // Bandai pairmtch // Bandai pbqbert // Parker Brothers +sag_si2 // Entex +sag_bb4 // Entex +sag_pb // Entex tmtron // Tomy vinvader // VTech zackman // Bandai