// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger
/******************************************************************************
Fidelity Elite A/S series hardware (EAS, EAG, PC)
see fidel_eag68k.cpp for 68000-based EAG hardware
TODO:
- add feas (original program)
BTANB:
- feasglab locks up at boot if it was powered off in the middle of the game.
To resolve this, hold the Game Control button while booting to clear nvram.
The ROM dump was verified from 2 chesscomputers.
*******************************************************************************
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.
The magnetic chessboard was licensed from AVE Micro Systems, in fact, the
PC model board is the same one as in AVE's ARB (ave_arb.cpp driver).
hardware overview:
- 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
*In West Germany, some distributors released it with overclocked CPUs,
advertised as 3.2, 3.6, or 4MHz. Unmodified EAS PCB photos show only a 3MHz XTAL.
Though model EAS-C(Glasgow) had a 4MHz XTAL
A condensator/battery keeps RAM contents alive for a while when powered off.
Note that EAS doesn't have a "new game" button, it is done through game options:
Press GAME CONTROL, then place/lift a piece on D6 to restart, or D8 to reset
with default settings, then press CL.
Prestige Challenger (PC) hardware is very similar. It was released before EAS,
it doesn't have the 8255 PPI, but has more RAM(7*TMM2016P). Some were released at
3.6MHz instead of 4MHz, perhaps due to hardware instability? Opening module PC16 was
included by default, this module is the same as CB16 but at different form factor.
Elite Avant Garde (models 6081,6088,6089) is on similar hardware as EAS.
Fidelity Elite Private Line were EAS/EAG conversions released by Fidelity Deutschland.
The "Elite Privat" was probably for the local market and the "Private Line" for export.
They took out the motherboard and leds and placed them inside a little box separate
from a (ledless) magnetic chessboard. The ROMs were unmodified, that makes them
uninteresting to emulate as separate drivers.
******************************************************************************/
#include "emu.h"
#include "machine/fidel_clockdiv.h"
#include "cpu/m6502/m65c02.h"
#include "cpu/m6502/r65c02.h"
#include "machine/i8255.h"
#include "machine/sensorboard.h"
#include "machine/nvram.h"
#include "machine/timer.h"
#include "sound/s14001a.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
#include "video/pwm.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
#include "softlist.h"
#include "speaker.h"
// internal artwork
#include "fidel_eag.lh" // clickable
#include "fidel_eas.lh" // clickable
#include "fidel_pc.lh" // clickable
namespace {
// note: sub-class of fidel_clockdiv_state (see mame/machine/fidel_clockdiv.*)
// EAS / shared
class elite_state : public fidel_clockdiv_state
{
public:
elite_state(const machine_config &mconfig, device_type type, const char *tag) :
fidel_clockdiv_state(mconfig, type, tag),
m_irq_on(*this, "irq_on"),
m_ppi8255(*this, "ppi8255"),
m_rombank(*this, "rombank"),
m_board(*this, "board"),
m_display(*this, "display"),
m_dac(*this, "dac"),
m_speech(*this, "speech"),
m_speech_rom(*this, "speech"),
m_language(*this, "language"),
m_inputs(*this, "IN.%u", 0),
m_rotate(false)
{ }
// machine configs
void pc(machine_config &config);
void eas(machine_config &config);
void easc(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(switch_cpu_freq) { set_cpu_freq(); }
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
void set_cpu_freq();
// devices/pointers
required_device<timer_device> m_irq_on;
optional_device<i8255_device> m_ppi8255;
optional_memory_bank m_rombank;
required_device<sensorboard_device> m_board;
required_device<pwm_display_device> m_display;
required_device<dac_bit_interface> m_dac;
required_device<s14001a_device> m_speech;
required_region_ptr<u8> m_speech_rom;
required_region_ptr<u8> m_language;
required_ioport_array<2> m_inputs;
// address maps
void eas_map(address_map &map);
void pc_map(address_map &map);
// periodic interrupts
template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
// I/O handlers
void update_display();
u8 speech_r(offs_t offset);
void segment_w(offs_t offset, u8 data);
void led_w(offs_t offset, u8 data);
u8 input_r();
void ppi_porta_w(u8 data);
u8 ppi_portb_r();
void ppi_portc_w(u8 data);
bool m_rotate;
u8 m_led_data;
u8 m_7seg_data;
u8 m_inp_mux;
u8 m_speech_bank;
};
void elite_state::machine_start()
{
fidel_clockdiv_state::machine_start();
// zerofill
m_led_data = 0;
m_7seg_data = 0;
m_inp_mux = 0;
m_speech_bank = 0;
// register for savestates
save_item(NAME(m_led_data));
save_item(NAME(m_7seg_data));
save_item(NAME(m_inp_mux));
save_item(NAME(m_speech_bank));
}
void elite_state::machine_reset()
{
set_cpu_freq();
fidel_clockdiv_state::machine_reset();
}
void elite_state::set_cpu_freq()
{
// known official CPU speeds: 3MHz(EAS/EWC?), 3.57MHz(PC/Privat), 4MHz(PC/EAS-C)
u8 inp = ioport("FAKE")->read();
m_maincpu->set_unscaled_clock((inp & 2) ? 4_MHz_XTAL : ((inp & 1) ? 3.579545_MHz_XTAL : 3_MHz_XTAL));
div_refresh();
}
// EAG
class eag_state : public elite_state
{
public:
eag_state(const machine_config &mconfig, device_type type, const char *tag) :
elite_state(mconfig, type, tag)
{
m_rotate = true;
}
// machine configs
void eag(machine_config &config);
void eag2100(machine_config &config);
void init_eag2100();
protected:
virtual void machine_reset() override;
private:
// address maps
void eag_map(address_map &map);
void eag2100_map(address_map &map);
};
void eag_state::init_eag2100()
{
m_rombank->configure_entries(0, 4, memregion("rombank")->base(), 0x2000);
}
void eag_state::machine_reset()
{
fidel_clockdiv_state::machine_reset();
if (m_rombank != nullptr)
m_rombank->set_entry(0);
}
/******************************************************************************
I/O
******************************************************************************/
// TTL/generic
void elite_state::update_display()
{
// 4/8 7seg leds+H, 8*8(+1) chessboard leds
u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4);
m_display->matrix(1 << m_inp_mux, m_led_data << 8 | seg_data);
}
u8 elite_state::speech_r(offs_t offset)
{
return m_speech_rom[m_speech_bank << 12 | offset];
}
void elite_state::segment_w(offs_t offset, u8 data)
{
// a0-a2,d7: digit segment
u8 mask = 1 << offset;
m_7seg_data = (m_7seg_data & ~mask) | ((data & 0x80) ? mask : 0);
update_display();
}
void elite_state::led_w(offs_t offset, u8 data)
{
// a0-a2,d0: led data
m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset);
update_display();
}
u8 elite_state::input_r()
{
u8 data = 0;
// multiplexed inputs (active low)
// read chessboard sensors
if (m_inp_mux < 8)
{
// EAG chessboard is rotated 90 degrees
if (m_rotate)
data = m_board->read_rank(m_inp_mux);
else
data = m_board->read_file(m_inp_mux, true);
}
// read button panel
else if (m_inp_mux == 8)
data = m_inputs[0]->read();
return ~data;
}
// 8255 PPI (PC: done with TTL instead)
void elite_state::ppi_porta_w(u8 data)
{
// d0-d5: TSI C0-C5
// d6: TSI START line
m_speech->data_w(data & 0x3f);
m_speech->start_w(data >> 6 & 1);
// d7: printer? (black wire to LED pcb)
}
void elite_state::ppi_portc_w(u8 data)
{
// d0-d3: 7442 a0-a3
// 7442 0-8: led select, input mux
m_inp_mux = data & 0xf;
update_display();
// 7442 9: speaker out
m_dac->write(BIT(1 << m_inp_mux, 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.25 : 1.0);
// d6,d7: bookrom bankswitch (model EAG)
if (m_rombank != nullptr)
m_rombank->set_entry(data >> 6 & 3);
}
u8 elite_state::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(hardwired)
data |= *m_language << 2 & 0x0c;
// d5: 3 more buttons
data |= (BIT(m_inputs[1]->read(), m_inp_mux)) ? 0 : 0x20;
// other: ?
return data | 0xd0;
}
/******************************************************************************
Address Maps
******************************************************************************/
void elite_state::pc_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x17ff).ram();
map(0x2000, 0x5fff).r("cartslot", FUNC(generic_slot_device::read_rom));
map(0x7000, 0x7000).w(FUNC(elite_state::ppi_porta_w));
map(0x7010, 0x7010).r(FUNC(elite_state::ppi_portb_r));
map(0x7020, 0x7027).w(FUNC(elite_state::segment_w)).nopr();
map(0x7030, 0x7037).w(FUNC(elite_state::led_w)).nopr();
map(0x7040, 0x7040).w(FUNC(elite_state::ppi_portc_w));
map(0x7050, 0x7050).r(FUNC(elite_state::input_r));
map(0x8000, 0x9fff).ram();
map(0xb000, 0xffff).rom();
}
void elite_state::eas_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x07ff).ram().share("nvram");
map(0x0800, 0x0fff).ram();
map(0x2000, 0x5fff).r("cartslot", FUNC(generic_slot_device::read_rom));
map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x7020, 0x7027).w(FUNC(elite_state::segment_w)).nopr();
map(0x7030, 0x7037).w(FUNC(elite_state::led_w)).nopr();
map(0x7050, 0x7050).r(FUNC(elite_state::input_r));
map(0x8000, 0x9fff).rom();
map(0xc000, 0xffff).rom();
}
void eag_state::eag_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x1fff).ram().share("nvram.ic8");
map(0x2000, 0x5fff).r("cartslot", FUNC(generic_slot_device::read_rom));
map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x7020, 0x7027).w(FUNC(eag_state::segment_w)).nopr();
map(0x7030, 0x7037).w(FUNC(eag_state::led_w)).nopr();
map(0x7050, 0x7050).r(FUNC(eag_state::input_r));
map(0x8000, 0x9fff).ram().share("nvram.ic6");
map(0xa000, 0xffff).rom();
}
void eag_state::eag2100_map(address_map &map)
{
eag_map(map);
map(0xa000, 0xbfff).bankr("rombank");
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( eas )
PORT_INCLUDE( fidel_clockdiv_4 )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Game Control")
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.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
PORT_START("FAKE")
PORT_CONFNAME( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, elite_state, switch_cpu_freq, 0) // factory set
PORT_CONFSETTING( 0x00, "3MHz (original)" )
PORT_CONFSETTING( 0x01, "3.57MHz (Privat)" )
PORT_CONFSETTING( 0x02, "4MHz (Glasgow)" )
INPUT_PORTS_END
static INPUT_PORTS_START( easc )
PORT_INCLUDE( eas )
PORT_MODIFY("FAKE") // default to 4MHz
PORT_CONFNAME( 0x03, 0x02, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, elite_state, switch_cpu_freq, 0) // factory set
PORT_CONFSETTING( 0x00, "3MHz (original)" )
PORT_CONFSETTING( 0x01, "3.57MHz (Privat)" )
PORT_CONFSETTING( 0x02, "4MHz (Glasgow)" )
INPUT_PORTS_END
static INPUT_PORTS_START( pc )
PORT_INCLUDE( easc )
PORT_MODIFY("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") // led display still says - G C -
INPUT_PORTS_END
static INPUT_PORTS_START( eag )
PORT_INCLUDE( fidel_clockdiv_4 )
PORT_START("IN.0")
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.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
INPUT_PORTS_END
/******************************************************************************
Machine Configs
******************************************************************************/
void elite_state::pc(machine_config &config)
{
/* basic machine hardware */
R65C02(config, m_maincpu, 4_MHz_XTAL); // R65C02P4
m_maincpu->set_addrmap(AS_PROGRAM, &elite_state::div_trampoline);
ADDRESS_MAP_BANK(config, m_mainmap).set_map(&elite_state::pc_map).set_options(ENDIANNESS_LITTLE, 8, 16);
const attotime irq_period = attotime::from_hz(38.4_kHz_XTAL/64); // through 4060 IC, 600Hz
TIMER(config, m_irq_on).configure_periodic(FUNC(elite_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
TIMER(config, "irq_off").configure_periodic(FUNC(elite_state::irq_off<M6502_IRQ_LINE>), irq_period);
SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
m_board->set_delay(attotime::from_msec(100));
/* video hardware */
PWM_DISPLAY(config, m_display).set_size(9, 16);
m_display->set_segmask(0xf, 0x7f);
config.set_default_layout(layout_fidel_pc);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
m_speech->ext_read().set(FUNC(elite_state::speech_r));
m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* cartridge */
GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc");
SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
}
void elite_state::easc(machine_config &config)
{
pc(config);
/* basic machine hardware */
m_mainmap->set_addrmap(AS_PROGRAM, &elite_state::eas_map);
I8255(config, m_ppi8255); // port B: input, port A & C: output
m_ppi8255->out_pa_callback().set(FUNC(elite_state::ppi_porta_w));
m_ppi8255->tri_pa_callback().set_constant(0);
m_ppi8255->in_pb_callback().set(FUNC(elite_state::ppi_portb_r));
m_ppi8255->out_pc_callback().set(FUNC(elite_state::ppi_portc_w));
m_ppi8255->tri_pc_callback().set_constant(0);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
m_board->set_nvram_enable(true);
config.set_default_layout(layout_fidel_eas);
}
void elite_state::eas(machine_config &config)
{
easc(config);
m_maincpu->set_clock(3_MHz_XTAL);
}
void eag_state::eag(machine_config &config)
{
eas(config);
/* basic machine hardware */
m_maincpu->set_clock(5_MHz_XTAL); // R65C02P4
m_mainmap->set_addrmap(AS_PROGRAM, &eag_state::eag_map);
config.device_remove("nvram");
NVRAM(config, "nvram.ic8", nvram_device::DEFAULT_ALL_0);
NVRAM(config, "nvram.ic6", nvram_device::DEFAULT_ALL_0);
/* video hardware */
m_display->set_segmask(0x1ef, 0x7f);
config.set_default_layout(layout_fidel_eag);
}
void eag_state::eag2100(machine_config &config)
{
eag(config);
/* basic machine hardware */
m_mainmap->set_addrmap(AS_PROGRAM, &eag_state::eag2100_map);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( feasbu )
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("hm_6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) ) // ST M27C64A
ROM_CONTINUE( 0x9000, 0x0800 )
ROM_CONTINUE( 0x8800, 0x0800 )
ROM_CONTINUE( 0x9800, 0x0800 )
ROM_LOAD("101-1052a02", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) ) // Mostek MK36C63N-5
ROM_LOAD("101-1052a01", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) ) // Mostek MK36C63N-5
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) ) // NEC D2332C
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
ROM_START( feasgla )
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("4.0_86", 0x8000, 0x0800, CRC(32784e2d) SHA1(dae060a5c49cc1993a78db293cd80464adfd892d) )
ROM_CONTINUE( 0x9000, 0x0800 )
ROM_CONTINUE( 0x8800, 0x0800 )
ROM_CONTINUE( 0x9800, 0x0800 )
ROM_LOAD("c5", 0xc000, 0x0800, CRC(ddb80412) SHA1(b1d9435d9a71b8eb241a2169bfbaa0499f510769) )
ROM_CONTINUE( 0xd000, 0x0800 )
ROM_CONTINUE( 0xc800, 0x0800 )
ROM_CONTINUE( 0xd800, 0x0800 )
ROM_LOAD("4.0_e4", 0xe000, 0x0800, CRC(62a5305a) SHA1(a361bd9a54b903d7b0fbacabe55ea5ccbbc1dc51) )
ROM_CONTINUE( 0xf000, 0x0800 )
ROM_CONTINUE( 0xe800, 0x0800 )
ROM_CONTINUE( 0xf800, 0x0800 )
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
ROM_START( feasglaa ) // model EAS-C
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("orange", 0x8000, 0x0800, CRC(32784e2d) SHA1(dae060a5c49cc1993a78db293cd80464adfd892d) )
ROM_CONTINUE( 0x9000, 0x0800 )
ROM_CONTINUE( 0x8800, 0x0800 )
ROM_CONTINUE( 0x9800, 0x0800 )
ROM_LOAD("black", 0xc000, 0x0800, CRC(3f0b01b6) SHA1(fe8d214f1678e000ba945e2f6dc3438af97c6f33) ) // only 2 bytes different
ROM_CONTINUE( 0xd000, 0x0800 )
ROM_CONTINUE( 0xc800, 0x0800 )
ROM_CONTINUE( 0xd800, 0x0800 )
ROM_LOAD("green", 0xe000, 0x0800, CRC(62a5305a) SHA1(a361bd9a54b903d7b0fbacabe55ea5ccbbc1dc51) )
ROM_CONTINUE( 0xf000, 0x0800 )
ROM_CONTINUE( 0xe800, 0x0800 )
ROM_CONTINUE( 0xf800, 0x0800 )
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
ROM_START( feasglab )
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("6a", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
ROM_CONTINUE( 0x9000, 0x0800 )
ROM_CONTINUE( 0x8800, 0x0800 )
ROM_CONTINUE( 0x9800, 0x0800 )
ROM_LOAD("5a", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
ROM_CONTINUE( 0xd000, 0x0800 )
ROM_CONTINUE( 0xc800, 0x0800 )
ROM_CONTINUE( 0xd800, 0x0800 )
ROM_LOAD("4a", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
ROM_CONTINUE( 0xf000, 0x0800 )
ROM_CONTINUE( 0xe800, 0x0800 )
ROM_CONTINUE( 0xf800, 0x0800 )
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) ) // NEC D2332C
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
ROM_START( 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) )
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
ROM_START( 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) )
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
ROM_START( feag ) // model 6081, aka "Mobile Master"
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("eg_orange.ic9", 0xa000, 0x2000, CRC(df9e7e74) SHA1(db76750eba5515213ecce07402c4d974c14e1a23) ) // M5L2764K, orange sticker
ROM_LOAD("eg_black.ic5", 0xc000, 0x2000, CRC(a5f6f295) SHA1(319f00d4b7a1704a3ca722c40f4096004b4b89d2) ) // M5L2764K, black sticker
ROM_LOAD("eg_green.ic4", 0xe000, 0x2000, CRC(1dc6508a) SHA1(6f2e730b216bfb900074d1d786124fc3cb038a8d) ) // M5L2764K, green sticker
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107.ic16", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101.ic16", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105.ic16", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106.ic16", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
ROM_START( feag2100 )
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("el2100_2.ic5", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
ROM_LOAD("el2100_3.ic4", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
ROM_REGION( 0x8000, "rombank", 0 )
ROM_LOAD("el2100_1.ic9", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107.ic16", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101.ic16", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105.ic16", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106.ic16", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
ROM_START( feag2100a ) // model 6088
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("2100_c_black.ic5", 0xc000, 0x2000, CRC(454eb839) SHA1(83d206464c194b022d43913b5f4092a8201f36b9) )
ROM_LOAD("2100_c_green.ic4", 0xe000, 0x2000, CRC(f1f76a63) SHA1(337b4572b743d383c6a12c360875d37682de3647) )
ROM_REGION( 0x8000, "rombank", 0 )
ROM_LOAD("2100_c_orange.ic9", 0x0000, 0x8000, CRC(feeff71c) SHA1(87614ca850848581d946193efa317181ef9c7a09) )
// speech ROM
ROM_DEFAULT_BIOS("en")
ROM_SYSTEM_BIOS(0, "en", "English")
ROM_SYSTEM_BIOS(1, "de", "German")
ROM_SYSTEM_BIOS(2, "fr", "French")
ROM_SYSTEM_BIOS(3, "sp", "Spanish")
ROM_REGION( 1, "language", 0 )
ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
ROM_REGION( 0x2000, "speech", 0 )
ROMX_LOAD("101-32107.ic16", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
ROM_RELOAD( 0x1000, 0x1000)
ROMX_LOAD("101-64101.ic16", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
ROMX_LOAD("101-64105.ic16", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
ROMX_LOAD("101-64106.ic16", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1983, feasbu, 0, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
CONS( 1984, feasgla, feasbu, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
CONS( 1984, feasglaa, feasbu, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
CONS( 1984, feasglab, feasbu, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
CONS( 1982, fpres, 0, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
CONS( 1983, fpresbu, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
CONS( 1986, feag, 0, 0, eag, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6081)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
CONS( 1986, feag2100, feag, 0, eag2100, eag, eag_state, init_eag2100, "Fidelity Electronics", "Elite Avant Garde 2100 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
CONS( 1986, feag2100a, feag, 0, eag2100, eag, eag_state, init_eag2100, "Fidelity Electronics", "Elite Avant Garde 2100 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )