summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/fidel_vcc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/fidel_vcc.cpp')
-rw-r--r--src/mame/drivers/fidel_vcc.cpp424
1 files changed, 0 insertions, 424 deletions
diff --git a/src/mame/drivers/fidel_vcc.cpp b/src/mame/drivers/fidel_vcc.cpp
deleted file mode 100644
index ddf9b772864..00000000000
--- a/src/mame/drivers/fidel_vcc.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-// 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 (Fidelity Deutschland product)
-- *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 "cpu/z80/z80.h"
-#include "machine/i8255.h"
-#include "sound/s14001a.h"
-#include "video/pwm.h"
-#include "speaker.h"
-
-// internal artwork
-#include "fidel_vcc.lh" // clickable
-
-
-namespace {
-
-class vcc_state : public driver_device
-{
-public:
- vcc_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_ppi8255(*this, "ppi8255"),
- m_display(*this, "display"),
- m_speech(*this, "speech"),
- m_speech_rom(*this, "speech"),
- m_language(*this, "language"),
- m_inputs(*this, "IN.%u", 0)
- { }
-
- // RE button is tied to Z80 RESET pin
- DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); }
-
- // machine drivers
- void vcc(machine_config &config);
-
-protected:
- virtual void machine_start() override;
-
-private:
- // devices/pointers
- required_device<cpu_device> m_maincpu;
- required_device<i8255_device> m_ppi8255;
- required_device<pwm_display_device> m_display;
- required_device<s14001a_device> m_speech;
- required_region_ptr<u8> m_speech_rom;
- required_region_ptr<u8> m_language;
- required_ioport_array<4> m_inputs;
-
- // address maps
- void main_map(address_map &map);
- void main_io(address_map &map);
-
- // I/O handlers
- void update_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);
-
- u8 m_led_select;
- u8 m_7seg_data;
- u8 m_inp_mux;
- u8 m_speech_bank;
-};
-
-void vcc_state::machine_start()
-{
- // zerofill
- m_led_select = 0;
- m_7seg_data = 0;
- m_inp_mux = 0;
- m_speech_bank = 0;
-
- // register for savestates
- save_item(NAME(m_led_select));
- save_item(NAME(m_7seg_data));
- save_item(NAME(m_inp_mux));
- save_item(NAME(m_speech_bank));
-
- // game relies on RAM filled with FF at power-on
- for (int i = 0; i < 0x400; i++)
- m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff);
-}
-
-
-
-/******************************************************************************
- I/O
-******************************************************************************/
-
-// misc handlers
-
-void vcc_state::update_display()
-{
- // 4 7seg leds (note: sel d0 for extra leds)
- u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
- m_display->matrix(m_led_select >> 2 & 0xf, outdata);
-}
-
-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);
- update_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;
- update_display();
-}
-
-READ8_MEMBER(vcc_state::ppi_portc_r)
-{
- u8 data = 0;
-
- // d0-d3: multiplexed inputs (active low)
- for (int i = 0; i < 4; i++)
- if (BIT(m_inp_mux, i))
- data |= m_inputs[i]->read();
-
- // also language switches, hardwired with 4 jumpers
- // 0(none wired): English, 1: German, 2: French, 4: Spanish, 8:Special(unused)
- if (~m_led_select & 0x40)
- data |= *m_language;
-
- return ~data & 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_CODE(KEYCODE_BACKSPACE)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O)
- 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_CODE(KEYCODE_ENTER_PAD)
- 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, 0)
-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));
-
- /* video hardware */
- PWM_DISPLAY(config, m_display).set_size(4, 8);
- m_display->set_segmask(0xf, 0x7f);
- 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) )
-
- // speech ROM
- ROM_DEFAULT_BIOS("en")
- ROM_SYSTEM_BIOS(0, "en", "English")
- ROM_SYSTEM_BIOS(1, "de", "German")
- ROM_SYSTEM_BIOS(2, "fr", "French")
- ROM_SYSTEM_BIOS(3, "sp", "Spanish")
-
- ROM_REGION( 1, "language", 0 )
- ROMX_FILL(0, 1, 0, ROM_BIOS(0) )
- ROMX_FILL(0, 1, 1, ROM_BIOS(1) )
- ROMX_FILL(0, 1, 2, ROM_BIOS(2) )
- ROMX_FILL(0, 1, 4, ROM_BIOS(3) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
- ROM_RELOAD( 0x1000, 0x1000)
- ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
- ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
- ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
-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
-
- // speech ROM
- ROM_DEFAULT_BIOS("en")
- ROM_SYSTEM_BIOS(0, "en", "English")
- ROM_SYSTEM_BIOS(1, "de", "German")
- ROM_SYSTEM_BIOS(2, "fr", "French")
- ROM_SYSTEM_BIOS(3, "sp", "Spanish")
-
- ROM_REGION( 1, "language", 0 )
- ROMX_FILL(0, 1, 0, ROM_BIOS(0) )
- ROMX_FILL(0, 1, 1, ROM_BIOS(1) )
- ROMX_FILL(0, 1, 2, ROM_BIOS(2) )
- ROMX_FILL(0, 1, 4, ROM_BIOS(3) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) ) // NEC P9Y019 // D2332C 229 // 101-32107
- ROM_RELOAD( 0x1000, 0x1000)
- ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
- ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
- ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
-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, empty_init, "Fidelity Electronics", "Voice Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )