diff --git a/src/mame/exidy/circus.cpp b/src/mame/exidy/circus.cpp index 35e87ed1067..bdf5121aa53 100644 --- a/src/mame/exidy/circus.cpp +++ b/src/mame/exidy/circus.cpp @@ -92,6 +92,19 @@ uint8_t circus_state::paddle_r() return m_paddle->read(); } +void circus_state::clown_z_w(uint8_t data) +{ + // This register triggers the discrete sound circuitry + //logerror("Z: %02X\n", data); + sound_w(data); + + // also used to enable the amplifier + machine().sound().system_mute(data & 0x80); + + // and the clown image currently displayed + m_clown_z = data; +} + /******************************************************************************* @@ -595,38 +608,19 @@ ROM_START( ripcord ) ROM_END -void circus_state::init_circus() -{ - m_game_id = 1; -} - -void circus_state::init_robotbwl() -{ - m_game_id = 2; -} -void circus_state::init_crash() -{ - m_game_id = 3; -} -void circus_state::init_ripcord() -{ - m_game_id = 4; -} - - /******************************************************************************* Game Drivers *******************************************************************************/ -GAMEL( 1977, circus, 0, circus, circus, circus_state, init_circus, ROT0, "Exidy / Taito", "Circus / Acrobat TV", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // named Acrobat TV when Taito published it in Japan -GAMEL( 1977, circuso, circus, circus, circus, circus_state, init_circus, ROT0, "Exidy / Taito", "Circus / Acrobat TV (older)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // " -GAMEL( 1977, springbd, circus, circus, circus, circus_state, init_circus, ROT0, "bootleg (Sub-Electro)", "Springboard (bootleg of Circus)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // looks like a text hack, but it also had a different bezel +GAMEL( 1977, circus, 0, circus, circus, circus_state, empty_init, ROT0, "Exidy / Taito", "Circus / Acrobat TV", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // named Acrobat TV when Taito published it in Japan +GAMEL( 1977, circuso, circus, circus, circus, circus_state, empty_init, ROT0, "Exidy / Taito", "Circus / Acrobat TV (older)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // " +GAMEL( 1977, springbd, circus, circus, circus, circus_state, empty_init, ROT0, "bootleg (Sub-Electro)", "Springboard (bootleg of Circus)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // looks like a text hack, but it also had a different bezel -GAME( 1977, robotbwl, 0, robotbwl, robotbwl, robotbwl_state, init_robotbwl, ROT0, "Exidy", "Robot Bowl", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1977, robotbwl, 0, robotbwl, robotbwl, robotbwl_state, empty_init, ROT0, "Exidy", "Robot Bowl", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -GAMEL( 1979, crash, 0, crash, crash, crash_state, init_crash, ROT0, "Exidy", "Crash (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) -GAMEL( 1979, crasha, crash, crash, crash, crash_state, init_crash, ROT0, "Exidy", "Crash (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crasha ) -GAMEL( 1979, smash, crash, crash, crash, crash_state, init_crash, ROT0, "bootleg", "Smash (Crash bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) // looks like a text hack, but it also had a different bezel +GAMEL( 1979, crash, 0, crash, crash, crash_state, empty_init, ROT0, "Exidy", "Crash (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) +GAMEL( 1979, crasha, crash, crash, crash, crash_state, empty_init, ROT0, "Exidy", "Crash (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crasha ) +GAMEL( 1979, smash, crash, crash, crash, crash_state, empty_init, ROT0, "bootleg", "Smash (Crash bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) // looks like a text hack, but it also had a different bezel -GAME( 1979, ripcord, 0, ripcord, ripcord, ripcord_state, init_ripcord, ROT0, "Exidy", "Rip Cord", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1979, ripcord, 0, ripcord, ripcord, ripcord_state, empty_init, ROT0, "Exidy", "Rip Cord", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/exidy/circus.h b/src/mame/exidy/circus.h index 015f571e976..7ebba201f30 100644 --- a/src/mame/exidy/circus.h +++ b/src/mame/exidy/circus.h @@ -32,11 +32,6 @@ public: void base_mcfg(machine_config &config); void circus(machine_config &config); - void init_ripcord(); - void init_circus(); - void init_robotbwl(); - void init_crash(); - protected: virtual void machine_start() override; virtual void machine_reset() override; @@ -56,12 +51,12 @@ protected: int m_clown_y = 0; int m_clown_z = 0; - int m_game_id = 0; void videoram_w(offs_t offset, uint8_t data); void clown_x_w(uint8_t data) { m_clown_x = 240 - data; } void clown_y_w(uint8_t data) { m_clown_y = 240 - data; } void clown_z_w(uint8_t data); uint8_t paddle_r(); + virtual void sound_w(uint8_t data); TILE_GET_INFO_MEMBER(get_bg_tile_info); virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -86,10 +81,10 @@ public: void robotbwl(machine_config &config); -protected: - virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override; - private: + virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override; + virtual void sound_w(uint8_t data) override; + void draw_box(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y); void draw_scoreboard(bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_bowling_alley(bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -108,10 +103,10 @@ public: void crash(machine_config &config); -protected: - virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override; - private: + virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override; + virtual void sound_w(uint8_t data) override; + void draw_car(bitmap_ind16 &bitmap, const rectangle &cliprect); }; @@ -127,8 +122,9 @@ public: void ripcord(machine_config &config); -protected: +private: virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override; + virtual void sound_w(uint8_t data) override; }; diff --git a/src/mame/exidy/circus_a.cpp b/src/mame/exidy/circus_a.cpp index e3926c4a9ff..655e9d47b7b 100644 --- a/src/mame/exidy/circus_a.cpp +++ b/src/mame/exidy/circus_a.cpp @@ -11,6 +11,12 @@ #include "emu.h" #include "circus.h" + + +/******************************************************************************* + Circus +*******************************************************************************/ + const char *const circus_sample_names[] = { "*circus", @@ -20,38 +26,9 @@ const char *const circus_sample_names[] = nullptr }; -const char *const crash_sample_names[] = -{ - "*crash", - "crash", - nullptr -}; - -const char *const ripcord_sample_names[] = -{ - "*ripcord", - "splash", - "scream", - "chute", - "whistle", - nullptr -}; - -const char *const robotbwl_sample_names[] = -{ - "*robotbwl", - "hit", - "roll", - "balldrop", - "demerit", - "reward", - nullptr -}; - - -/* Nodes - Inputs */ +// Nodes - Inputs #define CIRCUS_MUSIC_BIT NODE_01 -/* Nodes - Sounds */ +// Nodes - Sounds #define CIRCUS_MUSIC_SND NODE_10 DISCRETE_SOUND_START(circus_discrete) @@ -68,6 +45,116 @@ DISCRETE_SOUND_START(circus_discrete) DISCRETE_OUTPUT(CIRCUS_MUSIC_SND, 1) DISCRETE_SOUND_END + +void circus_state::sound_w(uint8_t data) +{ + // Bits 4-6 enable/disable trigger different events + switch ((data & 0x70) >> 4) + { + case 0: // All Off + m_discrete->write(CIRCUS_MUSIC_BIT, 0); + break; + + case 1: // Music + m_discrete->write(CIRCUS_MUSIC_BIT, 1); + break; + + case 2: // Pop + m_samples->start(0, 0); + break; + + case 3: // Normal Video + break; + + case 4: // Miss + m_samples->start(1, 1); + break; + + case 5: // Invert Video + break; + + case 6: // Bounce + m_samples->start(2, 2); + break; + + case 7: // Unused + break; + } +} + + + +/******************************************************************************* + Robot Bowl +*******************************************************************************/ + +const char *const robotbwl_sample_names[] = +{ + "*robotbwl", + "hit", + "roll", + "balldrop", + "demerit", + "reward", + nullptr +}; + +// Nodes - Inputs +#define ROBOTBWL_MUSIC_BIT NODE_01 +// Nodes - Sounds +#define ROBOTBWL_MUSIC_SND NODE_10 + +DISCRETE_SOUND_START(robotbwl_discrete) + /************************************************/ + /* Input register mapping for robotbwl */ + /************************************************/ + DISCRETE_INPUTX_LOGIC(ROBOTBWL_MUSIC_BIT, 30000, 0, 0) + + /************************************************/ + /* Music is just a 1 bit DAC */ + /************************************************/ + DISCRETE_RCFILTER(NODE_20, ROBOTBWL_MUSIC_BIT, RES_K(10), CAP_U(.47)) + DISCRETE_CRFILTER(ROBOTBWL_MUSIC_SND, NODE_20, RES_K(10) + RES_K(22), CAP_U(.1)) + + DISCRETE_OUTPUT(ROBOTBWL_MUSIC_SND, 1) +DISCRETE_SOUND_END + + +void robotbwl_state::sound_w(uint8_t data) +{ + if (data & 0x40) // Hit + m_samples->start(0, 0); + + if (data & 0x20) // Roll + m_samples->start(1, 1); + + if (data & 0x10) // Ball Drop + m_samples->start(2, 2); + + m_discrete->write(ROBOTBWL_MUSIC_BIT, data & 0x08); // Footsteps + + //if (data & 0x04) // Invert + + if (data & 0x02) // Demerit + m_samples->start(3, 3); + + if (data & 0x01) // Reward + m_samples->start(4, 4); +} + + + +/******************************************************************************* + Crash +*******************************************************************************/ + +const char *const crash_sample_names[] = +{ + "*crash", + "crash", + nullptr +}; + static const discrete_mixer_desc crash_mixer = { DISC_MIXER_IS_RESISTOR, @@ -80,24 +167,24 @@ static const discrete_mixer_desc crash_mixer = static const discrete_555_desc crash_beeper_555m = { DISC_555_OUT_SQW | DISC_555_OUT_DC | DISC_555_TRIGGER_IS_LOGIC, - 5, // B+ voltage of 555 + 5, // B+ voltage of 555 DEFAULT_555_VALUES }; static const discrete_555_desc crash_beeper_555a = { DISC_555_OUT_SQW | DISC_555_OUT_DC, - 5, // B+ voltage of 555 + 5, // B+ voltage of 555 DEFAULT_555_VALUES }; -/* Nodes - Inputs */ +// Nodes - Inputs #define CRASH_MUSIC_BIT NODE_01 #define CRASH_BEEPER_EN NODE_02 -/* Nodes - Adjusters */ +// Nodes - Adjusters #define CRASH_R63 NODE_10 #define CRASH_R39 NODE_11 -/* Nodes - Sounds */ +// Nodes - Sounds #define CRASH_MUSIC_SND NODE_20 #define CRASH_BEEPER_SND NODE_21 @@ -131,133 +218,92 @@ DISCRETE_SOUND_START(crash_discrete) DISCRETE_OUTPUT(NODE_90, 1) DISCRETE_SOUND_END -/* Nodes - Inputs */ -#define ROBOTBWL_MUSIC_BIT NODE_01 -/* Nodes - Sounds */ -#define ROBOTBWL_MUSIC_SND NODE_10 -DISCRETE_SOUND_START(robotbwl_discrete) - /************************************************/ - /* Input register mapping for robotbwl */ - /************************************************/ - DISCRETE_INPUTX_LOGIC(ROBOTBWL_MUSIC_BIT, 30000, 0, 0) - - /************************************************/ - /* Music is just a 1 bit DAC */ - /************************************************/ - DISCRETE_RCFILTER(NODE_20, ROBOTBWL_MUSIC_BIT, RES_K(10), CAP_U(.47)) - DISCRETE_CRFILTER(ROBOTBWL_MUSIC_SND, NODE_20, RES_K(10) + RES_K(22), CAP_U(.1)) - - DISCRETE_OUTPUT(ROBOTBWL_MUSIC_SND, 1) -DISCRETE_SOUND_END - - -/* This register controls the clown image currently displayed */ -/* and also is used to enable the amplifier and trigger the */ -/* discrete circuitry that produces sound effects and music */ - -void circus_state::clown_z_w(uint8_t data) +void crash_state::sound_w(uint8_t data) { - m_clown_z = (data & 0x0f); - *(memregion("maincpu")->base() + 0x8000) = data; logerror("Z:%02x\n",data); //DEBUG - - /* Bits 4-6 enable/disable trigger different events */ - switch (m_game_id) + // Bits 4-6 enable/disable trigger different events + switch ((data & 0x70) >> 4) { - case 1: /* circus */ - case 4: /* ripcord */ - switch ((data & 0x70) >> 4) - { - case 0 : /* All Off */ - m_discrete->write(CIRCUS_MUSIC_BIT, 0); - break; - - case 1 : /* Music */ - m_discrete->write(CIRCUS_MUSIC_BIT, 1); - break; - - case 2 : /* Circus = Pop; Rip Cord = Splash */ - m_samples->start(0, 0); - break; - - case 3 : /* Normal Video */ - break; - - case 4 : /* Circus = Miss; Rip Cord = Scream */ - m_samples->start(1, 1); - break; - - case 5 : /* Invert Video */ - break; - - case 6 : /* Circus = Bounce; Rip Cord = Chute Open */ - m_samples->start(2, 2); - break; - - case 7 : /* Circus = not used; Rip Cord = Whistle */ - if (m_game_id == 4) - m_samples->start(3, 3); - break; - } + case 0: // All Off + m_discrete->write(CRASH_MUSIC_BIT, 0); break; - case 2: /* robotbwl */ - m_discrete->write(ROBOTBWL_MUSIC_BIT, data & 0x08); /* Footsteps */ - - if (data & 0x40) /* Hit */ - m_samples->start(0, 0); - - if (data & 0x20) /* Roll */ - m_samples->start(1, 1); - - if (data & 0x10) /* Ball Drop */ - m_samples->start(2, 2); - - if (data & 0x02) /* Demerit */ - m_samples->start(3, 3); - - if (data & 0x01) /* Reward */ - m_samples->start(4, 4); - - // if (data & 0x04) /* Invert */ + case 1: // Music + m_discrete->write(CRASH_MUSIC_BIT, 1); break; - case 3: /* crash */ - /* Only the crash can be done with a sample */ - switch ((data & 0x70) >> 4) - { - case 0 : /* All Off */ - m_discrete->write(CRASH_MUSIC_BIT, 0); - break; + case 2: // Crash + m_samples->start(0, 0); + break; - case 1 : /* Music */ - m_discrete->write(CRASH_MUSIC_BIT, 1); - break; + case 3: // Normal Video and Beep + m_discrete->write(CRASH_BEEPER_EN, 0); + break; - case 2 : /* Crash */ - m_samples->start(0, 0); - break; + case 4: // Skid + break; - case 3 : /* Normal Video and Beep */ - m_discrete->write(CRASH_BEEPER_EN, 0); - break; + case 5: // Invert Video and Beep + m_discrete->write(CRASH_BEEPER_EN, 0); + break; - case 4 : /* Skid */ - break; + case 6: // Hi Motor + break; - case 5 : /* Invert Video and Beep */ - m_discrete->write(CRASH_BEEPER_EN, 0); - break; - - case 6 : /* Hi Motor */ - break; - - case 7 : /* Low Motor */ - break; - } + case 7: // Low Motor + break; + } +} + + + +/******************************************************************************* + Rip Cord +*******************************************************************************/ + +const char *const ripcord_sample_names[] = +{ + "*ripcord", + "splash", + "scream", + "chute", + "whistle", + nullptr +}; + +void ripcord_state::sound_w(uint8_t data) +{ + // Bits 4-6 enable/disable trigger different events + switch ((data & 0x70) >> 4) + { + case 0: // All Off + m_discrete->write(CIRCUS_MUSIC_BIT, 0); + break; + + case 1: // Music + m_discrete->write(CIRCUS_MUSIC_BIT, 1); + break; + + case 2: // Splash + m_samples->start(0, 0); + break; + + case 3: // Normal Video + break; + + case 4: // Scream + m_samples->start(1, 1); + break; + + case 5: // Invert Video + break; + + case 6: // Chute Open + m_samples->start(2, 2); + break; + + case 7: // Whistle + m_samples->start(3, 3); break; } - - /* Bit 7 enables amplifier (0 = on) */ - machine().sound().system_mute(data & 0x80); } diff --git a/src/mame/exidy/circus_v.cpp b/src/mame/exidy/circus_v.cpp index bc0b4a6877e..60da4669a35 100644 --- a/src/mame/exidy/circus_v.cpp +++ b/src/mame/exidy/circus_v.cpp @@ -12,6 +12,7 @@ #include "circus.h" + /******************************************************************************* Shared *******************************************************************************/