From c40822e56104b34e4874f35fe2898c04a8fbba59 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sat, 5 Mar 2022 10:44:05 +1100 Subject: [PATCH] babypac,granny: added sound. --- src/mame/drivers/by17.cpp | 54 +++++---- src/mame/drivers/by35.cpp | 160 ++++++++++++++++++--------- src/mame/drivers/byvid.cpp | 218 ++++++++++++++++++------------------- src/mame/drivers/zac_2.cpp | 14 +-- 4 files changed, 258 insertions(+), 188 deletions(-) diff --git a/src/mame/drivers/by17.cpp b/src/mame/drivers/by17.cpp index 2df32735d9f..91d14b6c688 100644 --- a/src/mame/drivers/by17.cpp +++ b/src/mame/drivers/by17.cpp @@ -2,18 +2,32 @@ // copyright-holders:Robbbert, Quench /******************************************************************************************** - PINBALL - Bally MPU AS-2518-17 +PINBALL +Bally MPU AS-2518-17 - These are some very early and well known Solid State machines, such as 'Eight Ball'. +Games: +**** Bally **** +- Bow and Arrow (#1033) +- Freedom (#1066) +- Night Rider (#1074) +- Black Jack (#1092) +- Evel Knievel (#1094) +- Mata Hari (#1104) +- Eight Ball (#1118) +- Bobby Orr Power Play (#1120) +- Strikes and Spares (#1135) +**** Other **** +- 301/Bull's Eye +- Stellar Airship +- Super Zeus +- Verspiel Dein Wasser Nicht! - They have orange digital 6 digit displays, and a mechanical chime unit for sounds. +They have orange digital 6 digit displays, and a mechanical chime unit for sounds. ToDo: - Bow & Arrow fails the PIA test and doesn't boot - Dips, Inputs, Solenoids vary per game -- Mechanical *********************************************************************************************/ @@ -75,19 +89,19 @@ protected: virtual void machine_reset() override; private: - uint8_t m_u10a; - uint8_t m_u10b; - uint8_t m_u11a; - uint8_t m_u11b; - bool m_u10_ca2; - bool m_u10_cb1; - bool m_u10_cb2; - bool m_u11_ca1; - bool m_u11_cb2; - uint8_t m_segment[6]; - uint8_t m_lamp_decode; - uint8_t m_solenoid_features[20][4]; - uint8_t m_io_hold_x[5]; // Used to hold switches closed (drop targets, balls in outholes/saucers etc). Solenoid activity release them. + uint8_t m_u10a = 0U; + uint8_t m_u10b = 0U; + uint8_t m_u11a = 0U; + uint8_t m_u11b = 0U; + bool m_u10_ca2 = 0; + bool m_u10_cb1 = 0; + bool m_u10_cb2 = 0; + bool m_u11_ca1 = 0; + bool m_u11_cb2 = 0; + uint8_t m_segment[6]{}; + uint8_t m_lamp_decode = 0U; + uint8_t m_solenoid_features[20][4]{}; + uint8_t m_io_hold_x[5]{}; // Used to hold switches closed (drop targets, balls in outholes/saucers etc). Solenoid activity release them. required_device m_maincpu; required_shared_ptr m_nvram; required_device m_pia_u10; @@ -1127,7 +1141,7 @@ ROM_START(eightblo) // Has an exploit if you tilt the ball in play and hold ti ROM_END /*-------------------------------- -/ Power Play #1120 +/ Bobby Orr Power Play #1120 /-------------------------------*/ ROM_START(pwerplay) ROM_REGION(0x1000, "roms", 0) @@ -1145,7 +1159,7 @@ ROM_START(stk_sprs) ROM_END /*-------------------------------------------------------------- -/ Stellar Airship / Geiger-Automatenbau GMBH, of Germany (1981) +/ Stellar Airship / Geiger-Automatenbau GMBH, of Germany (1979) /---------------------------------------------------------------*/ } // anonymous namespace diff --git a/src/mame/drivers/by35.cpp b/src/mame/drivers/by35.cpp index e88c5cee30d..2317ccdda33 100644 --- a/src/mame/drivers/by35.cpp +++ b/src/mame/drivers/by35.cpp @@ -13,42 +13,104 @@ There are many sound boards used, however there are only a few major types. * Cheap Squeak has 6803 + ZN429 + 2x2kROM * Xenon (#1196) has a sound board (similar to AS-3022) and a vocalizer board, with 32k of roms. +List of games: -Sound Board Machine ---------------------------------------------- -AS-2888-1 1106,1116,1119,1138,1147,1148 -AS-2888-3 1152 -AS-2888-4 1161,1162,1167 -AS-3022-1 1173 -AS-3022-2 1154 -AS-3022-3 1157 -AS-3022-5 1187 -AS-3022-6 1178 -AS-3022-7 1192 -AS-3022-8 1198 -AS-3022-9 1199 -AS-3022-11 1210 -AS-3022-12 1217 -AS-3022-14 1273 -AS-3022-15 1276 -AS-3022-18 1311 -AS-3059/3060 1196 -AS-3107-1 1215 -AS-3107-2 1220 -AS-3107-3 1219 -AS-3107-4 1222 -AS-3107-5 1233 -AS-3107-6 1245 -AS-3107-7 1239 -AS-3107-8 1248 -AS-3107-9 1247 -AS-3107-10 1262 -AS-3107-11 1282 -AS-3107-12 1283 -A084-91495-A371 1371 -Cheap Squeak 1390,1391,0A17,0A40,0A44,0B42 -(unknown) 1370 (Centaur II - Manual has the correct cover but insides are for Centaur #1239) - +Game NUM Sound Board +----------------------------------------------------------------------------------------------- +**** Bally **** +Mysterian 868 +Supersonic 1106 AS-2888-1 +Playboy 1116 AS-2888-1 +Lost World 1119 AS-2888-1 +The Six Million Dollar Man 1138 AS-2888-1 +Voltan Escapes Cosmic Doom 1147 AS-2888-1 +Star Trek 1148 AS-2888-1 +Kiss 1152 AS-2888-3 +Nitro Ground Shaker 1154 AS-3022-2 +Silverball Mania 1157 AS-3022-3 +Harlem Globetrotters on Tour 1161 AS-2888-4 +Dolly Parton 1162 AS-2888-4 +Paragon 1167 AS-2888-4 +Future Spa 1173 AS-3022-1 +Space Invaders 1178 AS-3022-6 +Rolling Stones 1187 AS-3022-5 +Mystic 1192 AS-3022-7 +Xenon 1196 AS-3059 (AS-2518-56) (Sounds Plus) and AS-3060 (AS-2518-57) (Vocalizer) +Viking 1198 AS-3022-8 +Hotdoggin' 1199 AS-3022-9 +Skateball 1210 AS-3022-11 +Flash Gordon 1215 AS-3107-1 (AS-2518-61) (Squawk & Talk) +Frontier 1217 AS-3022-12 +Fireball II 1219 AS-3107-3 +Eight Ball Deluxe 1220 AS-3107-2 +Embryon 1222 AS-3107-4 +Fathom 1233 AS-3107-5 +Centaur 1239 AS-3107-7 +Medusa 1245 AS-3107-6 +Vector 1247 AS-3107-9 +Elektra 1248 AS-3107-8 +Spectrum 1262 AS-3107-10 +Speakeasy / Speakeasy 4 1273 AS-3022-14 +BMX 1276 AS-3022-15 +Rapid Fire 1282 AS-3107-11 (No flippers in this game) +Mr & Mrs Pac-Man Pinball 1283 AS-3107-12 +Eight Ball Deluxe LE 1300 +Grand Slam (BY133) 1311 AS-3022-18 +Gold Ball (BY133) 1314 (0371) A084-91945-A371 +Centaur II 1370 (0370) Squawk & Talk, plus Say It Again (reverb card) +Kings of Steel 1390 (0390) Cheap Squeak +X's & O's 1391 (0391) Cheap Squeak +Midnight Marauders 0A12 (gun game) +Spy Hunter 0A17 Cheap Squeak +Fireball Classic 0A40 Cheap Squeak +Black Pyramid 0A44 Cheap Squeak +Cybernaut 0B42 Cheap Squeak +Eight Ball Deluxe (reissue) 0B87 +Big Bat (BY133) ---- AS-2518-61 (Squawk & Talk) +**** Bell **** +Cosmic Flash +Fantasy +Fireball II +Flash Gordon +Frontier +New Wave +Pinball +Pin Ball Pool +Saturn 2 +Super Bowl +Tiger Rag +**** Nuova Bell **** +Cobra +Dark Shadow +F1 Grand Prix +Future Queen +Skill Flight +Space Hawks +Top Pin +U-boat 65 +World Defender +**** I.D.I. **** +Movie Master +**** Geiger-Automatenbau **** +Dark Rider +Fly High +Miss World +Space Rider +**** Grand Products **** +301/Bullseye +**** Arkon Automaten **** +Sexy Girl +**** Elbos Electronics **** +Genesis +**** Zaccaria **** +Mystic Star +**** United **** +Big Ball Bowling (shuffle) +**** Monroe **** +Stars and Strikes (shuffle) +**** Stern **** +Black Beauty (shuffle) +-------------------------------------------------------------------------------------------- - The Nuova Bell Games from Dark Shadow onwards use inhouse designed circuit boards. The MPU board contains enhancements for full CPU address space, larger ROMs, 6802 CPU, Toshiba TC5517 CMOS RAM (2kb) for battery backup that can be jumpered in nibble or byte mode, etc. @@ -171,24 +233,24 @@ protected: void by35_map(address_map &map); void nuovo_map(address_map &map); - uint8_t m_u10a; - uint8_t m_u10b; - uint8_t m_u11a; - uint8_t m_u11b; + uint8_t m_u10a = 0U; + uint8_t m_u10b = 0U; + uint8_t m_u11a = 0U; + uint8_t m_u11b = 0U; static solenoid_feature_data const s_solenoid_features_default; private: - bool m_u10_ca2; - bool m_u10_cb1; - bool m_u10_cb2; - bool m_u11_ca1; - bool m_u11_cb2; - bool m_7d; - uint8_t m_segment[6]; - uint8_t m_lamp_decode; + bool m_u10_ca2 = 0; + bool m_u10_cb1 = 0; + bool m_u10_cb2 = 0; + bool m_u11_ca1 = 0; + bool m_u11_cb2 = 0; + bool m_7d = 0; + uint8_t m_segment[6]{}; + uint8_t m_lamp_decode = 0U; solenoid_feature_data const &m_solenoid_features; - uint8_t m_io_hold_x[6]; + uint8_t m_io_hold_x[6]{}; required_device m_maincpu; required_shared_ptr m_nvram; required_device m_pia_u10; @@ -1240,7 +1302,7 @@ void by35_state::u11_b_w(uint8_t data) if (m_solenoid_features[(data & 0x0f)][3]) // Reset/release relevant switch after firing Solenoid m_io_hold_x[(m_solenoid_features[(data & 0x0f)][2])] &= (m_solenoid_features[(data & 0x0f)][3]); } - else // Rest output - all momentary solenoids are off + else // Reset output - all momentary solenoids are off { std::fill_n(std::begin(m_solenoids), 15, false); } diff --git a/src/mame/drivers/byvid.cpp b/src/mame/drivers/byvid.cpp index 41ddf421052..8740375e7bb 100644 --- a/src/mame/drivers/byvid.cpp +++ b/src/mame/drivers/byvid.cpp @@ -10,25 +10,35 @@ A blend of arcade video game and pinball. It has the shape of ball is injected from between the flippers; there's no shooter. There's flipper buttons on the sides, and a joystick on the control panel. +Granny has an additional "Power" button, it's a gun to shoot + the alligators, if you have collected ammo. You need money to + pass the toll gates. +List of BY133 games: -Games: -- Baby Pacman (#1299) -- Granny & the Gators (#1369) +Game NUM Sound Board +----------------------------------------------------------------------------------------------- +Baby Pacman (1982) 1299 The vidiot board contains the cheap squeak circuit +Grand Slam (1983) 1311 AS-2518-51 (in by35.cpp) +Gold Ball (1983) 1314 (0371) A084-91495-A371/A360,AS-2518-51 (in by35.cpp) +Granny & the Gators (1984) 1369 (0369) Cheap Squeak +Big Bat (1984) ---- AS-2518-61 (in by35.cpp) Babypac uses a MPU4 board containing the main cpu, and a Vidiot board containing the video and sound cpus, and the video controller and the sound DAC and amp. Granny uses the MPU4 board, but it has a Vidiot Deluxe for the -video, and a Cheap Squeek sound board. The manual incorrectly +video, and a Cheap Squeak sound board. The manual incorrectly describes the babypac vidiot board. Unable to locate a schematic. Status: -- All machines are playable. +- Both machines are playable. +- To exit the pinball back to the video: + Babypac: press O or P; + Granny: press X. ToDo: (all) -- Sound. It gets stuck waiting for "input capture interrupt". - Beeper needs to be replaced by a red LED. ToDo (granny): @@ -46,8 +56,8 @@ ToDo (granny): #include "cpu/m6809/m6809.h" #include "machine/6821pia.h" #include "machine/timer.h" +#include "audio/bally.h" #include "sound/beep.h" -#include "sound/dac.h" #include "video/tms9928a.h" #include "speaker.h" @@ -61,7 +71,9 @@ public: : genpin_class(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_videocpu(*this, "videocpu") - , m_audiocpu(*this, "audiocpu") + , m_cheap_squeak(*this, "cheap_squeak") + , m_sound_select_handler(*this) + , m_sound_int_handler(*this) , m_pia_u7(*this, "pia_u7") , m_pia_u10(*this, "pia_u10") , m_pia_u11(*this, "pia_u11") @@ -83,10 +95,10 @@ public: { } DECLARE_INPUT_CHANGED_MEMBER(video_test); - DECLARE_INPUT_CHANGED_MEMBER(sound_test); DECLARE_INPUT_CHANGED_MEMBER(activity_test); DECLARE_INPUT_CHANGED_MEMBER(self_test); + void by133(machine_config &config); void babypac(machine_config &config); void granny(machine_config &config); @@ -95,25 +107,27 @@ private: virtual void machine_reset() override; u8 m_mpu_to_vid = 0U; u8 m_vid_to_mpu = 0U; - u8 m_u7_a = 0U; - u8 m_u7_b = 0U; - bool m_u7_cb2 = 0; - u8 m_u10_a = 0U; - u8 m_u10_b = 0U; + u8 m_u7a = 0U; + u8 m_u7b = 0U; + u8 m_u10a = 0U; + u8 m_u10b = 0U; bool m_u10_cb2 = 0; - u8 m_u11_a = 0U; - u8 m_u11_b = 0U; + bool m_u11_cb2 = 0; + u8 m_u11a = 0U; + u8 m_u11b = 0U; bool m_u10_timer = 0; bool m_u11_timer = 0; required_device m_maincpu; required_device m_videocpu; - required_device m_audiocpu; + required_device m_cheap_squeak; + devcb_write8 m_sound_select_handler; + devcb_write_line m_sound_int_handler; required_device m_pia_u7; required_device m_pia_u10; required_device m_pia_u11; required_device m_crtc; optional_device m_crtc2; // for Granny only - optional_device m_beep; // temp + required_device m_beep; // temp required_ioport m_io_test; required_ioport m_io_dsw0; required_ioport m_io_dsw1; @@ -129,8 +143,6 @@ private: u8 sound_data_r(); void sound_data_w(u8 data); - u8 m6803_port2_r(); - void m6803_port2_w(u8 data); u8 u7_a_r(); void u7_a_w(u8 data); u8 u7_b_r(); @@ -149,13 +161,13 @@ private: DECLARE_WRITE_LINE_MEMBER(u7_cb2_w); DECLARE_WRITE_LINE_MEMBER(u10_cb2_w); DECLARE_WRITE_LINE_MEMBER(u11_cb2_w); + DECLARE_WRITE_LINE_MEMBER(sound_ack_w) { m_pia_u11->cb2_w(state); } TIMER_DEVICE_CALLBACK_MEMBER(u10_timer); TIMER_DEVICE_CALLBACK_MEMBER(u11_timer); void granny_crtc_w(offs_t offset, u8 data); uint32_t screen_update_granny(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void granny_map(address_map &map); void main_map(address_map &map); - void audio_map(address_map &map); void video_map(address_map &map); }; @@ -195,11 +207,6 @@ void by133_state::granny_map(address_map &map) map(0x4000, 0xffff).rom(); } -void by133_state::audio_map(address_map &map) -{ // U27 Vidiot - map(0xc000, 0xffff).rom(); -} - INPUT_CHANGED_MEMBER( by133_state::video_test ) { @@ -207,12 +214,6 @@ INPUT_CHANGED_MEMBER( by133_state::video_test ) m_videocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); } -INPUT_CHANGED_MEMBER( by133_state::sound_test ) -{ - if(newval) - m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); -} - INPUT_CHANGED_MEMBER( by133_state::activity_test ) { if(newval) @@ -227,7 +228,6 @@ INPUT_CHANGED_MEMBER( by133_state::self_test ) static INPUT_PORTS_START( babypac ) PORT_START("TEST") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Video Test") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, by133_state, video_test, 0) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Sound Test") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, by133_state, sound_test, 0) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Activity") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, by133_state, activity_test, 0) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Self Test") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, by133_state, self_test, 0) @@ -380,7 +380,6 @@ INPUT_PORTS_END static INPUT_PORTS_START( granny ) PORT_START("TEST") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Video Test") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, by133_state, video_test, 0) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Sound Test") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, by133_state, sound_test, 0) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Activity") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, by133_state, activity_test, 0) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Self Test") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, by133_state, self_test, 0) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Power") // Also 2P start @@ -558,20 +557,6 @@ void by133_state::sound_data_w(u8 data) m_vid_to_mpu = data; } -u8 by133_state::m6803_port2_r() -{ - u8 data = ((m_u7_b << 1) & 0x1f) | 0x40 | m_u7_cb2; - m_u7_cb2 = false; - return data; -} - -void by133_state::m6803_port2_w(u8 data) -{ - //m_u7_b = data >> 1; - m_beep->set_clock(600); - m_beep->set_state(BIT(data, 0)); -} - WRITE_LINE_MEMBER( by133_state::u7_ca2_w ) { // comms out @@ -592,8 +577,8 @@ WRITE_LINE_MEMBER( by133_state::u7_cb2_w ) // red led m_beep->set_clock(950); m_beep->set_state(state); - if (state) - m_u7_cb2 = true; + if (!m_sound_int_handler.isnull()) + m_sound_int_handler(state); } WRITE_LINE_MEMBER( by133_state::u10_cb2_w ) @@ -605,89 +590,97 @@ WRITE_LINE_MEMBER( by133_state::u10_cb2_w ) WRITE_LINE_MEMBER( by133_state::u11_cb2_w ) { // solenoid-sound selector + + m_u11_cb2 = state; } u8 by133_state::u7_a_r() { - return m_u7_a; + return m_u7a; } void by133_state::u7_a_w(u8 data) { - m_u7_a = data; + m_u7a = data; } u8 by133_state::u7_b_r() { - if (BIT(m_u7_a, 7)) // bits 6 and 7 work; pinmame uses 7 - m_u7_b |= m_io_joy->read(); + if (BIT(m_u7a, 7)) // bits 6 and 7 work; pinmame uses 7 + m_u7b |= m_io_joy->read(); - if (BIT(m_u7_a, 6)) // Granny has a "power" button - used to shoot your gun. Is also 2-player start. - m_u7_b = m_io_test->read() & 0x80; + if (BIT(m_u7a, 6)) // Granny has a "power" button - used to shoot your gun. Is also 2-player start. + m_u7b = m_io_test->read() & 0x80; - return m_u7_b; + return m_u7b; } void by133_state::u7_b_w(u8 data) { //machine().scheduler().synchronize(); - m_u7_b = data; + m_u7b = data; + // Handle sound + if (!m_sound_select_handler.isnull()) + { + //u8 sound = (m_u11b & 0x0f) | ((data & 0x02) << 3); + m_sound_select_handler(data & 15); + } } u8 by133_state::u10_a_r() { - return m_u10_a; + return m_u10a; } void by133_state::u10_a_w(u8 data) { - m_u10_a = data; - if (BIT(m_u11_a, 2) == 0) + m_u10a = data; + if (BIT(m_u11a, 2) == 0) m_mpu_to_vid = data ^ 0x0f; // Lamps if (!m_u10_cb2) { - if (!BIT(m_u10_a, 6)) + if (!BIT(m_u10a, 6)) for (u8 i = 0; i < 16; i++) - m_io_outputs[16+u8(m_u10_timer)*16+i] = ((m_u10_a & 15) == i); - if (!BIT(m_u10_a, 7)) + m_io_outputs[16+u8(m_u10_timer)*16+i] = ((m_u10a & 15) == i); + if (!BIT(m_u10a, 7)) for (u8 i = 0; i < 16; i++) - m_io_outputs[48+u8(m_u10_timer)*16+i] = ((m_u10_a & 15) == i); + m_io_outputs[48+u8(m_u10_timer)*16+i] = ((m_u10a & 15) == i); } } u8 by133_state::u10_b_r() { - if (BIT(m_u11_a, 3) == 0) - return ~m_u7_a & 0x03; + if (BIT(m_u11a, 3) == 0) + return ~m_u7a & 0x03; - if (BIT(m_u11_a, 1) == 0) + if (BIT(m_u11a, 1) == 0) return m_vid_to_mpu; u8 data = 0; - if (BIT(m_u10_a, 0)) + if (BIT(m_u10a, 0)) data |= m_io_x0->read(); - if (BIT(m_u10_a, 1)) + if (BIT(m_u10a, 1)) data |= m_io_x1->read(); - if (BIT(m_u10_a, 2)) + if (BIT(m_u10a, 2)) data |= m_io_x2->read(); - if (BIT(m_u10_a, 3)) + if (BIT(m_u10a, 3)) data |= m_io_x3->read(); - if (BIT(m_u10_a, 4)) + if (BIT(m_u10a, 4)) data |= m_io_x4->read(); // granny only - if (BIT(m_u10_a, 5)) + if (BIT(m_u10a, 5)) data |= m_io_dsw0->read(); - if (BIT(m_u10_a, 6)) + if (BIT(m_u10a, 6)) data |= m_io_dsw1->read(); - if (BIT(m_u10_a, 7)) + if (BIT(m_u10a, 7)) data |= m_io_dsw2->read(); if (m_u10_cb2) @@ -698,29 +691,29 @@ u8 by133_state::u10_b_r() void by133_state::u10_b_w(u8 data) { - m_u10_b = data; + m_u10b = data; } u8 by133_state::u11_a_r() { - return m_u11_a; + return m_u11a; } void by133_state::u11_a_w(u8 data) { - m_u11_a = data; + m_u11a = data; m_pia_u7->ca1_w(BIT(data, 1)); m_pia_u7->ca2_w(BIT(data, 2)); } u8 by133_state::u11_b_r() { - return m_u11_b; + return m_u11b; } void by133_state::u11_b_w(u8 data) { - m_u11_b = data; + m_u11b = data; if (data == 0xB1) m_samples->start(5, 5); // outhole // Bits 0,1,2 go to 74LS138 to select one solenoid @@ -749,18 +742,20 @@ TIMER_DEVICE_CALLBACK_MEMBER( by133_state::u11_timer ) void by133_state::machine_start() { genpin_class::machine_start(); + m_sound_select_handler.resolve(); + m_sound_int_handler.resolve(); m_io_outputs.resolve(); save_item(NAME(m_mpu_to_vid)); save_item(NAME(m_vid_to_mpu)); - save_item(NAME(m_u7_a)); - save_item(NAME(m_u7_b)); - save_item(NAME(m_u7_cb2)); - save_item(NAME(m_u10_a)); - save_item(NAME(m_u10_b)); + save_item(NAME(m_u7a)); + save_item(NAME(m_u7b)); + save_item(NAME(m_u10a)); + save_item(NAME(m_u10b)); save_item(NAME(m_u10_cb2)); - save_item(NAME(m_u11_a)); - save_item(NAME(m_u11_b)); + save_item(NAME(m_u11_cb2)); + save_item(NAME(m_u11a)); + save_item(NAME(m_u11b)); save_item(NAME(m_u10_timer)); save_item(NAME(m_u11_timer)); } @@ -771,13 +766,13 @@ void by133_state::machine_reset() for (u8 i = 0; i < m_io_outputs.size(); i++) m_io_outputs[i] = 0; - m_u7_a = 0; - m_u7_b = 1; // select mode 2 of mc6803 on /reset (not emulated yet by the cpu) - m_u10_a = 0; - m_u10_b = 0; + m_u7a = 0; + m_u7b = 1; // select mode 2 of mc6803 on /reset (not emulated yet by the cpu) + m_u10a = 0; + m_u10b = 0; m_u10_cb2 = 0; - m_u11_a = 0; - m_u11_b = 0; + m_u11a = 0; + m_u11b = 0; m_mpu_to_vid = 0; m_vid_to_mpu = 0; m_beep->set_state(0); @@ -793,7 +788,7 @@ uint32_t by133_state::screen_update_granny(screen_device &screen, bitmap_rgb32 & return 0; } -void by133_state::babypac(machine_config &config) +void by133_state::by133(machine_config &config) { /* basic machine hardware */ M6800(config, m_maincpu, XTAL(3'579'545)/4); // no xtal, just 2 chips @@ -802,12 +797,6 @@ void by133_state::babypac(machine_config &config) MC6809(config, m_videocpu, XTAL(3'579'545)); m_videocpu->set_addrmap(AS_PROGRAM, &by133_state::video_map); - M6803(config, m_audiocpu, XTAL(3'579'545)); - m_audiocpu->set_addrmap(AS_PROGRAM, &by133_state::audio_map); - m_audiocpu->out_p1_cb().set("dac", FUNC(dac_byte_interface::data_w)); // P10-P17 - m_audiocpu->in_p2_cb().set(FUNC(by133_state::m6803_port2_r)); // P20-P24 sound command in - m_audiocpu->out_p2_cb().set(FUNC(by133_state::m6803_port2_w)); - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); PIA6821(config, m_pia_u7, 0); @@ -850,8 +839,13 @@ void by133_state::babypac(machine_config &config) /* sound hardware */ genpin_audio(config); - SPEAKER(config, "speaker").front_center(); - ZN429E(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // U32 (Vidiot) or U6 (Cheap Squeak) + SPEAKER(config, "mono").front_center(); + + BALLY_CHEAP_SQUEAK(config, m_cheap_squeak); + m_cheap_squeak->add_route(ALL_OUTPUTS, "mono", 1.00); + m_sound_select_handler.bind().set(m_cheap_squeak, FUNC(bally_cheap_squeak_device::sound_select)); + m_sound_int_handler.bind().set(m_cheap_squeak, FUNC(bally_cheap_squeak_device::sound_int)); + m_cheap_squeak->sound_ack_w_handler().set(FUNC(by133_state::sound_ack_w)); SPEAKER(config, "beee").front_center(); BEEP(config, m_beep, 600).add_route(ALL_OUTPUTS, "beee", 0.10); @@ -859,7 +853,7 @@ void by133_state::babypac(machine_config &config) void by133_state::granny(machine_config &config) { - babypac(config); + by133(config); MC6809(config.replace(), m_videocpu, XTAL(8'000'000)); // MC68B09P (XTAL value hard to read) m_videocpu->set_addrmap(AS_PROGRAM, &by133_state::granny_map); @@ -886,8 +880,8 @@ ROM_START(babypac) ROM_LOAD( "891-05-u11.764", 0xc000, 0x2000, CRC(0a5967a4) SHA1(26d56ddea3f39d41e382449007bf7ba113c0285f)) ROM_LOAD( "891-06-u12.764", 0xe000, 0x2000, CRC(58cfe542) SHA1(e024d14019866bd460d1da6b901f9b786a76a181)) - ROM_REGION(0x10000, "audiocpu", 0) - ROM_LOAD( "891-12-u29.764", 0xe000, 0x2000, CRC(0b57fd5d) SHA1(43a03e6d16c87c3305adb04722484f992f23a1bd)) + ROM_REGION(0x10000, "cheap_squeak:cpu", 0) + ROM_LOAD( "891-12-u29.764", 0xc000, 0x2000, CRC(0b57fd5d) SHA1(43a03e6d16c87c3305adb04722484f992f23a1bd)) ROM_END ROM_START(babypac2) @@ -901,8 +895,8 @@ ROM_START(babypac2) ROM_LOAD( "891-05-u11.764", 0xc000, 0x2000, CRC(0a5967a4) SHA1(26d56ddea3f39d41e382449007bf7ba113c0285f)) ROM_LOAD( "891-06-u12.764", 0xe000, 0x2000, CRC(58cfe542) SHA1(e024d14019866bd460d1da6b901f9b786a76a181)) - ROM_REGION(0x10000, "audiocpu", 0) - ROM_LOAD( "891-12-u29.764", 0xe000, 0x2000, CRC(0b57fd5d) SHA1(43a03e6d16c87c3305adb04722484f992f23a1bd)) + ROM_REGION(0x10000, "cheap_squeak:cpu", 0) + ROM_LOAD( "891-12-u29.764", 0xc000, 0x2000, CRC(0b57fd5d) SHA1(43a03e6d16c87c3305adb04722484f992f23a1bd)) ROM_END /*----------------------------------------------------------------- @@ -921,13 +915,13 @@ ROM_START(granny) ROM_LOAD( "vid_u8.764", 0xc000, 0x2000, CRC(a442bc01) SHA1(2c01123dc5799561ae9e7c5d6db588b82b5ae59c)) ROM_LOAD( "vid_u9.764", 0xe000, 0x2000, CRC(6b67a1f7) SHA1(251c2b941898363bbd6ee1a94710e2b2938ec851)) - ROM_REGION(0x10000, "audiocpu", 0) - ROM_LOAD( "cs_u3.764", 0xe000, 0x2000, CRC(0a39a51d) SHA1(98342ba38e48578ce9870f2ee85b553d46c0e35f)) + ROM_REGION(0x10000, "cheap_squeak:cpu", 0) + ROM_LOAD( "cs_u3.764", 0xc000, 0x2000, CRC(0a39a51d) SHA1(98342ba38e48578ce9870f2ee85b553d46c0e35f)) ROM_END } // Anonymous namespace -GAME( 1982, babypac, 0, babypac, babypac, by133_state, empty_init, ROT90, "Dave Nutting Associates / Bally", "Baby Pac-Man (set 1)", MACHINE_IS_SKELETON_MECHANICAL ) -GAME( 1982, babypac2, babypac, babypac, babypac, by133_state, empty_init, ROT90, "Dave Nutting Associates / Bally", "Baby Pac-Man (set 2)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME( 1982, babypac, 0, by133, babypac, by133_state, empty_init, ROT90, "Dave Nutting Associates / Bally", "Baby Pac-Man (set 1)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME( 1982, babypac2, babypac, by133, babypac, by133_state, empty_init, ROT90, "Dave Nutting Associates / Bally", "Baby Pac-Man (set 2)", MACHINE_IS_SKELETON_MECHANICAL ) GAME( 1984, granny, 0, granny, granny, by133_state, empty_init, ROT0, "Bally", "Granny and the Gators", MACHINE_IS_SKELETON_MECHANICAL ) diff --git a/src/mame/drivers/zac_2.cpp b/src/mame/drivers/zac_2.cpp index 250e9db1eac..0c70c7ab3de 100644 --- a/src/mame/drivers/zac_2.cpp +++ b/src/mame/drivers/zac_2.cpp @@ -47,14 +47,14 @@ private: void zac_2_io(address_map &map); void zac_2_map(address_map &map); - uint8_t m_input_line = 0U; + uint8_t m_row = 0U; uint8_t m_t_c = 0U; uint8_t m_out_offs = 0U; virtual void machine_reset() override; virtual void machine_start() override { m_digits.resolve(); } required_device m_maincpu; required_shared_ptr m_p_ram; - required_ioport_array<7> m_io_keyboard; + required_ioport_array<8> m_io_keyboard; output_finder<78> m_digits; }; @@ -167,19 +167,19 @@ static INPUT_PORTS_START( zac_2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP53") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("INP54") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("INP55") + + PORT_START("X7") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END uint8_t zac_2_state::ctrl_r() { - if (m_input_line < 7) - return m_io_keyboard[m_input_line]->read(); - - return 0xff; + return m_io_keyboard[m_row]->read(); } void zac_2_state::ctrl_w(uint8_t data) { - m_input_line = data & 7; + m_row = data & 7; } void zac_2_state::data_w(uint8_t data)