From 86504d022d16c16ac26139da94c433e6c1584954 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sat, 2 Oct 2021 05:16:38 +1000 Subject: [PATCH] zac_proto: added sound, added outputs, added save states. --- src/mame/drivers/zac_proto.cpp | 190 +++++++++++++++++++++++---------- 1 file changed, 132 insertions(+), 58 deletions(-) diff --git a/src/mame/drivers/zac_proto.cpp b/src/mame/drivers/zac_proto.cpp index 4238d56c453..f202a1594fe 100644 --- a/src/mame/drivers/zac_proto.cpp +++ b/src/mame/drivers/zac_proto.cpp @@ -14,39 +14,58 @@ The ball number is how many balls are left. 1 = last ball. +Status: +- All games are working. + ToDo: -- Mechanical -- Sound board, no info available. Also knocker output not known. +- Doesn't appear to have a knocker. To be confirmed. +- Find out how to enter test mode. **********************************************************************/ #include "emu.h" +#include "machine/clock.h" #include "machine/genpin.h" +#include "sound/spkrdev.h" #include "cpu/scmp/scmp.h" +#include "speaker.h" #include "zac_proto.lh" +namespace { + class zac_proto_state : public genpin_class { public: zac_proto_state(const machine_config &mconfig, device_type type, const char *tag) : genpin_class(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_speaker(*this, "speaker") , m_digits(*this, "digit%u", 0U) + , m_io_lamps(*this, "lamp%u", 0U) + , m_io_solenoids(*this, "sol%u", 0U) { } void zac_proto(machine_config &config); private: void out0_w(offs_t offset, uint8_t data); - void out1_w(uint8_t data); + void out1_w(offs_t offset, uint8_t data); void digit_w(offs_t offset, uint8_t data); - void sound_w(uint8_t data); + void sound_w(offs_t offset, uint8_t data); + DECLARE_WRITE_LINE_MEMBER(audio_clock); void zac_proto_map(address_map &map); + u8 m_u36 = 0; // preset divider for u44/u45 + u8 m_u37 = 0; // selector for u48 + u8 m_u44u45 = 0; // counters for u44/u45 + u8 m_u46u47 = 0; // counters for u46/u47 virtual void machine_reset() override; - virtual void machine_start() override { m_digits.resolve(); } + virtual void machine_start() override; required_device m_maincpu; + required_device m_speaker; output_finder<11> m_digits; + output_finder<84> m_io_lamps; + output_finder<12> m_io_solenoids; }; @@ -66,7 +85,7 @@ void zac_proto_state::zac_proto_map(address_map &map) map(0x0e02, 0x0e06).w(FUNC(zac_proto_state::digit_w)); map(0x0e07, 0x0e08).w(FUNC(zac_proto_state::sound_w)); map(0x0e09, 0x0e16).w(FUNC(zac_proto_state::out1_w)); - map(0x1400, 0x1bff).rom(); + map(0x1400, 0x17ff).rom(); } static INPUT_PORTS_START( zac_proto ) @@ -75,38 +94,38 @@ static INPUT_PORTS_START( zac_proto ) PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_TILT) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_Z) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_COLON) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_QUOTE) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_START("PL1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_Q) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_W) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_E) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_R) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_Y) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_U) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_I) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_O) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_START("PL2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_A) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_S) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_D) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_G) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_H) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_J) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_K) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_START("PL3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_L) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_C) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_V) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_B) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_N) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_M) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_COMMA) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_STOP) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_START("PL4") PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -196,7 +215,8 @@ INPUT_PORTS_END // solenoids (not knocker) void zac_proto_state::out0_w(offs_t offset, uint8_t data) { - uint16_t t = data | (offset << 8); + data &= 0x3f; + uint16_t t = data | (offset << 6); switch (t) { @@ -213,11 +233,16 @@ void zac_proto_state::out0_w(offs_t offset, uint8_t data) m_samples->start(5, 0); // bumpers break; } + for (u8 i = 0; i < 6; i++) + m_io_solenoids[offset*6+i] = BIT(data, i); } -void zac_proto_state::out1_w(uint8_t data) -{ // lamps +void zac_proto_state::out1_w(offs_t offset, uint8_t data) +{ + data &= 0x3f; + for (u8 i = 0; i < 6; i++) + m_io_lamps[offset*6+i] = BIT(data, i); } // need to implement blanking of leading zeroes @@ -231,9 +256,48 @@ void zac_proto_state::digit_w(offs_t offset, uint8_t data) m_digits[offset] = patterns[data>>4] | decimals[offset]; } -void zac_proto_state::sound_w(uint8_t data) +void zac_proto_state::sound_w(offs_t offset, uint8_t data) { -// to unknown sound board + data &= 0x3f; + if (offset) + { + data ^= 0x0e; + // sch labels shows bit 1 as enable, but pin numbers show bit 4 being enable. + // we will go by the pin numbers. + m_u37 = BIT(data, 1, 4); + m_u36 = (m_u36 & 0x3f) | (BIT(data, 0) << 6) | 0x80; + } + else + { + m_u36 = (m_u36 & 0x40) | data | 0x80; + } +} + +WRITE_LINE_MEMBER(zac_proto_state::audio_clock) +{ + if (state)// && BIT(m_u37, 3)) + { + m_u44u45--; + if (m_u44u45 == 0) + { + m_u44u45 = m_u36; + m_u46u47--; + if (BIT(m_u37, 3)) + m_speaker->level_w(BIT(m_u46u47, m_u37 & 7) ? 1 : -1); + } + } +} + +void zac_proto_state::machine_start() +{ + m_digits.resolve(); + m_io_lamps.resolve(); + m_io_solenoids.resolve(); + + save_item(NAME(m_u36)); + save_item(NAME(m_u37)); + save_item(NAME(m_u44u45)); + save_item(NAME(m_u46u47)); } void zac_proto_state::machine_reset() @@ -254,41 +318,51 @@ void zac_proto_state::zac_proto(machine_config &config) /* Sound */ genpin_audio(config); + + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50); + + clock_device &snd_clock(CLOCK(config, "sys_clock", XTAL(4'000'000) / 2)); + snd_clock.signal_handler().set(FUNC(zac_proto_state::audio_clock)); } +// The PCB has a space for another rom, U27, @0x1800, but it was never used. + /*-------------------------------- / Strike /-------------------------------*/ ROM_START(strike) - ROM_REGION(0x8000, "maincpu", 0) - ROM_LOAD("strike1.bin", 0x0000, 0x0400, CRC(650abc54) SHA1(6a4f83016a38338ba6a04271532f0880264e61a7)) - ROM_LOAD("strike2.bin", 0x0400, 0x0400, CRC(13c5a168) SHA1(2da3a5bc0c28a2aacd8c1396dac95cf35f8797cd)) - ROM_LOAD("strike3.bin", 0x0800, 0x0400, CRC(ebbbf315) SHA1(c87e961c8e5e99b0672cd632c5e104ea52088b5d)) - ROM_LOAD("strike4.bin", 0x1400, 0x0400, CRC(ca0eddd0) SHA1(52f9faf791c56b68b1806e685d0479ea67aba019)) + ROM_REGION(0x1800, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD("strike1.u23", 0x0000, 0x0400, CRC(650abc54) SHA1(6a4f83016a38338ba6a04271532f0880264e61a7)) + ROM_LOAD("strike2.u24", 0x0400, 0x0400, CRC(13c5a168) SHA1(2da3a5bc0c28a2aacd8c1396dac95cf35f8797cd)) + ROM_LOAD("strike3.u25", 0x0800, 0x0400, CRC(ebbbf315) SHA1(c87e961c8e5e99b0672cd632c5e104ea52088b5d)) + ROM_LOAD("strike4.u26", 0x1400, 0x0400, CRC(ca0eddd0) SHA1(52f9faf791c56b68b1806e685d0479ea67aba019)) ROM_END /*-------------------------------- / Ski Jump (10/78) /-------------------------------*/ ROM_START(skijump) - ROM_REGION(0x8000, "maincpu", 0) - ROM_LOAD("skijump1.bin", 0x0000, 0x0400, CRC(c0c0e18c) SHA1(d28ec2541f6c2e86e5b5514c7f9e558df68be72a)) - ROM_LOAD("skijump2.bin", 0x0400, 0x0400, CRC(b08aafb5) SHA1(ff6df4efa20a4461d525209a487d04896eeef29e)) - ROM_LOAD("skijump3.bin", 0x0800, 0x0400, CRC(9a8731c0) SHA1(9f7aaa8c6df04b925c8beff8b426c59bc3696f50)) - ROM_LOAD("skijump4.bin", 0x1400, 0x0400, CRC(fa064b51) SHA1(d4d02ca661e4084805f00247f31c0701320ab62d)) + ROM_REGION(0x1800, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD("skijump1.u23", 0x0000, 0x0400, CRC(c0c0e18c) SHA1(d28ec2541f6c2e86e5b5514c7f9e558df68be72a)) + ROM_LOAD("skijump2.u24", 0x0400, 0x0400, CRC(b08aafb5) SHA1(ff6df4efa20a4461d525209a487d04896eeef29e)) + ROM_LOAD("skijump3.u25", 0x0800, 0x0400, CRC(9a8731c0) SHA1(9f7aaa8c6df04b925c8beff8b426c59bc3696f50)) + ROM_LOAD("skijump4.u26", 0x1400, 0x0400, CRC(fa064b51) SHA1(d4d02ca661e4084805f00247f31c0701320ab62d)) ROM_END /*-------------------------------- / Space City (09/79) /-------------------------------*/ ROM_START(spacecty) - ROM_REGION(0x8000, "maincpu", 0) - ROM_LOAD("zsc1.dat", 0x0000, 0x0400, CRC(4405368f) SHA1(037ad7e7158424bb714b28e4effa2c96c8736ce4)) - ROM_LOAD("zsc2.dat", 0x0400, 0x0400, CRC(a6c41475) SHA1(7d7d851efb2db7d9a1988265cdff676260d753c3)) - ROM_LOAD("zsc3.dat", 0x0800, 0x0400, CRC(e6a2dcee) SHA1(d2dfff896ae90208c28179f9bbe43f93d7f2131c)) - ROM_LOAD("zsc4.dat", 0x1400, 0x0400, CRC(69e0bb95) SHA1(d9a1d0159bf49445b0ece0f9d7806ed80657c2b2)) + ROM_REGION(0x1800, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD("zsc1.u23", 0x0000, 0x0400, CRC(4405368f) SHA1(037ad7e7158424bb714b28e4effa2c96c8736ce4)) + ROM_LOAD("zsc2.u24", 0x0400, 0x0400, CRC(a6c41475) SHA1(7d7d851efb2db7d9a1988265cdff676260d753c3)) + ROM_LOAD("zsc3.u25", 0x0800, 0x0400, CRC(e6a2dcee) SHA1(d2dfff896ae90208c28179f9bbe43f93d7f2131c)) + ROM_LOAD("zsc4.u26", 0x1400, 0x0400, CRC(69e0bb95) SHA1(d9a1d0159bf49445b0ece0f9d7806ed80657c2b2)) ROM_END -GAME(1978, skijump, 0, zac_proto, zac_proto, zac_proto_state, empty_init, ROT0, "Zaccaria", "Ski Jump", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -GAME(1979, spacecty, 0, zac_proto, zac_proto, zac_proto_state, empty_init, ROT0, "Zaccaria", "Space City", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -GAME(1978, strike, 0, zac_proto, zac_proto, zac_proto_state, empty_init, ROT0, "Zaccaria", "Strike", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +} // anonymous namespace + +GAME(1978, skijump, 0, zac_proto, zac_proto, zac_proto_state, empty_init, ROT0, "Zaccaria", "Ski Jump", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME(1979, spacecty, 0, zac_proto, zac_proto, zac_proto_state, empty_init, ROT0, "Zaccaria", "Space City", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME(1978, strike, 0, zac_proto, zac_proto, zac_proto_state, empty_init, ROT0, "Zaccaria", "Strike", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )