summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/fidel6502.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/fidel6502.cpp')
-rw-r--r--src/mame/drivers/fidel6502.cpp2902
1 files changed, 2902 insertions, 0 deletions
diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp
new file mode 100644
index 00000000000..6209284c169
--- /dev/null
+++ b/src/mame/drivers/fidel6502.cpp
@@ -0,0 +1,2902 @@
+// license:BSD-3-Clause
+// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap
+// thanks-to:Berger,yoyo_chessboard
+/******************************************************************************
+
+ 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.
+ - granits gives error beeps at start, need to press clear to play
+ - 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 0 (display, TSI speech chip)
+1800-1FFF: PIA 1 (keypad, LEDs)
+2000-3FFF: 101-64019 ROM (also used on the regular sensory chess challenger)
+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
+
+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 0:
+------
+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 1:
+------
+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 1, 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 0)
+
+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 1
+PCB label 510-1035A01
+
+
+******************************************************************************
+
+Elite A/S Challenger (EAS)
+This came out in 1982. 2 program updates were released in 1983 and 1984,
+named Budapest and Glasgow, places where Fidelity won chess computer matches.
+A/S stands for auto sensory, it's the 1st Fidelity board with magnet sensors.
+---------------------------------
+
+8*8 magnet sensors, 11 buttons, 8*(8+1) LEDs + 4*7seg LEDs
+R65C02P4 or R6502BP CPU, default frequency 3MHz*
+4KB RAM (2*HM6116), 24KB ROM
+TSI S14001A + speech ROM
+I/O with 8255 PPI and bunch of TTL
+module slot and printer port
+PCB label 510-1071A01
+
+*It was advertised as 3.2, 3.6, or 4MHz, with unofficial modifications up to 8MHz.
+PCB photos show only a 3MHz XTAL.
+
+A condensator keeps RAM contents alive for a few hours when powered off.
+
+Elite Avant Garde (models 6081,6088,6089) is on the same hardware.
+
+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.
+
+
+******************************************************************************
+
+Voice Excellence (model 6092)
+----------------
+PCB 1: 510.1117A02, appears to be identical to other "Excellence" boards
+CPU: GTE G65SC102P-3, 32 KB PRG ROM: AMI 101-1080A01(IC5), 8192x8 SRAM SRM2264C10(IC6)
+2 rows of LEDs on the side: 1*8 green, 1*8 red
+
+PCB 2: 510.1117A01
+Speech: TSI S14001A, 32 KB ROM: AMI 101-1081A01(IC2)
+Dip Switches set ROM A13 and ROM A14, on the side of the board
+
+ROM A12 is tied to S14001A's A11 (yuck)
+ROM A11 is however tied to the CPU's XYZ
+
+0000_07FF - Spanish 1/4
+0800_0FFF - Spanish 3/4
+1000_17FF - Spanish 2/4
+1800_1FFF - Spanish 4/4
+
+2000_27FF - French 1/4
+2800_2FFF - French 3/4
+3000_3FFF - French 2/4
+3800_3FFF - French 4/4
+
+4000_47FF - German 1/4
+4800_4FFF - German 3/4
+5000_57FF - German 2/4
+5800_5FFF - German 4/4
+
+6000_67FF - English 1/2
+6800_6FFF - Bridge Challenger 1/2
+7000_77FF - English 2/2
+7800_7FFF - Bridge Challenger 2/2
+
+------------------
+RE info by hap, based on PCB photos
+
+Memory map:
+-----------
+0000-3FFF: 8K RAM (SRM2264)
+4000-7FFF: control (R/W)
+8000-FFFF: 32K ROM (M27256 compatible)
+
+control (W):
+------------
+CPU A0-A2 to 3*74259, CPU Dx to D (_C unused)
+
+CPU D0:
+- Q4,Q5: led commons
+- Q6,Q7,Q2,Q1: 7seg panel digit select
+- Q0-Q3: 7442 A0-A3
+ + 0-7: led data
+ + 0-8: keypad mux
+ + 9: buzzer out
+
+CPU D1: (model 6093)
+- Q0-Q7: 7seg data
+
+CPU D2: (model 6092)
+- Q0-Q5: TSI C0-C5
+- Q6: TSI START pin
+- Q7: TSI ROM A11
+
+A11 from TSI is tied to TSI ROM A12(!)
+TSI ROM A13,A14 are hardwired to the 2 language switches.
+Sound comes from the Audio out pin, digital out pins are N/C.
+
+control (R):
+------------
+CPU A0-A2 to 2*74251, CPU Dx to output
+
+CPU D7 to Y:
+- D0-D7: keypad row data
+
+CPU D6 to W: (model 6092, tied to VCC otherwise)
+- D0,D1: language switches
+- D2-D6: VCC
+- D7: TSI BUSY
+
+------------------
+One interesting clone of The Excellence is the Computerchess Playmate-2. It was
+produced in 1989 by SPS(Bulgaria) and RRR(Riga Radio Factory). The chess program
+ROM is identical to Excellence EP12. All internal circuitry is the same, the only
+difference is the capacitor driving the 555 for IRQ is 10nf instead of 22nf.
+
+What makes it unique is the addition of a chess clock.
+
+connector pinout from main pcb:
+1) 5V
+2) GND
+3) 74HC259.pin9 (Q4) = Row LED driving
+4) 74HC259.pin10 (Q5) = Column LED driving
+5) 74HC259.pin12 (Q7) = Bat. Low signal
+6) 74HC42.pin4 (Q3) = Col-D/Row-4 -> 'White Move' if D-LED blinks
+
+The extra board has a 7474, a К1016ХЛ1 (RTC, or MCU clock driver), a 4-digit
+VFD display, and some buttons for controlling the clock. IRQ frequency is doubled
+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 series:
+
+Designer 2000 (model 6102)
+----------------
+8KB RAM(KM6264AL-10), 32KB ROM(AMI 101.1077A01)
+Ricoh RP65C02G CPU, 3MHz XTAL
+PCB label 510.1129A01
+basically same as (Par) Excellence hardware, reskinned board
+
+Designer 2100 (model 6103): exactly same, but running at 5MHz
+
+Designer 2100 Display (model 6106)
+----------------
+8KB RAM(MS6264L-10), 2*32KB ROM(27C256)
+WDC W65C02P-6 CPU, 6MHz XTAL
+4-digit LCD panel
+PCB label 510.1130A01
+
+Designer 2000 Display (model 6105): same hardware, no bookrom, 3MHz
+
+Designer 1500 is on 80C50 hardware
+
+
+******************************************************************************
+
+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/bankdev.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_des.lh" // clickable
+#include "fidel_desdis.lh" // clickable
+#include "fidel_eag.lh" // clickable
+#include "fidel_eas.lh" // clickable
+#include "fidel_ex.lh" // clickable
+#include "fidel_exd.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
+
+
+class fidel6502_state : public fidelbase_state
+{
+public:
+ fidel6502_state(const machine_config &mconfig, device_type type, const char *tag)
+ : fidelbase_state(mconfig, type, tag),
+ m_ppi8255(*this, "ppi8255"),
+ m_rombank(*this, "rombank"),
+ m_mainmap(*this, "mainmap"),
+ m_div_config(*this, "div_config"),
+ m_irq_on(*this, "irq_on")
+ { }
+
+ void csc(machine_config &config);
+ void su9(machine_config &config);
+ void rsc(machine_config &config);
+ DECLARE_INPUT_CHANGED_MEMBER(su9_cpu_freq);
+
+ void eas_base(machine_config &config);
+ void eas(machine_config &config);
+ void eag(machine_config &config);
+ void pc(machine_config &config);
+ void init_eag();
+
+ void sc9b(machine_config &config);
+ void sc9c(machine_config &config);
+ void sc9d(machine_config &config);
+ void playmatic(machine_config &config);
+ DECLARE_INPUT_CHANGED_MEMBER(sc9c_cpu_freq);
+
+ void sc12_map(address_map &map);
+ void sc12(machine_config &config);
+ void sc12b(machine_config &config);
+
+ void as12(machine_config &config);
+
+ void fexcel(machine_config &config);
+ void fexcelb(machine_config &config);
+ void fexcel4(machine_config &config);
+ void fexceld(machine_config &config);
+ void fexcelv(machine_config &config);
+ void fexcelp(machine_config &config);
+ void granits(machine_config &config);
+ void fdes2100(machine_config &config);
+ void fdes2000(machine_config &config);
+ DECLARE_INPUT_CHANGED_MEMBER(fexcelv_bankswitch);
+
+ void fdes2000d(machine_config &config);
+ void fdes2100d(machine_config &config);
+ void init_fdesdis();
+
+ void fphantom(machine_config &config);
+ void init_fphantom();
+
+ void chesster(machine_config &config);
+ void kishon(machine_config &config);
+ void init_chesster();
+
+private:
+ // devices/pointers
+ optional_device<i8255_device> m_ppi8255;
+ optional_memory_bank m_rombank;
+ optional_device<address_map_bank_device> m_mainmap;
+ optional_ioport m_div_config;
+ optional_device<timer_device> m_irq_on;
+
+ // common
+ TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); }
+ TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); }
+ TIMER_DEVICE_CALLBACK_MEMBER(dummy) { ; } // MCFG_QUANTUM_PERFECT_CPU("maincpu") didn't work
+
+ DECLARE_WRITE8_MEMBER(div_trampoline_w);
+ DECLARE_READ8_MEMBER(div_trampoline_r);
+ void div_set_cpu_freq(offs_t offset);
+ void div_trampoline(address_map &map);
+ u16 m_div_status;
+
+ // CSC, SU9, RSC
+ 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_pb_r);
+ DECLARE_WRITE_LINE_MEMBER(csc_pia0_ca2_w);
+ DECLARE_WRITE8_MEMBER(csc_pia1_pa_w);
+ DECLARE_WRITE8_MEMBER(csc_pia1_pb_w);
+ DECLARE_READ8_MEMBER(csc_pia1_pa_r);
+ DECLARE_WRITE_LINE_MEMBER(csc_pia1_ca2_w);
+ DECLARE_WRITE_LINE_MEMBER(csc_pia1_cb2_w);
+ DECLARE_READ_LINE_MEMBER(csc_pia1_ca1_r);
+ DECLARE_READ_LINE_MEMBER(csc_pia1_cb1_r);
+ DECLARE_MACHINE_RESET(su9);
+ void su9_set_cpu_freq();
+ void csc_map(address_map &map);
+ void su9_map(address_map &map);
+ void rsc_map(address_map &map);
+
+ // EAS, EAG, PC
+ void eas_prepare_display();
+ 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);
+ void eas_map(address_map &map);
+ void eag_map(address_map &map);
+ void pc_map(address_map &map);
+
+ // 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);
+ DECLARE_MACHINE_RESET(sc9c);
+ void sc9c_set_cpu_freq();
+ void sc9_map(address_map &map);
+ void sc9d_map(address_map &map);
+
+ // SC12
+ DECLARE_WRITE8_MEMBER(sc12_control_w);
+ DECLARE_READ8_MEMBER(sc12_input_r);
+
+ // 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);
+
+ // Excellence
+ DECLARE_READ8_MEMBER(fexcelv_speech_r);
+ DECLARE_WRITE8_MEMBER(fexcel_ttl_w);
+ DECLARE_READ8_MEMBER(fexcelb_ttl_r);
+ DECLARE_READ8_MEMBER(fexcel_ttl_r);
+ void fexcel_map(address_map &map);
+ void fexcelb_map(address_map &map);
+ void fexcelp_map(address_map &map);
+
+ // Designer Display
+ DECLARE_WRITE8_MEMBER(fdesdis_control_w);
+ DECLARE_WRITE8_MEMBER(fdesdis_lcd_w);
+ DECLARE_READ8_MEMBER(fdesdis_input_r);
+ void fdesdis_map(address_map &map);
+
+ // Phantom
+ DECLARE_MACHINE_RESET(fphantom);
+ void fphantom_map(address_map &map);
+
+ // Chesster
+ DECLARE_WRITE8_MEMBER(chesster_control_w);
+ DECLARE_WRITE8_MEMBER(kishon_control_w);
+ void chesster_map(address_map &map);
+ void kishon_map(address_map &map);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+};
+
+
+// machine start/reset
+
+void fidel6502_state::machine_start()
+{
+ fidelbase_state::machine_start();
+
+ // register for savestates
+ save_item(NAME(m_div_status));
+}
+
+void fidel6502_state::machine_reset()
+{
+ fidelbase_state::machine_reset();
+
+ m_div_status = ~0;
+}
+
+
+
+/***************************************************************************
+
+ Helper Functions
+
+***************************************************************************/
+
+// Offset-dependent CPU divider on some machines
+
+void fidel6502_state::div_set_cpu_freq(offs_t offset)
+{
+ static const u16 mask = 0x6000;
+ u16 status = (offset & mask) | m_div_config->read();
+
+ if (status != m_div_status && status & 2)
+ {
+ // when a13/a14 is high, XTAL goes through divider(s)
+ // (depending on factory-set jumper, either one or two 7474)
+ float div = (status & 1) ? 0.25 : 0.5;
+ m_maincpu->set_clock_scale((offset & mask) ? div : 1.0);
+ }
+
+ m_div_status = status;
+}
+
+WRITE8_MEMBER(fidel6502_state::div_trampoline_w)
+{
+ div_set_cpu_freq(offset);
+ m_mainmap->write8(space, offset, data);
+}
+
+READ8_MEMBER(fidel6502_state::div_trampoline_r)
+{
+ if (!machine().side_effects_disabled())
+ div_set_cpu_freq(offset);
+
+ return m_mainmap->read8(space, offset);
+}
+
+void fidel6502_state::div_trampoline(address_map &map)
+{
+ map(0x0000, 0xffff).rw(FUNC(fidel6502_state::div_trampoline_r), FUNC(fidel6502_state::div_trampoline_w));
+}
+
+static INPUT_PORTS_START( cpu_div_2 )
+ PORT_START("div_config") // hardwired, default to /2
+ PORT_CONFNAME( 0x03, 0x02, "CPU Divider" )
+ PORT_CONFSETTING( 0x00, "Disabled" )
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_CONFSETTING( 0x03, "4" )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( cpu_div_4 )
+ PORT_START("div_config") // hardwired, default to /4
+ PORT_CONFNAME( 0x03, 0x03, "CPU Divider" )
+ PORT_CONFSETTING( 0x00, "Disabled" )
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_CONFSETTING( 0x03, "4" )
+INPUT_PORTS_END
+
+
+
+// Devices, I/O
+
+/******************************************************************************
+ CSC, SU9, RSC
+******************************************************************************/
+
+// misc handlers
+
+void fidel6502_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(fidel6502_state::csc_speech_r)
+{
+ return m_speech_rom[m_speech_bank << 12 | offset];
+}
+
+void fidel6502_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));
+}
+
+MACHINE_RESET_MEMBER(fidel6502_state, su9)
+{
+ fidel6502_state::machine_reset();
+ su9_set_cpu_freq();
+}
+
+
+// 6821 PIA 0
+
+WRITE8_MEMBER(fidel6502_state::csc_pia0_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(fidel6502_state::csc_pia0_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(fidel6502_state::csc_pia0_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
+ data |= (~read_inputs(9) >> 3 & 0x20) | (m_inp_matrix[9]->read() << 6 & 0xc0);
+
+ return data;
+}
+
+WRITE_LINE_MEMBER(fidel6502_state::csc_pia0_ca2_w)
+{
+ // printer?
+}
+
+
+// 6821 PIA 1
+
+READ8_MEMBER(fidel6502_state::csc_pia1_pa_r)
+{
+ // d0-d5: button row 0-5 (active low)
+ return (read_inputs(9) & 0x3f) ^ 0xff;
+}
+
+WRITE8_MEMBER(fidel6502_state::csc_pia1_pa_w)
+{
+ // d6,d7: 7442 A0,A1
+ m_led_select = (m_led_select & ~3) | (data >> 6 & 3);
+ csc_prepare_display();
+}
+
+WRITE8_MEMBER(fidel6502_state::csc_pia1_pb_w)
+{
+ // d0-d7: led row data
+ m_led_data = data;
+ csc_prepare_display();
+}
+
+READ_LINE_MEMBER(fidel6502_state::csc_pia1_ca1_r)
+{
+ // button row 6 (active low)
+ return ~read_inputs(9) >> 6 & 1;
+}
+
+READ_LINE_MEMBER(fidel6502_state::csc_pia1_cb1_r)
+{
+ // button row 7 (active low)
+ return ~read_inputs(9) >> 7 & 1;
+}
+
+WRITE_LINE_MEMBER(fidel6502_state::csc_pia1_cb2_w)
+{
+ // 7442 A2
+ m_led_select = (m_led_select & ~4) | (state ? 4 : 0);
+ csc_prepare_display();
+}
+
+WRITE_LINE_MEMBER(fidel6502_state::csc_pia1_ca2_w)
+{
+ // 7442 A3
+ m_led_select = (m_led_select & ~8) | (state ? 8 : 0);
+ csc_prepare_display();
+}
+
+
+
+/******************************************************************************
+ EAS, EAG, PC
+******************************************************************************/
+
+// TTL/generic
+
+void fidel6502_state::eas_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);
+}
+
+WRITE8_MEMBER(fidel6502_state::eas_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();
+}
+
+WRITE8_MEMBER(fidel6502_state::eas_led_w)
+{
+ // a0-a2,d0: led data
+ m_led_data = (data & 1) << offset;
+ eas_prepare_display();
+}
+
+READ8_MEMBER(fidel6502_state::eas_input_r)
+{
+ // multiplexed inputs (active low)
+ return read_inputs(9) ^ 0xff;
+}
+
+void fidel6502_state::init_eag()
+{
+ m_rombank->configure_entries(0, 4, memregion("rombank")->base(), 0x2000);
+}
+
+
+// 8255 PPI (PC: done with TTL instead)
+
+WRITE8_MEMBER(fidel6502_state::eas_ppi_porta_w)
+{
+ // d0-d5: TSI C0-C5
+ // d6: TSI START line
+ m_speech->data_w(space, 0, data & 0x3f);
+ m_speech->start_w(data >> 6 & 1);
+
+ // d7: printer? (black wire to LED pcb)
+}
+
+WRITE8_MEMBER(fidel6502_state::eas_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();
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(m_led_select, 9));
+
+ // d4: speech ROM A12
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = data >> 4 & 1;
+
+ // d5: lower TSI volume
+ m_speech->set_output_gain(0, (data & 0x20) ? 0.5 : 1.0);
+
+ // d6,d7: bookrom bankswitch (model EAG)
+ if (m_rombank != nullptr)
+ m_rombank->set_entry(data >> 6 & 3);
+}
+
+READ8_MEMBER(fidel6502_state::eas_ppi_portb_r)
+{
+ // d0: printer? white wire from LED pcb
+ u8 data = 1;
+
+ // d1: TSI BUSY line
+ data |= (m_speech->busy_r()) ? 2 : 0;
+
+ // d2,d3: language switches
+ data |= m_inp_matrix[9]->read() << 2 & 0x0c;
+
+ // d5: multiplexed inputs highest bit
+ data |= (read_inputs(9) & 0x100) ? 0 : 0x20;
+
+ // other: ?
+ return data | 0xd0;
+}
+
+
+
+/******************************************************************************
+ SC9
+******************************************************************************/
+
+// TTL/generic
+
+void fidel6502_state::sc9_prepare_display()
+{
+ // 8*8 chessboard leds + 1 corner led
+ display_matrix(8, 9, m_led_data, m_inp_mux);
+}
+
+WRITE8_MEMBER(fidel6502_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(fidel6502_state::sc9_led_w)
+{
+ // a0-a2,d0: led data via NE591N
+ m_led_data = (data & 1) << offset;
+ sc9_prepare_display();
+}
+
+READ8_MEMBER(fidel6502_state::sc9_input_r)
+{
+ // multiplexed inputs (active low)
+ return read_inputs(9) ^ 0xff;
+}
+
+READ8_MEMBER(fidel6502_state::sc9d_input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+void fidel6502_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));
+}
+
+MACHINE_RESET_MEMBER(fidel6502_state, sc9c)
+{
+ fidel6502_state::machine_reset();
+ sc9c_set_cpu_freq();
+}
+
+
+
+/******************************************************************************
+ SC12
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(fidel6502_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(fidel6502_state::sc12_input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ AS12
+******************************************************************************/
+
+// TTL/generic
+
+void fidel6502_state::as12_prepare_display()
+{
+ // 8*8(+1) chessboard leds
+ display_matrix(8, 9, m_led_data, m_inp_mux);
+}
+
+WRITE8_MEMBER(fidel6502_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(fidel6502_state::as12_led_w)
+{
+ // a0-a2,d0: led data via NE591N
+ m_led_data = (data & 1) << offset;
+ as12_prepare_display();
+}
+
+READ8_MEMBER(fidel6502_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;
+}
+
+
+
+/******************************************************************************
+ Excellence
+******************************************************************************/
+
+// misc handlers
+
+INPUT_CHANGED_MEMBER(fidel6502_state::fexcelv_bankswitch)
+{
+ // tied to speech ROM highest bits
+ m_speech->force_update();
+ m_speech_bank = (m_speech_bank & 1) | newval << 1;
+}
+
+READ8_MEMBER(fidel6502_state::fexcelv_speech_r)
+{
+ // TSI A11 is A12, program controls A11, user controls A13,A14(language switches)
+ offset = (offset & 0x7ff) | (offset << 1 & 0x1000);
+ return m_speech_rom[offset | (m_speech_bank << 11 & 0x800) | (~m_speech_bank << 12 & 0x6000)];
+}
+
+
+// TTL
+
+WRITE8_MEMBER(fidel6502_state::fexcel_ttl_w)
+{
+ // a0-a2,d0: 74259(1)
+ u8 mask = 1 << offset;
+ m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
+
+ // 74259 Q0-Q3: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ u16 sel = 1 << (m_led_select & 0xf) & 0x3ff;
+ u8 led_data = sel & 0xff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // 74259 Q4-Q7,Q2,Q1: digit/led select (active low)
+ u8 led_sel = ~bitswap<8>(m_led_select,0,3,1,2,7,6,5,4) & 0x3f;
+
+ // a0-a2,d1: digit segment data (model 6093)
+ m_7seg_data = (m_7seg_data & ~mask) | ((data & 2) ? mask : 0);
+ u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4);
+
+ // update display: 4 7seg leds, 2*8 chessboard leds
+ for (int i = 0; i < 6; i++)
+ m_display_state[i] = (led_sel >> i & 1) ? ((i < 2) ? led_data : seg_data) : 0;
+
+ set_display_size(8, 2+4);
+ set_display_segmask(0x3c, 0x7f);
+ display_update();
+
+ // speech (model 6092)
+ if (m_speech != nullptr)
+ {
+ // a0-a2,d2: 74259(2) to speech board
+ m_speech_data = (m_speech_data & ~mask) | ((data & 4) ? mask : 0);
+
+ // 74259 Q6: TSI ROM A11
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = (m_speech_bank & ~1) | (m_speech_data >> 6 & 1);
+
+ // Q0-Q5: TSI C0-C5
+ // Q7: TSI START line
+ m_speech->data_w(space, 0, m_speech_data & 0x3f);
+ m_speech->start_w(m_speech_data >> 7 & 1);
+ }
+}
+
+READ8_MEMBER(fidel6502_state::fexcelb_ttl_r)
+{
+ // a0-a2,d6: from speech board: language switches and TSI BUSY line, otherwise tied to VCC
+ u8 d6 = (m_inp_matrix[9].read_safe(0xff) >> offset & 1) ? 0x40 : 0;
+
+ // a0-a2,d7: multiplexed inputs (active low)
+ return d6 | ((read_inputs(9) >> offset & 1) ? 0 : 0x80);
+}
+
+READ8_MEMBER(fidel6502_state::fexcel_ttl_r)
+{
+ u8 d7 = 0x80;
+
+ // 74259(1) Q7 + 74251 I0: battery status
+ if (m_inp_mux == 1 && ~m_led_select & 0x80)
+ d7 = m_inp_matrix[9]->read() & 0x80;
+
+ // a0-a2,d7: multiplexed inputs (active low)
+ return d7 & ((read_inputs(9) >> offset & 1) ? 0 : 0x80);
+}
+
+
+
+/******************************************************************************
+ Designer Display
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(fidel6502_state::fdesdis_control_w)
+{
+ u8 q3_old = m_led_select & 8;
+
+ // a0-a2,d7: 74259
+ 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;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // 74259 Q0,Q1: led select (active low)
+ display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false);
+
+ // 74259 Q2: book rom A14
+ m_rombank->set_entry(~m_led_select >> 2 & 1);
+
+ // 74259 Q3: lcd common, update on rising edge
+ if (~q3_old & m_led_select & 8)
+ {
+ for (int i = 0; i < 4; i++)
+ m_display_state[i+2] = m_7seg_data >> (8*i) & 0xff;
+ }
+
+ m_display_maxy += 4;
+ set_display_segmask(0x3c, 0x7f);
+ display_update();
+}
+
+WRITE8_MEMBER(fidel6502_state::fdesdis_lcd_w)
+{
+ // a0-a2,d0-d3: 4*74259 to lcd digit segments
+ u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5);
+ for (int i = 0; i < 4; i++)
+ {
+ m_7seg_data = (m_7seg_data & ~mask) | ((data >> i & 1) ? 0 : mask);
+ mask <<= 8;
+ }
+}
+
+READ8_MEMBER(fidel6502_state::fdesdis_input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+void fidel6502_state::init_fdesdis()
+{
+ m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
+}
+
+
+
+/******************************************************************************
+ Phantom
+******************************************************************************/
+
+// TTL/generic
+
+MACHINE_RESET_MEMBER(fidel6502_state, fphantom)
+{
+ fidel6502_state::machine_reset();
+ m_rombank->set_entry(0);
+}
+
+void fidel6502_state::init_fphantom()
+{
+ m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
+}
+
+
+
+/******************************************************************************
+ Chesster
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(fidel6502_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) where Q3 is speechrom A16, other outputs unconnected
+ m_speech_bank = (m_speech_bank & ~mask) | ((data & 1) ? mask : 0);
+ m_rombank->set_entry((m_led_select >> 2 & 3) | (m_speech_bank >> 1 & 4));
+}
+
+WRITE8_MEMBER(fidel6502_state::kishon_control_w)
+{
+ chesster_control_w(space, offset, data);
+
+ // 2 more bankswitch bits: 74259(2) Q2 to A17, Q0 to A18
+ u8 bank = (m_led_select >> 2 & 3) | bitswap<3>(m_speech_bank, 0,2,3) << 2;
+ m_rombank->set_entry(bank);
+}
+
+void fidel6502_state::init_chesster()
+{
+ m_rombank->configure_entries(0, memregion("rombank")->bytes() / 0x4000, memregion("rombank")->base(), 0x4000);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+// CSC, SU9, RSC
+
+void fidel6502_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("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x1800, 0x1803).mirror(0x47fc).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x2000, 0x3fff).mirror(0x4000).rom();
+ map(0xa000, 0xffff).rom();
+}
+
+void fidel6502_state::su9_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x1000, 0x1003).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x1800, 0x1803).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x2000, 0x3fff).rom();
+ map(0xa000, 0xa7ff).rom();
+ map(0xc000, 0xffff).rom();
+}
+
+void fidel6502_state::rsc_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x03ff).ram();
+ map(0x2000, 0x2003).rw("pia", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0xf000, 0xffff).rom();
+}
+
+
+// EAS, EAG, PC
+
+void fidel6502_state::eas_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram().share("nvram");
+ map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
+ map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0x7020, 0x7027).w(FUNC(fidel6502_state::eas_segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(fidel6502_state::eas_led_w)).nopr();
+ map(0x7050, 0x7050).r(FUNC(fidel6502_state::eas_input_r));
+ map(0x8000, 0x9fff).rom();
+ map(0xc000, 0xffff).rom();
+}
+
+void fidel6502_state::eag_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x1fff).ram().share("nvram");
+ map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
+ map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0x7020, 0x7027).w(FUNC(fidel6502_state::eas_segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(fidel6502_state::eas_led_w)).nopr();
+ map(0x7050, 0x7050).r(FUNC(fidel6502_state::eas_input_r));
+ map(0x8000, 0x9fff).ram();
+ map(0xa000, 0xbfff).bankr("rombank");
+ map(0xc000, 0xffff).rom();
+}
+
+void fidel6502_state::pc_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x17ff).ram();
+ map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
+ map(0x7000, 0x7000).w(FUNC(fidel6502_state::eas_ppi_porta_w));
+ map(0x7010, 0x7010).r(FUNC(fidel6502_state::eas_ppi_portb_r));
+ map(0x7020, 0x7027).w(FUNC(fidel6502_state::eas_segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(fidel6502_state::eas_led_w)).nopr();
+ map(0x7040, 0x7040).w(FUNC(fidel6502_state::eas_ppi_portc_w));
+ map(0x7050, 0x7050).r(FUNC(fidel6502_state::eas_input_r));
+ map(0x8000, 0x9fff).ram();
+ map(0xb000, 0xffff).rom();
+}
+
+
+// SC9
+
+void fidel6502_state::sc9_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x07ff).mirror(0x1800).ram();
+ map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidel6502_state::sc9_control_w));
+ map(0x8000, 0x8007).mirror(0x1ff8).w(FUNC(fidel6502_state::sc9_led_w)).nopr();
+ map(0xa000, 0xa000).mirror(0x1fff).r(FUNC(fidel6502_state::sc9_input_r));
+ map(0xc000, 0xffff).rom();
+}
+
+void fidel6502_state::sc9d_map(address_map &map)
+{
+ sc9_map(map);
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(fidel6502_state::sc9d_input_r));
+}
+
+
+// SC12, AS12
+
+void fidel6502_state::sc12_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidel6502_state::sc12_control_w));
+ map(0x8000, 0x9fff).rom();
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(fidel6502_state::sc12_input_r));
+ map(0xc000, 0xcfff).mirror(0x1000).rom();
+ map(0xe000, 0xffff).rom();
+}
+
+void fidel6502_state::as12_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x1800, 0x1807).w(FUNC(fidel6502_state::as12_led_w)).nopr();
+ map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidel6502_state::as12_control_w));
+ map(0x8000, 0x9fff).rom();
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(fidel6502_state::as12_input_r));
+ map(0xc000, 0xffff).rom();
+}
+
+
+// Excellence
+
+void fidel6502_state::fexcel_map(address_map &map)
+{
+ map(0x0000, 0x07ff).mirror(0x3800).ram();
+ map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(fidel6502_state::fexcel_ttl_r), FUNC(fidel6502_state::fexcel_ttl_w));
+ //map(0x8000, 0x8000).nopr(); // checks for opening book module, but hw doesn't have a module slot
+ map(0xc000, 0xffff).rom();
+}
+
+void fidel6502_state::fexcelp_map(address_map &map)
+{
+ map(0x0000, 0x1fff).mirror(0x2000).ram();
+ map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(fidel6502_state::fexcel_ttl_r), FUNC(fidel6502_state::fexcel_ttl_w));
+ map(0x8000, 0xffff).rom();
+}
+
+void fidel6502_state::fexcelb_map(address_map &map)
+{
+ map(0x0000, 0x1fff).mirror(0x2000).ram();
+ map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(fidel6502_state::fexcelb_ttl_r), FUNC(fidel6502_state::fexcel_ttl_w));
+ map(0x8000, 0xffff).rom();
+}
+
+
+// Designer Display, Phantom, Chesster
+
+void fidel6502_state::fdesdis_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::fdesdis_control_w));
+ map(0x4000, 0x7fff).bankr("rombank");
+ map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(fidel6502_state::fdesdis_lcd_w));
+ map(0x8000, 0xffff).rom();
+}
+
+void fidel6502_state::fphantom_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0x4000, 0x7fff).bankr("rombank");
+ map(0x8000, 0xffff).rom();
+}
+
+void fidel6502_state::chesster_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_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();
+}
+
+void fidel6502_state::kishon_map(address_map &map)
+{
+ chesster_map(map);
+ map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::kishon_control_w));
+}
+
+
+
+/******************************************************************************
+ 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")
+
+ PORT_START("IN.9") // language setting, hardwired with 2 resistors/jumpers (0: Spanish, 1: French, 2: German, 3: English)
+ PORT_BIT(0x03, 0x03, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( cscsp )
+ PORT_INCLUDE( csc )
+
+ PORT_MODIFY("IN.9") // set to Spanish
+ PORT_BIT(0x03, 0x00, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( cscg )
+ PORT_INCLUDE( csc )
+
+ PORT_MODIFY("IN.9") // set to German
+ PORT_BIT(0x03, 0x02, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( cscfr )
+ PORT_INCLUDE( csc )
+
+ PORT_MODIFY("IN.9") // set to French
+ PORT_BIT(0x03, 0x01, IPT_CUSTOM)
+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, fidel6502_state, su9_cpu_freq, nullptr) // factory set
+ PORT_CONFSETTING( 0x00, "1.95MHz (SU9)" )
+ PORT_CONFSETTING( 0x01, "2.5MHz (DS9)" )
+INPUT_PORTS_END
+
+INPUT_CHANGED_MEMBER(fidel6502_state::su9_cpu_freq)
+{
+ su9_set_cpu_freq();
+}
+
+static INPUT_PORTS_START( su9sp )
+ PORT_INCLUDE( su9 )
+
+ PORT_MODIFY("IN.9") // set to Spanish
+ PORT_BIT(0x03, 0x00, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( su9g )
+ PORT_INCLUDE( su9 )
+
+ PORT_MODIFY("IN.9") // set to German
+ PORT_BIT(0x03, 0x02, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( su9fr )
+ PORT_INCLUDE( su9 )
+
+ PORT_MODIFY("IN.9") // set to French
+ PORT_BIT(0x03, 0x01, IPT_CUSTOM)
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( eas )
+ PORT_INCLUDE( fidel_cb_magnets )
+ PORT_INCLUDE( cpu_div_4 )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Game Control") // labeled RESET on the Prestige, but led display still says - G C -
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("PB / King")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TM / Rook")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("ST / Bishop")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("TB / Knight")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("LV / Pawn")
+
+ PORT_START("IN.9") // language setting, hardwired (0: Spanish, 1: French, 2: German, 3: English)
+ PORT_BIT(0x03, 0x03, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( eassp )
+ PORT_INCLUDE( eas )
+
+ PORT_MODIFY("IN.9") // set to Spanish
+ PORT_BIT(0x03, 0x00, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( easg )
+ PORT_INCLUDE( eas )
+
+ PORT_MODIFY("IN.9") // set to German
+ PORT_BIT(0x03, 0x02, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( easfr )
+ PORT_INCLUDE( eas )
+
+ PORT_MODIFY("IN.9") // set to French
+ PORT_BIT(0x03, 0x01, IPT_CUSTOM)
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( eag )
+ PORT_INCLUDE( fidel_cb_magnets )
+ PORT_INCLUDE( cpu_div_4 )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("LV / Pawn")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("TB / Knight")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("ST / Bishop")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("TM / Rook")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
+
+ PORT_START("IN.9") // language setting, hardwired (0: Spanish, 1: French, 2: German, 3: English)
+ PORT_BIT(0x03, 0x03, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( eagsp )
+ PORT_INCLUDE( eag )
+
+ PORT_MODIFY("IN.9") // set to Spanish
+ PORT_BIT(0x03, 0x00, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( eagg )
+ PORT_INCLUDE( eag )
+
+ PORT_MODIFY("IN.9") // set to German
+ PORT_BIT(0x03, 0x02, IPT_CUSTOM)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( eagfr )
+ PORT_INCLUDE( eag )
+
+ PORT_MODIFY("IN.9") // set to French
+ PORT_BIT(0x03, 0x01, IPT_CUSTOM)
+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_cb_buttons )
+ PORT_INCLUDE( sc12_sidepanel )
+ PORT_INCLUDE( cpu_div_2 )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc12b )
+ PORT_INCLUDE( fidel_cb_buttons )
+ PORT_INCLUDE( sc12_sidepanel )
+ PORT_INCLUDE( cpu_div_4 )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( as12 )
+ PORT_INCLUDE( fidel_cb_magnets )
+ PORT_INCLUDE( sc12_sidepanel )
+ PORT_INCLUDE( cpu_div_4 )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( playmatic )
+ PORT_INCLUDE( fidel_cb_magnets )
+ PORT_INCLUDE( sc12_sidepanel )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc9 )
+ PORT_INCLUDE( fidel_cb_buttons )
+ PORT_INCLUDE( sc12_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, fidel6502_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
+
+INPUT_CHANGED_MEMBER(fidel6502_state::sc9c_cpu_freq)
+{
+ sc9c_set_cpu_freq();
+}
+
+
+static INPUT_PORTS_START( fexcelb )
+ 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_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Move / Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hint / Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Take Back / Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Level / Rook")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Options / Queen")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Verify / King")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( fexcelv )
+ PORT_INCLUDE( fexcelb )
+
+ PORT_START("IN.9")
+ PORT_CONFNAME( 0x03, 0x00, DEF_STR( Language ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, fidel6502_state, fexcelv_bankswitch, 0)
+ PORT_CONFSETTING( 0x00, DEF_STR( English ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( German ) )
+ PORT_CONFSETTING( 0x02, DEF_STR( French ) )
+ PORT_CONFSETTING( 0x03, DEF_STR( Spanish ) )
+ PORT_BIT(0x7c, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("speech", s14001a_device, busy_r)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( fexcel )
+ PORT_INCLUDE( fexcelb )
+
+ PORT_START("IN.9")
+ PORT_CONFNAME( 0x80, 0x00, "Battery Status" )
+ PORT_CONFSETTING( 0x80, "Low" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Normal ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( fdes )
+ PORT_INCLUDE( fexcel )
+
+ PORT_MODIFY("IN.9")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) // no low-voltage detection circuit (still works in software though)
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( fdesdis )
+ 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 / Alternate")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Info")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Replay")
+ 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 / Time")
+ 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( chesster )
+ PORT_INCLUDE( fdesdis )
+
+ PORT_MODIFY("IN.8")
+ 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(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Replay")
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( fphantom )
+ PORT_INCLUDE( fidel_cb_buttons )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void fidel6502_state::rsc(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 1800000); // measured approx 1.81MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::rsc_map);
+
+ TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(546)); // from 555 timer, measured
+ m_irq_on->set_start_delay(attotime::from_hz(546) - attotime::from_usec(38)); // active for 38us
+
+ TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(546));
+
+ pia6821_device &pia(PIA6821(config, "pia", 0)); // MOS 6520
+ pia.readpa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_r));
+ pia.readca1_handler().set(FUNC(fidel6502_state::csc_pia1_ca1_r));
+ pia.readcb1_handler().set(FUNC(fidel6502_state::csc_pia1_cb1_r));
+ pia.writepa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_w));
+ pia.writepb_handler().set(FUNC(fidel6502_state::csc_pia1_pb_w));
+ pia.ca2_handler().set(FUNC(fidel6502_state::csc_pia1_ca2_w));
+ pia.cb2_handler().set(FUNC(fidel6502_state::csc_pia1_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 fidel6502_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, &fidel6502_state::csc_map);
+
+ TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(38.4_kHz_XTAL/64)); // through 4060 IC, 600Hz
+ m_irq_on->set_start_delay(attotime::from_hz(38.4_kHz_XTAL/64) - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
+ TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(38.4_kHz_XTAL/64));
+
+ pia6821_device &pia0(PIA6821(config, "pia0", 0));
+ pia0.readpb_handler().set(FUNC(fidel6502_state::csc_pia0_pb_r));
+ pia0.writepa_handler().set(FUNC(fidel6502_state::csc_pia0_pa_w));
+ pia0.writepb_handler().set(FUNC(fidel6502_state::csc_pia0_pb_w));
+ pia0.ca2_handler().set(FUNC(fidel6502_state::csc_pia0_ca2_w));
+
+ pia6821_device &pia1(PIA6821(config, "pia1", 0));
+ pia1.readpa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_r));
+ pia1.readca1_handler().set(FUNC(fidel6502_state::csc_pia1_ca1_r));
+ pia1.readcb1_handler().set(FUNC(fidel6502_state::csc_pia1_cb1_r));
+ pia1.writepa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_w));
+ pia1.writepb_handler().set(FUNC(fidel6502_state::csc_pia1_pb_w));
+ pia1.ca2_handler().set(FUNC(fidel6502_state::csc_pia1_ca2_w));
+ pia1.cb2_handler().set(FUNC(fidel6502_state::csc_pia1_cb2_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_device &speech(S14001A(config, "speech", 25000)); // R/C circuit, around 25khz
+ speech.ext_read().set(FUNC(fidel6502_state::csc_speech_r));
+ 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 fidel6502_state::su9(machine_config &config)
+{
+ csc(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::su9_map);
+
+ MCFG_MACHINE_RESET_OVERRIDE(fidel6502_state, su9)
+
+ config.set_default_layout(layout_fidel_su9);
+}
+
+void fidel6502_state::eas_base(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 3_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::div_trampoline);
+
+ TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(38.4_kHz_XTAL/64)); // through 4060 IC, 600Hz
+ m_irq_on->set_start_delay(attotime::from_hz(38.4_kHz_XTAL/64) - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
+
+ TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(38.4_kHz_XTAL/64));
+ TIMER(config, "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(3_MHz_XTAL));
+
+ ADDRESS_MAP_BANK(config, m_mainmap).set_map(&fidel6502_state::eas_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_eas);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ s14001a_device &speech(S14001A(config, "speech", 25000)); // R/C circuit, around 25khz
+ speech.ext_read().set(FUNC(fidel6502_state::csc_speech_r));
+ 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);
+
+ /* 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 fidel6502_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(fidel6502_state::eas_ppi_porta_w));
+ m_ppi8255->tri_pa_callback().set_constant(0);
+ m_ppi8255->in_pb_callback().set(FUNC(fidel6502_state::eas_ppi_portb_r));
+ m_ppi8255->out_pc_callback().set(FUNC(fidel6502_state::eas_ppi_portc_w));
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+}
+
+void fidel6502_state::pc(machine_config &config)
+{
+ eas_base(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4
+
+ TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(4_MHz_XTAL));
+
+ m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::pc_map);
+
+ config.set_default_layout(layout_fidel_pc);
+}
+
+void fidel6502_state::eag(machine_config &config)
+{
+ eas(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(5_MHz_XTAL); // R65C02P4
+
+ TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(5_MHz_XTAL));
+
+ m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::eag_map);
+
+ config.set_default_layout(layout_fidel_eag);
+}
+
+void fidel6502_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, &fidel6502_state::sc9d_map);
+ TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(610)); // from 555 timer (22nF, 102K, 2.7K)
+ m_irq_on->set_start_delay(attotime::from_hz(610) - attotime::from_usec(41)); // active for 41us
+ TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(610));
+
+ 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 fidel6502_state::sc9b(machine_config &config)
+{
+ sc9d(config);
+
+ /* basic machine hardware */
+ M6502(config.replace(), m_maincpu, 1500000); // from ceramic resonator "681 JSA", measured
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::sc9_map);
+}
+
+void fidel6502_state::sc9c(machine_config &config)
+{
+ sc9b(config);
+
+ /* basic machine hardware */
+ MCFG_MACHINE_RESET_OVERRIDE(fidel6502_state, sc9c)
+}
+
+void fidel6502_state::playmatic(machine_config &config)
+{
+ sc9b(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(3100000); // approximation
+
+ config.set_default_layout(layout_fidel_playmatic);
+}
+
+void fidel6502_state::sc12(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 3_MHz_XTAL); // R65C02P3
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::div_trampoline);
+ TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K)
+ m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630));
+
+ TIMER(config, "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(3_MHz_XTAL));
+
+ ADDRESS_MAP_BANK(config, m_mainmap).set_map(&fidel6502_state::sc12_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+
+ 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 fidel6502_state::sc12b(machine_config &config)
+{
+ sc12(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4
+
+ // change irq timer frequency
+ TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(596)); // from 556 timer (22nF, 82K+26K, 1K)
+ m_irq_on->set_start_delay(attotime::from_hz(596) - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(596));
+
+ TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(4_MHz_XTAL));
+}
+
+void fidel6502_state::as12(machine_config &config)
+{
+ sc12b(config);
+
+ /* basic machine hardware */
+ m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::as12_map);
+
+ // change irq timer frequency
+ TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(585)); // from 556 timer (22nF, 110K, 1K)
+ m_irq_on->set_start_delay(attotime::from_hz(585) - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(585));
+
+ config.set_default_layout(layout_fidel_as12);
+}
+
+void fidel6502_state::fexcel(machine_config &config)
+{
+ /* basic machine hardware */
+ M65SC02(config, m_maincpu, 12_MHz_XTAL/4); // G65SC102P-3, 12.0M ceramic resonator
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcel_map);
+ TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K)
+ m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_ex);
+
+ /* 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 fidel6502_state::fexcel4(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ R65C02(config.replace(), m_maincpu, 4_MHz_XTAL); // R65C02P4
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcel_map);
+}
+
+void fidel6502_state::fexcelb(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelb_map);
+}
+
+void fidel6502_state::fexcelp(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ R65C02(config.replace(), m_maincpu, 5_MHz_XTAL); // R65C02P4
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelp_map);
+}
+
+void fidel6502_state::granits(machine_config &config)
+{
+ fexcelp(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(8_MHz_XTAL); // overclocked
+}
+
+void fidel6502_state::fdes2100(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ M65C02(config.replace(), m_maincpu, 5_MHz_XTAL); // WDC 65C02
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelp_map);
+
+ // change irq timer frequency
+ TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(585)); // from 556 timer (22nF, 110K, 1K)
+ m_irq_on->set_start_delay(attotime::from_hz(585) - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(585));
+
+ config.set_default_layout(layout_fidel_des);
+}
+
+void fidel6502_state::fdes2000(machine_config &config)
+{
+ fdes2100(config);
+
+ /* basic machine hardware */
+ R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // RP65C02G
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelp_map);
+}
+
+void fidel6502_state::fexcelv(machine_config &config)
+{
+ fexcelb(config);
+
+ /* sound hardware */
+ S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
+ m_speech->ext_read().set(FUNC(fidel6502_state::fexcelv_speech_r));
+ m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
+}
+
+void fidel6502_state::fexceld(machine_config &config)
+{
+ fexcelb(config);
+
+ /* basic machine hardware */
+ config.set_default_layout(layout_fidel_exd);
+}
+
+void fidel6502_state::fdes2100d(machine_config &config)
+{
+ /* basic machine hardware */
+ M65C02(config, m_maincpu, 6_MHz_XTAL); // W65C02P-6
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map);
+ TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K)
+ m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_desdis);
+
+ /* 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 fidel6502_state::fdes2000d(machine_config &config)
+{
+ fdes2100d(config);
+
+ /* basic machine hardware */
+ R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // R65C02P3
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map);
+}
+
+void fidel6502_state::fphantom(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 4.9152_MHz_XTAL); // R65C02P4
+ m_maincpu->set_periodic_int(FUNC(fidel6502_state::irq0_line_hold), attotime::from_hz(600)); // guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fphantom_map);
+
+ MCFG_MACHINE_RESET_OVERRIDE(fidel6502_state, fphantom)
+
+ 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 fidel6502_state::chesster(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 5_MHz_XTAL); // RP65C02G
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::chesster_map);
+ TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(9615)); // R/C circuit, measured
+ m_irq_on->set_start_delay(attotime::from_hz(9615) - attotime::from_nsec(2600)); // active for 2.6us
+ TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(9615));
+
+ 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 fidel6502_state::kishon(machine_config &config)
+{
+ chesster(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(3.579545_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::kishon_map);
+}
+
+
+
+/******************************************************************************
+ 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-64109", 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( cscsp )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64109", 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( cscg )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64109", 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( cscfr )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64109", 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( 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( 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( 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
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("101-1052a02.4", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) ) // Mostek MK36C63N-5
+ ROM_LOAD("101-1052a01.5", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) ) // Mostek MK36C63N-5
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // NEC D2332C
+ ROM_RELOAD( 0x1000, 0x1000)
+ROM_END
+
+ROM_START( feasbusp )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("101-1052a02.4", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) )
+ ROM_LOAD("101-1052a01.5", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) )
+
+ 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( feasbug )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("101-1052a02.4", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) )
+ ROM_LOAD("101-1052a01.5", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) )
+
+ 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( feasbufr )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("101-1052a02.4", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) )
+ ROM_LOAD("101-1052a01.5", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) )
+
+ 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( feasgla )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("eli_gla.4", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
+ ROM_CONTINUE( 0xd000, 0x0800 )
+ ROM_CONTINUE( 0xc800, 0x0800 )
+ ROM_CONTINUE( 0xd800, 0x0800 )
+ ROM_LOAD("eli_gla.5", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
+ ROM_CONTINUE( 0xf000, 0x0800 )
+ ROM_CONTINUE( 0xe800, 0x0800 )
+ ROM_CONTINUE( 0xf800, 0x0800 )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // NEC D2332C
+ ROM_RELOAD( 0x1000, 0x1000)
+ROM_END
+
+ROM_START( feasglasp )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("eli_gla.4", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
+ ROM_CONTINUE( 0xd000, 0x0800 )
+ ROM_CONTINUE( 0xc800, 0x0800 )
+ ROM_CONTINUE( 0xd800, 0x0800 )
+ ROM_LOAD("eli_gla.5", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
+ ROM_CONTINUE( 0xf000, 0x0800 )
+ ROM_CONTINUE( 0xe800, 0x0800 )
+ ROM_CONTINUE( 0xf800, 0x0800 )
+
+ 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( feasglag )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("eli_gla.4", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
+ ROM_CONTINUE( 0xd000, 0x0800 )
+ ROM_CONTINUE( 0xc800, 0x0800 )
+ ROM_CONTINUE( 0xd800, 0x0800 )
+ ROM_LOAD("eli_gla.5", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
+ ROM_CONTINUE( 0xf000, 0x0800 )
+ ROM_CONTINUE( 0xe800, 0x0800 )
+ ROM_CONTINUE( 0xf800, 0x0800 )
+
+ 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( feasglafr )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("eli_gla.4", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
+ ROM_CONTINUE( 0xd000, 0x0800 )
+ ROM_CONTINUE( 0xc800, 0x0800 )
+ ROM_CONTINUE( 0xd800, 0x0800 )
+ ROM_LOAD("eli_gla.5", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
+ ROM_CONTINUE( 0xf000, 0x0800 )
+ ROM_CONTINUE( 0xe800, 0x0800 )
+ ROM_CONTINUE( 0xf800, 0x0800 )
+
+ 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( fpres )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
+
+ 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( fpressp )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
+
+ 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( fpresg )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
+
+ 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( fpresfr )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
+
+ 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( fpresbu )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
+
+ 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( fpresbusp )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
+
+ 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( fpresbug )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
+
+ 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( fpresbufr )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
+
+ 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( feag2100 )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
+ ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
+
+ 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( feag2100sp )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
+ ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
+
+ 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( feag2100g )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
+ ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
+
+ 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( feag2100fr )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
+ ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
+
+ 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( 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( fexcel ) // model 6080(B), PCB label 510.1117A02
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) )
+ROM_END
+
+ROM_START( fexceld ) // model 6093, PCB label 510.1117A02
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) ) // same rom as fexcel
+ROM_END
+
+ROM_START( fexcelv ) // model 6092, PCB label 510.1117A02, sound PCB 510.1117A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) ) // PCB1, M27256, same rom as fexcel
+
+ ROM_REGION( 0x8000, "speech", 0 )
+ ROM_LOAD("101-1081a01.ic2", 0x0000, 0x8000, CRC(c8ae1607) SHA1(6491ce6be60ed77f3dd931c0ca17616f13af943e) ) // PCB2, M27256
+ROM_END
+
+ROM_START( fexcel12 ) // model EP12, PCB label 510-1099A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1072a01.ic5", 0xc000, 0x4000, CRC(212b006d) SHA1(242ff851b0841cbec66bbada6a730da021010e2c) )
+ROM_END
+
+ROM_START( fexcel124 ) // model EP12, PCB label 510-1099A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1073a01.ic5", 0xc000, 0x4000, CRC(3e221534) SHA1(7516bc6a8aab9d8ac30ac1a9317630a6aa9ac1a0) )
+ROM_END
+
+ROM_START( fexcela ) // model 6080, PCB label 510-1099A01(manuf.1985) or 510-1099B01(manuf.1986)
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1072b01.ic5", 0xc000, 0x4000, CRC(fd2f6064) SHA1(f84bb98bdb9565a04891eb6820597d7aecc90c21) ) // RCA
+ROM_END
+
+
+ROM_START( fexcelp ) // model 6083, PCB label 510-1099A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) )
+ROM_END
+
+ROM_START( fexcelpb ) // model 6083, PCB label 510-1099B01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("par_ex.ic5", 0x8000, 0x8000, CRC(0d17b0f0) SHA1(3a6070fd4718c62b62ff0f08637bb6eb84eb9a1c) ) // GI 27C256, no label, only 1 byte difference, assume bugfix in bookrom
+ROM_END
+
+ROM_START( granits ) // modified SC12 board, overclocked Par Excellence program
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("granit_s-4", 0x8000, 0x8000, CRC(274d6aff) SHA1(c8d943b2f15422ac62f539b568f5509cbce568a3) )
+ROM_END
+
+ROM_START( fdes2000 ) // model 6102, PCB label 510.1129A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) ) // AMI, same label as fexcelp
+ROM_END
+
+ROM_START( fdes2100 ) // model 6103, PCB label 510.1129A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) ) // same as fdes2000
+ROM_END
+
+
+ROM_START( fdes2100d ) // model 6106, PCB label 510.1130A01. The 'rev B' dump came from a post-release bugfix by Fidelity
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("i9_orange.ic9", 0x8000, 0x8000, CRC(83fec02a) SHA1(6f43ab05bc605061989b05d0592dbd184efff9d4) ) // WSI 27C256L-12
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("bk3_white.ic10", 0x0000, 0x8000, CRC(3857cc35) SHA1(f073dafb9fd885c7ddb7fbff10e3653f343ef1c6) ) // WSI 27C256L-12
+ROM_END
+
+ROM_START( fdes2000d ) // model 6105, PCB label 510.1130A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("27c256.ic9", 0x8000, 0x8000, CRC(b136d1a1) SHA1(8438790a62f45284ff33a0255c5c89f526726d3e) ) // 27C256, no label
+
+ ROM_REGION( 0x8000, "rombank", ROMREGION_ERASEFF ) // no rom in ic10
+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
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
+CONS( 1981, reversic, 0, 0, rsc, rsc, fidel6502_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, fidel6502_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1981, cscsp, csc, 0, csc, cscsp, fidel6502_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1981, cscg, csc, 0, csc, cscg, fidel6502_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1981, cscfr, csc, 0, csc, cscfr, fidel6502_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1983, super9cc, 0, 0, su9, su9, fidel6502_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, super9ccsp, super9cc, 0, su9, su9sp, fidel6502_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, super9ccg, super9cc, 0, su9, su9g, fidel6502_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, super9ccfr, super9cc, 0, su9, su9fr, fidel6502_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1983, feasbu, 0, 0, eas, eas, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, feasbusp, feasbu, 0, eas, eassp, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, feasbug, feasbu, 0, eas, easg, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, feasbufr, feasbu, 0, eas, easfr, fidel6502_state, empty_init, "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, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1984, feasglasp, feasbu, 0, eas, eassp, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1984, feasglag, feasbu, 0, eas, easg, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1984, feasglafr, feasbu, 0, eas, easfr, fidel6502_state, empty_init, "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, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1982, fpressp, fpres, 0, pc, eassp, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1982, fpresg, fpres, 0, pc, easg, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1982, fpresfr, fpres, 0, pc, easfr, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fpresbu, fpres, 0, pc, eas, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fpresbusp, fpres, 0, pc, eassp, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fpresbug, fpres, 0, pc, easg, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fpresbufr, fpres, 0, pc, easfr, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1986, feag2100, 0, 0, eag, eag, fidel6502_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2100 (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, feag2100sp, feag2100, 0, eag, eagsp, fidel6502_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2100 (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, feag2100g, feag2100, 0, eag, eagg, fidel6502_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2100 (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, feag2100fr, feag2100, 0, eag, eagfr, fidel6502_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2100 (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1982, fscc9, 0, 0, sc9d, sc9, fidel6502_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, fidel6502_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, sc9c, sc9c, fidel6502_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, fidel6502_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, fidel6502_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, fidel6502_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, fidel6502_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+
+CONS( 1987, fexcel, 0, 0, fexcelb, fexcelb, fidel6502_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, fexcelv, fexcel, 0, fexcelv, fexcelv, fidel6502_state, empty_init, "Fidelity Electronics", "Voice Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, fexceld, fexcel, 0, fexceld, fexcelb, fidel6502_state, empty_init, "Fidelity Electronics", "Excel Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1985, fexcel12, fexcel, 0, fexcel, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // 1st version of The Excellence
+CONS( 1985, fexcel124, fexcel, 0, fexcel4, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1985, fexcela, fexcel, 0, fexcel, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1986, fexcelp, 0, 0, fexcelp, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Par Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, fexcelpb, fexcelp, 0, fexcelp, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Par Excellence (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, granits, fexcelp, 0, granits, fexcel, fidel6502_state, empty_init, "hack (RCS)", "Granit 'S'", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, fidel6502_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // Excellence series hardware
+CONS( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, fidel6502_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // "
+
+CONS( 1988, fdes2100d, 0, 0, fdes2100d, fdesdis, fidel6502_state, init_fdesdis, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fdes2000d, fdes2100d,0, fdes2000d, fdesdis, fidel6502_state, init_fdesdis, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1988, fphantom, 0, 0, fphantom, fphantom, fidel6502_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, fidel6502_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, fidel6502_state, init_chesster, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1991, kishon, chesster, 0, kishon, chesster, fidel6502_state, init_chesster, "Fidelity Electronics", "Kishon Chesster", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )