diff options
author | hap <happppp@users.noreply.github.com> | 2019-02-19 17:40:16 +0100 |
---|---|---|
committer | hap <happppp@users.noreply.github.com> | 2019-02-19 17:41:13 +0100 |
commit | 3426c5ead650b5e61d588feb04075ce758ff4d9c (patch) | |
tree | 5187cc7e0937aa4fb24276bf43fcef71c859d62d | |
parent | e905ec1d18f153559fcae762d19b741059952d40 (diff) |
fidelbase: extract card,vcc,vsc drivers (nw)
-rw-r--r-- | scripts/target/mame/mess.lua | 3 | ||||
-rw-r--r-- | src/mame/drivers/cxg_ch2001.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_as12.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_card.cpp | 523 | ||||
-rw-r--r-- | src/mame/drivers/fidel_cc7.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_csc.cpp | 6 | ||||
-rw-r--r-- | src/mame/drivers/fidel_dames.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_desdis.cpp | 6 | ||||
-rw-r--r-- | src/mame/drivers/fidel_eag68k.cpp | 6 | ||||
-rw-r--r-- | src/mame/drivers/fidel_elite.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_excel.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_phantom.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_sc12.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_sc6.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_sc8.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_sc9.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/fidel_vcc.cpp | 414 | ||||
-rw-r--r-- | src/mame/drivers/fidel_vsc.cpp | 442 | ||||
-rw-r--r-- | src/mame/drivers/fidelbase.cpp | 1402 | ||||
-rw-r--r-- | src/mame/drivers/hh_cop400.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/novagmcs48.cpp | 3 | ||||
-rw-r--r-- | src/mame/mame.lst | 12 | ||||
-rw-r--r-- | src/mame/mess.flt | 3 |
23 files changed, 1454 insertions, 1403 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 3acd800f5e4..5fde53e8ff3 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2134,6 +2134,7 @@ files { MAME_DIR .. "src/mame/drivers/fidelbase.cpp", MAME_DIR .. "src/mame/includes/fidelbase.h", MAME_DIR .. "src/mame/drivers/fidel_as12.cpp", + MAME_DIR .. "src/mame/drivers/fidel_card.cpp", MAME_DIR .. "src/mame/drivers/fidel_cc10.cpp", MAME_DIR .. "src/mame/drivers/fidel_cc7.cpp", MAME_DIR .. "src/mame/drivers/fidel_chesster.cpp", @@ -2148,6 +2149,8 @@ files { MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp", MAME_DIR .. "src/mame/drivers/fidel_sc8.cpp", MAME_DIR .. "src/mame/drivers/fidel_sc9.cpp", + MAME_DIR .. "src/mame/drivers/fidel_vcc.cpp", + MAME_DIR .. "src/mame/drivers/fidel_vsc.cpp", } createMESSProjects(_target, _subtarget, "force") diff --git a/src/mame/drivers/cxg_ch2001.cpp b/src/mame/drivers/cxg_ch2001.cpp index 411670a9e0f..f4226497c46 100644 --- a/src/mame/drivers/cxg_ch2001.cpp +++ b/src/mame/drivers/cxg_ch2001.cpp @@ -150,8 +150,7 @@ void ch2001_state::ch2001(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } diff --git a/src/mame/drivers/fidel_as12.cpp b/src/mame/drivers/fidel_as12.cpp index 599f0e6868c..4da9a92c6e3 100644 --- a/src/mame/drivers/fidel_as12.cpp +++ b/src/mame/drivers/fidel_as12.cpp @@ -153,8 +153,7 @@ void as12_state::as12(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); /* cartridge */ generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat")); diff --git a/src/mame/drivers/fidel_card.cpp b/src/mame/drivers/fidel_card.cpp new file mode 100644 index 00000000000..e673c80fd01 --- /dev/null +++ b/src/mame/drivers/fidel_card.cpp @@ -0,0 +1,523 @@ +// license:BSD-3-Clause +// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap +/****************************************************************************** + +Fidelity electronic card games +- *Bridge Challenger (BRC) +- Advanced Bridge Challenger (UBC) +- Voice Bridge Challenger (VBRC) +- Bridge Challenger III (English,*French) (BV3) +- *Gin & Cribbage Challenger +- *Skat Challenger + +*: not dumped yet + +TODO: +- the barcode card scanner isn't implemented, the games can't be considered working without it +- Z80 WAIT pin is not fully emulated, affecting VBRC speech busy state + +******************************************************************************* + +Voice Bridge Challenger (Model VBRC, later reissued as Model 7002) +and Bridge Challenger 3 (Model 7014) +(which both share the same* hardware) +-------------------------------- +* The Bridge Challenger 3 does not actually have the 8 LEDs nor the +latches which operate them populated and the plastic indicator cap locations +are instead are covered by a piece of plastic, but they do work if manually +added. + +RE notes by Kevin Horton + +This unit is similar in construction kinda to the chess challengers, however it +has an 8041 which does ALL of the system I/O. The Z80 has NO IO AT ALL other than +what is performed through the 8041! + +The main CPU is a Z80 running at 2.5MHz + +INT connects to VCC (not used) +NMI connects to VCC (not used) +RST connects to power on reset, and reset button + +The 8041 runs at 5MHz. + +Memory Map: +----------- +0000-1FFF: 8K 101-64108 ROM +2000-3FFF: 8K 101-64109 ROM +4000-5FFF: 8K 101-64110 ROM +6000-7FFF: 1K of RAM (2114 * 2) +8000-DFFF: unused +E000-FFFF: write to TSI chip + +NOTE: when the TSI chip is written to, the CPU IS STOPPED. The CPU will run again +when the word is done being spoken. This is because D0-D5 run to the TSI chip directly. + +The TSI chip's ROM is 4K, and is marked 101-32118. The clock is the same as the Chess +Challengers- 470K/100pf which gives a frequency around 25KHz or so. + +Port Map: +--------- +00-FF: 8041 I/O ports (A0 selects between the two) + +8041 pinout: +------------ +(note: columns are pulled up with 10K resistors) + +P10 - column H, RD LED, VFD grid 0 +P11 - column G, DB LED, VFD grid 1 +P12 - column F, <>V LED, VFD grid 2 +P13 - column E, ^V LED, VFD grid 3 +P14 - column D, W LED, VFD grid 4 +P15 - column C, S LED, VFD grid 5 +P16 - column B, E LED, VFD grid 6 +P17 - column A, N LED, VFD grid 7 + +P20 - I/O expander +P21 - I/O expander +P22 - I/O expander +P23 - I/O expander +P24 - row 0 through inverter +P25 - row 1 through inverter +P26 - row 2 through inverter +P27 - row 3 through inverter + +PROG - I/O expander + +T0 - optical card sensor (high = bright/reflective, low = dark/non reflective) +T1 - connects to inverter, then 5MHz/4 + +D8243C I/O expander: +-------------------- +P4.0 - segment M +P4.1 - segment L +P4.2 - segment N +P4.3 - segment E + +P5.0 - segment D +P5.1 - segment I +P5.2 - segment K +P5.3 - segment J + +P6.0 - segment A +P6.1 - segment B +P6.2 - segment F +P6.3 - segment G + +P7.0 - LED enable (high = LEDs can be lit. low = LEDs will not light) +P7.1 - goes through inverter, to pads that are not used +P7.2 - segment C +P7.3 - segment H + +button matrix: +-------------- +the matrix is composed of 8 columns by 4 rows. + + A B C D E F G H + ------------------------- +0- RE xx CL EN J Q K A +1- BR PB DB SC 7 8 9 10 +2- DL CV VL PL 3 4 5 6 +3- cl di he sp NT P 1 2 + +xx - speaker symbol +cl - clubs symbol +di - diamonds symbol +he - hearts symbol +sp - spades symbol + +NOTE: RE is not wired into the matrix, and is run separately out. + +There are 8 LEDs, and an 8 digit 14 segment VFD with commas and periods. +This display is the same one as can be found on the speak and spell. + + A * comma + *********** * + * *I *J K* * +F* * * * *B + * * * * * + G**** *****H + * * * * * +E* * * * *C + * *N *M L* * + *********** *decimal point + D + +The digits of the display are numbered left to right, 0 through 7 and are controlled +by the grids. hi = grid on, hi = segment on. + +A detailed description of the hardware can be found also in the patent 4,373,719. + +******************************************************************************/ + +#include "emu.h" +#include "includes/fidelbase.h" + +#include "cpu/z80/z80.h" +#include "cpu/mcs48/mcs48.h" +#include "machine/i8243.h" +#include "machine/clock.h" +#include "sound/volt_reg.h" +#include "speaker.h" + +// internal artwork +#include "fidel_vbrc.lh" // clickable +#include "fidel_bv3.lh" // clickable + + +namespace { + +class card_state : public fidelbase_state +{ +public: + card_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_mcu(*this, "mcu"), + m_i8243(*this, "i8243") + { } + + // machine drivers + void brc_base(machine_config &config); + void ubc(machine_config &config); + void vbrc(machine_config &config); + void bv3(machine_config &config); + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button) override; + +private: + // devices/pointers + required_device<i8041_device> m_mcu; + required_device<i8243_device> m_i8243; + + // address maps + void main_map(address_map &map); + void main_io(address_map &map); + + // I/O handlers + void prepare_display(); + DECLARE_WRITE8_MEMBER(speech_w); + DECLARE_WRITE8_MEMBER(mcu_p1_w); + DECLARE_READ8_MEMBER(mcu_p2_r); + template<int P> void ioexp_port_w(uint8_t data); +}; + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// misc handlers + +void card_state::prepare_display() +{ + // 14seg led segments, d15(12) is extra led + u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8); + set_display_segmask(0xff, 0x3fff); + display_matrix(16, 8, outdata, m_led_select); +} + +WRITE8_MEMBER(card_state::speech_w) +{ + if (m_speech == nullptr) + return; + + m_speech->data_w(space, 0, data & 0x3f); + m_speech->start_w(1); + m_speech->start_w(0); +} + + +// I8243 I/O expander + +template<int P> +void card_state::ioexp_port_w(uint8_t data) +{ + // P4x-P7x: digit segment data + m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P)); + prepare_display(); + + // P71 is tone (not on speech model) + if (P == 3 && m_dac != nullptr) + m_dac->write(BIT(data, 1)); +} + + +// I8041 MCU + +WRITE8_MEMBER(card_state::mcu_p1_w) +{ + // P10-P17: select digits, input mux + m_inp_mux = m_led_select = data; + prepare_display(); +} + +READ8_MEMBER(card_state::mcu_p2_r) +{ + // P20-P23: I8243 P2 + // P24-P27: multiplexed inputs (active low) + return (m_i8243->p2_r() & 0x0f) | (read_inputs(8) << 4 ^ 0xf0); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void card_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x5fff).rom(); + map(0x6000, 0x63ff).mirror(0x1c00).ram(); + map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::speech_w)); +} + +void card_state::main_io(address_map &map) +{ + map.global_mask(0x01); + map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +INPUT_CHANGED_MEMBER(card_state::reset_button) +{ + // reset button is directly wired to maincpu/mcu RESET pins + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); + m_mcu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + +static INPUT_PORTS_START( common ) + PORT_START("RESET") // is not on matrix IN.7 d0 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("RE") + + PORT_START("BARCODE") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Card Scanner") +INPUT_PORTS_END + +static INPUT_PORTS_START( vbrc ) + PORT_INCLUDE( common ) + + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("K") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("J") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("NT") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("EN") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("SC") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("PL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("CL") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("DB") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("VL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("PB") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("CV") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("BR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("DL") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs") +INPUT_PORTS_END + +static INPUT_PORTS_START( bv3 ) + PORT_INCLUDE( common ) + + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Ace") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("King") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Queen") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Quit") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Jack") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("No Trump") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Yes/Enter") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("No/Pass") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Player") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Clear") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Double") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Score") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Auto") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Conv") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Review") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Dealer") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void card_state::brc_base(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 5_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &card_state::main_map); + m_maincpu->set_addrmap(AS_IO, &card_state::main_io); + config.m_perfect_cpu_quantum = subtag("maincpu"); + + I8041(config, m_mcu, 5_MHz_XTAL); + m_mcu->p1_out_cb().set(FUNC(card_state::mcu_p1_w)); + m_mcu->p2_in_cb().set(FUNC(card_state::mcu_p2_r)); + m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w)); + m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w)); + m_mcu->t0_in_cb().set_ioport("BARCODE"); // card scanner + + // MCU T1 tied to master clock / 4 + CLOCK(config, "t1_clock", 5_MHz_XTAL/4).signal_handler().set_nop(); + m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert(); + + I8243(config, m_i8243); + m_i8243->p4_out_cb().set(FUNC(card_state::ioexp_port_w<0>)); + m_i8243->p5_out_cb().set(FUNC(card_state::ioexp_port_w<1>)); + m_i8243->p6_out_cb().set(FUNC(card_state::ioexp_port_w<2>)); + m_i8243->p7_out_cb().set(FUNC(card_state::ioexp_port_w<3>)); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_vbrc); +} + +void card_state::ubc(machine_config &config) +{ + brc_base(config); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + +void card_state::vbrc(machine_config &config) +{ + brc_base(config); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + S14001A(config, m_speech, 25000); // R/C circuit, around 25khz + m_speech->bsy().set_inputline("maincpu", Z80_INPUT_LINE_WAIT); + m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); +} + +void card_state::bv3(machine_config &config) +{ + vbrc(config); + config.set_default_layout(layout_fidel_bv3); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( vbrc ) // model VBRC aka 7002 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) // NEC 2364 + ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) // NEC 2364 + ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) // NEC 2364 + + ROM_REGION( 0x0400, "mcu", 0 ) + ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) + + ROM_REGION( 0x1000, "speech", 0 ) + ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) +ROM_END + +ROM_START( bridgeca ) // model UBC + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) + ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) + ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) + + ROM_REGION( 0x0400, "mcu", 0 ) + ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) +ROM_END + + +ROM_START( bridgec3 ) // model BV3 aka 7014, PCB label 510-1016 Rev.1 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("7014_white", 0x0000, 0x2000, CRC(eb1620ef) SHA1(987a9abc8c685f1a68678ea4ee65ec4a99419179) ) // TMM2764AD-20, white sticker + ROM_LOAD("7014_red", 0x2000, 0x2000, CRC(74af0019) SHA1(8dc05950c254ca050b95b93e5d0cf48f913a6d49) ) // TMM2764AD-20, red sticker + ROM_LOAD("7014_blue", 0x4000, 0x2000, CRC(341d9ca6) SHA1(370876573bb9408e75f4fc797304b6c64af0590a) ) // TMM2764AD-20, blue sticker + + ROM_REGION( 0x0400, "mcu", 0 ) + ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) // NEC P07021-027 || D8041C 563 100-1009 + + ROM_REGION( 0x1000, "speech", 0 ) + ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) // ea 101-32118 || (C) 1980 || EA 8332A247-4 || 8034 +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, vbrc, 0, 0, vbrc, vbrc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) +CONS( 1980, bridgeca, vbrc, 0, ubc, vbrc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) + +CONS( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/fidel_cc7.cpp b/src/mame/drivers/fidel_cc7.cpp index 2ff5a9476ff..bff4dcd341d 100644 --- a/src/mame/drivers/fidel_cc7.cpp +++ b/src/mame/drivers/fidel_cc7.cpp @@ -207,8 +207,7 @@ void bcc_state::bcc(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } diff --git a/src/mame/drivers/fidel_csc.cpp b/src/mame/drivers/fidel_csc.cpp index 4d0d81ae0fd..9055da0ac65 100644 --- a/src/mame/drivers/fidel_csc.cpp +++ b/src/mame/drivers/fidel_csc.cpp @@ -523,8 +523,7 @@ void csc_state::csc(machine_config &config) m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } void csc_state::su9(machine_config &config) @@ -561,8 +560,7 @@ void csc_state::rsc(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } diff --git a/src/mame/drivers/fidel_dames.cpp b/src/mame/drivers/fidel_dames.cpp index ff9787abb24..6bda528c73c 100644 --- a/src/mame/drivers/fidel_dames.cpp +++ b/src/mame/drivers/fidel_dames.cpp @@ -148,8 +148,7 @@ void dsc_state::dsc(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } diff --git a/src/mame/drivers/fidel_desdis.cpp b/src/mame/drivers/fidel_desdis.cpp index 399b5990739..b3188dc73fc 100644 --- a/src/mame/drivers/fidel_desdis.cpp +++ b/src/mame/drivers/fidel_desdis.cpp @@ -262,8 +262,7 @@ void desdis_state::fdes2100d(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } void desdis_state::fdes2000d(machine_config &config) @@ -292,8 +291,7 @@ void desmas_state::fdes2265(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } void desmas_state::fdes2325(machine_config &config) diff --git a/src/mame/drivers/fidel_eag68k.cpp b/src/mame/drivers/fidel_eag68k.cpp index bf92aebeb66..dfb60dbfbd1 100644 --- a/src/mame/drivers/fidel_eag68k.cpp +++ b/src/mame/drivers/fidel_eag68k.cpp @@ -446,8 +446,7 @@ void excel68k_state::fex68k(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } void excel68k_state::fex68km2(machine_config &config) @@ -486,8 +485,7 @@ void eag_state::eag_base(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); /* cartridge */ generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat")); diff --git a/src/mame/drivers/fidel_elite.cpp b/src/mame/drivers/fidel_elite.cpp index 6ec080adb7a..471c10c80ee 100644 --- a/src/mame/drivers/fidel_elite.cpp +++ b/src/mame/drivers/fidel_elite.cpp @@ -321,8 +321,7 @@ void elite_state::eas_base(machine_config &config) m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); /* cartridge */ generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat")); diff --git a/src/mame/drivers/fidel_excel.cpp b/src/mame/drivers/fidel_excel.cpp index d41409f8755..8a5e8aa22bc 100644 --- a/src/mame/drivers/fidel_excel.cpp +++ b/src/mame/drivers/fidel_excel.cpp @@ -351,8 +351,7 @@ void excel_state::fexcel(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } void excel_state::fexcel4(machine_config &config) diff --git a/src/mame/drivers/fidel_phantom.cpp b/src/mame/drivers/fidel_phantom.cpp index 07a9db49077..ec88e252db6 100644 --- a/src/mame/drivers/fidel_phantom.cpp +++ b/src/mame/drivers/fidel_phantom.cpp @@ -113,8 +113,7 @@ void phantom_state::fphantom(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } diff --git a/src/mame/drivers/fidel_sc12.cpp b/src/mame/drivers/fidel_sc12.cpp index aa4c049e0cc..56e538b551d 100644 --- a/src/mame/drivers/fidel_sc12.cpp +++ b/src/mame/drivers/fidel_sc12.cpp @@ -182,8 +182,7 @@ void sc12_state::sc12(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); /* cartridge */ generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat")); diff --git a/src/mame/drivers/fidel_sc6.cpp b/src/mame/drivers/fidel_sc6.cpp index 75c06b936af..71bff9eb016 100644 --- a/src/mame/drivers/fidel_sc6.cpp +++ b/src/mame/drivers/fidel_sc6.cpp @@ -185,8 +185,7 @@ void sc6_state::sc6(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); /* cartridge */ generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_sc6", "bin")); diff --git a/src/mame/drivers/fidel_sc8.cpp b/src/mame/drivers/fidel_sc8.cpp index 304d3722f57..3651a8b929d 100644 --- a/src/mame/drivers/fidel_sc8.cpp +++ b/src/mame/drivers/fidel_sc8.cpp @@ -127,8 +127,7 @@ void scc_state::scc(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } diff --git a/src/mame/drivers/fidel_sc9.cpp b/src/mame/drivers/fidel_sc9.cpp index 509d397d7b7..13c8f87c67e 100644 --- a/src/mame/drivers/fidel_sc9.cpp +++ b/src/mame/drivers/fidel_sc9.cpp @@ -220,8 +220,7 @@ void sc9_state::sc9d(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); /* cartridge */ generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat")); diff --git a/src/mame/drivers/fidel_vcc.cpp b/src/mame/drivers/fidel_vcc.cpp new file mode 100644 index 00000000000..d07bdffd706 --- /dev/null +++ b/src/mame/drivers/fidel_vcc.cpp @@ -0,0 +1,414 @@ +// license:BSD-3-Clause +// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap +/****************************************************************************** + +Fidelity Voice Chess Challenger series hardware +- Voice Chess Challenger (VCC) (version A and B?) +- Advanced Voice Chess Challenger (UVC) +- *Grandmaster Voice Chess Challenger +- *Decorator Challenger (FCC) + +*: not dumped yet + +******************************************************************************* + +RE notes by Kevin Horton + +The CPU is a Z80 running at 4MHz. The TSI chip runs at around 25KHz, using a +470K / 100pf RC network. This system is very very basic, and is composed of just +the Z80, 4 ROMs, the TSI chip, and an 8255. + +The Z80's interrupt inputs are all pulled to VCC, so no interrupts are used. + +Reset is connected to a power-on reset circuit and a button on the keypad (marked RE). + +The TSI chip connects to a 4K ROM. All of the 'Voiced' Chess Challengers +use this same ROM (three or four). The later chess boards use a slightly different part +number, but the contents are identical. + +Memory map (VCC): +----------- +0000-0FFF: 4K 2332 ROM 101-32013 +1000-1FFF: 4K 2332 ROM VCC2 +2000-2FFF: 4K 2332 ROM VCC3 +4000-5FFF: 1K RAM (2114 SRAM x2) +6000-FFFF: empty + +Memory map (UVC): +----------- +0000-1FFF: 8K 2364 ROM 101-64017 +2000-2FFF: 4K 2332 ROM 101-32010 +4000-5FFF: 1K RAM (2114 SRAM x2) +6000-FFFF: empty + +Port map: +--------- +00-03: 8255 port chip, mirrored over the 00-FF range; program accesses F4-F7 + +8255 connections: +----------------- +PA.0 - segment G, TSI A0 (W) +PA.1 - segment F, TSI A1 (W) +PA.2 - segment E, TSI A2 (W) +PA.3 - segment D, TSI A3 (W) +PA.4 - segment C, TSI A4 (W) +PA.5 - segment B, TSI A5 (W) +PA.6 - segment A, language latch Data (W) +PA.7 - TSI START line, language latch clock (W, see below) + +PB.0 - dot commons (W) +PB.1 - NC +PB.2 - digit 0, bottom dot (W) +PB.3 - digit 1, top dot (W) +PB.4 - digit 2 (W) +PB.5 - digit 3 (W) +PB.6 - enable language switches (W, see below) +PB.7 - TSI BUSY line (R) + +(button rows pulled up to 5V through 2.2K resistors) +PC.0 - button row 0, German language jumper (R) +PC.1 - button row 1, French language jumper (R) +PC.2 - button row 2, Spanish language jumper (R) +PC.3 - button row 3, special language jumper (R) +PC.4 - button column A (W) +PC.5 - button column B (W) +PC.6 - button column C (W) +PC.7 - button column D (W) + +language switches: +------------------ +When PB.6 is pulled low, the language switches can be read. There are four. +They connect to the button rows. When enabled, the row(s) will read low if +the jumper is present. English only VCC's do not have the 367 or any pads stuffed. +The jumpers are labeled: French, German, Spanish, and special. + +language latch: +--------------- +There's an unstuffed 7474 on the board that connects to PA.6 and PA.7. It allows +one to latch the state of A12 to the speech ROM. The English version has the chip +missing, and a jumper pulling "A12" to ground. This line is really a negative +enable. + +To make the VCC multi-language, one would install the 74367 (note: it must be a 74367 +or possibly a 74LS367. A 74HC367 would not work since they rely on the input current +to keep the inputs pulled up), solder a piggybacked ROM to the existing English +speech ROM, and finally install a 7474 dual flipflop. + +This way, the game can then detect which secondary language is present, and then it can +automatically select the correct ROM(s). I have to test whether it will do automatic +determination and give you a language option on power up or something. + +******************************************************************************/ + +#include "emu.h" +#include "includes/fidelbase.h" + +#include "cpu/z80/z80.h" +#include "machine/i8255.h" +#include "speaker.h" + +// internal artwork +#include "fidel_vcc.lh" // clickable + + +namespace { + +class vcc_state : public fidelbase_state +{ +public: + vcc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_ppi8255(*this, "ppi8255") + { } + + void vcc(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device<i8255_device> m_ppi8255; + + // address maps + void main_map(address_map &map); + void main_io(address_map &map); + + // I/O handlers + void prepare_display(); + DECLARE_READ8_MEMBER(speech_r); + DECLARE_WRITE8_MEMBER(ppi_porta_w); + DECLARE_READ8_MEMBER(ppi_portb_r); + DECLARE_WRITE8_MEMBER(ppi_portb_w); + DECLARE_READ8_MEMBER(ppi_portc_r); + DECLARE_WRITE8_MEMBER(ppi_portc_w); +}; + +void vcc_state::machine_start() +{ + fidelbase_state::machine_start(); + + // game relies on RAM initialized filled with 1 + for (int i = 0; i < 0x400; i++) + m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff); +} + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// misc handlers + +void vcc_state::prepare_display() +{ + // 4 7seg leds (note: sel d0 for extra leds) + u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); + set_display_segmask(0xf, 0x7f); + display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf); +} + +READ8_MEMBER(vcc_state::speech_r) +{ + return m_speech_rom[m_speech_bank << 12 | offset]; +} + + +// I8255 PPI + +WRITE8_MEMBER(vcc_state::ppi_porta_w) +{ + // d0-d6: digit segment data, bits are xABCDEFG + m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); + prepare_display(); + + // d0-d5: TSI C0-C5 + // d7: TSI START line + m_speech->data_w(space, 0, data & 0x3f); + m_speech->start_w(data >> 7 & 1); + + // d6: language latch data + // d7: language latch clock (latch on high) + if (data & 0x80) + { + m_speech->force_update(); // update stream to now + m_speech_bank = data >> 6 & 1; + } +} + +READ8_MEMBER(vcc_state::ppi_portb_r) +{ + // d7: TSI BUSY line + return (m_speech->busy_r()) ? 0x80 : 0x00; +} + +WRITE8_MEMBER(vcc_state::ppi_portb_w) +{ + // d0,d2-d5: digit/led select + // _d6: enable language switches + m_led_select = data; + prepare_display(); +} + +READ8_MEMBER(vcc_state::ppi_portc_r) +{ + // d0-d3: multiplexed inputs (active low) + // also language switches, hardwired with 4 jumpers + // 0(none wired): English, 1: German, 2: French, 4: Spanish, 8:Special(unused) + u8 lan = (~m_led_select & 0x40) ? m_language : 0; + return ~(lan | read_inputs(4)) & 0xf; +} + +WRITE8_MEMBER(vcc_state::ppi_portc_w) +{ + // d4-d7: input mux (inverted) + m_inp_mux = ~data >> 4 & 0xf; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void vcc_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x2fff).rom(); + map(0x4000, 0x43ff).mirror(0x1c00).ram(); +} + +void vcc_state::main_io(address_map &map) +{ + map.global_mask(0x03); + map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( vcc ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) + + PORT_START("RESET") // is not on matrix IN.0 d0 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, vcc_state, reset_button, nullptr) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void vcc_state::vcc(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 4_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &vcc_state::main_io); + + I8255(config, m_ppi8255); + m_ppi8255->out_pa_callback().set(FUNC(vcc_state::ppi_porta_w)); + m_ppi8255->tri_pa_callback().set_constant(0); + m_ppi8255->in_pb_callback().set(FUNC(vcc_state::ppi_portb_r)); + m_ppi8255->out_pb_callback().set(FUNC(vcc_state::ppi_portb_w)); + m_ppi8255->tri_pb_callback().set_constant(0); + m_ppi8255->in_pc_callback().set(FUNC(vcc_state::ppi_portc_r)); + m_ppi8255->out_pc_callback().set(FUNC(vcc_state::ppi_portc_w)); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_vcc); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + S14001A(config, m_speech, 25000); // R/C circuit, around 25khz + m_speech->ext_read().set(FUNC(vcc_state::speech_r)); + m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( vcc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) + ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) + ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) + ROM_RELOAD( 0x1000, 0x1000) +ROM_END + +ROM_START( vccg ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) + ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) + ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct +ROM_END + +ROM_START( vccsp ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) + ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) + ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // dumped from Spanish VCC, is same as data in fexcelv +ROM_END + +ROM_START( vccfr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) + ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) + ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct +ROM_END + +ROM_START( uvc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) // MOS // 101-64017 // 3880 + ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) // NEC P9Z021 // D2332C 228 // 101-32010, == cn19175n_vcc3 on vcc + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // NEC P9Y019 // D2332C 229 // 101-32107 + ROM_RELOAD( 0x1000, 0x1000) +ROM_END + +ROM_START( uvcg ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) + ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct +ROM_END + +ROM_START( uvcsp ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) + ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) +ROM_END + +ROM_START( uvcfr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) + ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, vcc, 0, 0, vcc, vcc, vcc_state, init_language<0>, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, vccg, vcc, 0, vcc, vcc, vcc_state, init_language<1>, "Fidelity Electronics", "Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, vccsp, vcc, 0, vcc, vcc, vcc_state, init_language<2>, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, vccfr, vcc, 0, vcc, vcc, vcc_state, init_language<4>, "Fidelity Electronics", "Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, init_language<0>, "Fidelity Electronics", "Advanced Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, uvcg, vcc, 0, vcc, vcc, vcc_state, init_language<1>, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, uvcsp, vcc, 0, vcc, vcc, vcc_state, init_language<2>, "Fidelity Electronics", "Advanced Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, uvcfr, vcc, 0, vcc, vcc, vcc_state, init_language<4>, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/fidel_vsc.cpp b/src/mame/drivers/fidel_vsc.cpp new file mode 100644 index 00000000000..6923d6b26b3 --- /dev/null +++ b/src/mame/drivers/fidel_vsc.cpp @@ -0,0 +1,442 @@ +// license:BSD-3-Clause +// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap +/****************************************************************************** + +Fidelity Voice Sensory Chess Challenger (VSC) +--------------------------------------------- +RE notes by Kevin Horton + +The display/button/LED/speech technology is identical to Fidelity CSC. +Only the CPU board was changed. As such, it works the same but is interfaced +to different port chips this time. + +Hardware: +--------- +On the board are 13 chips. + +The CPU is a Z80A running at 3.9MHz, with 20K of ROM and 1K of RAM mapped. +I/O is composed of an 8255 triple port adaptor, and a Z80A PIO parallel I/O +interface. + +There's the usual TSI S14001A speech synth with its requisite 4K ROM which is the +same as on the other talking chess boards. The TSI chip is running at 26.37KHz. +It uses a 470K resistor and a 100pf capacitor. + +The "perfect" clock would be 1/RC most likely (actually this will be skewed a tad by +duty cycle of the oscillator) which with those parts values gives 21.27KHz. The +formula is probably more likely to be 1/1.2RC or so. + +Rounding out the hardware are three driver chips for the LEDs, a 7404 inverter to +run the crystal osc, a 555 timer to generate a clock, and a 74138 selector. + +NMI runs to a 555 oscillator that generates a 600Hz clock (measured: 598.9Hz. +It has a multiturn pot to adjust). +INT is pulled to 5V +RST connects to a power-on reset circuit + +Memory map: +----------- +0000-1FFF: 8K ROM 101-64018 +2000-3FFF: 8K ROM 101-64019 (also used on the sensory champ. chess challenger) +4000-5FFF: 4K ROM 101-32024 +6000-7FFF: 1K of RAM (2114 * 2) +8000-FFFF: not used, maps to open bus + +Port map: +--------- +There's only two chips in the portmap, an 8255 triple port chip, and a Z80A PIO +parallel input/output device. + +Decoding isn't performed using a selector, but instead address lines are used. + +A2 connects to /CE on the 8255 +A3 connects to /CE on the Z80A PIO + +A0 connects to port A/B select on PIO & A0 of 8255 +A1 connects to control/data select on PIO & A1 of 8255 + +So to enable only the 8255, you'd write/read to 08-0Bh for example +To enable only the PIO, you'd write/read to 04-07h for example. + +writing to 00-03h will enable and write to BOTH chips, and reading 00-03h +will return data from BOTH chips (and cause a bus conflict). The code probably +never does either of these things. + +Likewise, writing/reading to 0Ch-0Fh will result in open bus, because neither chip's +enable line will be low. + +This sequence repeats every 16 addresses. So to recap: + +00-03: both chips enabled (probably not used) +04-07: PIO enabled +08-0B: 8255 enabled +0C-0F: neither enabled + +10-FF: mirrors of 00-0F. + +Refer to the Sensory Champ. Chess Chall. for explanations of the below +I/O names and labels. It's the same. + +8255: +----- +PA.0 - segment D, TSI A0 +PA.1 - segment E, TSI A1 +PA.2 - segment F, TSI A2 +PA.3 - segment A, TSI A3 +PA.4 - segment B, TSI A4 +PA.5 - segment C, TSI A5 +PA.6 - segment G +PA.7 - segment H + +PB.0 - LED row 1 +PB.1 - LED row 2 +PB.2 - LED row 3 +PB.3 - LED row 4 +PB.4 - LED row 5 +PB.5 - LED row 6 +PB.6 - LED row 7 +PB.7 - LED row 8 + +PC.0 - LED column A, button column A, 7seg digit 1 +PC.1 - LED column B, button column B, 7seg digit 2 +PC.2 - LED column C, button column C, 7seg digit 3 +PC.3 - LED column D, button column D, 7seg digit 4 +PC.4 - LED column E, button column E +PC.5 - LED column F, button column F +PC.6 - LED column G, button column G +PC.7 - LED column H, button column H + +Z80A PIO: +--------- +PA.0 - button row 1 +PA.1 - button row 2 +PA.2 - button row 3 +PA.3 - button row 4 +PA.4 - button row 5 +PA.5 - button row 6 +PA.6 - button row 7 +PA.7 - button row 8 + +PB.0 - button column I +PB.1 - button column J +PB.2 - hi/lo TSI speaker volume +PB.3 - violet wire +PB.4 - white wire (and TSI BUSY line) +PB.5 - selection jumper input (see below) +PB.6 - TSI start line +PB.7 - TSI ROM A12 line + +selection jumpers: +------------------ +These act like another row of buttons. It is composed of two diode locations, +so there's up to 4 possible configurations. My board does not have either diode +stuffed, so this most likely is "English". I suspect it selects which language to use +for the speech synth. Of course you need the other speech ROMs for this to function +properly. + +Anyways, the two jumpers are connected to button columns A and B and the common +connects to Z80A PIO PB.5, which basically makes a 10th button row. I would +expect that the software reads these once on startup only. + +******************************************************************************/ + +#include "emu.h" +#include "includes/fidelbase.h" + +#include "cpu/z80/z80.h" +#include "machine/i8255.h" +#include "machine/z80pio.h" +#include "speaker.h" + +// internal artwork +#include "fidel_vsc.lh" // clickable + + +namespace { + +class vsc_state : public fidelbase_state +{ +public: + vsc_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), + m_z80pio(*this, "z80pio"), + m_ppi8255(*this, "ppi8255") + { } + + void vsc(machine_config &config); + +private: + // devices/pointers + required_device<z80pio_device> m_z80pio; + required_device<i8255_device> m_ppi8255; + + // address maps + void main_map(address_map &map); + void main_io(address_map &map); + DECLARE_READ8_MEMBER(main_io_trampoline_r); + DECLARE_WRITE8_MEMBER(main_io_trampoline_w); + + // I/O handlers + void prepare_display(); + DECLARE_READ8_MEMBER(speech_r); + DECLARE_WRITE8_MEMBER(ppi_porta_w); + DECLARE_WRITE8_MEMBER(ppi_portb_w); + DECLARE_WRITE8_MEMBER(ppi_portc_w); + DECLARE_READ8_MEMBER(pio_porta_r); + DECLARE_READ8_MEMBER(pio_portb_r); + DECLARE_WRITE8_MEMBER(pio_portb_w); +}; + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// misc handlers + +void vsc_state::prepare_display() +{ + // 4 7seg leds+H, 8*8 chessboard leds + set_display_segmask(0xf, 0x7f); + display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select); +} + +READ8_MEMBER(vsc_state::speech_r) +{ + return m_speech_rom[m_speech_bank << 12 | offset]; +} + + +// I8255 PPI + +WRITE8_MEMBER(vsc_state::ppi_porta_w) +{ + // d0-d5: TSI C0-C5 + m_speech->data_w(space, 0, data & 0x3f); + + // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led) + m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3); + prepare_display(); +} + +WRITE8_MEMBER(vsc_state::ppi_portb_w) +{ + // d0-d7: led row data + m_led_data = data; + prepare_display(); +} + +WRITE8_MEMBER(vsc_state::ppi_portc_w) +{ + // d0-d3: select digits + // d0-d7: select leds, input mux low bits + m_inp_mux = (m_inp_mux & ~0xff) | data; + m_led_select = data; + prepare_display(); +} + + +// Z80 PIO + +READ8_MEMBER(vsc_state::pio_porta_r) +{ + // d0-d7: multiplexed inputs + // also language switches(hardwired with 2 diodes) + u8 lan = (m_inp_mux & 0x400) ? m_language : 0; + return read_inputs(10) | lan; +} + +READ8_MEMBER(vsc_state::pio_portb_r) +{ + u8 data = 0; + + // d4: TSI BUSY line + data |= (m_speech->busy_r()) ? 0 : 0x10; + + return data; +} + +WRITE8_MEMBER(vsc_state::pio_portb_w) +{ + // d0,d1: input mux highest bits + // d5: enable language switch + m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x300) | (data << 5 & 0x400); + + // d7: TSI ROM A12 + m_speech->force_update(); // update stream to now + m_speech_bank = data >> 7 & 1; + + // d6: TSI START line + m_speech->start_w(data >> 6 & 1); + + // d2: lower TSI volume + m_speech->set_output_gain(0, (data & 4) ? 0.5 : 1.0); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void vsc_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x3fff).rom(); + map(0x4000, 0x4fff).mirror(0x1000).rom(); + map(0x6000, 0x63ff).mirror(0x1c00).ram(); +} + +// VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously +READ8_MEMBER(vsc_state::main_io_trampoline_r) +{ + u8 data = 0xff; // open bus + if (~offset & 4) + data &= m_ppi8255->read(offset & 3); + if (~offset & 8) + data &= m_z80pio->read(space, offset & 3); + + return data; +} + +WRITE8_MEMBER(vsc_state::main_io_trampoline_w) +{ + if (~offset & 4) + m_ppi8255->write(offset & 3, data); + if (~offset & 8) + m_z80pio->write(space, offset & 3, data); +} + +void vsc_state::main_io(address_map &map) +{ + map.global_mask(0x0f); + map(0x00, 0x0f).rw(FUNC(vsc_state::main_io_trampoline_r), FUNC(vsc_state::main_io_trampoline_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( vsc ) + PORT_INCLUDE( fidel_cb_buttons ) + + PORT_START("IN.8") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE") + + PORT_START("IN.9") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST") + PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void vsc_state::vsc(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator + m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &vsc_state::main_io); + + const attotime irq_period = attotime::from_hz(587); // 555 timer, measured + TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on<INPUT_LINE_NMI>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half) + TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off<INPUT_LINE_NMI>), irq_period); + + I8255(config, m_ppi8255); + m_ppi8255->out_pa_callback().set(FUNC(vsc_state::ppi_porta_w)); + m_ppi8255->out_pb_callback().set(FUNC(vsc_state::ppi_portb_w)); + m_ppi8255->out_pc_callback().set(FUNC(vsc_state::ppi_portc_w)); + + Z80PIO(config, m_z80pio, 3.9_MHz_XTAL); + m_z80pio->in_pa_callback().set(FUNC(vsc_state::pio_porta_r)); + m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r)); + m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w)); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_vsc); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + S14001A(config, m_speech, 25000); // R/C circuit, around 25khz + m_speech->ext_read().set(FUNC(vsc_state::speech_r)); + m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( vsc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) + ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) + ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) + ROM_RELOAD( 0x1000, 0x1000) +ROM_END + +ROM_START( vscg ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) + ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) + ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct +ROM_END + +ROM_START( vscsp ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) + ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) + ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct +ROM_END + +ROM_START( vscfr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) + ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) + ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) + + ROM_REGION( 0x2000, "speech", 0 ) + ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, vsc, 0, 0, vsc, vsc, vsc_state, init_language<0>, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscg, vsc, 0, vsc, vsc, vsc_state, init_language<1>, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscsp, vsc, 0, vsc, vsc, vsc_state, init_language<2>, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, vscfr, vsc, 0, vsc, vsc, vsc_state, init_language<3>, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/fidelbase.cpp b/src/mame/drivers/fidelbase.cpp index c5f004b075f..2961125ccc5 100644 --- a/src/mame/drivers/fidelbase.cpp +++ b/src/mame/drivers/fidelbase.cpp @@ -1,441 +1,50 @@ // license:BSD-3-Clause -// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap -// thanks-to:Berger,yoyo_chessboard +// copyright-holders:hap /****************************************************************************** - Fidelity Electronics Z80 based board driver - for 6502 based boards, see drivers/fidel6502.cpp - for 68000 based boards, see drivers/fidel68k.cpp - - NOTE: MAME doesn't include a generalized implementation for boardpieces yet, - greatly affecting user playability of emulated electronic board games. - As workaround for the chess games, use an external chess GUI on the side, - such as Arena(in editmode). - - TODO: - - Source organization is a big mess. Each machine family could be in its own - sub driverclass, and separate files. - - card games aren't playable without the barcode scanner - - Z80 WAIT pin is not fully emulated, affecting VBRC speech busy state - TODO: - - Source organization is a big mess. Each machine family could be in its own - sub driverclass, and separate files. - - verify cpu speed and rom labels where unknown - - improve EAS/SC12/etc CPU divider? it seems a little bit slower than the real machine. - Currently, a dummy timer workaround is needed, or it's much worse. - Is the problem here is due to timing of CPU addressbus changes? We can only 'sense' - the addressbus at read or write accesses. - - finish fphantom emulation - - Read the official manual(s) on how to play. - - Keypad legend: - - RE: Reset - - CL: Clear - - EN: Enter - - PB: Problem Mode - - PV: Position Verification - - LV: Playing Levels - - TB: Take Back - - DM: Display Move/Double Move - - RV: Reverse - - ST: Set/Stop - - TM: Time - - Peripherals, compatible with various boards: - - Fidelity Challenger Printer - thermal printer, MCU=D8048C243 - - Program/data cartridges, for various boards, some cross-compatible: - - CB9: Challenger Book Openings 1 - 8KB (label not known) - - CB16: Challenger Book Openings 2 - 8+8KB 101-1042A01,02 - - *CG64: 64 Greatest Games - - *EOA-EOE: Challenger Book Openings - Chess Encyclopedia A-E (5 modules) - - Board hardware descriptions below. - Detailed RE work done by Kevin 'kevtris' Horton, except where noted - -******************************************************************************* - -Voice Chess Challenger (VCC) (version A and B?) -Advanced Voice Chess Challenger (UVC) -Grandmaster Voice Chess Challenger -Decorator Challenger (FCC) - -(which share the same hardware) ----------------------- -The CPU is a Z80 running at 4MHz. The TSI chip runs at around 25KHz, using a -470K / 100pf RC network. This system is very very basic, and is composed of just -the Z80, 4 ROMs, the TSI chip, and an 8255. - -The Z80's interrupt inputs are all pulled to VCC, so no interrupts are used. - -Reset is connected to a power-on reset circuit and a button on the keypad (marked RE). - -The TSI chip connects to a 4K ROM. All of the 'Voiced' Chess Challengers -use this same ROM (three or four). The later chess boards use a slightly different part -number, but the contents are identical. - -Memory map (VCC): ------------ -0000-0FFF: 4K 2332 ROM 101-32013 -1000-1FFF: 4K 2332 ROM VCC2 -2000-2FFF: 4K 2332 ROM VCC3 -4000-5FFF: 1K RAM (2114 SRAM x2) -6000-FFFF: empty - -Memory map (UVC): ------------ -0000-1FFF: 8K 2364 ROM 101-64017 -2000-2FFF: 4K 2332 ROM 101-32010 -4000-5FFF: 1K RAM (2114 SRAM x2) -6000-FFFF: empty - -Port map: ---------- -00-03: 8255 port chip, mirrored over the 00-FF range; program accesses F4-F7 - -8255 connections: ------------------ -PA.0 - segment G, TSI A0 (W) -PA.1 - segment F, TSI A1 (W) -PA.2 - segment E, TSI A2 (W) -PA.3 - segment D, TSI A3 (W) -PA.4 - segment C, TSI A4 (W) -PA.5 - segment B, TSI A5 (W) -PA.6 - segment A, language latch Data (W) -PA.7 - TSI START line, language latch clock (W, see below) - -PB.0 - dot commons (W) -PB.1 - NC -PB.2 - digit 0, bottom dot (W) -PB.3 - digit 1, top dot (W) -PB.4 - digit 2 (W) -PB.5 - digit 3 (W) -PB.6 - enable language switches (W, see below) -PB.7 - TSI BUSY line (R) - -(button rows pulled up to 5V through 2.2K resistors) -PC.0 - button row 0, German language jumper (R) -PC.1 - button row 1, French language jumper (R) -PC.2 - button row 2, Spanish language jumper (R) -PC.3 - button row 3, special language jumper (R) -PC.4 - button column A (W) -PC.5 - button column B (W) -PC.6 - button column C (W) -PC.7 - button column D (W) - -language switches: ------------------- -When PB.6 is pulled low, the language switches can be read. There are four. -They connect to the button rows. When enabled, the row(s) will read low if -the jumper is present. English only VCC's do not have the 367 or any pads stuffed. -The jumpers are labeled: French, German, Spanish, and special. - -language latch: ---------------- -There's an unstuffed 7474 on the board that connects to PA.6 and PA.7. It allows -one to latch the state of A12 to the speech ROM. The English version has the chip -missing, and a jumper pulling "A12" to ground. This line is really a negative -enable. - -To make the VCC multi-language, one would install the 74367 (note: it must be a 74367 -or possibly a 74LS367. A 74HC367 would not work since they rely on the input current -to keep the inputs pulled up), solder a piggybacked ROM to the existing English -speech ROM, and finally install a 7474 dual flipflop. - -This way, the game can then detect which secondary language is present, and then it can -automatically select the correct ROM(s). I have to test whether it will do automatic -determination and give you a language option on power up or something. - - -******************************************************************************* - - -******************************************************************************* - -Voice Bridge Challenger (Model VBRC, later reissued as Model 7002) -and Bridge Challenger 3 (Model 7014) -(which both share the same* hardware) --------------------------------- -* The Bridge Challenger 3 does not actually have the 8 LEDs nor the -latches which operate them populated and the plastic indicator cap locations -are instead are covered by a piece of plastic, but they do work if manually -added. - -This unit is similar in construction kinda to the chess challengers, however it -has an 8041 which does ALL of the system I/O. The Z80 has NO IO AT ALL other than -what is performed through the 8041! - -The main CPU is a Z80 running at 2.5MHz - -INT connects to VCC (not used) -NMI connects to VCC (not used) -RST connects to power on reset, and reset button - -The 8041 runs at 5MHz. - -Memory Map: ------------ -0000-1FFF: 8K 101-64108 ROM -2000-3FFF: 8K 101-64109 ROM -4000-5FFF: 8K 101-64110 ROM -6000-7FFF: 1K of RAM (2114 * 2) -8000-DFFF: unused -E000-FFFF: write to TSI chip - -NOTE: when the TSI chip is written to, the CPU IS STOPPED. The CPU will run again -when the word is done being spoken. This is because D0-D5 run to the TSI chip directly. - -The TSI chip's ROM is 4K, and is marked 101-32118. The clock is the same as the Chess -Challengers- 470K/100pf which gives a frequency around 25KHz or so. - -Port Map: ---------- -00-FF: 8041 I/O ports (A0 selects between the two) - -8041 pinout: ------------- -(note: columns are pulled up with 10K resistors) - -P10 - column H, RD LED, VFD grid 0 -P11 - column G, DB LED, VFD grid 1 -P12 - column F, <>V LED, VFD grid 2 -P13 - column E, ^V LED, VFD grid 3 -P14 - column D, W LED, VFD grid 4 -P15 - column C, S LED, VFD grid 5 -P16 - column B, E LED, VFD grid 6 -P17 - column A, N LED, VFD grid 7 - -P20 - I/O expander -P21 - I/O expander -P22 - I/O expander -P23 - I/O expander -P24 - row 0 through inverter -P25 - row 1 through inverter -P26 - row 2 through inverter -P27 - row 3 through inverter - -PROG - I/O expander - -T0 - optical card sensor (high = bright/reflective, low = dark/non reflective) -T1 - connects to inverter, then 5MHz/4 - -D8243C I/O expander: --------------------- -P4.0 - segment M -P4.1 - segment L -P4.2 - segment N -P4.3 - segment E - -P5.0 - segment D -P5.1 - segment I -P5.2 - segment K -P5.3 - segment J - -P6.0 - segment A -P6.1 - segment B -P6.2 - segment F -P6.3 - segment G - -P7.0 - LED enable (high = LEDs can be lit. low = LEDs will not light) -P7.1 - goes through inverter, to pads that are not used -P7.2 - segment C -P7.3 - segment H - -button matrix: --------------- -the matrix is composed of 8 columns by 4 rows. - - A B C D E F G H - ------------------------- -0- RE xx CL EN J Q K A -1- BR PB DB SC 7 8 9 10 -2- DL CV VL PL 3 4 5 6 -3- cl di he sp NT P 1 2 - -xx - speaker symbol -cl - clubs symbol -di - diamonds symbol -he - hearts symbol -sp - spades symbol - -NOTE: RE is not wired into the matrix, and is run separately out. - -There are 8 LEDs, and an 8 digit 14 segment VFD with commas and periods. -This display is the same one as can be found on the speak and spell. - - A * comma - *********** * - * *I *J K* * -F* * * * *B - * * * * * - G**** *****H - * * * * * -E* * * * *C - * *N *M L* * - *********** *decimal point - D - -The digits of the display are numbered left to right, 0 through 7 and are controlled -by the grids. hi = grid on, hi = segment on. - -A detailed description of the hardware can be found also in the patent 4,373,719. - - -******************************************************************************* - -Voice Sensory Chess Challenger (VSC) ------------------------------------- -The display/button/LED/speech technology is identical to Fidelity CSC. -Only the CPU board was changed. As such, it works the same but is interfaced -to different port chips this time. - -Hardware: ---------- -On the board are 13 chips. - -The CPU is a Z80A running at 3.9MHz, with 20K of ROM and 1K of RAM mapped. -I/O is composed of an 8255 triple port adaptor, and a Z80A PIO parallel I/O -interface. - -There's the usual TSI S14001A speech synth with its requisite 4K ROM which is the -same as on the other talking chess boards. The TSI chip is running at 26.37KHz. -It uses a 470K resistor and a 100pf capacitor. - -The "perfect" clock would be 1/RC most likely (actually this will be skewed a tad by -duty cycle of the oscillator) which with those parts values gives 21.27KHz. The -formula is probably more likely to be 1/1.2RC or so. - -Rounding out the hardware are three driver chips for the LEDs, a 7404 inverter to -run the crystal osc, a 555 timer to generate a clock, and a 74138 selector. - -NMI runs to a 555 oscillator that generates a 600Hz clock (measured: 598.9Hz. It has a multiturn pot to adjust). -INT is pulled to 5V -RST connects to a power-on reset circuit - -Memory map: ------------ -0000-1FFF: 8K ROM 101-64018 -2000-3FFF: 8K ROM 101-64019 (also used on the sensory champ. chess challenger) -4000-5FFF: 4K ROM 101-32024 -6000-7FFF: 1K of RAM (2114 * 2) -8000-FFFF: not used, maps to open bus - -Port map: ---------- -There's only two chips in the portmap, an 8255 triple port chip, and a Z80A PIO -parallel input/output device. - -Decoding isn't performed using a selector, but instead address lines are used. - -A2 connects to /CE on the 8255 -A3 connects to /CE on the Z80A PIO - -A0 connects to port A/B select on PIO & A0 of 8255 -A1 connects to control/data select on PIO & A1 of 8255 - -So to enable only the 8255, you'd write/read to 08-0Bh for example -To enable only the PIO, you'd write/read to 04-07h for example. - -writing to 00-03h will enable and write to BOTH chips, and reading 00-03h -will return data from BOTH chips (and cause a bus conflict). The code probably -never does either of these things. - -Likewise, writing/reading to 0Ch-0Fh will result in open bus, because neither chip's -enable line will be low. - -This sequence repeats every 16 addresses. So to recap: - -00-03: both chips enabled (probably not used) -04-07: PIO enabled -08-0B: 8255 enabled -0C-0F: neither enabled - -10-FF: mirrors of 00-0F. - -Refer to the Sensory Champ. Chess Chall. for explanations of the below -I/O names and labels. It's the same. - -8255: ------ -PA.0 - segment D, TSI A0 -PA.1 - segment E, TSI A1 -PA.2 - segment F, TSI A2 -PA.3 - segment A, TSI A3 -PA.4 - segment B, TSI A4 -PA.5 - segment C, TSI A5 -PA.6 - segment G -PA.7 - segment H - -PB.0 - LED row 1 -PB.1 - LED row 2 -PB.2 - LED row 3 -PB.3 - LED row 4 -PB.4 - LED row 5 -PB.5 - LED row 6 -PB.6 - LED row 7 -PB.7 - LED row 8 - -PC.0 - LED column A, button column A, 7seg digit 1 -PC.1 - LED column B, button column B, 7seg digit 2 -PC.2 - LED column C, button column C, 7seg digit 3 -PC.3 - LED column D, button column D, 7seg digit 4 -PC.4 - LED column E, button column E -PC.5 - LED column F, button column F -PC.6 - LED column G, button column G -PC.7 - LED column H, button column H - -Z80A PIO: ---------- -PA.0 - button row 1 -PA.1 - button row 2 -PA.2 - button row 3 -PA.3 - button row 4 -PA.4 - button row 5 -PA.5 - button row 6 -PA.6 - button row 7 -PA.7 - button row 8 - -PB.0 - button column I -PB.1 - button column J -PB.2 - hi/lo TSI speaker volume -PB.3 - violet wire -PB.4 - white wire (and TSI BUSY line) -PB.5 - selection jumper input (see below) -PB.6 - TSI start line -PB.7 - TSI ROM A12 line - -selection jumpers: ------------------- -These act like another row of buttons. It is composed of two diode locations, -so there's up to 4 possible configurations. My board does not have either diode -stuffed, so this most likely is "English". I suspect it selects which language to use -for the speech synth. Of course you need the other speech ROMs for this to function -properly. - -Anyways, the two jumpers are connected to button columns A and B and the common -connects to Z80A PIO PB.5, which basically makes a 10th button row. I would -expect that the software reads these once on startup only. +Fidelity Electronics (mostly-)chess computer driver base class + +NOTE: MAME doesn't include a generalized implementation for boardpieces yet, +greatly affecting user playability of emulated electronic board games. +As workaround for the chess games, use an external chess GUI on the side, +such as Arena(in editmode). + +TODO: (see each driver for more specific) +- verify cpu speed and rom labels where unknown +- improve EAS/SC12/etc CPU divider? it seems a little bit slower than the real machine. + Currently, a dummy timer workaround is needed, or it's much worse. + Is the problem here is due to timing of CPU addressbus changes? We can only 'sense' + the addressbus at read or write accesses. + +Keypad legend: +- RE: Reset +- CL: Clear +- EN: Enter +- PB: Problem Mode +- PV: Position Verification +- LV: Playing Levels +- TB: Take Back +- DM: Display Move/Double Move +- RV: Reverse +- ST: Set/Stop +- TM: Time + +Read the official manual(s) on how to play. + +Peripherals, compatible with various boards: +- Fidelity Challenger Printer - thermal printer, MCU=D8048C243 + +Program/data cartridges, for various boards, some cross-compatible: +- CB9: Challenger Book Openings 1 - 8KB (label not known) +- CB16: Challenger Book Openings 2 - 8+8KB 101-1042A01,02 +- *CG64: 64 Greatest Games +- *EOA-EOE: Challenger Book Openings - Chess Encyclopedia A-E (5 modules) ******************************************************************************/ #include "emu.h" #include "includes/fidelbase.h" -#include "cpu/z80/z80.h" -#include "cpu/mcs48/mcs48.h" -#include "machine/clock.h" -#include "machine/i8255.h" -#include "machine/i8243.h" -#include "machine/z80pio.h" -#include "sound/volt_reg.h" -#include "speaker.h" - -// internal artwork -#include "fidel_vcc.lh" // clickable -#include "fidel_vbrc.lh" // clickable -#include "fidel_bv3.lh" // clickable -#include "fidel_vsc.lh" // clickable // machine start/reset @@ -482,122 +91,8 @@ void fidelbase_state::machine_reset() } - - - -class vsc_state : public fidelbase_state -{ -public: - vsc_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_z80pio(*this, "z80pio"), - m_ppi8255(*this, "ppi8255") - { } - - void vsc(machine_config &config); - -private: - // devices/pointers - required_device<z80pio_device> m_z80pio; - required_device<i8255_device> m_ppi8255; - - void main_map(address_map &map); - void main_io(address_map &map); - DECLARE_READ8_MEMBER(main_io_trampoline_r); - DECLARE_WRITE8_MEMBER(main_io_trampoline_w); - - // I/O handlers - void prepare_display(); - DECLARE_READ8_MEMBER(speech_r); - DECLARE_WRITE8_MEMBER(ppi_porta_w); - DECLARE_WRITE8_MEMBER(ppi_portb_w); - DECLARE_WRITE8_MEMBER(ppi_portc_w); - DECLARE_READ8_MEMBER(pio_porta_r); - DECLARE_READ8_MEMBER(pio_portb_r); - DECLARE_WRITE8_MEMBER(pio_portb_w); -}; - - - -class card_state : public fidelbase_state -{ -public: - card_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_mcu(*this, "mcu"), - m_i8243(*this, "i8243") - { } - - void brc_base(machine_config &config); - void ubc(machine_config &config); - void vbrc(machine_config &config); - void bv3(machine_config &config); - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button) override; - -private: - // devices/pointers - required_device<i8041_device> m_mcu; - required_device<i8243_device> m_i8243; - - void main_map(address_map &map); - void main_io(address_map &map); - - void prepare_display(); - DECLARE_WRITE8_MEMBER(speech_w); - DECLARE_WRITE8_MEMBER(mcu_p1_w); - DECLARE_READ8_MEMBER(mcu_p2_r); - template<int P> void ioexp_port_w(uint8_t data); -}; - - -class vcc_state : public fidelbase_state -{ -public: - vcc_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag), - m_ppi8255(*this, "ppi8255") - { } - - void vcc(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device<i8255_device> m_ppi8255; - - void main_map(address_map &map); - void main_io(address_map &map); - - // I/O handlers - void prepare_display(); - DECLARE_READ8_MEMBER(speech_r); - DECLARE_WRITE8_MEMBER(ppi_porta_w); - DECLARE_READ8_MEMBER(ppi_portb_r); - DECLARE_WRITE8_MEMBER(ppi_portb_w); - DECLARE_READ8_MEMBER(ppi_portc_r); - DECLARE_WRITE8_MEMBER(ppi_portc_w); -}; - -void vcc_state::machine_start() -{ - fidelbase_state::machine_start(); - - // game relies on RAM initialized filled with 1 - for (int i = 0; i < 0x400; i++) - m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff); -} - - - - - /*************************************************************************** - - Helper Functions - + Helper Functions ***************************************************************************/ // The device may strobe the outputs very fast, it is unnoticeable to the user. @@ -717,8 +212,7 @@ READ8_MEMBER(fidelbase_state::cartridge_r) } - -// Offset-dependent CPU divider on some machines +// Offset-dependent CPU divider on some 6502-based machines void fidelbase_state::div_set_cpu_freq(offs_t offset) { @@ -772,478 +266,7 @@ INPUT_PORTS_START( fidel_cpu_div_4 ) INPUT_PORTS_END -// Devices, I/O - -/****************************************************************************** - CCX, VCC/UVC -******************************************************************************/ - -// misc handlers - -void vcc_state::prepare_display() -{ - // 4 7seg leds (note: sel d0 for extra leds) - u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); - set_display_segmask(0xf, 0x7f); - display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf); -} - -READ8_MEMBER(vcc_state::speech_r) -{ - return m_speech_rom[m_speech_bank << 12 | offset]; -} - - -// I8255 PPI - -WRITE8_MEMBER(vcc_state::ppi_porta_w) -{ - // d0-d6: digit segment data, bits are xABCDEFG - m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); - prepare_display(); - - // d0-d5: TSI C0-C5 - // d7: TSI START line - m_speech->data_w(space, 0, data & 0x3f); - m_speech->start_w(data >> 7 & 1); - - // d6: language latch data - // d7: language latch clock (latch on high) - if (data & 0x80) - { - m_speech->force_update(); // update stream to now - m_speech_bank = data >> 6 & 1; - } -} - -READ8_MEMBER(vcc_state::ppi_portb_r) -{ - // d7: TSI BUSY line - return (m_speech->busy_r()) ? 0x80 : 0x00; -} - -WRITE8_MEMBER(vcc_state::ppi_portb_w) -{ - // d0,d2-d5: digit/led select - // _d6: enable language switches - m_led_select = data; - prepare_display(); -} - -READ8_MEMBER(vcc_state::ppi_portc_r) -{ - // d0-d3: multiplexed inputs (active low) - // also language switches, hardwired with 4 jumpers - // 0(none wired): English, 1: German, 2: French, 4: Spanish, 8:Special(unused) - u8 lan = (~m_led_select & 0x40) ? m_language : 0; - return ~(lan | read_inputs(4)) & 0xf; -} - -WRITE8_MEMBER(vcc_state::ppi_portc_w) -{ - // d4-d7: input mux (inverted) - m_inp_mux = ~data >> 4 & 0xf; -} - - -// CCX-specific (no speech chip, 1-bit beeper instead) - - - - -/****************************************************************************** - BCC, BKC -******************************************************************************/ - - - - -/****************************************************************************** - VSC -******************************************************************************/ - -// misc handlers - -void vsc_state::prepare_display() -{ - // 4 7seg leds+H, 8*8 chessboard leds - set_display_segmask(0xf, 0x7f); - display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select); -} - -READ8_MEMBER(vsc_state::speech_r) -{ - return m_speech_rom[m_speech_bank << 12 | offset]; -} - - -// I8255 PPI - -WRITE8_MEMBER(vsc_state::ppi_porta_w) -{ - // d0-d5: TSI C0-C5 - m_speech->data_w(space, 0, data & 0x3f); - - // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led) - m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3); - prepare_display(); -} - -WRITE8_MEMBER(vsc_state::ppi_portb_w) -{ - // d0-d7: led row data - m_led_data = data; - prepare_display(); -} - -WRITE8_MEMBER(vsc_state::ppi_portc_w) -{ - // d0-d3: select digits - // d0-d7: select leds, input mux low bits - m_inp_mux = (m_inp_mux & ~0xff) | data; - m_led_select = data; - prepare_display(); -} - - -// Z80 PIO - -READ8_MEMBER(vsc_state::pio_porta_r) -{ - // d0-d7: multiplexed inputs - // also language switches(hardwired with 2 diodes) - u8 lan = (m_inp_mux & 0x400) ? m_language : 0; - return read_inputs(10) | lan; -} - -READ8_MEMBER(vsc_state::pio_portb_r) -{ - u8 data = 0; - - // d4: TSI BUSY line - data |= (m_speech->busy_r()) ? 0 : 0x10; - - return data; -} - -WRITE8_MEMBER(vsc_state::pio_portb_w) -{ - // d0,d1: input mux highest bits - // d5: enable language switch - m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x300) | (data << 5 & 0x400); - - // d7: TSI ROM A12 - m_speech->force_update(); // update stream to now - m_speech_bank = data >> 7 & 1; - - // d6: TSI START line - m_speech->start_w(data >> 6 & 1); - - // d2: lower TSI volume - m_speech->set_output_gain(0, (data & 4) ? 0.5 : 1.0); -} - - - -/****************************************************************************** - VBRC/UBC, BV3 -******************************************************************************/ - -// misc handlers - -void card_state::prepare_display() -{ - // 14seg led segments, d15(12) is extra led - u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8); - set_display_segmask(0xff, 0x3fff); - display_matrix(16, 8, outdata, m_led_select); -} - -WRITE8_MEMBER(card_state::speech_w) -{ - if (m_speech == nullptr) - return; - - m_speech->data_w(space, 0, data & 0x3f); - m_speech->start_w(1); - m_speech->start_w(0); -} - - -// I8243 I/O expander - -template<int P> -void card_state::ioexp_port_w(uint8_t data) -{ - // P4x-P7x: digit segment data - m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P)); - prepare_display(); - - // P71 is tone (not on speech model) - if (P == 3 && m_dac != nullptr) - m_dac->write(BIT(data, 1)); -} - - -// I8041 MCU - -WRITE8_MEMBER(card_state::mcu_p1_w) -{ - // P10-P17: select digits, input mux - m_inp_mux = m_led_select = data; - prepare_display(); -} - -READ8_MEMBER(card_state::mcu_p2_r) -{ - // P20-P23: I8243 P2 - // P24-P27: multiplexed inputs (active low) - return (m_i8243->p2_r() & 0x0f) | (read_inputs(8) << 4 ^ 0xf0); -} - - - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -// CCX, VCC/UVC - -void vcc_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x2fff).rom(); - map(0x4000, 0x43ff).mirror(0x1c00).ram(); -} - -void vcc_state::main_io(address_map &map) -{ - map.global_mask(0x03); - map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)); -} - - -// BCC, BKC - - - -// VSC - -void vsc_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x4fff).mirror(0x1000).rom(); - map(0x6000, 0x63ff).mirror(0x1c00).ram(); -} - -// VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously -READ8_MEMBER(vsc_state::main_io_trampoline_r) -{ - u8 data = 0xff; // open bus - if (~offset & 4) - data &= m_ppi8255->read(offset & 3); - if (~offset & 8) - data &= m_z80pio->read(space, offset & 3); - - return data; -} - -WRITE8_MEMBER(vsc_state::main_io_trampoline_w) -{ - if (~offset & 4) - m_ppi8255->write(offset & 3, data); - if (~offset & 8) - m_z80pio->write(space, offset & 3, data); -} - -void vsc_state::main_io(address_map &map) -{ - map.global_mask(0x0f); - map(0x00, 0x0f).rw(FUNC(vsc_state::main_io_trampoline_r), FUNC(vsc_state::main_io_trampoline_w)); -} - - -// VBRC/UBC, BV3 - -void card_state::main_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x5fff).rom(); - map(0x6000, 0x63ff).mirror(0x1c00).ram(); - map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::speech_w)); -} - -void card_state::main_io(address_map &map) -{ - map.global_mask(0x01); - map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w)); -} - - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -// static or boardless games - -static INPUT_PORTS_START( vcc ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) - - PORT_START("RESET") // is not on matrix IN.0 d0 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, vcc_state, reset_button, nullptr) -INPUT_PORTS_END - - - -INPUT_CHANGED_MEMBER(card_state::reset_button) -{ - // reset button is directly wired to maincpu/mcu RESET pins - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); - m_mcu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - -static INPUT_PORTS_START( common ) - PORT_START("RESET") // is not on matrix IN.7 d0 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("RE") - - PORT_START("BARCODE") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Card Scanner") -INPUT_PORTS_END - -static INPUT_PORTS_START( vbrc ) - PORT_INCLUDE( common ) - - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("K") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("J") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("NT") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("EN") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("SC") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("PL") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("CL") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("DB") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("VL") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("PB") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("CV") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("BR") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("DL") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs") -INPUT_PORTS_END - - -static INPUT_PORTS_START( bv3 ) - PORT_INCLUDE( common ) - - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Ace") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("King") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Queen") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Quit") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Jack") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("No Trump") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Yes/Enter") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("No/Pass") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Player") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Clear") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Double") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Score") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Auto") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Conv") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Review") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Dealer") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs") -INPUT_PORTS_END - - -// sensory board games +// chessboard generic inputs INPUT_PORTS_START( fidel_cb_buttons ) PORT_START("IN.0") @@ -1408,346 +431,3 @@ INPUT_PORTS_START( fidel_cb_magnets ) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") INPUT_PORTS_END - - -static INPUT_PORTS_START( vsc ) - PORT_INCLUDE( fidel_cb_buttons ) - - PORT_START("IN.8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE") - - PORT_START("IN.9") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST") - PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED) -INPUT_PORTS_END - - - - -/****************************************************************************** - Machine Drivers -******************************************************************************/ - - -void vcc_state::vcc(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 4_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::main_map); - m_maincpu->set_addrmap(AS_IO, &vcc_state::main_io); - - I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(vcc_state::ppi_porta_w)); - m_ppi8255->tri_pa_callback().set_constant(0); - m_ppi8255->in_pb_callback().set(FUNC(vcc_state::ppi_portb_r)); - m_ppi8255->out_pb_callback().set(FUNC(vcc_state::ppi_portb_w)); - m_ppi8255->tri_pb_callback().set_constant(0); - m_ppi8255->in_pc_callback().set(FUNC(vcc_state::ppi_portc_r)); - m_ppi8255->out_pc_callback().set(FUNC(vcc_state::ppi_portc_w)); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_vcc); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->ext_read().set(FUNC(vcc_state::speech_r)); - m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); -} - -void vsc_state::vsc(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator - m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::main_map); - m_maincpu->set_addrmap(AS_IO, &vsc_state::main_io); - - const attotime irq_period = attotime::from_hz(587); // 555 timer, measured - TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on<INPUT_LINE_NMI>), irq_period); - m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half) - TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off<INPUT_LINE_NMI>), irq_period); - - I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(vsc_state::ppi_porta_w)); - m_ppi8255->out_pb_callback().set(FUNC(vsc_state::ppi_portb_w)); - m_ppi8255->out_pc_callback().set(FUNC(vsc_state::ppi_portc_w)); - - Z80PIO(config, m_z80pio, 3.9_MHz_XTAL); - m_z80pio->in_pa_callback().set(FUNC(vsc_state::pio_porta_r)); - m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r)); - m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w)); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_vsc); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->ext_read().set(FUNC(vsc_state::speech_r)); - m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); -} - -void card_state::brc_base(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 5_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &card_state::main_map); - m_maincpu->set_addrmap(AS_IO, &card_state::main_io); - config.m_perfect_cpu_quantum = subtag("maincpu"); - - I8041(config, m_mcu, 5_MHz_XTAL); - m_mcu->p1_out_cb().set(FUNC(card_state::mcu_p1_w)); - m_mcu->p2_in_cb().set(FUNC(card_state::mcu_p2_r)); - m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w)); - m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w)); - m_mcu->t0_in_cb().set_ioport("BARCODE"); // card scanner - - // MCU T1 tied to master clock / 4 - CLOCK(config, "t1_clock", 5_MHz_XTAL/4).signal_handler().set_nop(); - m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert(); - - I8243(config, m_i8243); - m_i8243->p4_out_cb().set(FUNC(card_state::ioexp_port_w<0>)); - m_i8243->p5_out_cb().set(FUNC(card_state::ioexp_port_w<1>)); - m_i8243->p6_out_cb().set(FUNC(card_state::ioexp_port_w<2>)); - m_i8243->p7_out_cb().set(FUNC(card_state::ioexp_port_w<3>)); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_vbrc); -} - -void card_state::ubc(machine_config &config) -{ - brc_base(config); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - -void card_state::vbrc(machine_config &config) -{ - brc_base(config); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - S14001A(config, m_speech, 25000); // R/C circuit, around 25khz - m_speech->bsy().set_inputline("maincpu", Z80_INPUT_LINE_WAIT); - m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75); -} - -void card_state::bv3(machine_config &config) -{ - vbrc(config); - config.set_default_layout(layout_fidel_bv3); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - - - - -ROM_START( vcc ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) - ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) - ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) - ROM_RELOAD( 0x1000, 0x1000) -ROM_END - -ROM_START( vccg ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) - ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) - ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct -ROM_END - -ROM_START( vccsp ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) - ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) - ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // dumped from Spanish VCC, is same as data in fexcelv -ROM_END - -ROM_START( vccfr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) - ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) - ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct -ROM_END - - -ROM_START( uvc ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) // MOS // 101-64017 // 3880 - ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) // NEC P9Z021 // D2332C 228 // 101-32010, == cn19175n_vcc3 on vcc - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // NEC P9Y019 // D2332C 229 // 101-32107 - ROM_RELOAD( 0x1000, 0x1000) -ROM_END - -ROM_START( uvcg ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) - ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct -ROM_END - -ROM_START( uvcsp ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) - ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) -ROM_END - -ROM_START( uvcfr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) - ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct -ROM_END - - -ROM_START( vsc ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) - ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) - ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) - ROM_RELOAD( 0x1000, 0x1000) -ROM_END - -ROM_START( vscg ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) - ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) - ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct -ROM_END - -ROM_START( vscsp ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) - ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) - ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct -ROM_END - -ROM_START( vscfr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) ) - ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) ) - ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) ) - - ROM_REGION( 0x2000, "speech", 0 ) - ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct -ROM_END - - -ROM_START( vbrc ) // model VBRC aka 7002 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) // NEC 2364 - ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) // NEC 2364 - ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) // NEC 2364 - - ROM_REGION( 0x0400, "mcu", 0 ) - ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) - - ROM_REGION( 0x1000, "speech", 0 ) - ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) -ROM_END - -ROM_START( bridgeca ) // model UBC - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) - ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) - ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) - - ROM_REGION( 0x0400, "mcu", 0 ) - ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) -ROM_END - - -ROM_START( bridgec3 ) // model BV3 aka 7014, PCB label 510-1016 Rev.1 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("7014_white", 0x0000, 0x2000, CRC(eb1620ef) SHA1(987a9abc8c685f1a68678ea4ee65ec4a99419179) ) // TMM2764AD-20, white sticker - ROM_LOAD("7014_red", 0x2000, 0x2000, CRC(74af0019) SHA1(8dc05950c254ca050b95b93e5d0cf48f913a6d49) ) // TMM2764AD-20, red sticker - ROM_LOAD("7014_blue", 0x4000, 0x2000, CRC(341d9ca6) SHA1(370876573bb9408e75f4fc797304b6c64af0590a) ) // TMM2764AD-20, blue sticker - - ROM_REGION( 0x0400, "mcu", 0 ) - ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) // NEC P07021-027 || D8041C 563 100-1009 - - ROM_REGION( 0x1000, "speech", 0 ) - ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) // ea 101-32118 || (C) 1980 || EA 8332A247-4 || 8034 -ROM_END - - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS - -CONS( 1979, vcc, 0, 0, vcc, vcc, vcc_state, init_language<0>, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, vccg, vcc, 0, vcc, vcc, vcc_state, init_language<1>, "Fidelity Electronics", "Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, vccsp, vcc, 0, vcc, vcc, vcc_state, init_language<2>, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, vccfr, vcc, 0, vcc, vcc, vcc_state, init_language<4>, "Fidelity Electronics", "Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, init_language<0>, "Fidelity Electronics", "Advanced Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, uvcg, vcc, 0, vcc, vcc, vcc_state, init_language<1>, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, uvcsp, vcc, 0, vcc, vcc, vcc_state, init_language<2>, "Fidelity Electronics", "Advanced Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, uvcfr, vcc, 0, vcc, vcc, vcc_state, init_language<4>, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1980, vsc, 0, 0, vsc, vsc, vsc_state, init_language<0>, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscg, vsc, 0, vsc, vsc, vsc_state, init_language<1>, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscsp, vsc, 0, vsc, vsc, vsc_state, init_language<2>, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1980, vscfr, vsc, 0, vsc, vsc, vsc_state, init_language<3>, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) - -CONS( 1980, vbrc, 0, 0, vbrc, vbrc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) -CONS( 1980, bridgeca, vbrc, 0, ubc, vbrc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) -CONS( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/hh_cop400.cpp b/src/mame/drivers/hh_cop400.cpp index dcb8b46d7ab..716e772c7a2 100644 --- a/src/mame/drivers/hh_cop400.cpp +++ b/src/mame/drivers/hh_cop400.cpp @@ -1581,7 +1581,7 @@ void bship82_state::bship82(machine_config &config) /* sound hardware */ SPEAKER(config, "mono").front_center(); DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.125); // see above - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); } @@ -1804,7 +1804,7 @@ void vidchal_state::vidchal(machine_config &config) /* sound hardware */ SPEAKER(config, "mono").front_center(); DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.125); // unknown DAC - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); } diff --git a/src/mame/drivers/novagmcs48.cpp b/src/mame/drivers/novagmcs48.cpp index 831b85744a4..3c81e6e35fb 100644 --- a/src/mame/drivers/novagmcs48.cpp +++ b/src/mame/drivers/novagmcs48.cpp @@ -164,8 +164,7 @@ void novagmcs48_state::presto(machine_config &config) /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } void novagmcs48_state::octo(machine_config &config) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index d62424c3331..2924acf007f 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -12852,6 +12852,11 @@ fgoala // MF (c) 1979 Taito Corporation @source:fidel_as12.cpp feleg // +@source:fidel_card.cpp +bridgec3 // +bridgeca // +vbrc // + @source:fidel_cc10.cpp cc10 // @@ -12953,18 +12958,17 @@ fscc9b // fscc9c // fscc9ps // -@source:fidelbase.cpp -bridgec3 // -bridgeca // +@source:fidel_vcc.cpp uvc // UVC: Advanced Voice Chess Challenger (English) uvcfr // * French uvcg // * German uvcsp // * Spanish -vbrc // vcc // VCC: Voice Chess Challenger (English) vccfr // * German vccg // * Spanish vccsp // * French + +@source:fidel_vsc.cpp vsc // VSC: Voice Sensory Chess Challenger (English) vscfr // * French vscg // * German diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 4a7cf44acdd..e8781e37dff 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -242,6 +242,7 @@ fc100.cpp fccpu20.cpp fccpu30.cpp fidel_as12.cpp +fidel_card.cpp fidel_cc10.cpp fidel_cc7.cpp fidel_chesster.cpp @@ -256,6 +257,8 @@ fidel_sc12.cpp fidel_sc6.cpp fidel_sc8.cpp fidel_sc9.cpp +fidel_vcc.cpp +fidel_vsc.cpp fidelbase.cpp fk1.cpp fm7.cpp |