summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2019-02-18 22:32:38 +0100
committer hap <happppp@users.noreply.github.com>2019-02-18 22:32:57 +0100
commit077f602605fc64eb4648d603b3a0036b4f6b7908 (patch)
treef7aaa78b4300ec340a42363048106328cdae0457
parent6207d7d2d3262718c78c143681a4c609a7e72452 (diff)
fidel6502: split up into multiple files (nw)
-rw-r--r--scripts/target/mame/mess.lua6
-rw-r--r--src/mame/drivers/fidel6502.cpp1674
-rw-r--r--src/mame/drivers/fidel_as12.cpp189
-rw-r--r--src/mame/drivers/fidel_chesster.cpp212
-rw-r--r--src/mame/drivers/fidel_csc.cpp696
-rw-r--r--src/mame/drivers/fidel_desdis.cpp6
-rw-r--r--src/mame/drivers/fidel_eag68k.cpp6
-rw-r--r--src/mame/drivers/fidel_excel.cpp4
-rw-r--r--src/mame/drivers/fidel_phantom.cpp144
-rw-r--r--src/mame/drivers/fidel_sc12.cpp241
-rw-r--r--src/mame/drivers/fidel_sc9.cpp294
-rw-r--r--src/mame/drivers/fidelbase.cpp19
-rw-r--r--src/mame/drivers/novag6502.cpp6
-rw-r--r--src/mame/drivers/novag68k.cpp2
-rw-r--r--src/mame/drivers/novagf8.cpp2
-rw-r--r--src/mame/drivers/novagmcs48.cpp2
-rw-r--r--src/mame/mame.lst52
-rw-r--r--src/mame/mess.flt6
18 files changed, 1925 insertions, 1636 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index ddb14390bf2..0ee54ec15d4 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -2131,10 +2131,16 @@ createMESSProjects(_target, _subtarget, "fidelity")
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_chesster.cpp",
+ MAME_DIR .. "src/mame/drivers/fidel_csc.cpp",
MAME_DIR .. "src/mame/drivers/fidel_desdis.cpp",
MAME_DIR .. "src/mame/drivers/fidel_eag68k.cpp",
MAME_DIR .. "src/mame/drivers/fidel_excel.cpp",
+ MAME_DIR .. "src/mame/drivers/fidel_phantom.cpp",
+ MAME_DIR .. "src/mame/drivers/fidel_sc12.cpp",
MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp",
+ MAME_DIR .. "src/mame/drivers/fidel_sc9.cpp",
MAME_DIR .. "src/mame/drivers/fidel6502.cpp",
}
diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp
index d2155bcf5fb..abfeb8959c7 100644
--- a/src/mame/drivers/fidel6502.cpp
+++ b/src/mame/drivers/fidel6502.cpp
@@ -1,193 +1,12 @@
// license:BSD-3-Clause
-// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap
-// thanks-to:Berger,yoyo_chessboard
+// copyright-holders:hap
+// thanks-to:Berger
/******************************************************************************
- Fidelity Electronics 6502 based board driver
-
- 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.
- - 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
-
-******************************************************************************
-
-Champion Sensory Chess Challenger (CSC)
----------------------------------------
-
-Memory map:
------------
-0000-07FF: 2K of RAM
-0800-0FFF: 1K of RAM (note: mirrored twice)
-1000-17FF: PIA 1 (display, TSI speech chip)
-1800-1FFF: PIA 0 (keypad, LEDs)
-2000-3FFF: 101-64019 ROM*
-4000-7FFF: mirror of 0000-3FFF
-8000-9FFF: not used
-A000-BFFF: 101-1025A03 ROM
-C000-DFFF: 101-1025A02 ROM
-E000-FDFF: 101-1025A01 ROM
-FE00-FFFF: 512 byte 74S474 PROM
-
-*: 101-64019 is also used on the VSC(fidelz80.cpp). It contains the opening book
-and "64 greatest games", as well as some Z80 code. Obviously the latter is unused
-on the CSC.
-
-CPU is a 6502 running at 1.95MHz (3.9MHz resonator, divided by 2)
-
-NMI is not used.
-IRQ is connected to a 600Hz oscillator (38.4KHz divided by 64).
-Reset is connected to a power-on reset circuit.
-
-PIA 1:
-------
-PA0 - 7seg segments E, TSI A0
-PA1 - 7seg segments D, TSI A1
-PA2 - 7seg segments C, TSI A2
-PA3 - 7seg segments H, TSI A3
-PA4 - 7seg segments G, TSI A4
-PA5 - 7seg segments F, TSI A5
-PA6 - 7seg segments B
-PA7 - 7seg segments A
-
-PB0 - A12 on speech ROM (if used... not used on this model, ROM is 4K)
-PB1 - START line on TSI
-PB2 - white wire
-PB3 - BUSY line from TSI
-PB4 - hi/lo TSI speaker volume
-PB5 - button row 9
-PB6 - selection jumper (resistor to 5V)
-PB7 - selection jumper (resistor to ground)
-
-CA1 - NC
-CA2 - violet wire
-
-CB1 - NC
-CB2 - NC (connects to pin 14 of soldered connector)
-
-PIA 0:
-------
-PA0 - button row 1
-PA1 - button row 2
-PA2 - button row 3
-PA3 - button row 4
-PA4 - button row 5
-PA5 - button row 6
-PA6 - 7442 selector bit 0
-PA7 - 7442 selector bit 1
-
-PB0 - LED row 1
-PB1 - LED row 2
-PB2 - LED row 3
-PB3 - LED row 4
-PB4 - LED row 5
-PB5 - LED row 6
-PB6 - LED row 7
-PB7 - LED row 8
-
-CA1 - button row 7
-CA2 - selector bit 3
-
-CB1 - button row 8
-CB2 - selector bit 2
-
-Selector: (attached to PIA 0, outputs 1 of 10 pins low. 7442)
----------
-output # (selected turns this column on, and all others off)
-0 - LED column A, button column A, 7seg digit 1
-1 - LED column B, button column B, 7seg digit 2
-2 - LED column C, button column C, 7seg digit 3
-3 - LED column D, button column D, 7seg digit 4
-4 - LED column E, button column E
-5 - LED column F, button column F
-6 - LED column G, button column G
-7 - LED column H, button column H
-8 - button column I
-9 - Tone line (toggle to make a tone in the buzzer)
-
-The rows/columns are indicated on the game board:
-
- ABCDEFGH I
---------------
-| | 8
-| | 7
-| | 6
-| | 5
-| | 4
-| | 3
-| | 2
-| | 1
---------------
-
-The "lone LED" is above the control column.
-column I is the "control column" on the right for starting a new game, etc.
-
-The upper 6 buttons are connected as such:
-
-column A - speak
-column B - RV
-column C - TM
-column D - LV
-column E - DM
-column F - ST
-
-these 6 buttons use row 9 (connects to PIA 1)
-
-LED display:
-------------
-43 21 (digit number)
------
-88:88
-
-The LED display is four 7 segment digits. normal ABCDEFG lettering is used for segments.
-
-The upper dot is connected to digit 3 common
-The lower dot is connected to digit 4 common
-The lone LED is connected to digit 1 common
-
-All three of the above are called "segment H".
-
-
-******************************************************************************
-
-Super 9 Sensory Chess Challenger (SU9/DS9)
-This is basically the Fidelity Elite A/S program on CSC hardware.
-Model DS9(Deluxe) has a 5MHz XTAL, but is otherwise same.
----------------------------------
-
-R6502AP CPU, 1.95MHz(3.9MHz resonator)
-2 RAM chips, assume 4KB
-2*8KB ROM + 1*2KB ROM
-built-in CB9 module
-
-See CSC description above for more information.
+Fidelity Elite A/S series hardware (EAS, EAG, PC)
+see fidel_eag68k.cpp for 68000-based EAG hardware
-
-******************************************************************************
-
-Reversi Sensory Challenger (RSC)
-The 1st version came out in 1980, a program revision was released in 1981.
-Another distinction is the board color and layout, the 1981 version is green.
----------------------------------
-
-8*(8+1) buttons, 8*8+1 LEDs
-1KB RAM(2*2114), 4KB ROM
-MOS MPS 6502B CPU, frequency unknown
-MOS MPS 6520 PIA, I/O is nearly same as CSC's PIA 0
-PCB label 510-1035A01
-
-
-******************************************************************************
+*******************************************************************************
Elite A/S Challenger (EAS)
This came out in 1982. 2 program updates were released in 1983 and 1984,
@@ -214,130 +33,25 @@ Prestige Challenger (PC) hardware is very similar. They stripped the 8255 PPI,
and added more RAM(7*TMM2016P). Some were released at 3.6MHz instead of 4MHz,
perhaps due to hardware instability?
-
-******************************************************************************
-
-Sensory Chess Challenger "9" (SC9)
-3 versions were available, the newest "B" version was 2MHz and included the Budapest program.
-The Playmatic S was only released in Germany, it's basically a 'deluxe' version of SC9
-with magnet sensors and came with CB9 and CB16.
----------------------------------
-
-8*(8+1) buttons, 8*8+1 LEDs
-36-pin edge connector, assume same as SC12
-2KB RAM(TMM2016P), 2*8KB ROM(HN48364P)
-R6502-13, 1.4MHz from resonator, another pcb with the same resonator was measured 1.49MHz*
-PCB label 510-1046C01 2-1-82
-
-*: 2 other boards were measured 1.60MHz and 1.88MHz(newest serial). Online references
-suggest 3 versions of SC9(C01) total: 1.5MHz, 1.6MHz, and 1.9MHz.
-
-I/O is via TTL, not further documented here
-
-
-******************************************************************************
-
-Sensory 12 Chess Challenger (SC12-B, 6086)
-4 versions are known to exist: A,B,C, and X, with increasing CPU speed.
----------------------------------
-RE information from netlist by Berger
-
-8*(8+1) buttons, 8+8+2 red LEDs
-DIN 41524C printer port
-36-pin edge connector
-CPU is a R65C02P4, running at 4MHz*
-
-*By default, the CPU frequency is lowered on A13/A14 access, with a factory-set jumper:
-/2 on model SC12(1.5MHz), /4 on model 6086(1MHz)
-
-NE556 dual-timer IC:
-- timer#1, one-shot at power-on, to CPU _RESET
-- timer#2: R1=82K+50K pot at 26K, R2=1K, C=22nF, to CPU _IRQ: ~596Hz, active low=15.25us
-
-Memory map:
------------
-0000-0FFF: 4K RAM (2016 * 2)
-2000-5FFF: cartridge
-6000-7FFF: control(W)
-8000-9FFF: 8K ROM SSS SCM23C65E4
-A000-BFFF: keypad(R)
-C000-DFFF: 4K ROM TI TMS2732AJL-45
-E000-FFFF: 8K ROM Toshiba TMM2764D-2
-
-control: (74LS377)
---------
-Q0-Q3: 7442 A0-A3
-Q4: enable printer port pin 1 input
-Q5: printer port pin 5 output
-Q6,Q7: LEDs common anode
-
-7442 0-8: input mux and LEDs cathode
-7442 9: buzzer
-
-The keypad is read through a 74HC251, where S0,1,2 is from CPU A0,1,2, Y is connected to CPU D7.
-If control Q4 is set, printer data can be read from I0.
-
-
-
-******************************************************************************
-
-Phantom (model 6100)
-----------------
-R65C02P4, XTAL marked 4.91?200
-2*32KB ROM 27C256-15, 8KB RAM MS6264L-10
-LCD driver, display panel for digits
-magnetized x/y motor under chessboard, chesspieces have magnet underneath
-piezo speaker, LEDs, 8*8 chessboard buttons
-PCB label 510.1128A01
-
-Fidelity licensed the design of the Milton/Phantom motorized chessboard and released
-their own version. It has a small LCD panel added, the rest looks nearly the same from
-the outside. After Fidelity was taken over by H&G, it was rereleased in 1990 as the
-Mephisto Phantom. This is assumed to be identical.
-
-
-******************************************************************************
-
-Chesster (model 6120)
-There is also a German version titled Kishon Chesster (model 6120G, or 6127)
-----------------
-
-8*(8+1) buttons, 8+8+1 LEDs
-8KB RAM(UM6264-12), 32KB ROM(M27C256B)
-Ricoh RP65C02G CPU, 5MHz XTAL
-8-bit DAC speech timed via IRQ, 128KB ROM(AMI custom label)
-PCB label 510.1141C01
-
-I/O is via TTL, very similar to Designer Display
-
******************************************************************************/
#include "emu.h"
#include "includes/fidelbase.h"
-#include "cpu/m6502/m6502.h"
#include "cpu/m6502/r65c02.h"
-#include "cpu/m6502/m65sc02.h"
-#include "machine/6821pia.h"
#include "machine/i8255.h"
#include "machine/nvram.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
-#include "fidel_as12.lh" // clickable
-#include "fidel_chesster.lh" // clickable
-#include "fidel_csc.lh" // clickable, with preliminary boardpieces simulation
#include "fidel_eag.lh" // clickable
#include "fidel_eas.lh" // clickable
#include "fidel_pc.lh" // clickable
-#include "fidel_playmatic.lh" // clickable
-#include "fidel_rsc_v2.lh" // clickable
-#include "fidel_sc9.lh" // clickable
-#include "fidel_sc12.lh" // clickable
-#include "fidel_su9.lh" // clickable
+namespace {
+
class elite_state : public fidelbase_state
{
public:
@@ -346,422 +60,85 @@ public:
m_ppi8255(*this, "ppi8255")
{ }
+ // machine drivers
void eas_base(machine_config &config);
void eas(machine_config &config);
void eag(machine_config &config);
void pc(machine_config &config);
- template <int Language> void init_eag();
-
+ template <int Language> void init_eag();
private:
// devices/pointers
optional_device<i8255_device> m_ppi8255;
- // EAS, EAG, PC
- void eas_prepare_display();
- DECLARE_READ8_MEMBER(eas_speech_r);
- DECLARE_WRITE8_MEMBER(eas_segment_w);
- DECLARE_WRITE8_MEMBER(eas_led_w);
- DECLARE_READ8_MEMBER(eas_input_r);
- DECLARE_WRITE8_MEMBER(eas_ppi_porta_w);
- DECLARE_READ8_MEMBER(eas_ppi_portb_r);
- DECLARE_WRITE8_MEMBER(eas_ppi_portc_w);
+ // address maps
void eas_map(address_map &map);
void eag_map(address_map &map);
void pc_map(address_map &map);
-};
-
-
-
-class sc12_state : public fidelbase_state
-{
-public:
- sc12_state(const machine_config &mconfig, device_type type, const char *tag) :
- fidelbase_state(mconfig, type, tag)
- { }
-
- void sc12(machine_config &config);
- void sc12b(machine_config &config);
-
-private:
-
- // SC12
- void sc12_map(address_map &map);
- DECLARE_WRITE8_MEMBER(sc12_control_w);
- DECLARE_READ8_MEMBER(sc12_input_r);
-};
-
-
-class as12_state : public fidelbase_state
-{
-public:
- as12_state(const machine_config &mconfig, device_type type, const char *tag) :
- fidelbase_state(mconfig, type, tag)
- { }
-
- void as12(machine_config &config);
-
-private:
-
- // AS12
- void as12_prepare_display();
- DECLARE_WRITE8_MEMBER(as12_control_w);
- DECLARE_WRITE8_MEMBER(as12_led_w);
- DECLARE_READ8_MEMBER(as12_input_r);
- void as12_map(address_map &map);
-};
-
-
-
-class phantom_state : public fidelbase_state
-{
-public:
- phantom_state(const machine_config &mconfig, device_type type, const char *tag) :
- fidelbase_state(mconfig, type, tag)
- { }
-
- void fphantom(machine_config &config);
- void init_fphantom();
-
-private:
- void fphantom_map(address_map &map);
- virtual void machine_reset() override;
-};
-
-void phantom_state::machine_reset()
-{
- fidelbase_state::machine_reset();
- m_rombank->set_entry(0);
-}
-
-void phantom_state::init_fphantom()
-{
- m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
-}
-
-
-
-class sc9_state : public fidelbase_state
-{
-public:
- sc9_state(const machine_config &mconfig, device_type type, const char *tag) :
- fidelbase_state(mconfig, type, tag)
- { }
-
- void sc9b(machine_config &config);
- void sc9c(machine_config &config);
- void sc9d(machine_config &config);
- void playmatic(machine_config &config);
-
-protected:
- // SC9
- void sc9_prepare_display();
- DECLARE_WRITE8_MEMBER(sc9_control_w);
- DECLARE_WRITE8_MEMBER(sc9_led_w);
- DECLARE_READ8_MEMBER(sc9_input_r);
- DECLARE_READ8_MEMBER(sc9d_input_r);
- void sc9_map(address_map &map);
- void sc9d_map(address_map &map);
-};
-
-class sc9c_state : public sc9_state
-{
-public:
- sc9c_state(const machine_config &mconfig, device_type type, const char *tag) :
- sc9_state(mconfig, type, tag)
- { }
-
- DECLARE_INPUT_CHANGED_MEMBER(sc9c_cpu_freq) { sc9c_set_cpu_freq(); }
-
-protected:
- virtual void machine_reset() override;
- void sc9c_set_cpu_freq();
-};
-
-void sc9c_state::machine_reset()
-{
- sc9_state::machine_reset();
- sc9c_set_cpu_freq();
-}
-
-void sc9c_state::sc9c_set_cpu_freq()
-{
- // SC9(C01) was released with 1.5MHz, 1.6MHz, or 1.9MHz CPU
- u8 inp = ioport("FAKE")->read();
- m_maincpu->set_unscaled_clock((inp & 2) ? 1900000 : ((inp & 1) ? 1600000 : 1500000));
-}
-
-
-
-
-
-
-class chesster_state : public fidelbase_state
-{
-public:
- chesster_state(const machine_config &mconfig, device_type type, const char *tag) :
- fidelbase_state(mconfig, type, tag)
- { }
-
- void chesster(machine_config &config);
- void kishon(machine_config &config);
- void init_chesster();
-
-private:
- int m_numbanks;
-
- DECLARE_WRITE8_MEMBER(chesster_control_w);
- DECLARE_READ8_MEMBER(chesster_input_r);
- void chesster_map(address_map &map);
-};
-
-
-
-class csc_state : public fidelbase_state
-{
-public:
- csc_state(const machine_config &mconfig, device_type type, const char *tag) :
- fidelbase_state(mconfig, type, tag),
- m_pia(*this, "pia%u", 0)
- { }
-
- void csc(machine_config &config);
- void su9(machine_config &config);
- void rsc(machine_config &config);
-
-protected:
- optional_device_array<pia6821_device, 2> m_pia;
- void csc_prepare_display();
- DECLARE_READ8_MEMBER(csc_speech_r);
- DECLARE_WRITE8_MEMBER(csc_pia0_pa_w);
- DECLARE_WRITE8_MEMBER(csc_pia0_pb_w);
- DECLARE_READ8_MEMBER(csc_pia0_pa_r);
- DECLARE_WRITE_LINE_MEMBER(csc_pia0_ca2_w);
- DECLARE_WRITE_LINE_MEMBER(csc_pia0_cb2_w);
- DECLARE_READ_LINE_MEMBER(csc_pia0_ca1_r);
- DECLARE_READ_LINE_MEMBER(csc_pia0_cb1_r);
- DECLARE_WRITE8_MEMBER(csc_pia1_pa_w);
- DECLARE_WRITE8_MEMBER(csc_pia1_pb_w);
- DECLARE_READ8_MEMBER(csc_pia1_pb_r);
- DECLARE_WRITE_LINE_MEMBER(csc_pia1_ca2_w);
- void csc_map(address_map &map);
- void su9_map(address_map &map);
- void rsc_map(address_map &map);
+ // I/O handlers
+ void prepare_display();
+ DECLARE_READ8_MEMBER(speech_r);
+ DECLARE_WRITE8_MEMBER(segment_w);
+ DECLARE_WRITE8_MEMBER(led_w);
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(ppi_porta_w);
+ DECLARE_READ8_MEMBER(ppi_portb_r);
+ DECLARE_WRITE8_MEMBER(ppi_portc_w);
};
-class su9_state : public csc_state
-{
-public:
- su9_state(const machine_config &mconfig, device_type type, const char *tag) :
- csc_state(mconfig, type, tag)
- { }
-
- DECLARE_INPUT_CHANGED_MEMBER(su9_cpu_freq) { su9_set_cpu_freq(); }
-
-protected:
- virtual void machine_reset() override;
- void su9_set_cpu_freq();
-};
-
-void su9_state::machine_reset()
-{
- csc_state::machine_reset();
- su9_set_cpu_freq();
-}
-
-void su9_state::su9_set_cpu_freq()
-{
- // SU9 CPU is clocked 1.95MHz, DS9 is 2.5MHz
- m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (5_MHz_XTAL/2) : (3.9_MHz_XTAL/2));
-}
-
-
-
-/***************************************************************************
-
- Helper Functions
-
-***************************************************************************/
-
-
-
-// Devices, I/O
-
-/******************************************************************************
- CSC, SU9, RSC
-******************************************************************************/
-
-// misc handlers
-
-void csc_state::csc_prepare_display()
-{
- // 7442 0-8: led select, input mux
- m_inp_mux = 1 << m_led_select & 0x3ff;
-
- // 7442 9: speaker out
- m_dac->write(BIT(m_inp_mux, 9));
-
- // 7seg leds+H (not on all models), 8*8(+1) chessboard leds
- set_display_segmask(0xf, 0x7f);
- display_matrix(16, 9, m_led_data << 8 | m_7seg_data, m_inp_mux);
-}
-
-READ8_MEMBER(csc_state::csc_speech_r)
-{
- return m_speech_rom[m_speech_bank << 12 | offset];
-}
-
-
-// 6821 PIA 0
-
-READ8_MEMBER(csc_state::csc_pia0_pa_r)
-{
- // d0-d5: button row 0-5 (active low)
- return (read_inputs(9) & 0x3f) ^ 0xff;
-}
-
-WRITE8_MEMBER(csc_state::csc_pia0_pa_w)
-{
- // d6,d7: 7442 A0,A1
- m_led_select = (m_led_select & ~3) | (data >> 6 & 3);
- csc_prepare_display();
-}
-
-WRITE8_MEMBER(csc_state::csc_pia0_pb_w)
-{
- // d0-d7: led row data
- m_led_data = data;
- csc_prepare_display();
-}
-
-READ_LINE_MEMBER(csc_state::csc_pia0_ca1_r)
-{
- // button row 6 (active low)
- return ~read_inputs(9) >> 6 & 1;
-}
-
-READ_LINE_MEMBER(csc_state::csc_pia0_cb1_r)
-{
- // button row 7 (active low)
- return ~read_inputs(9) >> 7 & 1;
-}
-
-WRITE_LINE_MEMBER(csc_state::csc_pia0_cb2_w)
-{
- // 7442 A2
- m_led_select = (m_led_select & ~4) | (state ? 4 : 0);
- csc_prepare_display();
-}
-
-WRITE_LINE_MEMBER(csc_state::csc_pia0_ca2_w)
-{
- // 7442 A3
- m_led_select = (m_led_select & ~8) | (state ? 8 : 0);
- csc_prepare_display();
-}
-
-
-// 6821 PIA 1
-
-WRITE8_MEMBER(csc_state::csc_pia1_pa_w)
-{
- // d0-d5: TSI C0-C5
- m_speech->data_w(space, 0, data & 0x3f);
-
- // d0-d7: data for the 4 7seg leds, bits are ABFGHCDE (H is extra led)
- m_7seg_data = bitswap<8>(data,0,1,5,6,7,2,3,4);
- csc_prepare_display();
-}
-
-WRITE8_MEMBER(csc_state::csc_pia1_pb_w)
-{
- // d0: speech ROM A12
- m_speech->force_update(); // update stream to now
- m_speech_bank = data & 1;
-
- // d1: TSI START line
- m_speech->start_w(data >> 1 & 1);
-
- // d4: lower TSI volume
- m_speech->set_output_gain(0, (data & 0x10) ? 0.5 : 1.0);
-}
-
-READ8_MEMBER(csc_state::csc_pia1_pb_r)
-{
- // d2: printer?
- u8 data = 0x04;
-
- // d3: TSI BUSY line
- if (m_speech->busy_r())
- data |= 0x08;
-
- // d5: button row 8 (active low)
- // d6,d7: language switches(hardwired with 2 resistors/jumpers)
- data |= (~read_inputs(9) >> 3 & 0x20) | (~m_language << 6 & 0xc0);
-
- return data;
-}
-
-WRITE_LINE_MEMBER(csc_state::csc_pia1_ca2_w)
+template <int Language>
+void elite_state::init_eag()
{
- // printer?
+ m_language = Language;
+ m_rombank->configure_entries(0, 4, memregion("rombank")->base(), 0x2000);
}
-
-
/******************************************************************************
- EAS, EAG, PC
+ Devices, I/O
******************************************************************************/
// TTL/generic
-void elite_state::eas_prepare_display()
+void elite_state::prepare_display()
{
// 4/8 7seg leds+H, 8*8(+1) chessboard leds
set_display_segmask(0x1ef, 0x7f);
display_matrix(16, 9, m_led_data << 8 | m_7seg_data, m_led_select);
}
-READ8_MEMBER(elite_state::eas_speech_r)
+READ8_MEMBER(elite_state::speech_r)
{
return m_speech_rom[m_speech_bank << 12 | offset];
}
-WRITE8_MEMBER(elite_state::eas_segment_w)
+WRITE8_MEMBER(elite_state::segment_w)
{
// a0-a2,d7: digit segment
m_7seg_data = (data & 0x80) >> offset;
m_7seg_data = bitswap<8>(m_7seg_data,7,6,4,5,0,2,1,3);
- eas_prepare_display();
+ prepare_display();
}
-WRITE8_MEMBER(elite_state::eas_led_w)
+WRITE8_MEMBER(elite_state::led_w)
{
// a0-a2,d0: led data
m_led_data = (data & 1) << offset;
- eas_prepare_display();
+ prepare_display();
}
-READ8_MEMBER(elite_state::eas_input_r)
+READ8_MEMBER(elite_state::input_r)
{
// multiplexed inputs (active low)
return read_inputs(9) ^ 0xff;
}
-template <int Language>
-void elite_state::init_eag()
-{
- m_language = Language;
- m_rombank->configure_entries(0, 4, memregion("rombank")->base(), 0x2000);
-}
-
// 8255 PPI (PC: done with TTL instead)
-WRITE8_MEMBER(elite_state::eas_ppi_porta_w)
+WRITE8_MEMBER(elite_state::ppi_porta_w)
{
// d0-d5: TSI C0-C5
// d6: TSI START line
@@ -771,13 +148,13 @@ WRITE8_MEMBER(elite_state::eas_ppi_porta_w)
// d7: printer? (black wire to LED pcb)
}
-WRITE8_MEMBER(elite_state::eas_ppi_portc_w)
+WRITE8_MEMBER(elite_state::ppi_portc_w)
{
// d0-d3: 7442 a0-a3
// 7442 0-8: led select, input mux
m_led_select = 1 << (data & 0xf) & 0x3ff;
m_inp_mux = m_led_select & 0x1ff;
- eas_prepare_display();
+ prepare_display();
// 7442 9: speaker out
m_dac->write(BIT(m_led_select, 9));
@@ -794,7 +171,7 @@ WRITE8_MEMBER(elite_state::eas_ppi_portc_w)
m_rombank->set_entry(data >> 6 & 3);
}
-READ8_MEMBER(elite_state::eas_ppi_portb_r)
+READ8_MEMBER(elite_state::ppi_portb_r)
{
// d0: printer? white wire from LED pcb
u8 data = 1;
@@ -815,221 +192,18 @@ READ8_MEMBER(elite_state::eas_ppi_portb_r)
/******************************************************************************
- SC9
-******************************************************************************/
-
-// TTL/generic
-
-void sc9_state::sc9_prepare_display()
-{
- // 8*8 chessboard leds + 1 corner led
- display_matrix(8, 9, m_led_data, m_inp_mux);
-}
-
-WRITE8_MEMBER(sc9_state::sc9_control_w)
-{
- // d0-d3: 74245 P0-P3
- // 74245 Q0-Q8: input mux, led select
- u16 sel = 1 << (data & 0xf) & 0x3ff;
- m_inp_mux = sel & 0x1ff;
- sc9_prepare_display();
-
- // 74245 Q9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // d4,d5: ?
- // d6,d7: N/C
-}
-
-WRITE8_MEMBER(sc9_state::sc9_led_w)
-{
- // a0-a2,d0: led data via NE591N
- m_led_data = (data & 1) << offset;
- sc9_prepare_display();
-}
-
-READ8_MEMBER(sc9_state::sc9_input_r)
-{
- // multiplexed inputs (active low)
- return read_inputs(9) ^ 0xff;
-}
-
-READ8_MEMBER(sc9_state::sc9d_input_r)
-{
- // a0-a2,d7: multiplexed inputs (active low)
- return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
-}
-
-
-
-/******************************************************************************
- SC12
-******************************************************************************/
-
-// TTL/generic
-
-WRITE8_MEMBER(sc12_state::sc12_control_w)
-{
- // d0-d3: 7442 a0-a3
- // 7442 0-8: led data, input mux
- u16 sel = 1 << (data & 0xf) & 0x3ff;
- m_inp_mux = sel & 0x1ff;
-
- // 7442 9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // d6,d7: led select (active low)
- display_matrix(9, 2, sel & 0x1ff, ~data >> 6 & 3);
-
- // d4,d5: printer
- //..
-}
-
-READ8_MEMBER(sc12_state::sc12_input_r)
-{
- // a0-a2,d7: multiplexed inputs (active low)
- return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
-}
-
-
-
-/******************************************************************************
- AS12
-******************************************************************************/
-
-// TTL/generic
-
-void as12_state::as12_prepare_display()
-{
- // 8*8(+1) chessboard leds
- display_matrix(8, 9, m_led_data, m_inp_mux);
-}
-
-WRITE8_MEMBER(as12_state::as12_control_w)
-{
- // d0-d3: 74245 P0-P3
- // 74245 Q0-Q8: input mux, led select
- u16 sel = 1 << (data & 0xf) & 0x3ff;
- m_inp_mux = bitswap<9>(sel,5,8,7,6,4,3,1,0,2);
- as12_prepare_display();
-
- // 74245 Q9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // d4,d5: printer?
- // d6,d7: N/C?
-}
-
-WRITE8_MEMBER(as12_state::as12_led_w)
-{
- // a0-a2,d0: led data via NE591N
- m_led_data = (data & 1) << offset;
- as12_prepare_display();
-}
-
-READ8_MEMBER(as12_state::as12_input_r)
-{
- // a0-a2,d7: multiplexed inputs (active low)
- u8 inp = bitswap<8>(read_inputs(9),4,3,2,1,0,5,6,7);
- return (inp >> offset & 1) ? 0 : 0x80;
-}
-
-
-
-
-
-
-
-
-/******************************************************************************
- Chesster
-******************************************************************************/
-
-// TTL/generic
-
-WRITE8_MEMBER(chesster_state::chesster_control_w)
-{
- // a0-a2,d7: 74259(1)
- u8 mask = 1 << offset;
- m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
-
- // 74259 Q4-Q7: 7442 a0-a3
- // 7442 0-8: led data, input mux
- u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
- m_inp_mux = sel & 0x1ff;
-
- // 74259 Q0,Q1: led select (active low)
- display_matrix(9, 2, m_inp_mux, ~m_led_select & 3);
-
- // 74259 Q2,Q3: speechrom A14,A15
- // a0-a2,d0: 74259(2) Q3,Q2,Q0 to A16,A17,A18
- m_speech_bank = (m_speech_bank & ~mask) | ((data & 1) ? mask : 0);
- u8 bank = (m_led_select >> 2 & 3) | bitswap<3>(m_speech_bank, 0,2,3) << 2;
- m_rombank->set_entry(bank & (m_numbanks - 1));
-}
-
-READ8_MEMBER(chesster_state::chesster_input_r)
-{
- // a0-a2,d7: multiplexed inputs (active low)
- return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
-}
-
-void chesster_state::init_chesster()
-{
- m_numbanks = memregion("rombank")->bytes() / 0x4000;
- m_rombank->configure_entries(0, m_numbanks, memregion("rombank")->base(), 0x4000);
-}
-
-
-
-/******************************************************************************
Address Maps
******************************************************************************/
-// CSC, SU9, RSC
-
-void csc_state::csc_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x07ff).mirror(0x4000).ram();
- map(0x0800, 0x0bff).mirror(0x4400).ram();
- map(0x1000, 0x1003).mirror(0x47fc).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x1800, 0x1803).mirror(0x47fc).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x2000, 0x3fff).mirror(0x4000).rom();
- map(0xa000, 0xffff).rom();
-}
-
-void csc_state::su9_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x0fff).ram();
- map(0x1000, 0x1003).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x1800, 0x1803).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x2000, 0x3fff).rom();
- map(0xa000, 0xa7ff).rom();
- map(0xc000, 0xffff).rom();
-}
-
-void csc_state::rsc_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x03ff).ram();
- map(0x2000, 0x2003).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0xf000, 0xffff).rom();
-}
-
-
-// EAS, EAG, PC
-
void elite_state::eas_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x0fff).ram().share("nvram");
map(0x2000, 0x5fff).r(FUNC(elite_state::cartridge_r));
map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x7020, 0x7027).w(FUNC(elite_state::eas_segment_w)).nopr();
- map(0x7030, 0x7037).w(FUNC(elite_state::eas_led_w)).nopr();
- map(0x7050, 0x7050).r(FUNC(elite_state::eas_input_r));
+ map(0x7020, 0x7027).w(FUNC(elite_state::segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(elite_state::led_w)).nopr();
+ map(0x7050, 0x7050).r(FUNC(elite_state::input_r));
map(0x8000, 0x9fff).rom();
map(0xc000, 0xffff).rom();
}
@@ -1040,9 +214,9 @@ void elite_state::eag_map(address_map &map)
map(0x0000, 0x1fff).ram().share("nvram");
map(0x2000, 0x5fff).r(FUNC(elite_state::cartridge_r));
map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x7020, 0x7027).w(FUNC(elite_state::eas_segment_w)).nopr();
- map(0x7030, 0x7037).w(FUNC(elite_state::eas_led_w)).nopr();
- map(0x7050, 0x7050).r(FUNC(elite_state::eas_input_r));
+ map(0x7020, 0x7027).w(FUNC(elite_state::segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(elite_state::led_w)).nopr();
+ map(0x7050, 0x7050).r(FUNC(elite_state::input_r));
map(0x8000, 0x9fff).ram();
map(0xa000, 0xbfff).bankr("rombank");
map(0xc000, 0xffff).rom();
@@ -1053,158 +227,22 @@ void elite_state::pc_map(address_map &map)
map.unmap_value_high();
map(0x0000, 0x17ff).ram();
map(0x2000, 0x5fff).r(FUNC(elite_state::cartridge_r));
- map(0x7000, 0x7000).w(FUNC(elite_state::eas_ppi_porta_w));
- map(0x7010, 0x7010).r(FUNC(elite_state::eas_ppi_portb_r));
- map(0x7020, 0x7027).w(FUNC(elite_state::eas_segment_w)).nopr();
- map(0x7030, 0x7037).w(FUNC(elite_state::eas_led_w)).nopr();
- map(0x7040, 0x7040).w(FUNC(elite_state::eas_ppi_portc_w));
- map(0x7050, 0x7050).r(FUNC(elite_state::eas_input_r));
+ map(0x7000, 0x7000).w(FUNC(elite_state::ppi_porta_w));
+ map(0x7010, 0x7010).r(FUNC(elite_state::ppi_portb_r));
+ map(0x7020, 0x7027).w(FUNC(elite_state::segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(elite_state::led_w)).nopr();
+ map(0x7040, 0x7040).w(FUNC(elite_state::ppi_portc_w));
+ map(0x7050, 0x7050).r(FUNC(elite_state::input_r));
map(0x8000, 0x9fff).ram();
map(0xb000, 0xffff).rom();
}
-// SC9
-
-void sc9_state::sc9_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x07ff).mirror(0x1800).ram();
- map(0x2000, 0x5fff).r(FUNC(sc9_state::cartridge_r));
- map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(sc9_state::sc9_control_w));
- map(0x8000, 0x8007).mirror(0x1ff8).w(FUNC(sc9_state::sc9_led_w)).nopr();
- map(0xa000, 0xa000).mirror(0x1fff).r(FUNC(sc9_state::sc9_input_r));
- map(0xc000, 0xffff).rom();
-}
-
-void sc9_state::sc9d_map(address_map &map)
-{
- sc9_map(map);
- map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(sc9_state::sc9d_input_r));
-}
-
-
-// SC12, AS12
-
-void sc12_state::sc12_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x0fff).ram();
- map(0x2000, 0x5fff).r(FUNC(sc12_state::cartridge_r));
- map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(sc12_state::sc12_control_w));
- map(0x8000, 0x9fff).rom();
- map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(sc12_state::sc12_input_r));
- map(0xc000, 0xcfff).mirror(0x1000).rom();
- map(0xe000, 0xffff).rom();
-}
-
-void as12_state::as12_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x0fff).ram();
- map(0x1800, 0x1807).w(FUNC(as12_state::as12_led_w)).nopr();
- map(0x2000, 0x5fff).r(FUNC(as12_state::cartridge_r));
- map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(as12_state::as12_control_w));
- map(0x8000, 0x9fff).rom();
- map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(as12_state::as12_input_r));
- map(0xc000, 0xffff).rom();
-}
-
-
-
-
-
-// Designer Display, Phantom, Chesster
-
-void phantom_state::fphantom_map(address_map &map)
-{
- map(0x0000, 0x1fff).ram();
- map(0x4000, 0x7fff).bankr("rombank");
- map(0x8000, 0xffff).rom();
-}
-
-void chesster_state::chesster_map(address_map &map)
-{
- map(0x0000, 0x1fff).ram();
- map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(chesster_state::chesster_input_r), FUNC(chesster_state::chesster_control_w));
- map(0x4000, 0x7fff).bankr("rombank");
- map(0x6000, 0x6000).mirror(0x1fff).w("dac8", FUNC(dac_byte_interface::data_w));
- map(0x8000, 0xffff).rom();
-}
-
-
-
/******************************************************************************
Input Ports
******************************************************************************/
-static INPUT_PORTS_START( rsc )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("ST")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("RV")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("DM")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("CL")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("LV")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PV")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( csc )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_MODIFY("IN.0")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
-
- PORT_MODIFY("IN.1")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
-
- PORT_MODIFY("IN.2")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM")
-
- PORT_MODIFY("IN.3")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV")
-
- PORT_MODIFY("IN.4")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
-
- PORT_MODIFY("IN.5")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST")
-
- 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")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( su9 )
- PORT_INCLUDE( csc )
-
- PORT_MODIFY("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
-
- PORT_START("FAKE")
- PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, su9_state, su9_cpu_freq, nullptr) // factory set
- PORT_CONFSETTING( 0x00, "1.95MHz (SU9)" )
- PORT_CONFSETTING( 0x01, "2.5MHz (DS9)" )
-INPUT_PORTS_END
-
-
static INPUT_PORTS_START( eas )
PORT_INCLUDE( fidel_cpu_div_4 )
PORT_INCLUDE( fidel_cb_magnets )
@@ -1229,7 +267,6 @@ static INPUT_PORTS_START( eas )
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("LV / Pawn")
INPUT_PORTS_END
-
static INPUT_PORTS_START( eag )
PORT_INCLUDE( fidel_cpu_div_4 )
PORT_INCLUDE( fidel_cb_magnets )
@@ -1255,185 +292,11 @@ static INPUT_PORTS_START( eag )
INPUT_PORTS_END
-static INPUT_PORTS_START( sc12_sidepanel )
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / 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")
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sc12 )
- PORT_INCLUDE( fidel_cpu_div_2 )
- PORT_INCLUDE( fidel_cb_buttons )
- PORT_INCLUDE( sc12_sidepanel )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sc12b )
- PORT_INCLUDE( fidel_cpu_div_4 )
- PORT_INCLUDE( fidel_cb_buttons )
- PORT_INCLUDE( sc12_sidepanel )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( as12 )
- PORT_INCLUDE( fidel_cpu_div_4 )
- PORT_INCLUDE( fidel_cb_magnets )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / 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")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( sc9_sidepanel )
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / 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")
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( playmatic )
- PORT_INCLUDE( fidel_cb_magnets )
- PORT_INCLUDE( sc9_sidepanel )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sc9 )
- PORT_INCLUDE( fidel_cb_buttons )
- PORT_INCLUDE( sc9_sidepanel )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sc9c )
- PORT_INCLUDE( sc9 )
-
- PORT_START("FAKE")
- PORT_CONFNAME( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, sc9c_state, sc9c_cpu_freq, nullptr) // factory set
- PORT_CONFSETTING( 0x00, "1.5MHz" )
- PORT_CONFSETTING( 0x01, "1.6MHz" )
- PORT_CONFSETTING( 0x02, "1.9MHz" )
-INPUT_PORTS_END
-
-
-
-static INPUT_PORTS_START( chesster )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / No")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Yes")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Repeat")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Replay")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( fphantom )
- PORT_INCLUDE( fidel_cb_buttons )
-INPUT_PORTS_END
-
-
/******************************************************************************
Machine Drivers
******************************************************************************/
-void csc_state::rsc(machine_config &config)
-{
- /* basic machine hardware */
- M6502(config, m_maincpu, 1800000); // measured approx 1.81MHz
- m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::rsc_map);
-
- const attotime irq_period = attotime::from_hz(546); // from 555 timer, measured
- TIMER(config, m_irq_on).configure_periodic(FUNC(csc_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_usec(38)); // active for 38us
- TIMER(config, "irq_off").configure_periodic(FUNC(csc_state::irq_off<M6502_IRQ_LINE>), irq_period);
-
- PIA6821(config, m_pia[0], 0); // MOS 6520
- m_pia[0]->readpa_handler().set(FUNC(csc_state::csc_pia0_pa_r));
- m_pia[0]->readca1_handler().set(FUNC(csc_state::csc_pia0_ca1_r));
- m_pia[0]->readcb1_handler().set(FUNC(csc_state::csc_pia0_cb1_r));
- m_pia[0]->writepa_handler().set(FUNC(csc_state::csc_pia0_pa_w));
- m_pia[0]->writepb_handler().set(FUNC(csc_state::csc_pia0_pb_w));
- m_pia[0]->ca2_handler().set(FUNC(csc_state::csc_pia0_ca2_w));
- m_pia[0]->cb2_handler().set(FUNC(csc_state::csc_pia0_cb2_w));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_rsc_v2);
-
- /* 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.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void csc_state::csc(machine_config &config)
-{
- /* basic machine hardware */
- M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // from 3.9MHz resonator
- m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::csc_map);
-
- const attotime irq_period = attotime::from_hz(38.4_kHz_XTAL/64); // through 4060 IC, 600Hz
- TIMER(config, m_irq_on).configure_periodic(FUNC(csc_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
- TIMER(config, "irq_off").configure_periodic(FUNC(csc_state::irq_off<M6502_IRQ_LINE>), irq_period);
-
- PIA6821(config, m_pia[0], 0);
- m_pia[0]->readpa_handler().set(FUNC(csc_state::csc_pia0_pa_r));
- m_pia[0]->readca1_handler().set(FUNC(csc_state::csc_pia0_ca1_r));
- m_pia[0]->readcb1_handler().set(FUNC(csc_state::csc_pia0_cb1_r));
- m_pia[0]->writepa_handler().set(FUNC(csc_state::csc_pia0_pa_w));
- m_pia[0]->writepb_handler().set(FUNC(csc_state::csc_pia0_pb_w));
- m_pia[0]->ca2_handler().set(FUNC(csc_state::csc_pia0_ca2_w));
- m_pia[0]->cb2_handler().set(FUNC(csc_state::csc_pia0_cb2_w));
-
- PIA6821(config, m_pia[1], 0);
- m_pia[1]->readpb_handler().set(FUNC(csc_state::csc_pia1_pb_r));
- m_pia[1]->writepa_handler().set(FUNC(csc_state::csc_pia1_pa_w));
- m_pia[1]->writepb_handler().set(FUNC(csc_state::csc_pia1_pb_w));
- m_pia[1]->ca2_handler().set(FUNC(csc_state::csc_pia1_ca2_w));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_csc);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
- m_speech->ext_read().set(FUNC(csc_state::csc_speech_r));
- 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.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void csc_state::su9(machine_config &config)
-{
- csc(config);
-
- m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::su9_map);
- config.set_default_layout(layout_fidel_su9);
-}
-
void elite_state::eas_base(machine_config &config)
{
/* basic machine hardware */
@@ -1454,7 +317,7 @@ void elite_state::eas_base(machine_config &config)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
- m_speech->ext_read().set(FUNC(elite_state::eas_speech_r));
+ m_speech->ext_read().set(FUNC(elite_state::speech_r));
m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
@@ -1474,10 +337,10 @@ void elite_state::eas(machine_config &config)
eas_base(config);
I8255(config, m_ppi8255); // port B: input, port A & C: output
- m_ppi8255->out_pa_callback().set(FUNC(elite_state::eas_ppi_porta_w));
+ m_ppi8255->out_pa_callback().set(FUNC(elite_state::ppi_porta_w));
m_ppi8255->tri_pa_callback().set_constant(0);
- m_ppi8255->in_pb_callback().set(FUNC(elite_state::eas_ppi_portb_r));
- m_ppi8255->out_pc_callback().set(FUNC(elite_state::eas_ppi_portc_w));
+ m_ppi8255->in_pb_callback().set(FUNC(elite_state::ppi_portb_r));
+ m_ppi8255->out_pc_callback().set(FUNC(elite_state::ppi_portc_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
}
@@ -1506,290 +369,12 @@ void elite_state::eag(machine_config &config)
config.set_default_layout(layout_fidel_eag);
}
-void sc9_state::sc9d(machine_config &config)
-{
- /* basic machine hardware */
- M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // R6502AP, 3.9MHz resonator
- m_maincpu->set_addrmap(AS_PROGRAM, &sc9_state::sc9d_map);
-
- const attotime irq_period = attotime::from_hz(610); // from 555 timer (22nF, 102K, 2.7K)
- TIMER(config, m_irq_on).configure_periodic(FUNC(sc9_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us
- TIMER(config, "irq_off").configure_periodic(FUNC(sc9_state::irq_off<M6502_IRQ_LINE>), irq_period);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_sc9);
-
- /* 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.set_output(5.0);
- 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"));
- cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
-
- SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
-}
-
-void sc9_state::sc9b(machine_config &config)
-{
- sc9d(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(1500000); // from ceramic resonator "681 JSA", measured
- m_maincpu->set_addrmap(AS_PROGRAM, &sc9_state::sc9_map);
-}
-
-void sc9_state::playmatic(machine_config &config)
-{
- sc9b(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(3100000); // approximation
- config.set_default_layout(layout_fidel_playmatic);
-}
-
-void sc12_state::sc12(machine_config &config)
-{
- /* basic machine hardware */
- R65C02(config, m_maincpu, 3_MHz_XTAL); // R65C02P3
- m_maincpu->set_addrmap(AS_PROGRAM, &sc12_state::div_trampoline);
- ADDRESS_MAP_BANK(config, m_mainmap).set_map(&sc12_state::sc12_map).set_options(ENDIANNESS_LITTLE, 8, 16);
-
- TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(3_MHz_XTAL));
-
- const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
- TIMER(config, m_irq_on).configure_periodic(FUNC(sc12_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config, "irq_off").configure_periodic(FUNC(sc12_state::irq_off<M6502_IRQ_LINE>), irq_period);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_sc12);
-
- /* 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.set_output(5.0);
- 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"));
- cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
-
- SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
-}
-
-void sc12_state::sc12b(machine_config &config)
-{
- sc12(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4
- TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
-
- // change irq timer frequency
- const attotime irq_period = attotime::from_hz(596); // from 556 timer (22nF, 82K+26K, 1K)
- TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(sc12_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config.replace(), "irq_off").configure_periodic(FUNC(sc12_state::irq_off<M6502_IRQ_LINE>), irq_period);
-}
-
-
-
-void as12_state::as12(machine_config &config)
-{
- /* basic machine hardware */
- R65C02(config, m_maincpu, 4_MHz_XTAL); // R65C02P4
- m_maincpu->set_addrmap(AS_PROGRAM, &as12_state::div_trampoline);
- ADDRESS_MAP_BANK(config, m_mainmap).set_map(&as12_state::as12_map).set_options(ENDIANNESS_LITTLE, 8, 16);
-
- TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
-
- const attotime irq_period = attotime::from_hz(585); // from 556 timer (22nF, 110K, 1K)
- TIMER(config, m_irq_on).configure_periodic(FUNC(as12_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config, "irq_off").configure_periodic(FUNC(as12_state::irq_off<M6502_IRQ_LINE>), irq_period);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_as12);
-
- /* 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.set_output(5.0);
- 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"));
- cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
-
- SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
-}
-
-
-
-void phantom_state::fphantom(machine_config &config)
-{
- /* basic machine hardware */
- R65C02(config, m_maincpu, 4.9152_MHz_XTAL); // R65C02P4
- m_maincpu->set_periodic_int(FUNC(phantom_state::irq0_line_hold), attotime::from_hz(600)); // guessed
- m_maincpu->set_addrmap(AS_PROGRAM, &phantom_state::fphantom_map);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- //config.set_default_layout(layout_fidel_phantom);
-
- /* 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.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void chesster_state::chesster(machine_config &config)
-{
- /* basic machine hardware */
- R65C02(config, m_maincpu, 5_MHz_XTAL); // RP65C02G
- m_maincpu->set_addrmap(AS_PROGRAM, &chesster_state::chesster_map);
-
- const attotime irq_period = attotime::from_hz(9615); // R/C circuit, measured
- TIMER(config, m_irq_on).configure_periodic(FUNC(chesster_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_nsec(2600)); // active for 2.6us
- TIMER(config, "irq_off").configure_periodic(FUNC(chesster_state::irq_off<M6502_IRQ_LINE>), irq_period);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_chesster);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_8BIT_R2R(config, "dac8", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // m74hc374b1.ic1 + 8l513_02.z2
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac8", 1.0, DAC_VREF_POS_INPUT);
- vref.add_route(0, "dac8", -1.0, DAC_VREF_NEG_INPUT);
-}
-
-void chesster_state::kishon(machine_config &config)
-{
- chesster(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(3.579545_MHz_XTAL);
-}
-
/******************************************************************************
ROM Definitions
******************************************************************************/
-ROM_START( reversic )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1000a01", 0xf000, 0x1000, CRC(ca7723a7) SHA1(bd92330f2d9494fa408f5a2ca300d7a755bdf489) )
-ROM_END
-
-
-ROM_START( csc )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
- ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
- ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
- ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) )
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( cscg )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
- ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
- ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
- ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
-
- 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( cscsp )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
- ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
- ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
- ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
-
- 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( cscfr )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
- ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
- ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
- ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
-
- 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( super9cc )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
- ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
- ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
- ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, BAD_DUMP CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // taken from csc, assume correct
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( super9ccg )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
- ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
- ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
- ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
-
- 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( super9ccsp )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
- ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
- ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
- ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
-
- 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( super9ccfr )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
- ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
- ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
- ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
-
- 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( feasbu )
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) ) // ST M27C64A, unknown label
@@ -2069,88 +654,7 @@ ROM_START( feag2100fr )
ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
ROM_END
-
-ROM_START( fscc9 ) // PCB label 510-1046D01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1034b01", 0xc000, 0x2000, CRC(65288753) SHA1(651f5ca5969ddd72a20cbebdec2de83c4bf10650) )
- ROM_LOAD("101-1034c02", 0xe000, 0x2000, CRC(238b092f) SHA1(7ddffc6dba822aee9d8ad6815b23024ed5cdfd26) )
-ROM_END
-
-ROM_START( fscc9b ) // PCB label 510-1046B01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) )
- ROM_LOAD("101-1034a02", 0xe000, 0x2000, CRC(ecfa0a4c) SHA1(738df99a250fad0b1da5ebeb8c92a9ad1461417b) )
-ROM_END
-
-ROM_START( fscc9c ) // PCB label 510-1046C01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) ) // HN48364P
- ROM_LOAD("101-1034b02", 0xe000, 0x2000, CRC(cbaf97d7) SHA1(7ed8e68bb74713d9e2ff1d9c037012320b7bfcbf) ) // "
-ROM_END
-
-ROM_START( fscc9ps )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("play64c1.bin", 0xc000, 0x2000, CRC(e96aa95d) SHA1(16d90cf0ef166aef579d442671290a2c43e24dfe) )
- ROM_LOAD("play64en.bin", 0xe000, 0x2000, CRC(6fa188d2) SHA1(1b9b0209c496c89ecb7f9ec07bfd9429ff9b275e) )
-ROM_END
-
-
-ROM_START( fscc12 ) // model SC12, PCB label 510-1084B01
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
- ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(ed5289b2) SHA1(9b0c7f9ae4102d4a66eb8c91d4e84b9eec2ffb3d) ) // TI TMS2732AJL-45, no label, orange sticker
- ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(0c4968c4) SHA1(965a66870b0f8ce9549418cbda09d2ff262a1504) ) // TI TMS2764JL-25, no label, red sticker
-ROM_END
-
-ROM_START( fscc12b ) // model 6086, PCB label 510-1084B01
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
- ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(45070a71) SHA1(8aeecff828f26fb7081902c757559903be272649) ) // TI TMS2732AJL-45, no label, orange sticker
- ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(183d3edc) SHA1(3296a4c3bce5209587d4a1694fce153558544e63) ) // Toshiba TMM2764D-2, no label, red sticker
-ROM_END
-
-
-ROM_START( feleg ) // model AS12(or 6085), PCB label 510-1084B01
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("feleg.1", 0x8000, 0x2000, CRC(e9df31e8) SHA1(31c52bb8f75580c82093eb950959c1bc294189a8) ) // TMM2764, no label
- ROM_LOAD("feleg.2", 0xc000, 0x2000, CRC(bed9c84b) SHA1(c12f39765b054d2ad81f747e698715ad4246806d) ) // "
- ROM_LOAD("feleg.3", 0xe000, 0x2000, CRC(b1fb49aa) SHA1(d8c9687dd564f0fa603e6d684effb1d113ac64b4) ) // "
-ROM_END
-
-
-
-ROM_START( fphantom ) // model 6100, PCB label 510.1128A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("u_3c_yellow.u3", 0x8000, 0x8000, CRC(fb7c38ae) SHA1(a1aa7637705052cb4eec92644dc79aee7ba4d77c) ) // 27C256
-
- ROM_REGION( 0x8000, "rombank", 0 )
- ROM_LOAD("u_4_white.u4", 0x0000, 0x8000, CRC(e4181ba2) SHA1(1f77d1867c6f566be98645fc252a01108f412c96) ) // 27C256
-ROM_END
-
-
-ROM_START( chesster ) // model 6120, PCB label 510.1141C01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("ch_1.3.ic9", 0x8000, 0x8000, CRC(8b42d1ad) SHA1(2161fc5ab2476fe7ca4ffc226e3cb329b8a57a01) ) // 27256, CH 1.3 on sticker
-
- ROM_REGION( 0x20000, "rombank", 0 )
- ROM_LOAD("101-1091b02.ic10", 0x0000, 0x20000, CRC(fa370e88) SHA1(a937c8f1ec295cf9539d12466993974e40771493) ) // AMI, 27C010 or equivalent
-ROM_END
-
-ROM_START( chesstera ) // model 6120, PCB label 510.1141C01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("chesster.ic9", 0x8000, 0x8000, CRC(29f9a698) SHA1(4c83ca46fd5fc9c40302e9c7f16b4ae2c18b06e6) ) // M27C256B, sticker but no label
-
- ROM_REGION( 0x20000, "rombank", 0 )
- ROM_LOAD("101-1091a02.ic10", 0x0000, 0x20000, CRC(2b4d243c) SHA1(921e51978facb502b207b4f64a73b1e74127e826) ) // AMI, 27C010 or equivalent
-ROM_END
-
-ROM_START( kishon ) // model 6120G or 6127(same), PCB label 510.1141C01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("kishon.ic9", 0x8000, 0x8000, CRC(121c007f) SHA1(652e9ea47b6bb1632d10eb0fcd7f98cdba22fce7) ) // 27C256
-
- ROM_REGION( 0x80000, "rombank", 0 )
- ROM_LOAD("kishon_v2.6_1-14-91.ic10", 0x0000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12, aka 101-1094A01
-ROM_END
+} // anonymous namespace
@@ -2158,54 +662,26 @@ ROM_END
Drivers
******************************************************************************/
-// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
-CONS( 1981, reversic, 0, 0, rsc, rsc, csc_state, empty_init, "Fidelity Electronics", "Reversi Sensory Challenger (green version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1981, csc, 0, 0, csc, csc, csc_state, init_language<0>, "Fidelity Electronics", "Champion Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1981, cscg, csc, 0, csc, csc, csc_state, init_language<1>, "Fidelity Electronics", "Champion Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1981, cscsp, csc, 0, csc, csc, csc_state, init_language<2>, "Fidelity Electronics", "Champion Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1981, cscfr, csc, 0, csc, csc, csc_state, init_language<3>, "Fidelity Electronics", "Champion Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1983, super9cc, 0, 0, su9, su9, su9_state, init_language<0>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, super9ccg, super9cc, 0, su9, su9, su9_state, init_language<1>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, super9ccsp, super9cc, 0, su9, su9, su9_state, init_language<2>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, super9ccfr, super9cc, 0, su9, su9, su9_state, init_language<3>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1983, feasbu, 0, 0, eas, eas, elite_state, init_language<0>, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, feasbug, feasbu, 0, eas, eas, elite_state, init_language<1>, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, feasbusp, feasbu, 0, eas, eas, elite_state, init_language<2>, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, feasbufr, feasbu, 0, eas, eas, elite_state, init_language<3>, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1984, feasgla, feasbu, 0, eas, eas, elite_state, init_language<0>, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1984, feasglag, feasbu, 0, eas, eas, elite_state, init_language<1>, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1984, feasglasp, feasbu, 0, eas, eas, elite_state, init_language<2>, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1984, feasglafr, feasbu, 0, eas, eas, elite_state, init_language<3>, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1982, fpres, 0, 0, pc, eas, elite_state, init_language<0>, "Fidelity Electronics", "Prestige Challenger (original program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1982, fpresg, fpres, 0, pc, eas, elite_state, init_language<1>, "Fidelity Electronics", "Prestige Challenger (original program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1982, fpressp, fpres, 0, pc, eas, elite_state, init_language<2>, "Fidelity Electronics", "Prestige Challenger (original program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1982, fpresfr, fpres, 0, pc, eas, elite_state, init_language<3>, "Fidelity Electronics", "Prestige Challenger (original program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fpresbu, fpres, 0, pc, eas, elite_state, init_language<0>, "Fidelity Electronics", "Prestige Challenger (Budapest program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fpresbug, fpres, 0, pc, eas, elite_state, init_language<1>, "Fidelity Electronics", "Prestige Challenger (Budapest program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fpresbusp, fpres, 0, pc, eas, elite_state, init_language<2>, "Fidelity Electronics", "Prestige Challenger (Budapest program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fpresbufr, fpres, 0, pc, eas, elite_state, init_language<3>, "Fidelity Electronics", "Prestige Challenger (Budapest program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1986, feag2100, 0, 0, eag, eag, elite_state, init_eag<0>, "Fidelity Electronics", "Elite Avant Garde 2100 (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, feag2100g, feag2100, 0, eag, eag, elite_state, init_eag<1>, "Fidelity Electronics", "Elite Avant Garde 2100 (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, feag2100sp, feag2100, 0, eag, eag, elite_state, init_eag<2>, "Fidelity Electronics", "Elite Avant Garde 2100 (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, feag2100fr, feag2100, 0, eag, eag, elite_state, init_eag<3>, "Fidelity Electronics", "Elite Avant Garde 2100 (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1982, fscc9, 0, 0, sc9d, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. D)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // aka version "B"
-CONS( 1982, fscc9b, fscc9, 0, sc9b, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1982, fscc9c, fscc9, 0, sc9b, sc9c, sc9c_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fscc9ps, fscc9, 0, playmatic, playmatic, sc9_state, empty_init, "Fidelity Electronics", "Sensory 9 Playmatic 'S'", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // Fidelity West Germany
-
-CONS( 1984, fscc12, 0, 0, sc12, sc12, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
-CONS( 1984, fscc12b, fscc12, 0, sc12b, sc12b, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
-
-CONS( 1985, feleg, 0, 0, as12, as12, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
-
-CONS( 1988, fphantom, 0, 0, fphantom, fphantom, phantom_state, init_fphantom, "Fidelity Electronics", "Phantom (Fidelity)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-
-CONS( 1990, chesster, 0, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger (V1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, chesstera, chesster, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1991, kishon, chesster, 0, kishon, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Kishon Chesster", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1983, feasbu, 0, 0, eas, eas, elite_state, init_language<0>, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, feasbug, feasbu, 0, eas, eas, elite_state, init_language<1>, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, feasbusp, feasbu, 0, eas, eas, elite_state, init_language<2>, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, feasbufr, feasbu, 0, eas, eas, elite_state, init_language<3>, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1984, feasgla, feasbu, 0, eas, eas, elite_state, init_language<0>, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1984, feasglag, feasbu, 0, eas, eas, elite_state, init_language<1>, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1984, feasglasp, feasbu, 0, eas, eas, elite_state, init_language<2>, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1984, feasglafr, feasbu, 0, eas, eas, elite_state, init_language<3>, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1982, fpres, 0, 0, pc, eas, elite_state, init_language<0>, "Fidelity Electronics", "Prestige Challenger (original program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1982, fpresg, fpres, 0, pc, eas, elite_state, init_language<1>, "Fidelity Electronics", "Prestige Challenger (original program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1982, fpressp, fpres, 0, pc, eas, elite_state, init_language<2>, "Fidelity Electronics", "Prestige Challenger (original program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1982, fpresfr, fpres, 0, pc, eas, elite_state, init_language<3>, "Fidelity Electronics", "Prestige Challenger (original program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fpresbu, fpres, 0, pc, eas, elite_state, init_language<0>, "Fidelity Electronics", "Prestige Challenger (Budapest program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fpresbug, fpres, 0, pc, eas, elite_state, init_language<1>, "Fidelity Electronics", "Prestige Challenger (Budapest program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fpresbusp, fpres, 0, pc, eas, elite_state, init_language<2>, "Fidelity Electronics", "Prestige Challenger (Budapest program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fpresbufr, fpres, 0, pc, eas, elite_state, init_language<3>, "Fidelity Electronics", "Prestige Challenger (Budapest program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1986, feag2100, 0, 0, eag, eag, elite_state, init_eag<0>, "Fidelity Electronics", "Elite Avant Garde 2100 (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, feag2100g, feag2100, 0, eag, eag, elite_state, init_eag<1>, "Fidelity Electronics", "Elite Avant Garde 2100 (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, feag2100sp, feag2100, 0, eag, eag, elite_state, init_eag<2>, "Fidelity Electronics", "Elite Avant Garde 2100 (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, feag2100fr, feag2100, 0, eag, eag, elite_state, init_eag<3>, "Fidelity Electronics", "Elite Avant Garde 2100 (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_as12.cpp b/src/mame/drivers/fidel_as12.cpp
new file mode 100644
index 00000000000..73098a6119a
--- /dev/null
+++ b/src/mame/drivers/fidel_as12.cpp
@@ -0,0 +1,189 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:yoyo_chessboard
+/******************************************************************************
+
+Elegance Chess Challenger (AS12)
+----------------
+R65C02P4 CPU @ 4MHz
+3*8KB ROM(TMM2764), 2*2KB RAM(HM6116)
+PCB label 510-1084B01
+
+This is on the SC12B board, with enough modifications to support more leds and
+magnetic chess board sensors. See fidel_sc12.cpp for a more technical description.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_as12.lh" // clickable
+
+
+namespace {
+
+class as12_state : public fidelbase_state
+{
+public:
+ as12_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ void as12(machine_config &config);
+
+private:
+ void main_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_WRITE8_MEMBER(led_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+void as12_state::prepare_display()
+{
+ // 8*8(+1) chessboard leds
+ display_matrix(8, 9, m_led_data, m_inp_mux);
+}
+
+WRITE8_MEMBER(as12_state::control_w)
+{
+ // d0-d3: 74245 P0-P3
+ // 74245 Q0-Q8: input mux, led select
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
+ m_inp_mux = bitswap<9>(sel,5,8,7,6,4,3,1,0,2);
+ prepare_display();
+
+ // 74245 Q9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // d4,d5: printer?
+ // d6,d7: N/C?
+}
+
+WRITE8_MEMBER(as12_state::led_w)
+{
+ // a0-a2,d0: led data via NE591N
+ m_led_data = (data & 1) << offset;
+ prepare_display();
+}
+
+READ8_MEMBER(as12_state::input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ u8 inp = bitswap<8>(read_inputs(9),4,3,2,1,0,5,6,7);
+ return (inp >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void as12_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x1800, 0x1807).w(FUNC(as12_state::led_w)).nopr();
+ map(0x2000, 0x5fff).r(FUNC(as12_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(as12_state::control_w));
+ map(0x8000, 0x9fff).rom();
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(as12_state::input_r));
+ map(0xc000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( as12 )
+ PORT_INCLUDE( fidel_cpu_div_4 )
+ PORT_INCLUDE( fidel_cb_magnets )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / 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")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void as12_state::as12(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 4_MHz_XTAL); // R65C02P4
+ m_maincpu->set_addrmap(AS_PROGRAM, &as12_state::div_trampoline);
+ ADDRESS_MAP_BANK(config, m_mainmap).set_map(&as12_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+
+ TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
+
+ const attotime irq_period = attotime::from_hz(585); // from 556 timer (22nF, 110K, 1K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(as12_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(as12_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_as12);
+
+ /* 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.set_output(5.0);
+ 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"));
+ cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( feleg ) // model AS12(or 6085), PCB label 510-1084B01
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("feleg.1", 0x8000, 0x2000, CRC(e9df31e8) SHA1(31c52bb8f75580c82093eb950959c1bc294189a8) ) // TMM2764, no label
+ ROM_LOAD("feleg.2", 0xc000, 0x2000, CRC(bed9c84b) SHA1(c12f39765b054d2ad81f747e698715ad4246806d) ) // "
+ ROM_LOAD("feleg.3", 0xe000, 0x2000, CRC(b1fb49aa) SHA1(d8c9687dd564f0fa603e6d684effb1d113ac64b4) ) // "
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1985, feleg, 0, 0, as12, as12, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
diff --git a/src/mame/drivers/fidel_chesster.cpp b/src/mame/drivers/fidel_chesster.cpp
new file mode 100644
index 00000000000..c3e2aea73bf
--- /dev/null
+++ b/src/mame/drivers/fidel_chesster.cpp
@@ -0,0 +1,212 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:yoyo_chessboard
+/******************************************************************************
+
+Chesster (model 6120)
+There is also a German version titled Kishon Chesster (model 6120G, or 6127)
+----------------
+
+8*(8+1) buttons, 8+8+1 LEDs
+8KB RAM(UM6264-12), 32KB ROM(M27C256B)
+Ricoh RP65C02G CPU, 5MHz XTAL
+8-bit DAC speech timed via IRQ, 128KB ROM(AMI custom label)
+PCB label 510.1141C01
+
+I/O is via TTL, memory map is similar to Designer Display
+
+The speech technology was invented by Forrest S. Mozer(same person that invented
+the S14001A in the 70s), this time a 65C02 software solution.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_chesster.lh" // clickable
+
+
+namespace {
+
+class chesster_state : public fidelbase_state
+{
+public:
+ chesster_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void chesster(machine_config &config);
+ void kishon(machine_config &config);
+
+ void init_chesster();
+
+private:
+ void main_map(address_map &map);
+
+ int m_numbanks;
+
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+void chesster_state::init_chesster()
+{
+ m_numbanks = memregion("rombank")->bytes() / 0x4000;
+ m_rombank->configure_entries(0, m_numbanks, memregion("rombank")->base(), 0x4000);
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(chesster_state::control_w)
+{
+ // a0-a2,d7: 74259(1)
+ u8 mask = 1 << offset;
+ m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
+
+ // 74259 Q4-Q7: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 74259 Q0,Q1: led select (active low)
+ display_matrix(9, 2, m_inp_mux, ~m_led_select & 3);
+
+ // 74259 Q2,Q3: speechrom A14,A15
+ // a0-a2,d0: 74259(2) Q3,Q2,Q0 to A16,A17,A18
+ m_speech_bank = (m_speech_bank & ~mask) | ((data & 1) ? mask : 0);
+ u8 bank = (m_led_select >> 2 & 3) | bitswap<3>(m_speech_bank, 0,2,3) << 2;
+ m_rombank->set_entry(bank & (m_numbanks - 1));
+}
+
+READ8_MEMBER(chesster_state::input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void chesster_state::main_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(chesster_state::input_r), FUNC(chesster_state::control_w));
+ map(0x4000, 0x7fff).bankr("rombank");
+ map(0x6000, 0x6000).mirror(0x1fff).w("dac8", FUNC(dac_byte_interface::data_w));
+ map(0x8000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( chesster )
+ PORT_INCLUDE( fidel_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / No")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Yes")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Repeat")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Replay")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void chesster_state::chesster(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 5_MHz_XTAL); // RP65C02G
+ m_maincpu->set_addrmap(AS_PROGRAM, &chesster_state::main_map);
+
+ const attotime irq_period = attotime::from_hz(9615); // R/C circuit, measured
+ TIMER(config, m_irq_on).configure_periodic(FUNC(chesster_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(2600)); // active for 2.6us
+ TIMER(config, "irq_off").configure_periodic(FUNC(chesster_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_chesster);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_8BIT_R2R(config, "dac8", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // m74hc374b1.ic1 + 8l513_02.z2
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.set_output(5.0);
+ vref.add_route(0, "dac8", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac8", -1.0, DAC_VREF_NEG_INPUT);
+}
+
+void chesster_state::kishon(machine_config &config)
+{
+ chesster(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(3.579545_MHz_XTAL);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( chesster ) // model 6120, PCB label 510.1141C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("ch_1.3.ic9", 0x8000, 0x8000, CRC(8b42d1ad) SHA1(2161fc5ab2476fe7ca4ffc226e3cb329b8a57a01) ) // 27256, CH 1.3 on sticker
+
+ ROM_REGION( 0x20000, "rombank", 0 )
+ ROM_LOAD("101-1091b02.ic10", 0x0000, 0x20000, CRC(fa370e88) SHA1(a937c8f1ec295cf9539d12466993974e40771493) ) // AMI, 27C010 or equivalent
+ROM_END
+
+ROM_START( chesstera ) // model 6120, PCB label 510.1141C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("chesster.ic9", 0x8000, 0x8000, CRC(29f9a698) SHA1(4c83ca46fd5fc9c40302e9c7f16b4ae2c18b06e6) ) // M27C256B, sticker but no label
+
+ ROM_REGION( 0x20000, "rombank", 0 )
+ ROM_LOAD("101-1091a02.ic10", 0x0000, 0x20000, CRC(2b4d243c) SHA1(921e51978facb502b207b4f64a73b1e74127e826) ) // AMI, 27C010 or equivalent
+ROM_END
+
+ROM_START( kishon ) // model 6120G or 6127(same), PCB label 510.1141C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("kishon.ic9", 0x8000, 0x8000, CRC(121c007f) SHA1(652e9ea47b6bb1632d10eb0fcd7f98cdba22fce7) ) // 27C256
+
+ ROM_REGION( 0x80000, "rombank", 0 )
+ ROM_LOAD("kishon_v2.6_1-14-91.ic10", 0x0000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12, aka 101-1094A01
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1990, chesster, 0, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger (V1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, chesstera, chesster, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1991, kishon, chesster, 0, kishon, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Kishon Chesster", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_csc.cpp b/src/mame/drivers/fidel_csc.cpp
new file mode 100644
index 00000000000..1ef96680820
--- /dev/null
+++ b/src/mame/drivers/fidel_csc.cpp
@@ -0,0 +1,696 @@
+// license:BSD-3-Clause
+// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap
+// thanks-to:Berger,yoyo_chessboard
+/******************************************************************************
+
+Fidelity CSC(and derived) hardware
+- Champion Sensory Chess Challenger
+- Super 9 Sensory Chess Challenger
+- Reversi Sensory Challenger
+
+*******************************************************************************
+
+Champion Sensory Chess Challenger (CSC)
+---------------------------------------
+RE notes by Kevin Horton
+
+Memory map:
+-----------
+0000-07FF: 2K of RAM
+0800-0FFF: 1K of RAM (note: mirrored twice)
+1000-17FF: PIA 1 (display, TSI speech chip)
+1800-1FFF: PIA 0 (keypad, LEDs)
+2000-3FFF: 101-64019 ROM*
+4000-7FFF: mirror of 0000-3FFF
+8000-9FFF: not used
+A000-BFFF: 101-1025A03 ROM
+C000-DFFF: 101-1025A02 ROM
+E000-FDFF: 101-1025A01 ROM
+FE00-FFFF: 512 byte 74S474 PROM
+
+*: 101-64019 is also used on the VSC(fidel_vsc.cpp). It contains the opening book
+and "64 greatest games", as well as some Z80 code. Obviously the latter is unused
+on the CSC.
+
+CPU is a 6502 running at 1.95MHz (3.9MHz resonator, divided by 2)
+
+NMI is not used.
+IRQ is connected to a 600Hz oscillator (38.4KHz divided by 64).
+Reset is connected to a power-on reset circuit.
+
+PIA 1:
+------
+PA0 - 7seg segments E, TSI A0
+PA1 - 7seg segments D, TSI A1
+PA2 - 7seg segments C, TSI A2
+PA3 - 7seg segments H, TSI A3
+PA4 - 7seg segments G, TSI A4
+PA5 - 7seg segments F, TSI A5
+PA6 - 7seg segments B
+PA7 - 7seg segments A
+
+PB0 - A12 on speech ROM (if used... not used on this model, ROM is 4K)
+PB1 - START line on TSI
+PB2 - white wire
+PB3 - BUSY line from TSI
+PB4 - hi/lo TSI speaker volume
+PB5 - button row 9
+PB6 - selection jumper (resistor to 5V)
+PB7 - selection jumper (resistor to ground)
+
+CA1 - NC
+CA2 - violet wire
+
+CB1 - NC
+CB2 - NC (connects to pin 14 of soldered connector)
+
+PIA 0:
+------
+PA0 - button row 1
+PA1 - button row 2
+PA2 - button row 3
+PA3 - button row 4
+PA4 - button row 5
+PA5 - button row 6
+PA6 - 7442 selector bit 0
+PA7 - 7442 selector bit 1
+
+PB0 - LED row 1
+PB1 - LED row 2
+PB2 - LED row 3
+PB3 - LED row 4
+PB4 - LED row 5
+PB5 - LED row 6
+PB6 - LED row 7
+PB7 - LED row 8
+
+CA1 - button row 7
+CA2 - selector bit 3
+
+CB1 - button row 8
+CB2 - selector bit 2
+
+Selector: (attached to PIA 0, outputs 1 of 10 pins low. 7442)
+---------
+output # (selected turns this column on, and all others off)
+0 - LED column A, button column A, 7seg digit 1
+1 - LED column B, button column B, 7seg digit 2
+2 - LED column C, button column C, 7seg digit 3
+3 - LED column D, button column D, 7seg digit 4
+4 - LED column E, button column E
+5 - LED column F, button column F
+6 - LED column G, button column G
+7 - LED column H, button column H
+8 - button column I
+9 - Tone line (toggle to make a tone in the buzzer)
+
+The rows/columns are indicated on the game board:
+
+ ABCDEFGH I
+--------------
+| | 8
+| | 7
+| | 6
+| | 5
+| | 4
+| | 3
+| | 2
+| | 1
+--------------
+
+The "lone LED" is above the control column.
+column I is the "control column" on the right for starting a new game, etc.
+
+The upper 6 buttons are connected as such:
+
+column A - speak
+column B - RV
+column C - TM
+column D - LV
+column E - DM
+column F - ST
+
+these 6 buttons use row 9 (connects to PIA 1)
+
+LED display:
+------------
+43 21 (digit number)
+-----
+88:88
+
+The LED display is four 7 segment digits. normal ABCDEFG lettering is used for segments.
+
+The upper dot is connected to digit 3 common
+The lower dot is connected to digit 4 common
+The lone LED is connected to digit 1 common
+
+All three of the above are called "segment H".
+
+*******************************************************************************
+
+Super 9 Sensory Chess Challenger (SU9/DS9)
+This is basically the Fidelity Elite A/S program on CSC hardware.
+Model DS9(Deluxe) has a 5MHz XTAL, but is otherwise same.
+---------------------------------
+
+R6502AP CPU, 1.95MHz(3.9MHz resonator)
+2 RAM chips, assume 4KB
+2*8KB ROM + 1*2KB ROM
+built-in CB9 module
+
+See CSC description above for more information.
+
+*******************************************************************************
+
+Reversi Sensory Challenger (RSC)
+The 1st version came out in 1980, a program revision was released in 1981.
+Another distinction is the board color and layout, the 1981 version is green.
+---------------------------------
+
+8*(8+1) buttons, 8*8+1 LEDs
+1KB RAM(2*2114), 4KB ROM
+MOS MPS 6502B CPU, frequency unknown
+MOS MPS 6520 PIA, I/O is nearly same as CSC's PIA 0
+PCB label 510-1035A01
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/m6502.h"
+#include "machine/6821pia.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_csc.lh" // clickable, with preliminary boardpieces simulation
+#include "fidel_rsc_v2.lh" // clickable
+#include "fidel_su9.lh" // clickable
+
+
+namespace {
+
+class csc_state : public fidelbase_state
+{
+public:
+ csc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_pia(*this, "pia%u", 0)
+ { }
+
+ // machine drivers
+ void csc(machine_config &config);
+ void su9(machine_config &config);
+ void rsc(machine_config &config);
+
+protected:
+ // devices/pointers
+ optional_device_array<pia6821_device, 2> m_pia;
+
+ // address maps
+ void csc_map(address_map &map);
+ void su9_map(address_map &map);
+ void rsc_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_READ8_MEMBER(speech_r);
+ DECLARE_WRITE8_MEMBER(pia0_pa_w);
+ DECLARE_WRITE8_MEMBER(pia0_pb_w);
+ DECLARE_READ8_MEMBER(pia0_pa_r);
+ DECLARE_WRITE_LINE_MEMBER(pia0_ca2_w);
+ DECLARE_WRITE_LINE_MEMBER(pia0_cb2_w);
+ DECLARE_READ_LINE_MEMBER(pia0_ca1_r);
+ DECLARE_READ_LINE_MEMBER(pia0_cb1_r);
+ DECLARE_WRITE8_MEMBER(pia1_pa_w);
+ DECLARE_WRITE8_MEMBER(pia1_pb_w);
+ DECLARE_READ8_MEMBER(pia1_pb_r);
+ DECLARE_WRITE_LINE_MEMBER(pia1_ca2_w);
+};
+
+class su9_state : public csc_state
+{
+public:
+ su9_state(const machine_config &mconfig, device_type type, const char *tag) :
+ csc_state(mconfig, type, tag)
+ { }
+
+ DECLARE_INPUT_CHANGED_MEMBER(su9_cpu_freq) { su9_set_cpu_freq(); }
+
+protected:
+ virtual void machine_reset() override;
+ void su9_set_cpu_freq();
+};
+
+void su9_state::machine_reset()
+{
+ csc_state::machine_reset();
+ su9_set_cpu_freq();
+}
+
+void su9_state::su9_set_cpu_freq()
+{
+ // SU9 CPU is clocked 1.95MHz, DS9 is 2.5MHz
+ m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (5_MHz_XTAL/2) : (3.9_MHz_XTAL/2));
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+void csc_state::prepare_display()
+{
+ // 7442 0-8: led select, input mux
+ m_inp_mux = 1 << m_led_select & 0x3ff;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(m_inp_mux, 9));
+
+ // 7seg leds+H (not on all models), 8*8(+1) chessboard leds
+ set_display_segmask(0xf, 0x7f);
+ display_matrix(16, 9, m_led_data << 8 | m_7seg_data, m_inp_mux);
+}
+
+READ8_MEMBER(csc_state::speech_r)
+{
+ return m_speech_rom[m_speech_bank << 12 | offset];
+}
+
+
+// 6821 PIA 0
+
+READ8_MEMBER(csc_state::pia0_pa_r)
+{
+ // d0-d5: button row 0-5 (active low)
+ return (read_inputs(9) & 0x3f) ^ 0xff;
+}
+
+WRITE8_MEMBER(csc_state::pia0_pa_w)
+{
+ // d6,d7: 7442 A0,A1
+ m_led_select = (m_led_select & ~3) | (data >> 6 & 3);
+ prepare_display();
+}
+
+WRITE8_MEMBER(csc_state::pia0_pb_w)
+{
+ // d0-d7: led row data
+ m_led_data = data;
+ prepare_display();
+}
+
+READ_LINE_MEMBER(csc_state::pia0_ca1_r)
+{
+ // button row 6 (active low)
+ return ~read_inputs(9) >> 6 & 1;
+}
+
+READ_LINE_MEMBER(csc_state::pia0_cb1_r)
+{
+ // button row 7 (active low)
+ return ~read_inputs(9) >> 7 & 1;
+}
+
+WRITE_LINE_MEMBER(csc_state::pia0_cb2_w)
+{
+ // 7442 A2
+ m_led_select = (m_led_select & ~4) | (state ? 4 : 0);
+ prepare_display();
+}
+
+WRITE_LINE_MEMBER(csc_state::pia0_ca2_w)
+{
+ // 7442 A3
+ m_led_select = (m_led_select & ~8) | (state ? 8 : 0);
+ prepare_display();
+}
+
+
+// 6821 PIA 1
+
+WRITE8_MEMBER(csc_state::pia1_pa_w)
+{
+ // d0-d5: TSI C0-C5
+ m_speech->data_w(space, 0, data & 0x3f);
+
+ // d0-d7: data for the 4 7seg leds, bits are ABFGHCDE (H is extra led)
+ m_7seg_data = bitswap<8>(data,0,1,5,6,7,2,3,4);
+ prepare_display();
+}
+
+WRITE8_MEMBER(csc_state::pia1_pb_w)
+{
+ // d0: speech ROM A12
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = data & 1;
+
+ // d1: TSI START line
+ m_speech->start_w(data >> 1 & 1);
+
+ // d4: lower TSI volume
+ m_speech->set_output_gain(0, (data & 0x10) ? 0.5 : 1.0);
+}
+
+READ8_MEMBER(csc_state::pia1_pb_r)
+{
+ // d2: printer?
+ u8 data = 0x04;
+
+ // d3: TSI BUSY line
+ if (m_speech->busy_r())
+ data |= 0x08;
+
+ // d5: button row 8 (active low)
+ // d6,d7: language switches(hardwired with 2 resistors/jumpers)
+ data |= (~read_inputs(9) >> 3 & 0x20) | (~m_language << 6 & 0xc0);
+
+ return data;
+}
+
+WRITE_LINE_MEMBER(csc_state::pia1_ca2_w)
+{
+ // printer?
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void csc_state::csc_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x07ff).mirror(0x4000).ram();
+ map(0x0800, 0x0bff).mirror(0x4400).ram();
+ map(0x1000, 0x1003).mirror(0x47fc).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x1800, 0x1803).mirror(0x47fc).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x2000, 0x3fff).mirror(0x4000).rom();
+ map(0xa000, 0xffff).rom();
+}
+
+void csc_state::su9_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x1000, 0x1003).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x1800, 0x1803).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x2000, 0x3fff).rom();
+ map(0xa000, 0xa7ff).rom();
+ map(0xc000, 0xffff).rom();
+}
+
+void csc_state::rsc_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x03ff).ram();
+ map(0x2000, 0x2003).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0xf000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( csc )
+ PORT_INCLUDE( fidel_cb_buttons )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV")
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
+
+ PORT_MODIFY("IN.5")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST")
+
+ 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")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( su9 )
+ PORT_INCLUDE( csc )
+
+ PORT_MODIFY("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
+
+ PORT_START("FAKE")
+ PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, su9_state, su9_cpu_freq, nullptr) // factory set
+ PORT_CONFSETTING( 0x00, "1.95MHz (SU9)" )
+ PORT_CONFSETTING( 0x01, "2.5MHz (DS9)" )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rsc )
+ PORT_INCLUDE( fidel_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("ST")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("RV")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("DM")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("CL")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("LV")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PV")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void csc_state::csc(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // from 3.9MHz resonator
+ m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::csc_map);
+
+ const attotime irq_period = attotime::from_hz(38.4_kHz_XTAL/64); // through 4060 IC, 600Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(csc_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
+ TIMER(config, "irq_off").configure_periodic(FUNC(csc_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ PIA6821(config, m_pia[0], 0);
+ m_pia[0]->readpa_handler().set(FUNC(csc_state::pia0_pa_r));
+ m_pia[0]->readca1_handler().set(FUNC(csc_state::pia0_ca1_r));
+ m_pia[0]->readcb1_handler().set(FUNC(csc_state::pia0_cb1_r));
+ m_pia[0]->writepa_handler().set(FUNC(csc_state::pia0_pa_w));
+ m_pia[0]->writepb_handler().set(FUNC(csc_state::pia0_pb_w));
+ m_pia[0]->ca2_handler().set(FUNC(csc_state::pia0_ca2_w));
+ m_pia[0]->cb2_handler().set(FUNC(csc_state::pia0_cb2_w));
+
+ PIA6821(config, m_pia[1], 0);
+ m_pia[1]->readpb_handler().set(FUNC(csc_state::pia1_pb_r));
+ m_pia[1]->writepa_handler().set(FUNC(csc_state::pia1_pa_w));
+ m_pia[1]->writepb_handler().set(FUNC(csc_state::pia1_pb_w));
+ m_pia[1]->ca2_handler().set(FUNC(csc_state::pia1_ca2_w));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_csc);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
+ m_speech->ext_read().set(FUNC(csc_state::speech_r));
+ 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.set_output(5.0);
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+void csc_state::su9(machine_config &config)
+{
+ csc(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::su9_map);
+ config.set_default_layout(layout_fidel_su9);
+}
+
+void csc_state::rsc(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 1800000); // measured approx 1.81MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::rsc_map);
+
+ const attotime irq_period = attotime::from_hz(546); // from 555 timer, measured
+ TIMER(config, m_irq_on).configure_periodic(FUNC(csc_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_usec(38)); // active for 38us
+ TIMER(config, "irq_off").configure_periodic(FUNC(csc_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ PIA6821(config, m_pia[0], 0); // MOS 6520
+ m_pia[0]->readpa_handler().set(FUNC(csc_state::pia0_pa_r));
+ m_pia[0]->readca1_handler().set(FUNC(csc_state::pia0_ca1_r));
+ m_pia[0]->readcb1_handler().set(FUNC(csc_state::pia0_cb1_r));
+ m_pia[0]->writepa_handler().set(FUNC(csc_state::pia0_pa_w));
+ m_pia[0]->writepb_handler().set(FUNC(csc_state::pia0_pb_w));
+ m_pia[0]->ca2_handler().set(FUNC(csc_state::pia0_ca2_w));
+ m_pia[0]->cb2_handler().set(FUNC(csc_state::pia0_cb2_w));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_rsc_v2);
+
+ /* 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.set_output(5.0);
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( csc )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
+ ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
+ ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
+ ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ROM_END
+
+ROM_START( cscg )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
+ ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
+ ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
+ ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
+
+ 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( cscsp )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
+ ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
+ ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
+ ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
+
+ 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( cscfr )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
+ ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
+ ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
+ ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
+
+ 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( super9cc )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
+ ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
+ ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
+ ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROM_LOAD("101-32107", 0x0000, 0x1000, BAD_DUMP CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // taken from csc, assume correct
+ ROM_RELOAD( 0x1000, 0x1000)
+ROM_END
+
+ROM_START( super9ccg )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
+ ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
+ ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
+ ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
+
+ 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( super9ccsp )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
+ ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
+ ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
+ ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
+
+ 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( super9ccfr )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
+ ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
+ ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
+ ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
+
+ 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( reversic )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1000a01", 0xf000, 0x1000, CRC(ca7723a7) SHA1(bd92330f2d9494fa408f5a2ca300d7a755bdf489) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1981, csc, 0, 0, csc, csc, csc_state, init_language<0>, "Fidelity Electronics", "Champion Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1981, cscg, csc, 0, csc, csc, csc_state, init_language<1>, "Fidelity Electronics", "Champion Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1981, cscsp, csc, 0, csc, csc, csc_state, init_language<2>, "Fidelity Electronics", "Champion Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1981, cscfr, csc, 0, csc, csc, csc_state, init_language<3>, "Fidelity Electronics", "Champion Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1983, super9cc, 0, 0, su9, su9, su9_state, init_language<0>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, super9ccg, super9cc, 0, su9, su9, su9_state, init_language<1>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, super9ccsp, super9cc, 0, su9, su9, su9_state, init_language<2>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, super9ccfr, super9cc, 0, su9, su9, su9_state, init_language<3>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1981, reversic, 0, 0, rsc, rsc, csc_state, empty_init, "Fidelity Electronics", "Reversi Sensory Challenger (green version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_desdis.cpp b/src/mame/drivers/fidel_desdis.cpp
index 26b42e59d76..49f28c7519e 100644
--- a/src/mame/drivers/fidel_desdis.cpp
+++ b/src/mame/drivers/fidel_desdis.cpp
@@ -3,6 +3,10 @@
// thanks-to:Berger,yoyo_chessboard
/******************************************************************************
+Fidelity Designer Display series (6502-based displayless Designer is in fidel_excel.cpp)
+
+*******************************************************************************
+
Designer 2100 Display (model 6106)
----------------
8KB RAM(MS6264L-10), 2*32KB ROM(27C256)
@@ -12,7 +16,7 @@ PCB label 510.1130A01
Designer 2000 Display (model 6105): same hardware, no bookrom, 3MHz
-******************************************************************************
+*******************************************************************************
Designer Mach III Master 2265 (model 6113)
------------------------------------------
diff --git a/src/mame/drivers/fidel_eag68k.cpp b/src/mame/drivers/fidel_eag68k.cpp
index 8ec963c0dbb..7aec1922f51 100644
--- a/src/mame/drivers/fidel_eag68k.cpp
+++ b/src/mame/drivers/fidel_eag68k.cpp
@@ -16,7 +16,7 @@ TODO:
at twice the frequency due to lack of superscalar.
- V11 beeper is too high pitched, obviously related to wrong CPU type too
-******************************************************************************
+*******************************************************************************
Excel 68000 (model 6094)
------------------------
@@ -32,7 +32,7 @@ Mach IV has 2*256KB DRAM, and a daughterboard(510.1123B01) for the 68020.
I/O is via TTL, overall very similar to EAG.
-******************************************************************************
+*******************************************************************************
Elite Avant Garde (EAG, model 6114)
-----------------------------------
@@ -82,7 +82,7 @@ Memory map: (of what is known)
700002-700003 R lo d7: 74251: keypad row 8
604000-607FFF: 16KB EEPROM
-******************************************************************************
+*******************************************************************************
Elite Avant Garde (EAG, model 6117)
-----------------------------------
diff --git a/src/mame/drivers/fidel_excel.cpp b/src/mame/drivers/fidel_excel.cpp
index 14043e3d52f..ea7e7f96087 100644
--- a/src/mame/drivers/fidel_excel.cpp
+++ b/src/mame/drivers/fidel_excel.cpp
@@ -9,7 +9,7 @@ TODO:
- granits gives error beeps at start, need to press clear to play
- granits buttons seem too sensitive
-******************************************************************************
+*******************************************************************************
Voice Excellence (model 6092)
----------------
@@ -110,7 +110,7 @@ VFD display, and some buttons for controlling the clock. IRQ frequency is double
presumedly for using the blinking led as seconds counter. It only tracks player time,
not of the opponent. And it obviously doesn't show chessmove coordinates either.
-******************************************************************************
+*******************************************************************************
Designer 2000 (model 6102)
----------------
diff --git a/src/mame/drivers/fidel_phantom.cpp b/src/mame/drivers/fidel_phantom.cpp
new file mode 100644
index 00000000000..0ebd0f5cd29
--- /dev/null
+++ b/src/mame/drivers/fidel_phantom.cpp
@@ -0,0 +1,144 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+
+Fidelity Phantom Chess Challenger
+
+TODO:
+- everything
+
+*******************************************************************************
+
+Fidelity licensed the design of the Milton/Phantom motorized chessboard and released
+their own version. It has a small LCD panel added, the rest looks nearly the same from
+the outside. After Fidelity was taken over by H&G, it was rereleased in 1990 as the
+Mephisto Phantom. This is assumed to be identical.
+
+Phantom (model 6100)
+----------------
+R65C02P4, XTAL marked 4.91?200
+2*32KB ROM 27C256-15, 8KB RAM MS6264L-10
+LCD driver, display panel for digits
+magnetized x/y motor under chessboard, chesspieces have magnet underneath
+piezo speaker, LEDs, 8*8 chessboard buttons
+PCB label 510.1128A01
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+//#include "fidel_phantom.lh" // clickable
+
+
+namespace {
+
+class phantom_state : public fidelbase_state
+{
+public:
+ phantom_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ void fphantom(machine_config &config);
+ void init_fphantom();
+
+private:
+ void main_map(address_map &map);
+ virtual void machine_reset() override;
+};
+
+void phantom_state::machine_reset()
+{
+ fidelbase_state::machine_reset();
+ m_rombank->set_entry(0);
+}
+
+void phantom_state::init_fphantom()
+{
+ m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+//..
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void phantom_state::main_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0x4000, 0x7fff).bankr("rombank");
+ map(0x8000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( fphantom )
+ PORT_INCLUDE( fidel_cb_buttons )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void phantom_state::fphantom(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 4.9152_MHz_XTAL); // R65C02P4
+ m_maincpu->set_periodic_int(FUNC(phantom_state::irq0_line_hold), attotime::from_hz(600)); // guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &phantom_state::main_map);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ //config.set_default_layout(layout_fidel_phantom);
+
+ /* 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.set_output(5.0);
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fphantom ) // model 6100, PCB label 510.1128A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("u_3c_yellow.u3", 0x8000, 0x8000, CRC(fb7c38ae) SHA1(a1aa7637705052cb4eec92644dc79aee7ba4d77c) ) // 27C256
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("u_4_white.u4", 0x0000, 0x8000, CRC(e4181ba2) SHA1(1f77d1867c6f566be98645fc252a01108f412c96) ) // 27C256
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1988, fphantom, 0, 0, fphantom, fphantom, phantom_state, init_fphantom, "Fidelity Electronics", "Phantom Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/fidel_sc12.cpp b/src/mame/drivers/fidel_sc12.cpp
new file mode 100644
index 00000000000..f58b6828912
--- /dev/null
+++ b/src/mame/drivers/fidel_sc12.cpp
@@ -0,0 +1,241 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger,yoyo_chessboard
+/******************************************************************************
+
+Sensory 12 Chess Challenger (SC12-B, 6086)
+4 versions are known to exist: A,B,C, and X, with increasing CPU speed.
+---------------------------------
+RE information from netlist by Berger
+
+8*(8+1) buttons, 8+8+2 red LEDs
+DIN 41524C printer port
+36-pin edge connector
+CPU is a R65C02P4, running at 4MHz*
+
+*By default, the CPU frequency is lowered on A13/A14 access, with a factory-set jumper:
+/2 on model SC12(1.5MHz), /4 on model 6086(1MHz)
+
+NE556 dual-timer IC:
+- timer#1, one-shot at power-on, to CPU _RESET
+- timer#2: R1=82K+50K pot at 26K, R2=1K, C=22nF, to CPU _IRQ: ~596Hz, active low=15.25us
+
+Memory map:
+-----------
+0000-0FFF: 4K RAM (2016 * 2)
+2000-5FFF: cartridge
+6000-7FFF: control(W)
+8000-9FFF: 8K ROM SSS SCM23C65E4
+A000-BFFF: keypad(R)
+C000-DFFF: 4K ROM TI TMS2732AJL-45
+E000-FFFF: 8K ROM Toshiba TMM2764D-2
+
+control: (74LS377)
+--------
+Q0-Q3: 7442 A0-A3
+Q4: enable printer port pin 1 input
+Q5: printer port pin 5 output
+Q6,Q7: LEDs common anode
+
+7442 0-8: input mux and LEDs cathode
+7442 9: buzzer
+
+The keypad is read through a 74HC251, where S0,1,2 is from CPU A0,1,2, Y is connected to CPU D7.
+If control Q4 is set, printer data can be read from I0.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_sc12.lh" // clickable
+
+
+namespace {
+
+class sc12_state : public fidelbase_state
+{
+public:
+ sc12_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void sc12(machine_config &config);
+ void sc12b(machine_config &config);
+
+private:
+ void main_map(address_map &map);
+
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(sc12_state::control_w)
+{
+ // d0-d3: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // d6,d7: led select (active low)
+ display_matrix(9, 2, sel & 0x1ff, ~data >> 6 & 3);
+
+ // d4,d5: printer
+ //..
+}
+
+READ8_MEMBER(sc12_state::input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void sc12_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x2000, 0x5fff).r(FUNC(sc12_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(sc12_state::control_w));
+ map(0x8000, 0x9fff).rom();
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(sc12_state::input_r));
+ map(0xc000, 0xcfff).mirror(0x1000).rom();
+ map(0xe000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( sc12_sidepanel )
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / 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")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc12 )
+ PORT_INCLUDE( fidel_cpu_div_2 )
+ PORT_INCLUDE( fidel_cb_buttons )
+ PORT_INCLUDE( sc12_sidepanel )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc12b )
+ PORT_INCLUDE( fidel_cpu_div_4 )
+ PORT_INCLUDE( fidel_cb_buttons )
+ PORT_INCLUDE( sc12_sidepanel )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void sc12_state::sc12(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 3_MHz_XTAL); // R65C02P3
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc12_state::div_trampoline);
+ ADDRESS_MAP_BANK(config, m_mainmap).set_map(&sc12_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+
+ TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(3_MHz_XTAL));
+
+ const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(sc12_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(sc12_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_sc12);
+
+ /* 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.set_output(5.0);
+ 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"));
+ cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
+}
+
+void sc12_state::sc12b(machine_config &config)
+{
+ sc12(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4
+ TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
+
+ // change irq timer frequency
+ const attotime irq_period = attotime::from_hz(596); // from 556 timer (22nF, 82K+26K, 1K)
+ TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(sc12_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config.replace(), "irq_off").configure_periodic(FUNC(sc12_state::irq_off<M6502_IRQ_LINE>), irq_period);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fscc12 ) // model SC12, PCB label 510-1084B01
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
+ ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(ed5289b2) SHA1(9b0c7f9ae4102d4a66eb8c91d4e84b9eec2ffb3d) ) // TI TMS2732AJL-45, no label, orange sticker
+ ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(0c4968c4) SHA1(965a66870b0f8ce9549418cbda09d2ff262a1504) ) // TI TMS2764JL-25, no label, red sticker
+ROM_END
+
+ROM_START( fscc12b ) // model 6086, PCB label 510-1084B01
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
+ ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(45070a71) SHA1(8aeecff828f26fb7081902c757559903be272649) ) // TI TMS2732AJL-45, no label, orange sticker
+ ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(183d3edc) SHA1(3296a4c3bce5209587d4a1694fce153558544e63) ) // Toshiba TMM2764D-2, no label, red sticker
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1984, fscc12, 0, 0, sc12, sc12, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+CONS( 1984, fscc12b, fscc12, 0, sc12b, sc12b, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
diff --git a/src/mame/drivers/fidel_sc9.cpp b/src/mame/drivers/fidel_sc9.cpp
new file mode 100644
index 00000000000..0ab321a382a
--- /dev/null
+++ b/src/mame/drivers/fidel_sc9.cpp
@@ -0,0 +1,294 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger,yoyo_chessboard
+/******************************************************************************
+
+Sensory Chess Challenger "9" (SC9)
+3 versions were available, the newest "B" version was 2MHz and included the Budapest program.
+The Playmatic S was only released in Germany, it's basically a 'deluxe' version of SC9
+with magnet sensors and came with CB9 and CB16.
+---------------------------------
+
+8*(8+1) buttons, 8*8+1 LEDs
+36-pin edge connector, assume same as SC12
+2KB RAM(TMM2016P), 2*8KB ROM(HN48364P)
+R6502-13, 1.4MHz from resonator, another pcb with the same resonator was measured 1.49MHz*
+PCB label 510-1046C01 2-1-82
+
+*: 2 other boards were measured 1.60MHz and 1.88MHz(newest serial). Online references
+suggest 3 versions of SC9(C01) total: 1.5MHz, 1.6MHz, and 1.9MHz.
+
+I/O is via TTL, not further documented here
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/m6502.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_playmatic.lh" // clickable
+#include "fidel_sc9.lh" // clickable
+
+
+namespace {
+
+class sc9_state : public fidelbase_state
+{
+public:
+ sc9_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void sc9b(machine_config &config);
+ void sc9c(machine_config &config);
+ void sc9d(machine_config &config);
+ void playmatic(machine_config &config);
+
+protected:
+ // address maps
+ void sc9_map(address_map &map);
+ void sc9d_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_WRITE8_MEMBER(led_w);
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_READ8_MEMBER(input_d7_r);
+};
+
+class sc9c_state : public sc9_state
+{
+public:
+ sc9c_state(const machine_config &mconfig, device_type type, const char *tag) :
+ sc9_state(mconfig, type, tag)
+ { }
+
+ DECLARE_INPUT_CHANGED_MEMBER(sc9c_cpu_freq) { sc9c_set_cpu_freq(); }
+
+protected:
+ virtual void machine_reset() override;
+ void sc9c_set_cpu_freq();
+};
+
+void sc9c_state::machine_reset()
+{
+ sc9_state::machine_reset();
+ sc9c_set_cpu_freq();
+}
+
+void sc9c_state::sc9c_set_cpu_freq()
+{
+ // SC9(C01) was released with 1.5MHz, 1.6MHz, or 1.9MHz CPU
+ u8 inp = ioport("FAKE")->read();
+ m_maincpu->set_unscaled_clock((inp & 2) ? 1900000 : ((inp & 1) ? 1600000 : 1500000));
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+void sc9_state::prepare_display()
+{
+ // 8*8 chessboard leds + 1 corner led
+ display_matrix(8, 9, m_led_data, m_inp_mux);
+}
+
+WRITE8_MEMBER(sc9_state::control_w)
+{
+ // d0-d3: 74245 P0-P3
+ // 74245 Q0-Q8: input mux, led select
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
+ m_inp_mux = sel & 0x1ff;
+ prepare_display();
+
+ // 74245 Q9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // d4,d5: ?
+ // d6,d7: N/C
+}
+
+WRITE8_MEMBER(sc9_state::led_w)
+{
+ // a0-a2,d0: led data via NE591N
+ m_led_data = (data & 1) << offset;
+ prepare_display();
+}
+
+READ8_MEMBER(sc9_state::input_r)
+{
+ // multiplexed inputs (active low)
+ return read_inputs(9) ^ 0xff;
+}
+
+READ8_MEMBER(sc9_state::input_d7_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void sc9_state::sc9_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x07ff).mirror(0x1800).ram();
+ map(0x2000, 0x5fff).r(FUNC(sc9_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(sc9_state::control_w));
+ map(0x8000, 0x8007).mirror(0x1ff8).w(FUNC(sc9_state::led_w)).nopr();
+ map(0xa000, 0xa000).mirror(0x1fff).r(FUNC(sc9_state::input_r));
+ map(0xc000, 0xffff).rom();
+}
+
+void sc9_state::sc9d_map(address_map &map)
+{
+ sc9_map(map);
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(sc9_state::input_d7_r));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( sc9_sidepanel )
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / 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")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc9 )
+ PORT_INCLUDE( fidel_cb_buttons )
+ PORT_INCLUDE( sc9_sidepanel )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( playmatic )
+ PORT_INCLUDE( fidel_cb_magnets )
+ PORT_INCLUDE( sc9_sidepanel )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc9c )
+ PORT_INCLUDE( sc9 )
+
+ PORT_START("FAKE")
+ PORT_CONFNAME( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, sc9c_state, sc9c_cpu_freq, nullptr) // factory set
+ PORT_CONFSETTING( 0x00, "1.5MHz" )
+ PORT_CONFSETTING( 0x01, "1.6MHz" )
+ PORT_CONFSETTING( 0x02, "1.9MHz" )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void sc9_state::sc9d(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // R6502AP, 3.9MHz resonator
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc9_state::sc9d_map);
+
+ const attotime irq_period = attotime::from_hz(610); // from 555 timer (22nF, 102K, 2.7K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(sc9_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us
+ TIMER(config, "irq_off").configure_periodic(FUNC(sc9_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_sc9);
+
+ /* 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.set_output(5.0);
+ 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"));
+ cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
+}
+
+void sc9_state::sc9b(machine_config &config)
+{
+ sc9d(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(1500000); // from ceramic resonator "681 JSA", measured
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc9_state::sc9_map);
+}
+
+void sc9_state::playmatic(machine_config &config)
+{
+ sc9b(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(3100000); // approximation
+ config.set_default_layout(layout_fidel_playmatic);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fscc9 ) // PCB label 510-1046D01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1034b01", 0xc000, 0x2000, CRC(65288753) SHA1(651f5ca5969ddd72a20cbebdec2de83c4bf10650) )
+ ROM_LOAD("101-1034c02", 0xe000, 0x2000, CRC(238b092f) SHA1(7ddffc6dba822aee9d8ad6815b23024ed5cdfd26) )
+ROM_END
+
+ROM_START( fscc9b ) // PCB label 510-1046B01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) )
+ ROM_LOAD("101-1034a02", 0xe000, 0x2000, CRC(ecfa0a4c) SHA1(738df99a250fad0b1da5ebeb8c92a9ad1461417b) )
+ROM_END
+
+ROM_START( fscc9c ) // PCB label 510-1046C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) ) // HN48364P
+ ROM_LOAD("101-1034b02", 0xe000, 0x2000, CRC(cbaf97d7) SHA1(7ed8e68bb74713d9e2ff1d9c037012320b7bfcbf) ) // "
+ROM_END
+
+ROM_START( fscc9ps )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("play64c1.bin", 0xc000, 0x2000, CRC(e96aa95d) SHA1(16d90cf0ef166aef579d442671290a2c43e24dfe) )
+ ROM_LOAD("play64en.bin", 0xe000, 0x2000, CRC(6fa188d2) SHA1(1b9b0209c496c89ecb7f9ec07bfd9429ff9b275e) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1982, fscc9, 0, 0, sc9d, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. D)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // aka version "B"
+CONS( 1982, fscc9b, fscc9, 0, sc9b, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1982, fscc9c, fscc9, 0, sc9b, sc9c, sc9c_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fscc9ps, fscc9, 0, playmatic, playmatic, sc9_state, empty_init, "Fidelity Electronics", "Sensory 9 Playmatic 'S'", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // by Fidelity West Germany
diff --git a/src/mame/drivers/fidelbase.cpp b/src/mame/drivers/fidelbase.cpp
index f97db30f1af..283b79cc857 100644
--- a/src/mame/drivers/fidelbase.cpp
+++ b/src/mame/drivers/fidelbase.cpp
@@ -17,6 +17,15 @@
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.
@@ -45,7 +54,7 @@
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)
@@ -139,7 +148,7 @@ automatically select the correct ROM(s). I have to test whether it will do auto
determination and give you a language option on power up or something.
-******************************************************************************
+*******************************************************************************
Chess Challenger 10 (CCX)
-------------------
@@ -185,7 +194,7 @@ PC.6 - button column C (W)
PC.7 - button column D (W)
-******************************************************************************
+*******************************************************************************
Chess Challenger 7 (BCC)
------------------------
@@ -221,7 +230,7 @@ Port map (Read):
D0-D3: keypad row
-******************************************************************************
+*******************************************************************************
Voice Bridge Challenger (Model VBRC, later reissued as Model 7002)
and Bridge Challenger 3 (Model 7014)
@@ -352,7 +361,7 @@ 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)
------------------------------------
diff --git a/src/mame/drivers/novag6502.cpp b/src/mame/drivers/novag6502.cpp
index 6778501ca26..4949e189dc7 100644
--- a/src/mame/drivers/novag6502.cpp
+++ b/src/mame/drivers/novag6502.cpp
@@ -17,7 +17,7 @@
- sforte/sexpert led handling is correct?
- printer port
-******************************************************************************
+*******************************************************************************
Super Constellation Chess Computer (model 844):
- UMC UM6502C @ 4 MHz (8MHz XTAL), 600Hz? IRQ(source unknown?)
@@ -26,7 +26,7 @@ Super Constellation Chess Computer (model 844):
- external ports for clock and printer, not emulated here
-******************************************************************************
+*******************************************************************************
Constellation Forte:
- R65C02P4 @ 5MHz (10MHz XTAL)
@@ -38,7 +38,7 @@ When it was first added to MAME as skeleton driver in mmodular.c, cforteb romset
was assumed to be Super Forte B, but it definitely isn't. I/O is similar to supercon.
-******************************************************************************
+*******************************************************************************
Super Expert (model 878/887/902):
- 65C02 @ 5MHz or 6MHz (10MHz or 12MHz XTAL)
diff --git a/src/mame/drivers/novag68k.cpp b/src/mame/drivers/novag68k.cpp
index ae0b9daff4a..4313572da55 100644
--- a/src/mame/drivers/novag68k.cpp
+++ b/src/mame/drivers/novag68k.cpp
@@ -13,7 +13,7 @@
TODO:
- RS232 port (when connected, I'm only getting "New Game")
-******************************************************************************
+*******************************************************************************
Diablo 68000:
- M68000 @ 16MHz, IPL1 256Hz, IPL2 from ACIA IRQ(always high)
diff --git a/src/mame/drivers/novagf8.cpp b/src/mame/drivers/novagf8.cpp
index 514ed828b28..a7d974f4b93 100644
--- a/src/mame/drivers/novagf8.cpp
+++ b/src/mame/drivers/novagf8.cpp
@@ -10,7 +10,7 @@
- hardware is similar to MK I, the drivers can be merged in theory.
But I prefer my source code to be licensed BSD3, mk1.cpp is GPL2.
-******************************************************************************
+*******************************************************************************
Delta-1:
- 3850PK CPU at ~2MHz, 3853PK memory interface
diff --git a/src/mame/drivers/novagmcs48.cpp b/src/mame/drivers/novagmcs48.cpp
index 69fa328c2f6..840f0c450c1 100644
--- a/src/mame/drivers/novagmcs48.cpp
+++ b/src/mame/drivers/novagmcs48.cpp
@@ -14,7 +14,7 @@
- is presto led handling correct? mux data needs to be auto cleared
similar to diablo/sexpert
-******************************************************************************
+*******************************************************************************
Presto:
- NEC D80C49C MCU(serial 186), OSC from LC circuit measured ~6MHz
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 81d5102a721..a37da31ee30 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -12849,6 +12849,25 @@ feversoc // (c) 2004
fgoal // TF (c) 1979 Taito Corporation
fgoala // MF (c) 1979 Taito Corporation
+@source:fidel_as12.cpp
+feleg //
+
+@source:fidel_chesster.cpp
+chesster //
+chesstera //
+kishon //
+
+@source:fidel_csc.cpp
+csc // CSC: Champion Sensory Chess Challenger (English)
+cscfr // * French
+cscg // * German
+cscsp // * Spanish
+reversic //
+super9cc // SU9: Super 9 Sensory Chess Challenger (English)
+super9ccfr // * French
+super9ccg // * German
+super9ccsp // * Spanish
+
@source:fidel_desdis.cpp
fdes2000d //
fdes2100d //
@@ -12883,17 +12902,23 @@ fexcelpb //
fexcelv //
granits // RCS
+@source:fidel_phantom.cpp
+fphantom //
+
+@source:fidel_sc12.cpp
+fscc12 //
+fscc12b //
+
@source:fidel_sc6.cpp
fscc6 //
+@source:fidel_sc9.cpp
+fscc9 //
+fscc9b //
+fscc9c //
+fscc9ps //
+
@source:fidel6502.cpp
-chesster //
-chesstera //
-kishon //
-csc // CSC: Champion Sensory Chess Challenger (English)
-cscfr // * French
-cscg // * German
-cscsp // * Spanish
feasbu // EAS: Elite A/S Challenger (Budapest program, English)
feasbufr // * French
feasbug // * German
@@ -12906,8 +12931,6 @@ feag2100 // EAG: Elite Avant Garde 2100 (English)
feag2100fr // * French
feag2100g // * German
feag2100sp // * Spanish
-feleg //
-fphantom //
fpres //
fpressp //
fpresg //
@@ -12916,17 +12939,6 @@ fpresbu //
fpresbusp //
fpresbug //
fpresbufr //
-fscc9 //
-fscc9b //
-fscc9c //
-fscc9ps //
-fscc12 //
-fscc12b //
-reversic //
-super9cc // SU9: Super 9 Sensory Chess Challenger (English)
-super9ccfr // * French
-super9ccg // * German
-super9ccsp // * Spanish
@source:fidelbase.cpp
backgamc //
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 6701e725a53..2a71bb1a721 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -241,10 +241,16 @@ fb01.cpp
fc100.cpp
fccpu20.cpp
fccpu30.cpp
+fidel_as12.cpp
+fidel_chesster.cpp
+fidel_csc.cpp
fidel_desdis.cpp
fidel_eag68k.cpp
fidel_excel.cpp
+fidel_phantom.cpp
+fidel_sc12.cpp
fidel_sc6.cpp
+fidel_sc9.cpp
fidel6502.cpp
fidelbase.cpp
fk1.cpp