From 495f68a480175d8742837842eaa61ff3c63c97d4 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 22 Sep 2023 22:39:20 +0200 Subject: New working systems ------------------- Bridge Bidder [hap, Sean Riddle] --- src/mame/ddr/chessmstdm.cpp | 4 +- src/mame/fidelity/bridgeb.cpp | 300 ++++++++++++++++++++++++++++++++++++++ src/mame/fidelity/cc1.cpp | 4 +- src/mame/fidelity/cc7.cpp | 2 - src/mame/layout/fidel_bridgeb.lay | 197 +++++++++++++++++++++++++ src/mame/layout/lk3000.lay | 2 +- src/mame/mame.lst | 3 + 7 files changed, 505 insertions(+), 7 deletions(-) create mode 100644 src/mame/fidelity/bridgeb.cpp create mode 100644 src/mame/layout/fidel_bridgeb.lay diff --git a/src/mame/ddr/chessmstdm.cpp b/src/mame/ddr/chessmstdm.cpp index a45f1bad5ce..7e6a5e7876f 100644 --- a/src/mame/ddr/chessmstdm.cpp +++ b/src/mame/ddr/chessmstdm.cpp @@ -283,7 +283,7 @@ INPUT_PORTS_END Machine Configs *******************************************************************************/ -static const z80_daisy_config chessmstdm_daisy_chain[] = +static const z80_daisy_config daisy_chain[] = { { "z80pio1" }, { nullptr } @@ -295,7 +295,7 @@ void chessmstdm_state::chessmstdm(machine_config &config) Z80(config, m_maincpu, 8_MHz_XTAL / 2); m_maincpu->set_addrmap(AS_PROGRAM, &chessmstdm_state::chessmstdm_mem); m_maincpu->set_addrmap(AS_IO, &chessmstdm_state::chessmstdm_io); - m_maincpu->set_daisy_config(chessmstdm_daisy_chain); + m_maincpu->set_daisy_config(daisy_chain); auto &strobe(CLOCK(config, "strobe", 500)); // from 555 timer, 50% duty strobe.signal_handler().set(m_pio[1], FUNC(z80pio_device::strobe_b)); diff --git a/src/mame/fidelity/bridgeb.cpp b/src/mame/fidelity/bridgeb.cpp new file mode 100644 index 00000000000..42c0a3d10bf --- /dev/null +++ b/src/mame/fidelity/bridgeb.cpp @@ -0,0 +1,300 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Fidelity Bridge Bidder (BB / 7004) + +It's related to the Bridge Challenger series, but has no card reader, nor does +it play Bridge. It's more like a (cheat) tool for helping with bidding. + +The 101-64109 ROM is identical to the one in Advanced Bridge Challenger. + +Hardware notes: +- PCB label: main PCB: 510-1012, display PCB: 510-1013 +- Zilog Z80-CPU-PS @ ~1MHz (R/C clock, no XTAL) +- Zilog Z80 PIO (custom label) +- 16KB ROM (2* NEC 2364C), 1KB RAM (2*TC5514P) +- 3*Litronix DL1414, 4 more leds, piezo + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/z80/z80.h" +#include "machine/z80pio.h" +#include "sound/dac.h" +#include "video/dl1416.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +#include "fidel_bridgeb.lh" + + +namespace { + +class bridgeb_state : public driver_device +{ +public: + bridgeb_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_z80pio(*this, "z80pio"), + m_dl1414(*this, "dl1414_%u", 0), + m_led_pwm(*this, "led_pwm"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0), + m_digits(*this, "digit%u", 0U) + { } + + void bridgeb(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(reset_button); + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_pa(); } + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device m_z80pio; + required_device_array m_dl1414; + required_device m_led_pwm; + required_device m_dac; + required_ioport_array<8> m_inputs; + output_finder<12> m_digits; + + void main_map(address_map &map); + void main_io(address_map &map); + + template void update_digits(offs_t offset, u16 data); + + void digit_w(offs_t offset, u8 data); + void control_w(u8 data); + u8 input_r(); + void input_w(u8 data); + void update_pa(); + + u8 m_inp_mux = 0; +}; + +void bridgeb_state::machine_start() +{ + m_digits.resolve(); + + // register for savestates + save_item(NAME(m_inp_mux)); +} + +INPUT_CHANGED_MEMBER(bridgeb_state::reset_button) +{ + // reset button is directly wired to Z80 RESET pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +// DL1414 + +template +void bridgeb_state::update_digits(offs_t offset, u16 data) +{ + m_digits[N * 4 + offset] = data; +} + +void bridgeb_state::digit_w(offs_t offset, u8 data) +{ + assert(offset >= 0x2000); + + // write to one DL1414 digit + offset = (offset >> 11 & 0xf) - 4; + m_dl1414[offset >> 2]->bus_w(offset & 3, data); +} + + +// Z80 PIO + +void bridgeb_state::control_w(u8 data) +{ + // A4,A5: led data + // A6: N/C + m_led_pwm->matrix(1, 1 << (data >> 4 & 3)); + + // A7: speaker out + m_dac->write(BIT(data, 7)); +} + +u8 bridgeb_state::input_r() +{ + u8 data = 0; + + // A0-A3: multiplexed inputs + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read() & 0xf; + + return ~data; +} + +void bridgeb_state::update_pa() +{ + // push inputs to port A (can trigger IRQ) + m_z80pio->port_a_write(input_r()); +} + +void bridgeb_state::input_w(u8 data) +{ + // B0-B7: input mux + m_inp_mux = ~data; + update_pa(); +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void bridgeb_state::main_map(address_map &map) +{ + map(0x0000, 0x3fff).rom(); + map(0x6000, 0x63ff).mirror(0x1c00).ram(); + map(0x8000, 0xffff).w(FUNC(bridgeb_state::digit_w)); + map(0x8000, 0x9fff).unmapw(); +} + +void bridgeb_state::main_io(address_map &map) +{ + map.global_mask(0x03); + map(0x00, 0x03).rw(m_z80pio, FUNC(z80pio_device::read), FUNC(z80pio_device::write)); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +#define PORT_CHANGED_CB(x) \ + PORT_CHANGED_MEMBER(DEVICE_SELF, bridgeb_state, x, 0) + +static INPUT_PORTS_START( bridgeb ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("A") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("K") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("Q") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_SLASH) PORT_NAME("P") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("J") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_STOP) PORT_NAME("NT") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("EN") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_F) PORT_NAME("HD") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_V) PORT_NAME("IN") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Spades") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CL") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_D) PORT_NAME("DB") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_C) PORT_NAME("VL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_M) PORT_NAME("Hearts") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_W) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_S) PORT_NAME("PR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_X) PORT_NAME("CV") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_N) PORT_NAME("Diamonds") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_A) PORT_NAME("BR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_Z) PORT_NAME("DL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(input_changed) PORT_CODE(KEYCODE_B) PORT_NAME("Clubs") + + PORT_START("RESET") // is not on matrix IN.7 d0 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CHANGED_CB(reset_button) PORT_CODE(KEYCODE_Q) PORT_NAME("RE") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +static const z80_daisy_config daisy_chain[] = +{ + { "z80pio" }, + { nullptr } +}; + +void bridgeb_state::bridgeb(machine_config &config) +{ + // basic machine hardware + Z80(config, m_maincpu, 1000000); // R/C clock, appromixation + m_maincpu->set_addrmap(AS_PROGRAM, &bridgeb_state::main_map); + m_maincpu->set_addrmap(AS_IO, &bridgeb_state::main_io); + m_maincpu->set_daisy_config(daisy_chain); + + Z80PIO(config, m_z80pio, 1000000); + m_z80pio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + m_z80pio->out_pa_callback().set(FUNC(bridgeb_state::control_w)); + m_z80pio->in_pa_callback().set(FUNC(bridgeb_state::input_r)); + m_z80pio->out_pb_callback().set(FUNC(bridgeb_state::input_w)); + + // video hardware + DL1414T(config, m_dl1414[0], 0U).update().set(FUNC(bridgeb_state::update_digits<0>)); + DL1414T(config, m_dl1414[1], 0U).update().set(FUNC(bridgeb_state::update_digits<1>)); + DL1414T(config, m_dl1414[2], 0U).update().set(FUNC(bridgeb_state::update_digits<2>)); + + PWM_DISPLAY(config, m_led_pwm).set_size(1, 4); + config.set_default_layout(layout_fidel_bridgeb); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( bridgeb ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64111", 0x0000, 0x2000, CRC(903d0c3c) SHA1(8360bc21acfd0115730242fa1aa62356f289a88d) ) // NEC 2364C 218 + ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) // NEC 2364C 211 +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1980, bridgeb, 0, 0, bridgeb, bridgeb, bridgeb_state, empty_init, "Fidelity Electronics", "Bridge Bidder", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/fidelity/cc1.cpp b/src/mame/fidelity/cc1.cpp index a5316e20d77..c475bc1bf39 100644 --- a/src/mame/fidelity/cc1.cpp +++ b/src/mame/fidelity/cc1.cpp @@ -308,8 +308,8 @@ ROM_END ROM_START( cc10c ) ROM_REGION(0x10000, "maincpu", 0) - ROM_LOAD("k95069-922_ucc_10", 0x0000, 0x1000, CRC(2232c1c4) SHA1(fd282ba7ce7ac28834c860cec2cca398aec1b3f3) ) - ROM_CONTINUE( 0x2000, 0x1000 ) + ROM_LOAD("ucc_10", 0x0000, 0x1000, CRC(2232c1c4) SHA1(fd282ba7ce7ac28834c860cec2cca398aec1b3f3) ) + ROM_CONTINUE( 0x2000, 0x1000 ) ROM_END } // anonymous namespace diff --git a/src/mame/fidelity/cc7.cpp b/src/mame/fidelity/cc7.cpp index 7855b95c853..07b6e62b883 100644 --- a/src/mame/fidelity/cc7.cpp +++ b/src/mame/fidelity/cc7.cpp @@ -109,8 +109,6 @@ void bcc_state::machine_start() I/O *******************************************************************************/ -// TTL - void bcc_state::control_w(offs_t offset, u8 data) { // a0-a2,d7: digit segment data via NE591 diff --git a/src/mame/layout/fidel_bridgeb.lay b/src/mame/layout/fidel_bridgeb.lay new file mode 100644 index 00000000000..31ef9dc0725 --- /dev/null +++ b/src/mame/layout/fidel_bridgeb.lay @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/lk3000.lay b/src/mame/layout/lk3000.lay index 9425915b79b..596059452d0 100644 --- a/src/mame/layout/lk3000.lay +++ b/src/mame/layout/lk3000.lay @@ -5,7 +5,7 @@ license:CC0-1.0 - + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 5bfe2cffa88..b1b78596cdd 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -17746,6 +17746,9 @@ felega1 felega2 felega3 +@source:fidelity/bridgeb.cpp +bridgeb + @source:fidelity/card.cpp bridgec bridgec3 -- cgit v1.2.3