summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2019-02-18 02:54:52 +0100
committer hap <happppp@users.noreply.github.com>2019-02-18 02:54:52 +0100
commit058f7c0ae3dfc60f135643635a559005af897c46 (patch)
tree5ddec6933a30c3e25746da7e091b0ad89c7ac82a
parent95f817b54d2643b302f2a1be000d24052b44bdfb (diff)
fidel6502: put excellence in its own file (nw)
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/mame/drivers/fidel6502.cpp471
-rw-r--r--src/mame/drivers/fidel_desdis.cpp4
-rw-r--r--src/mame/drivers/fidel_eag68k.cpp4
-rw-r--r--src/mame/drivers/fidel_excel.cpp522
-rw-r--r--src/mame/mame.lst24
-rw-r--r--src/mame/mess.flt1
7 files changed, 544 insertions, 483 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 60f10fbb386..ddb14390bf2 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -2133,6 +2133,7 @@ files {
MAME_DIR .. "src/mame/includes/fidelbase.h",
MAME_DIR .. "src/mame/drivers/fidel_desdis.cpp",
MAME_DIR .. "src/mame/drivers/fidel_eag68k.cpp",
+ MAME_DIR .. "src/mame/drivers/fidel_excel.cpp",
MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp",
MAME_DIR .. "src/mame/drivers/fidel6502.cpp",
}
diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp
index b2c5dc68e40..ef0a55c95b3 100644
--- a/src/mame/drivers/fidel6502.cpp
+++ b/src/mame/drivers/fidel6502.cpp
@@ -18,8 +18,6 @@
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
- - granits buttons seem too sensitive
- finish fphantom emulation
******************************************************************************
@@ -280,132 +278,6 @@ The keypad is read through a 74HC251, where S0,1,2 is from CPU A0,1,2, Y is conn
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
-
******************************************************************************
@@ -457,11 +329,8 @@ I/O is via TTL, very similar to Designer Display
#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_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
@@ -617,32 +486,6 @@ void sc9c_state::sc9c_set_cpu_freq()
-class excel_state : public fidelbase_state
-{
-public:
- excel_state(const machine_config &mconfig, device_type type, const char *tag) :
- fidelbase_state(mconfig, type, tag)
- { }
-
- 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);
-
-private:
- DECLARE_READ8_MEMBER(fexcelv_speech_r);
- DECLARE_WRITE8_MEMBER(fexcel_ttl_w);
- DECLARE_READ8_MEMBER(fexcelb_ttl_r);
- void fexcel_map(address_map &map);
- void fexcelb_map(address_map &map);
-};
-
class chesster_state : public fidelbase_state
{
@@ -1133,91 +976,6 @@ READ8_MEMBER(fidel6502_state::as12_input_r)
-/******************************************************************************
- Excellence
-******************************************************************************/
-
-// misc handlers
-
-INPUT_CHANGED_MEMBER(excel_state::fexcelv_bankswitch)
-{
- // tied to speech ROM highest bits
- m_speech->force_update();
- m_speech_bank = (m_speech_bank & 1) | newval << 1;
-}
-
-READ8_MEMBER(excel_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(excel_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(excel_state::fexcelb_ttl_r)
-{
- u8 d7 = 0x80;
-
- // 74259(1) Q7 + 74251 I0: battery status
- if (m_inp_matrix[10] != nullptr && m_inp_mux == 1 && ~m_led_select & 0x80)
- d7 = m_inp_matrix[10]->read() & 0x80;
-
- // 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 ((read_inputs(9) >> offset & 1) ? 0 : d7) | d6 | 0x3f;
-}
-
@@ -1411,22 +1169,7 @@ void fidel6502_state::as12_map(address_map &map)
}
-// Excellence
-void excel_state::fexcel_map(address_map &map)
-{
- map(0x0000, 0x07ff).mirror(0x3800).ram();
- map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(excel_state::fexcelb_ttl_r), FUNC(excel_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 excel_state::fexcelb_map(address_map &map)
-{
- map(0x0000, 0x1fff).mirror(0x2000).ram();
- map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(excel_state::fexcelb_ttl_r), FUNC(excel_state::fexcel_ttl_w));
- map(0x8000, 0xffff).rom();
-}
// Designer Display, Phantom, Chesster
@@ -1736,49 +1479,6 @@ static INPUT_PORTS_START( sc9c )
INPUT_PORTS_END
-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, excel_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.10")
- 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.10")
- 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( chesster )
PORT_INCLUDE( fidel_cb_buttons )
@@ -2065,105 +1765,6 @@ void fidel6502_state::as12(machine_config &config)
config.set_default_layout(layout_fidel_as12);
}
-void excel_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, &excel_state::fexcel_map);
-
- const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
- TIMER(config, m_irq_on).configure_periodic(FUNC(excel_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config, "irq_off").configure_periodic(FUNC(excel_state::irq_off<M6502_IRQ_LINE>), irq_period);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_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 excel_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, &excel_state::fexcel_map);
-}
-
-void excel_state::fexcelb(machine_config &config)
-{
- fexcel(config);
-
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &excel_state::fexcelb_map);
-}
-
-void excel_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, &excel_state::fexcelb_map);
-}
-
-void excel_state::granits(machine_config &config)
-{
- fexcelp(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(8_MHz_XTAL); // overclocked
-}
-
-void excel_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, &excel_state::fexcelb_map);
-
- // change irq timer frequency
- const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
- TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(excel_state::irq_on<M6502_IRQ_LINE>), irq_period);
- m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config.replace(), "irq_off").configure_periodic(FUNC(excel_state::irq_off<M6502_IRQ_LINE>), irq_period);
-
- config.set_default_layout(layout_fidel_des);
-}
-
-void excel_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, &excel_state::fexcelb_map);
-}
-
-void excel_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(excel_state::fexcelv_speech_r));
- m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
-}
-
-void excel_state::fexceld(machine_config &config)
-{
- fexcelb(config);
-
- /* basic machine hardware */
- config.set_default_layout(layout_fidel_exd);
-}
void fidel6502_state::fphantom(machine_config &config)
@@ -2653,65 +2254,6 @@ ROM_START( feleg ) // model AS12(or 6085), PCB label 510-1084B01
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( fphantom ) // model 6100, PCB label 510.1128A01
ROM_REGION( 0x10000, "maincpu", 0 )
@@ -2798,19 +2340,6 @@ CONS( 1984, fscc12b, fscc12, 0, sc12b, sc12b, fidel6502_state, empt
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, excel_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, excel_state, empty_init, "Fidelity Electronics", "Voice Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1987, fexceld, fexcel, 0, fexceld, fexcelb, excel_state, empty_init, "Fidelity Electronics", "Excel Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1985, fexcel12, fexcel, 0, fexcel, fexcel, excel_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, excel_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, excel_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, excel_state, empty_init, "Fidelity Electronics", "The Par Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, fexcelpb, fexcelp, 0, fexcelp, fexcel, excel_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, excel_state, empty_init, "hack (RCS)", "Granit 'S'", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2100", 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, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger (V1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_desdis.cpp b/src/mame/drivers/fidel_desdis.cpp
index f0d7051c29a..26b42e59d76 100644
--- a/src/mame/drivers/fidel_desdis.cpp
+++ b/src/mame/drivers/fidel_desdis.cpp
@@ -57,6 +57,7 @@ public:
fidelbase_state(mconfig, type, tag)
{ }
+ // machine drivers
void fdes2000d(machine_config &config);
void fdes2100d(machine_config &config);
@@ -78,12 +79,14 @@ public:
desdis_state(mconfig, type, tag)
{ }
+ // machine drivers
void fdes2265(machine_config &config);
void fdes2325(machine_config &config);
void init_fdes2265();
private:
+ // address maps
void fdes2265_map(address_map &map);
void fdes2325_map(address_map &map);
@@ -214,7 +217,6 @@ void desmas_state::fdes2325_map(address_map &map)
-
/******************************************************************************
Input Ports
******************************************************************************/
diff --git a/src/mame/drivers/fidel_eag68k.cpp b/src/mame/drivers/fidel_eag68k.cpp
index 70f4b5659a8..8ec963c0dbb 100644
--- a/src/mame/drivers/fidel_eag68k.cpp
+++ b/src/mame/drivers/fidel_eag68k.cpp
@@ -177,6 +177,7 @@ public:
m_ram(*this, "ram")
{ }
+ // machine drivers
void eag_base(machine_config &config);
void eag(machine_config &config);
void eagv5(machine_config &config);
@@ -191,6 +192,7 @@ protected:
// devices/pointers
optional_device<ram_device> m_ram;
+ // address maps
void eag_map(address_map &map);
void eagv7_map(address_map &map);
void eagv11_map(address_map &map);
@@ -212,11 +214,13 @@ public:
eag_state(mconfig, type, tag)
{ }
+ // machine drivers
void fex68k(machine_config &config);
void fex68km2(machine_config &config);
void fex68km3(machine_config &config);
private:
+ // address maps
void fex68k_map(address_map &map);
void fex68km2_map(address_map &map);
void fex68km3_map(address_map &map);
diff --git a/src/mame/drivers/fidel_excel.cpp b/src/mame/drivers/fidel_excel.cpp
new file mode 100644
index 00000000000..14043e3d52f
--- /dev/null
+++ b/src/mame/drivers/fidel_excel.cpp
@@ -0,0 +1,522 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger,yoyo_chessboard
+/******************************************************************************
+
+Fidelity Excellence series hardware (for Excel 68000, see fidel_eag68k.cpp)
+
+TODO:
+- granits gives error beeps at start, need to press clear to play
+- granits buttons seem too sensitive
+
+******************************************************************************
+
+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 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 1500 is on 80C50 hardware)
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "cpu/m6502/m65sc02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_des.lh" // clickable
+#include "fidel_ex.lh" // clickable
+#include "fidel_exd.lh" // clickable
+
+
+namespace {
+
+class excel_state : public fidelbase_state
+{
+public:
+ excel_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ 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(lan_bankswitch);
+
+private:
+ // address maps
+ void fexcel_map(address_map &map);
+ void fexcelb_map(address_map &map);
+
+ // I/O handlers
+ DECLARE_READ8_MEMBER(speech_r);
+ DECLARE_WRITE8_MEMBER(ttl_w);
+ DECLARE_READ8_MEMBER(ttl_r);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+INPUT_CHANGED_MEMBER(excel_state::lan_bankswitch)
+{
+ // tied to speech ROM highest bits
+ m_speech->force_update();
+ m_speech_bank = (m_speech_bank & 1) | newval << 1;
+}
+
+READ8_MEMBER(excel_state::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(excel_state::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(excel_state::ttl_r)
+{
+ u8 d7 = 0x80;
+
+ // 74259(1) Q7 + 74251 I0: battery status
+ if (m_inp_matrix[10] != nullptr && m_inp_mux == 1 && ~m_led_select & 0x80)
+ d7 = m_inp_matrix[10]->read() & 0x80;
+
+ // 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 ((read_inputs(9) >> offset & 1) ? 0 : d7) | d6 | 0x3f;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void excel_state::fexcel_map(address_map &map)
+{
+ map(0x0000, 0x07ff).mirror(0x3800).ram();
+ map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(excel_state::ttl_r), FUNC(excel_state::ttl_w));
+ //map(0x8000, 0x8000).nopr(); // checks for opening book module, but hw doesn't have a module slot
+ map(0xc000, 0xffff).rom();
+}
+
+void excel_state::fexcelb_map(address_map &map)
+{
+ map(0x0000, 0x1fff).mirror(0x2000).ram();
+ map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(excel_state::ttl_r), FUNC(excel_state::ttl_w));
+ map(0x8000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+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, excel_state, lan_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.10")
+ 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.10")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) // no low-voltage detection circuit (still works in software though)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void excel_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, &excel_state::fexcel_map);
+
+ const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(excel_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(excel_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_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 excel_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, &excel_state::fexcel_map);
+}
+
+void excel_state::fexcelb(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel_state::fexcelb_map);
+}
+
+void excel_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, &excel_state::fexcelb_map);
+}
+
+void excel_state::granits(machine_config &config)
+{
+ fexcelp(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(8_MHz_XTAL); // overclocked
+}
+
+void excel_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, &excel_state::fexcelb_map);
+
+ // change irq timer frequency
+ const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
+ TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(excel_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config.replace(), "irq_off").configure_periodic(FUNC(excel_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ config.set_default_layout(layout_fidel_des);
+}
+
+void excel_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, &excel_state::fexcelb_map);
+}
+
+void excel_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(excel_state::speech_r));
+ m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
+}
+
+void excel_state::fexceld(machine_config &config)
+{
+ fexcelb(config);
+
+ /* basic machine hardware */
+ config.set_default_layout(layout_fidel_exd);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+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
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1987, fexcel, 0, 0, fexcelb, fexcelb, excel_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, excel_state, empty_init, "Fidelity Electronics", "Voice Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, fexceld, fexcel, 0, fexceld, fexcelb, excel_state, empty_init, "Fidelity Electronics", "Excel Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1985, fexcel12, fexcel, 0, fexcel, fexcel, excel_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, excel_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, excel_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, excel_state, empty_init, "Fidelity Electronics", "The Par Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, fexcelpb, fexcelp, 0, fexcelp, fexcel, excel_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, excel_state, empty_init, "hack (RCS)", "Granit 'S'", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 6529e8ba9b6..5febe7361a3 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -12870,6 +12870,19 @@ fex68kb //
fex68km2 //
fex68km3 //
+@source:fidel_excel.cpp
+fdes2000 //
+fdes2100 //
+fexcel //
+fexcel12 //
+fexcel124 //
+fexcela //
+fexceld //
+fexcelp //
+fexcelpb //
+fexcelv //
+granits // RCS
+
@source:fidel_sc6.cpp
fscc6 //
@@ -12881,8 +12894,6 @@ csc // CSC: Champion Sensory Chess Challenger (Engli
cscfr // * French
cscg // * German
cscsp // * Spanish
-fdes2000 //
-fdes2100 //
feasbu // EAS: Elite A/S Challenger (Budapest program, English)
feasbufr // * French
feasbug // * German
@@ -12896,14 +12907,6 @@ feag2100fr // * French
feag2100g // * German
feag2100sp // * Spanish
feleg //
-fexcel //
-fexcel12 //
-fexcel124 //
-fexcela //
-fexceld //
-fexcelp //
-fexcelpb //
-fexcelv //
fphantom //
fpres //
fpressp //
@@ -12919,7 +12922,6 @@ fscc9c //
fscc9ps //
fscc12 //
fscc12b //
-granits // RCS
reversic //
super9cc // SU9: Super 9 Sensory Chess Challenger (English)
super9ccfr // * French
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index b0bb839c7ee..6701e725a53 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -243,6 +243,7 @@ fccpu20.cpp
fccpu30.cpp
fidel_desdis.cpp
fidel_eag68k.cpp
+fidel_excel.cpp
fidel_sc6.cpp
fidel6502.cpp
fidelbase.cpp