From c5ad28736d7664105dd9167c443ce1e0dd3feaf9 Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 24 Apr 2019 17:10:38 +0200 Subject: New clone added --------- Carnival (upright, PIT8253 music) [hap, Andrew Welburn] --- src/mame/audio/carnival.cpp | 108 ++++++++++++++++++++++++++++++------------- src/mame/drivers/vicdual.cpp | 59 +++++++++++++++++++---- src/mame/includes/vicdual.h | 30 ++++++++---- src/mame/mame.lst | 1 + 4 files changed, 148 insertions(+), 50 deletions(-) diff --git a/src/mame/audio/carnival.cpp b/src/mame/audio/carnival.cpp index 36f9c8a039f..d64892f4bd2 100644 --- a/src/mame/audio/carnival.cpp +++ b/src/mame/audio/carnival.cpp @@ -126,7 +126,6 @@ WRITE8_MEMBER( carnival_state::carnival_audio_1_w ) } } - WRITE8_MEMBER( carnival_state::carnival_audio_2_w ) { int bitsChanged; @@ -156,34 +155,13 @@ WRITE8_MEMBER( carnival_state::carnival_audio_2_w ) /* Music board */ -void carnival_state::carnival_psg_latch(address_space &space) -{ - if (m_psgBus & 1) - { - // BDIR W, BC1 selects address or data - if (m_psgBus & 2) - m_psg->address_w(m_psgData); - else - m_psg->data_w(m_psgData); - } -} - -WRITE8_MEMBER( carnival_state::carnival_music_port_1_w ) -{ - // P1: ay8912 d0-d7 - m_psgData = data; - carnival_psg_latch(space); -} +// common -WRITE8_MEMBER( carnival_state::carnival_music_port_2_w ) +void carnival_state::mboard_map(address_map &map) { - // P2 d6: AY8912 BDIR(R/W) - // P2 d7: AY8912 BC1 - m_psgBus = data >> 6 & 3; - carnival_psg_latch(space); + map(0x0000, 0x03ff).rom(); } - READ_LINE_MEMBER( carnival_state::carnival_music_port_t1_r ) { // T1: comms from audio port 2 d3 @@ -191,22 +169,45 @@ READ_LINE_MEMBER( carnival_state::carnival_music_port_t1_r ) } -void carnival_state::mboard_map(address_map &map) +// AY8912 music + +void carnival_state::carnival_psg_latch() { - map(0x0000, 0x03ff).rom(); + if (m_musicBus & 1) + { + // BDIR W, BC1 selects address or data + if (m_musicBus & 2) + m_psg->address_w(m_musicData); + else + m_psg->data_w(m_musicData); + } } +WRITE8_MEMBER( carnival_state::carnivala_music_port_1_w ) +{ + // P1: AY8912 d0-d7 + m_musicData = data; + carnival_psg_latch(); +} -void carnival_state::carnival_audio(machine_config &config) +WRITE8_MEMBER( carnival_state::carnivala_music_port_2_w ) +{ + // P2 d6: AY8912 BDIR(R/W) + // P2 d7: AY8912 BC1 + m_musicBus = data >> 6 & 3; + carnival_psg_latch(); +} + +void carnival_state::carnivala_audio(machine_config &config) { /* music board */ - I8039(config, m_audiocpu, XTAL(3'579'545)); + I8035(config, m_audiocpu, XTAL(3'579'545)); m_audiocpu->set_addrmap(AS_PROGRAM, &carnival_state::mboard_map); - m_audiocpu->p1_out_cb().set(FUNC(carnival_state::carnival_music_port_1_w)); - m_audiocpu->p2_out_cb().set(FUNC(carnival_state::carnival_music_port_2_w)); + m_audiocpu->p1_out_cb().set(FUNC(carnival_state::carnivala_music_port_1_w)); + m_audiocpu->p2_out_cb().set(FUNC(carnival_state::carnivala_music_port_2_w)); m_audiocpu->t1_in_cb().set(FUNC(carnival_state::carnival_music_port_t1_r)); - AY8912(config, m_psg, XTAL(3'579'545)/3).add_route(ALL_OUTPUTS, "mono", 0.25); + AY8912(config, m_psg, XTAL(3'579'545)/3).add_route(ALL_OUTPUTS, "mono", 0.25); // also seen with AY-3-8910, daughterboard has place for either chip /* samples */ SAMPLES(config, m_samples); @@ -214,3 +215,46 @@ void carnival_state::carnival_audio(machine_config &config) m_samples->set_samples_names(carnival_sample_names); m_samples->add_route(ALL_OUTPUTS, "mono", 0.5); } + + +// PIT8253 music + +WRITE8_MEMBER( carnival_state::carnivalb_music_port_1_w ) +{ + // P1: PIT8253 d0-d7 + m_musicData = data; +} + +WRITE8_MEMBER( carnival_state::carnivalb_music_port_2_w ) +{ + // P2 d7: PIT8253 write strobe + // P2 d5,d6: PIT8253 A0,A1 + if (~m_musicBus & data & 0x80) + m_pit->write(data >> 5 & 3, m_musicData); + + m_musicBus = data; +} + +void carnival_state::carnivalb_audio(machine_config &config) +{ + // already inherited carnivala_audio + config.device_remove("psg"); + + m_audiocpu->p1_out_cb().set(FUNC(carnival_state::carnivalb_music_port_1_w)); + m_audiocpu->p2_out_cb().set(FUNC(carnival_state::carnivalb_music_port_2_w)); + + PIT8253(config, m_pit, 0); + m_pit->set_clk<0>(XTAL(3'579'545)/3); + m_pit->set_clk<1>(XTAL(3'579'545)/3); + m_pit->set_clk<2>(XTAL(3'579'545)/3); + + m_pit->out_handler<0>().set(m_dac[0], FUNC(dac_bit_interface::write)); + m_pit->out_handler<1>().set(m_dac[1], FUNC(dac_bit_interface::write)); + m_pit->out_handler<2>().set(m_dac[2], FUNC(dac_bit_interface::write)); + + for (int i = 0; i < 3; i++) + { + DAC_1BIT(config, m_dac[i]).add_route(ALL_OUTPUTS, "mono", 0.15); + VOLTAGE_REGULATOR(config, m_vref[i]).add_route(0, m_dac[i], 1.0, DAC_VREF_POS_INPUT); + } +} diff --git a/src/mame/drivers/vicdual.cpp b/src/mame/drivers/vicdual.cpp index bd38d1cec50..f2664f90bff 100644 --- a/src/mame/drivers/vicdual.cpp +++ b/src/mame/drivers/vicdual.cpp @@ -266,11 +266,11 @@ void carnival_state::machine_start() { vicdual_state::machine_start(); - m_psgData = 0; - m_psgBus = 0; + m_musicData = 0; + m_musicBus = 0; - save_item(NAME(m_psgData)); - save_item(NAME(m_psgBus)); + save_item(NAME(m_musicData)); + save_item(NAME(m_musicBus)); } @@ -2204,7 +2204,15 @@ void carnival_state::carnival(machine_config &config) /* audio hardware */ SPEAKER(config, "mono").front_center(); - carnival_audio(config); + carnivala_audio(config); +} + +void carnival_state::carnivalb(machine_config &config) +{ + carnival(config); + + /* audio hardware */ + carnivalb_audio(config); } void carnival_state::carnivalh(machine_config &config) @@ -3465,13 +3473,42 @@ ROM_START( carnival ) ROM_LOAD( "epr-666.u1", 0x3c00, 0x0400, CRC(4eec7fae) SHA1(cdc858165136c55b01511805c9d4dc6bc598fe1f) ) ROM_REGION( 0x0020, "proms", 0 ) - ROM_LOAD( "316-633", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) + ROM_LOAD( "316-633", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */ - ROM_LOAD( "epr-412", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) ) + ROM_LOAD( "epr-412.u5", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) ) ROM_REGION( 0x0020, "user1", 0 ) /* timing PROM */ - ROM_LOAD( "316-0206.u14", 0x0000, 0x0020, CRC(9617d796) SHA1(7cff2741866095ff42eadd8022bea349ec8d2f39) ) /* control PROM */ + ROM_LOAD( "316-0206.u14", 0x0000, 0x0020, CRC(9617d796) SHA1(7cff2741866095ff42eadd8022bea349ec8d2f39) ) /* control PROM */ +ROM_END + +ROM_START( carnivalb ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "epr-651.u33", 0x0000, 0x0400, CRC(9f2736e6) SHA1(c3fb9197b5e83dc7d5335de2268e0acb30cf8328) ) + ROM_LOAD( "epr-652.u32", 0x0400, 0x0400, CRC(a1f58beb) SHA1(e027beca7bf3ef5ef67e2195f909332fd194b5dc) ) + ROM_LOAD( "epr-653.u31", 0x0800, 0x0400, CRC(67b17922) SHA1(46cdfd0371dec61a5440c2111660729c0f0ecdb8) ) + ROM_LOAD( "epr-654.u30", 0x0c00, 0x0400, CRC(befb09a5) SHA1(da44b6a869b5eb0705e01fee4478696f6bef9de8) ) + ROM_LOAD( "epr-655.u29", 0x1000, 0x0400, CRC(623fcdad) SHA1(35890964f5cf799c141002916641089ccec0fcc9) ) + ROM_LOAD( "epr-656.u28", 0x1400, 0x0400, CRC(53040332) SHA1(ff7a06d93cb890abf0616770774668396d128ba3) ) + ROM_LOAD( "epr-657.u27", 0x1800, 0x0400, CRC(f2537467) SHA1(262b859098f4f7e5e9bf2f83bda833044824226e) ) + ROM_LOAD( "epr-658.u26", 0x1c00, 0x0400, CRC(fcc3854e) SHA1(7adbd6ca6f636dec75fa6eccdf3381686e074bc6) ) + ROM_LOAD( "epr-659.u8", 0x2000, 0x0400, CRC(28be8d69) SHA1(2d9ac9a53f00fe2282e4317585e6bddadb676c0f) ) + ROM_LOAD( "epr-660.u7", 0x2400, 0x0400, CRC(3873ccdb) SHA1(56be81fdee8947758ba966915c0739e5560a7f94) ) + ROM_LOAD( "epr-661.u6", 0x2800, 0x0400, CRC(d9a96dff) SHA1(0366acf3418901bfeeda59d4cd51fe8ceaad4577) ) + ROM_LOAD( "epr-662.u5", 0x2c00, 0x0400, CRC(d893ca72) SHA1(564176ab7f3757d51db8eef9fbc4228fa2ce328f) ) + ROM_LOAD( "epr-663.u4", 0x3000, 0x0400, CRC(df8c63c5) SHA1(e8d0632b5cb5bd7f698485531f3edeb13efdc685) ) + ROM_LOAD( "epr-664.u3", 0x3400, 0x0400, CRC(689a73e8) SHA1(b4134e8d892df7ba3352e4d3f581923decae6e54) ) + ROM_LOAD( "epr-665.u2", 0x3800, 0x0400, CRC(28e7b2b6) SHA1(57eb5dd0f11da8ff8001e76036264246d6bc27d2) ) + ROM_LOAD( "epr-666.u1", 0x3c00, 0x0400, CRC(4eec7fae) SHA1(cdc858165136c55b01511805c9d4dc6bc598fe1f) ) + + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "316-633", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) + + ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */ + ROM_LOAD( "carnival_b.u5", 0x0000, 0x0400, CRC(422abb43) SHA1(edb6f74ccf9382624353e927ac225e1455bb1144) ) + + ROM_REGION( 0x0020, "user1", 0 ) /* timing PROM */ + ROM_LOAD( "316-0206.u14", 0x0000, 0x0020, CRC(9617d796) SHA1(7cff2741866095ff42eadd8022bea349ec8d2f39) ) /* control PROM */ ROM_END ROM_START( carnivalc ) @@ -3497,7 +3534,7 @@ ROM_START( carnivalc ) ROM_LOAD( "316-633", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) ROM_REGION( 0x0400, "audiocpu", 0 ) /* sound ROM */ - ROM_LOAD( "epr-412", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) ) + ROM_LOAD( "epr-412.u5", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) ) ROM_REGION( 0x0020, "user1", 0 ) /* timing PROM */ ROM_LOAD( "316-0206.u14", 0x0000, 0x0020, CRC(9617d796) SHA1(7cff2741866095ff42eadd8022bea349ec8d2f39) ) /* control PROM */ @@ -3866,6 +3903,7 @@ ROM_END * *************************************/ +// YEAR NAME PARENT MACHINE INPUT CLASS INIT ORIENT. COMPANY, FULLNAME, FLAGS GAMEL(1977, depthch, 0, depthch, depthch, vicdual_state, empty_init, ROT0, "Gremlin", "Depthcharge", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_depthch ) GAMEL(1977, depthcho, depthch, depthch, depthch, vicdual_state, empty_init, ROT0, "Gremlin", "Depthcharge (older)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_depthch ) GAMEL(1977, subhunt, depthch, depthch, depthch, vicdual_state, empty_init, ROT0, "Gremlin (Taito license)", "Sub Hunter (Gremlin / Taito)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_depthch ) @@ -3897,7 +3935,8 @@ GAME( 1979, carhntds, 0, carhntds, carhntds, vicdual_state, empty_in GAME( 1980, tranqgun, 0, tranqgun, tranqgun, vicdual_state, empty_init, ROT270, "Sega", "Tranquillizer Gun", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1980, spacetrk, 0, spacetrk, spacetrk, vicdual_state, empty_init, ROT270, "Sega", "Space Trek (upright)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1980, spacetrkc, spacetrk, spacetrk, spacetrkc, vicdual_state, empty_init, ROT270, "Sega", "Space Trek (cocktail)", MACHINE_IMPERFECT_GRAPHICS |MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1980, carnival, 0, carnival, carnival, carnival_state, empty_init, ROT270, "Sega", "Carnival (upright)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1980, carnival, 0, carnival, carnival, carnival_state, empty_init, ROT270, "Sega", "Carnival (upright, AY8912 music)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1980, carnivalb, carnival, carnivalb, carnival, carnival_state, empty_init, ROT270, "Sega", "Carnival (upright, PIT8253 music)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1980, carnivalc, carnival, carnival, carnivalc, carnival_state, empty_init, ROT270, "Sega", "Carnival (cocktail)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1980, carnivalh, carnival, carnivalh, carnivalh, carnival_state, empty_init, ROT270, "Sega", "Carnival (Head On hardware, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1980, carnivalha, carnival, carnivalh, carnivalh, carnival_state, empty_init, ROT270, "Sega", "Carnival (Head On hardware, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/vicdual.h b/src/mame/includes/vicdual.h index cd461c54e6f..0a453acdba8 100644 --- a/src/mame/includes/vicdual.h +++ b/src/mame/includes/vicdual.h @@ -7,10 +7,13 @@ *************************************************************************/ #include "cpu/mcs48/mcs48.h" +#include "machine/pit8253.h" #include "machine/timer.h" #include "sound/ay8910.h" +#include "sound/dac.h" #include "sound/discrete.h" #include "sound/samples.h" +#include "sound/volt_reg.h" #include "screen.h" #include "audio/vicdual-97271p.h" #include "video/vicdual-97269pb.h" @@ -247,24 +250,33 @@ public: carnival_state(const machine_config &mconfig, device_type type, const char *tag) : vicdual_state(mconfig, type, tag), m_audiocpu(*this, "audiocpu"), - m_psg(*this, "psg") + m_psg(*this, "psg"), + m_pit(*this, "pit"), + m_dac(*this, "dac%u", 0), + m_vref(*this, "vref%u", 0) { } void carnival(machine_config &config); - void carnival_audio(machine_config &config); + void carnivalb(machine_config &config); void carnivalh(machine_config &config); + void carnivala_audio(machine_config &config); + void carnivalb_audio(machine_config &config); + protected: virtual void machine_start() override; - optional_device m_audiocpu; + required_device m_audiocpu; optional_device m_psg; + optional_device m_pit; + optional_device_array m_dac; + optional_device_array m_vref; void carnival_io_map(address_map &map); void mboard_map(address_map &map); - int m_psgData; - int m_psgBus; + int m_musicData; + int m_musicBus; DECLARE_WRITE8_MEMBER(carnival_io_w); @@ -272,9 +284,11 @@ protected: DECLARE_WRITE8_MEMBER( carnival_audio_1_w ); DECLARE_WRITE8_MEMBER( carnival_audio_2_w ); DECLARE_READ_LINE_MEMBER( carnival_music_port_t1_r ); - DECLARE_WRITE8_MEMBER( carnival_music_port_1_w ); - DECLARE_WRITE8_MEMBER( carnival_music_port_2_w ); - void carnival_psg_latch(address_space &space); + DECLARE_WRITE8_MEMBER( carnivala_music_port_1_w ); + DECLARE_WRITE8_MEMBER( carnivala_music_port_2_w ); + void carnival_psg_latch(); + DECLARE_WRITE8_MEMBER( carnivalb_music_port_1_w ); + DECLARE_WRITE8_MEMBER( carnivalb_music_port_2_w ); }; class headonsa_state : public vicdual_state diff --git a/src/mame/mame.lst b/src/mame/mame.lst index a1111be9248..46f8d50323d 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -38735,6 +38735,7 @@ brdrlins // Sidam bootleg car2 // bootleg carhntds // carnival // 651-666 (c) 1980 Sega +carnivalb // carnivalc // 501-516 (c) 1980 Sega carnivalh // carnivalha // -- cgit v1.2.3