fidel6502: split up into multiple files (nw)

This commit is contained in:
hap 2019-02-18 22:32:38 +01:00
parent 6207d7d2d3
commit 077f602605
18 changed files with 1952 additions and 1663 deletions

View File

@ -2131,10 +2131,16 @@ createMESSProjects(_target, _subtarget, "fidelity")
files { files {
MAME_DIR .. "src/mame/drivers/fidelbase.cpp", MAME_DIR .. "src/mame/drivers/fidelbase.cpp",
MAME_DIR .. "src/mame/includes/fidelbase.h", MAME_DIR .. "src/mame/includes/fidelbase.h",
MAME_DIR .. "src/mame/drivers/fidel_as12.cpp",
MAME_DIR .. "src/mame/drivers/fidel_chesster.cpp",
MAME_DIR .. "src/mame/drivers/fidel_csc.cpp",
MAME_DIR .. "src/mame/drivers/fidel_desdis.cpp", MAME_DIR .. "src/mame/drivers/fidel_desdis.cpp",
MAME_DIR .. "src/mame/drivers/fidel_eag68k.cpp", MAME_DIR .. "src/mame/drivers/fidel_eag68k.cpp",
MAME_DIR .. "src/mame/drivers/fidel_excel.cpp", MAME_DIR .. "src/mame/drivers/fidel_excel.cpp",
MAME_DIR .. "src/mame/drivers/fidel_phantom.cpp",
MAME_DIR .. "src/mame/drivers/fidel_sc12.cpp",
MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp", MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp",
MAME_DIR .. "src/mame/drivers/fidel_sc9.cpp",
MAME_DIR .. "src/mame/drivers/fidel6502.cpp", MAME_DIR .. "src/mame/drivers/fidel6502.cpp",
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,189 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:yoyo_chessboard
/******************************************************************************
Elegance Chess Challenger (AS12)
----------------
R65C02P4 CPU @ 4MHz
3*8KB ROM(TMM2764), 2*2KB RAM(HM6116)
PCB label 510-1084B01
This is on the SC12B board, with enough modifications to support more leds and
magnetic chess board sensors. See fidel_sc12.cpp for a more technical description.
******************************************************************************/
#include "emu.h"
#include "includes/fidelbase.h"
#include "cpu/m6502/r65c02.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "fidel_as12.lh" // clickable
namespace {
class as12_state : public fidelbase_state
{
public:
as12_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
void as12(machine_config &config);
private:
void main_map(address_map &map);
// I/O handlers
void prepare_display();
DECLARE_WRITE8_MEMBER(control_w);
DECLARE_WRITE8_MEMBER(led_w);
DECLARE_READ8_MEMBER(input_r);
};
/******************************************************************************
Devices, I/O
******************************************************************************/
// TTL/generic
void as12_state::prepare_display()
{
// 8*8(+1) chessboard leds
display_matrix(8, 9, m_led_data, m_inp_mux);
}
WRITE8_MEMBER(as12_state::control_w)
{
// d0-d3: 74245 P0-P3
// 74245 Q0-Q8: input mux, led select
u16 sel = 1 << (data & 0xf) & 0x3ff;
m_inp_mux = bitswap<9>(sel,5,8,7,6,4,3,1,0,2);
prepare_display();
// 74245 Q9: speaker out
m_dac->write(BIT(sel, 9));
// d4,d5: printer?
// d6,d7: N/C?
}
WRITE8_MEMBER(as12_state::led_w)
{
// a0-a2,d0: led data via NE591N
m_led_data = (data & 1) << offset;
prepare_display();
}
READ8_MEMBER(as12_state::input_r)
{
// a0-a2,d7: multiplexed inputs (active low)
u8 inp = bitswap<8>(read_inputs(9),4,3,2,1,0,5,6,7);
return (inp >> offset & 1) ? 0 : 0x80;
}
/******************************************************************************
Address Maps
******************************************************************************/
void as12_state::main_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x0fff).ram();
map(0x1800, 0x1807).w(FUNC(as12_state::led_w)).nopr();
map(0x2000, 0x5fff).r(FUNC(as12_state::cartridge_r));
map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(as12_state::control_w));
map(0x8000, 0x9fff).rom();
map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(as12_state::input_r));
map(0xc000, 0xffff).rom();
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( as12 )
PORT_INCLUDE( fidel_cpu_div_4 )
PORT_INCLUDE( fidel_cb_magnets )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void as12_state::as12(machine_config &config)
{
/* basic machine hardware */
R65C02(config, m_maincpu, 4_MHz_XTAL); // R65C02P4
m_maincpu->set_addrmap(AS_PROGRAM, &as12_state::div_trampoline);
ADDRESS_MAP_BANK(config, m_mainmap).set_map(&as12_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
const attotime irq_period = attotime::from_hz(585); // from 556 timer (22nF, 110K, 1K)
TIMER(config, m_irq_on).configure_periodic(FUNC(as12_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
TIMER(config, "irq_off").configure_periodic(FUNC(as12_state::irq_off<M6502_IRQ_LINE>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_as12);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* cartridge */
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat"));
cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( feleg ) // model AS12(or 6085), PCB label 510-1084B01
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("feleg.1", 0x8000, 0x2000, CRC(e9df31e8) SHA1(31c52bb8f75580c82093eb950959c1bc294189a8) ) // TMM2764, no label
ROM_LOAD("feleg.2", 0xc000, 0x2000, CRC(bed9c84b) SHA1(c12f39765b054d2ad81f747e698715ad4246806d) ) // "
ROM_LOAD("feleg.3", 0xe000, 0x2000, CRC(b1fb49aa) SHA1(d8c9687dd564f0fa603e6d684effb1d113ac64b4) ) // "
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1985, feleg, 0, 0, as12, as12, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )

View File

@ -0,0 +1,212 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:yoyo_chessboard
/******************************************************************************
Chesster (model 6120)
There is also a German version titled Kishon Chesster (model 6120G, or 6127)
----------------
8*(8+1) buttons, 8+8+1 LEDs
8KB RAM(UM6264-12), 32KB ROM(M27C256B)
Ricoh RP65C02G CPU, 5MHz XTAL
8-bit DAC speech timed via IRQ, 128KB ROM(AMI custom label)
PCB label 510.1141C01
I/O is via TTL, memory map is similar to Designer Display
The speech technology was invented by Forrest S. Mozer(same person that invented
the S14001A in the 70s), this time a 65C02 software solution.
******************************************************************************/
#include "emu.h"
#include "includes/fidelbase.h"
#include "cpu/m6502/r65c02.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "fidel_chesster.lh" // clickable
namespace {
class chesster_state : public fidelbase_state
{
public:
chesster_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
// machine drivers
void chesster(machine_config &config);
void kishon(machine_config &config);
void init_chesster();
private:
void main_map(address_map &map);
int m_numbanks;
// I/O handlers
DECLARE_WRITE8_MEMBER(control_w);
DECLARE_READ8_MEMBER(input_r);
};
void chesster_state::init_chesster()
{
m_numbanks = memregion("rombank")->bytes() / 0x4000;
m_rombank->configure_entries(0, m_numbanks, memregion("rombank")->base(), 0x4000);
}
/******************************************************************************
Devices, I/O
******************************************************************************/
// TTL/generic
WRITE8_MEMBER(chesster_state::control_w)
{
// a0-a2,d7: 74259(1)
u8 mask = 1 << offset;
m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
// 74259 Q4-Q7: 7442 a0-a3
// 7442 0-8: led data, input mux
u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
m_inp_mux = sel & 0x1ff;
// 74259 Q0,Q1: led select (active low)
display_matrix(9, 2, m_inp_mux, ~m_led_select & 3);
// 74259 Q2,Q3: speechrom A14,A15
// a0-a2,d0: 74259(2) Q3,Q2,Q0 to A16,A17,A18
m_speech_bank = (m_speech_bank & ~mask) | ((data & 1) ? mask : 0);
u8 bank = (m_led_select >> 2 & 3) | bitswap<3>(m_speech_bank, 0,2,3) << 2;
m_rombank->set_entry(bank & (m_numbanks - 1));
}
READ8_MEMBER(chesster_state::input_r)
{
// a0-a2,d7: multiplexed inputs (active low)
return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
}
/******************************************************************************
Address Maps
******************************************************************************/
void chesster_state::main_map(address_map &map)
{
map(0x0000, 0x1fff).ram();
map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(chesster_state::input_r), FUNC(chesster_state::control_w));
map(0x4000, 0x7fff).bankr("rombank");
map(0x6000, 0x6000).mirror(0x1fff).w("dac8", FUNC(dac_byte_interface::data_w));
map(0x8000, 0xffff).rom();
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( chesster )
PORT_INCLUDE( fidel_cb_buttons )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / No")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Yes")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Repeat")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Replay")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void chesster_state::chesster(machine_config &config)
{
/* basic machine hardware */
R65C02(config, m_maincpu, 5_MHz_XTAL); // RP65C02G
m_maincpu->set_addrmap(AS_PROGRAM, &chesster_state::main_map);
const attotime irq_period = attotime::from_hz(9615); // R/C circuit, measured
TIMER(config, m_irq_on).configure_periodic(FUNC(chesster_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(2600)); // active for 2.6us
TIMER(config, "irq_off").configure_periodic(FUNC(chesster_state::irq_off<M6502_IRQ_LINE>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_chesster);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_8BIT_R2R(config, "dac8", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // m74hc374b1.ic1 + 8l513_02.z2
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac8", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac8", -1.0, DAC_VREF_NEG_INPUT);
}
void chesster_state::kishon(machine_config &config)
{
chesster(config);
/* basic machine hardware */
m_maincpu->set_clock(3.579545_MHz_XTAL);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( chesster ) // model 6120, PCB label 510.1141C01
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("ch_1.3.ic9", 0x8000, 0x8000, CRC(8b42d1ad) SHA1(2161fc5ab2476fe7ca4ffc226e3cb329b8a57a01) ) // 27256, CH 1.3 on sticker
ROM_REGION( 0x20000, "rombank", 0 )
ROM_LOAD("101-1091b02.ic10", 0x0000, 0x20000, CRC(fa370e88) SHA1(a937c8f1ec295cf9539d12466993974e40771493) ) // AMI, 27C010 or equivalent
ROM_END
ROM_START( chesstera ) // model 6120, PCB label 510.1141C01
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("chesster.ic9", 0x8000, 0x8000, CRC(29f9a698) SHA1(4c83ca46fd5fc9c40302e9c7f16b4ae2c18b06e6) ) // M27C256B, sticker but no label
ROM_REGION( 0x20000, "rombank", 0 )
ROM_LOAD("101-1091a02.ic10", 0x0000, 0x20000, CRC(2b4d243c) SHA1(921e51978facb502b207b4f64a73b1e74127e826) ) // AMI, 27C010 or equivalent
ROM_END
ROM_START( kishon ) // model 6120G or 6127(same), PCB label 510.1141C01
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("kishon.ic9", 0x8000, 0x8000, CRC(121c007f) SHA1(652e9ea47b6bb1632d10eb0fcd7f98cdba22fce7) ) // 27C256
ROM_REGION( 0x80000, "rombank", 0 )
ROM_LOAD("kishon_v2.6_1-14-91.ic10", 0x0000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12, aka 101-1094A01
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1990, chesster, 0, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger (V1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1990, chesstera, chesster, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1991, kishon, chesster, 0, kishon, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Kishon Chesster", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -0,0 +1,696 @@
// license:BSD-3-Clause
// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap
// thanks-to:Berger,yoyo_chessboard
/******************************************************************************
Fidelity CSC(and derived) hardware
- Champion Sensory Chess Challenger
- Super 9 Sensory Chess Challenger
- Reversi Sensory Challenger
*******************************************************************************
Champion Sensory Chess Challenger (CSC)
---------------------------------------
RE notes by Kevin Horton
Memory map:
-----------
0000-07FF: 2K of RAM
0800-0FFF: 1K of RAM (note: mirrored twice)
1000-17FF: PIA 1 (display, TSI speech chip)
1800-1FFF: PIA 0 (keypad, LEDs)
2000-3FFF: 101-64019 ROM*
4000-7FFF: mirror of 0000-3FFF
8000-9FFF: not used
A000-BFFF: 101-1025A03 ROM
C000-DFFF: 101-1025A02 ROM
E000-FDFF: 101-1025A01 ROM
FE00-FFFF: 512 byte 74S474 PROM
*: 101-64019 is also used on the VSC(fidel_vsc.cpp). It contains the opening book
and "64 greatest games", as well as some Z80 code. Obviously the latter is unused
on the CSC.
CPU is a 6502 running at 1.95MHz (3.9MHz resonator, divided by 2)
NMI is not used.
IRQ is connected to a 600Hz oscillator (38.4KHz divided by 64).
Reset is connected to a power-on reset circuit.
PIA 1:
------
PA0 - 7seg segments E, TSI A0
PA1 - 7seg segments D, TSI A1
PA2 - 7seg segments C, TSI A2
PA3 - 7seg segments H, TSI A3
PA4 - 7seg segments G, TSI A4
PA5 - 7seg segments F, TSI A5
PA6 - 7seg segments B
PA7 - 7seg segments A
PB0 - A12 on speech ROM (if used... not used on this model, ROM is 4K)
PB1 - START line on TSI
PB2 - white wire
PB3 - BUSY line from TSI
PB4 - hi/lo TSI speaker volume
PB5 - button row 9
PB6 - selection jumper (resistor to 5V)
PB7 - selection jumper (resistor to ground)
CA1 - NC
CA2 - violet wire
CB1 - NC
CB2 - NC (connects to pin 14 of soldered connector)
PIA 0:
------
PA0 - button row 1
PA1 - button row 2
PA2 - button row 3
PA3 - button row 4
PA4 - button row 5
PA5 - button row 6
PA6 - 7442 selector bit 0
PA7 - 7442 selector bit 1
PB0 - LED row 1
PB1 - LED row 2
PB2 - LED row 3
PB3 - LED row 4
PB4 - LED row 5
PB5 - LED row 6
PB6 - LED row 7
PB7 - LED row 8
CA1 - button row 7
CA2 - selector bit 3
CB1 - button row 8
CB2 - selector bit 2
Selector: (attached to PIA 0, outputs 1 of 10 pins low. 7442)
---------
output # (selected turns this column on, and all others off)
0 - LED column A, button column A, 7seg digit 1
1 - LED column B, button column B, 7seg digit 2
2 - LED column C, button column C, 7seg digit 3
3 - LED column D, button column D, 7seg digit 4
4 - LED column E, button column E
5 - LED column F, button column F
6 - LED column G, button column G
7 - LED column H, button column H
8 - button column I
9 - Tone line (toggle to make a tone in the buzzer)
The rows/columns are indicated on the game board:
ABCDEFGH I
--------------
| | 8
| | 7
| | 6
| | 5
| | 4
| | 3
| | 2
| | 1
--------------
The "lone LED" is above the control column.
column I is the "control column" on the right for starting a new game, etc.
The upper 6 buttons are connected as such:
column A - speak
column B - RV
column C - TM
column D - LV
column E - DM
column F - ST
these 6 buttons use row 9 (connects to PIA 1)
LED display:
------------
43 21 (digit number)
-----
88:88
The LED display is four 7 segment digits. normal ABCDEFG lettering is used for segments.
The upper dot is connected to digit 3 common
The lower dot is connected to digit 4 common
The lone LED is connected to digit 1 common
All three of the above are called "segment H".
*******************************************************************************
Super 9 Sensory Chess Challenger (SU9/DS9)
This is basically the Fidelity Elite A/S program on CSC hardware.
Model DS9(Deluxe) has a 5MHz XTAL, but is otherwise same.
---------------------------------
R6502AP CPU, 1.95MHz(3.9MHz resonator)
2 RAM chips, assume 4KB
2*8KB ROM + 1*2KB ROM
built-in CB9 module
See CSC description above for more information.
*******************************************************************************
Reversi Sensory Challenger (RSC)
The 1st version came out in 1980, a program revision was released in 1981.
Another distinction is the board color and layout, the 1981 version is green.
---------------------------------
8*(8+1) buttons, 8*8+1 LEDs
1KB RAM(2*2114), 4KB ROM
MOS MPS 6502B CPU, frequency unknown
MOS MPS 6520 PIA, I/O is nearly same as CSC's PIA 0
PCB label 510-1035A01
******************************************************************************/
#include "emu.h"
#include "includes/fidelbase.h"
#include "cpu/m6502/m6502.h"
#include "machine/6821pia.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "fidel_csc.lh" // clickable, with preliminary boardpieces simulation
#include "fidel_rsc_v2.lh" // clickable
#include "fidel_su9.lh" // clickable
namespace {
class csc_state : public fidelbase_state
{
public:
csc_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_pia(*this, "pia%u", 0)
{ }
// machine drivers
void csc(machine_config &config);
void su9(machine_config &config);
void rsc(machine_config &config);
protected:
// devices/pointers
optional_device_array<pia6821_device, 2> m_pia;
// address maps
void csc_map(address_map &map);
void su9_map(address_map &map);
void rsc_map(address_map &map);
// I/O handlers
void prepare_display();
DECLARE_READ8_MEMBER(speech_r);
DECLARE_WRITE8_MEMBER(pia0_pa_w);
DECLARE_WRITE8_MEMBER(pia0_pb_w);
DECLARE_READ8_MEMBER(pia0_pa_r);
DECLARE_WRITE_LINE_MEMBER(pia0_ca2_w);
DECLARE_WRITE_LINE_MEMBER(pia0_cb2_w);
DECLARE_READ_LINE_MEMBER(pia0_ca1_r);
DECLARE_READ_LINE_MEMBER(pia0_cb1_r);
DECLARE_WRITE8_MEMBER(pia1_pa_w);
DECLARE_WRITE8_MEMBER(pia1_pb_w);
DECLARE_READ8_MEMBER(pia1_pb_r);
DECLARE_WRITE_LINE_MEMBER(pia1_ca2_w);
};
class su9_state : public csc_state
{
public:
su9_state(const machine_config &mconfig, device_type type, const char *tag) :
csc_state(mconfig, type, tag)
{ }
DECLARE_INPUT_CHANGED_MEMBER(su9_cpu_freq) { su9_set_cpu_freq(); }
protected:
virtual void machine_reset() override;
void su9_set_cpu_freq();
};
void su9_state::machine_reset()
{
csc_state::machine_reset();
su9_set_cpu_freq();
}
void su9_state::su9_set_cpu_freq()
{
// SU9 CPU is clocked 1.95MHz, DS9 is 2.5MHz
m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (5_MHz_XTAL/2) : (3.9_MHz_XTAL/2));
}
/******************************************************************************
Devices, I/O
******************************************************************************/
// misc handlers
void csc_state::prepare_display()
{
// 7442 0-8: led select, input mux
m_inp_mux = 1 << m_led_select & 0x3ff;
// 7442 9: speaker out
m_dac->write(BIT(m_inp_mux, 9));
// 7seg leds+H (not on all models), 8*8(+1) chessboard leds
set_display_segmask(0xf, 0x7f);
display_matrix(16, 9, m_led_data << 8 | m_7seg_data, m_inp_mux);
}
READ8_MEMBER(csc_state::speech_r)
{
return m_speech_rom[m_speech_bank << 12 | offset];
}
// 6821 PIA 0
READ8_MEMBER(csc_state::pia0_pa_r)
{
// d0-d5: button row 0-5 (active low)
return (read_inputs(9) & 0x3f) ^ 0xff;
}
WRITE8_MEMBER(csc_state::pia0_pa_w)
{
// d6,d7: 7442 A0,A1
m_led_select = (m_led_select & ~3) | (data >> 6 & 3);
prepare_display();
}
WRITE8_MEMBER(csc_state::pia0_pb_w)
{
// d0-d7: led row data
m_led_data = data;
prepare_display();
}
READ_LINE_MEMBER(csc_state::pia0_ca1_r)
{
// button row 6 (active low)
return ~read_inputs(9) >> 6 & 1;
}
READ_LINE_MEMBER(csc_state::pia0_cb1_r)
{
// button row 7 (active low)
return ~read_inputs(9) >> 7 & 1;
}
WRITE_LINE_MEMBER(csc_state::pia0_cb2_w)
{
// 7442 A2
m_led_select = (m_led_select & ~4) | (state ? 4 : 0);
prepare_display();
}
WRITE_LINE_MEMBER(csc_state::pia0_ca2_w)
{
// 7442 A3
m_led_select = (m_led_select & ~8) | (state ? 8 : 0);
prepare_display();
}
// 6821 PIA 1
WRITE8_MEMBER(csc_state::pia1_pa_w)
{
// d0-d5: TSI C0-C5
m_speech->data_w(space, 0, data & 0x3f);
// d0-d7: data for the 4 7seg leds, bits are ABFGHCDE (H is extra led)
m_7seg_data = bitswap<8>(data,0,1,5,6,7,2,3,4);
prepare_display();
}
WRITE8_MEMBER(csc_state::pia1_pb_w)
{
// d0: speech ROM A12
m_speech->force_update(); // update stream to now
m_speech_bank = data & 1;
// d1: TSI START line
m_speech->start_w(data >> 1 & 1);
// d4: lower TSI volume
m_speech->set_output_gain(0, (data & 0x10) ? 0.5 : 1.0);
}
READ8_MEMBER(csc_state::pia1_pb_r)
{
// d2: printer?
u8 data = 0x04;
// d3: TSI BUSY line
if (m_speech->busy_r())
data |= 0x08;
// d5: button row 8 (active low)
// d6,d7: language switches(hardwired with 2 resistors/jumpers)
data |= (~read_inputs(9) >> 3 & 0x20) | (~m_language << 6 & 0xc0);
return data;
}
WRITE_LINE_MEMBER(csc_state::pia1_ca2_w)
{
// printer?
}
/******************************************************************************
Address Maps
******************************************************************************/
void csc_state::csc_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x07ff).mirror(0x4000).ram();
map(0x0800, 0x0bff).mirror(0x4400).ram();
map(0x1000, 0x1003).mirror(0x47fc).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x1800, 0x1803).mirror(0x47fc).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x2000, 0x3fff).mirror(0x4000).rom();
map(0xa000, 0xffff).rom();
}
void csc_state::su9_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x0fff).ram();
map(0x1000, 0x1003).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x1800, 0x1803).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x2000, 0x3fff).rom();
map(0xa000, 0xa7ff).rom();
map(0xc000, 0xffff).rom();
}
void csc_state::rsc_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x03ff).ram();
map(0x2000, 0x2003).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0xf000, 0xffff).rom();
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( csc )
PORT_INCLUDE( fidel_cb_buttons )
PORT_MODIFY("IN.0")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
PORT_MODIFY("IN.1")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
PORT_MODIFY("IN.2")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM")
PORT_MODIFY("IN.3")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV")
PORT_MODIFY("IN.4")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
PORT_MODIFY("IN.5")
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST")
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
INPUT_PORTS_END
static INPUT_PORTS_START( su9 )
PORT_INCLUDE( csc )
PORT_MODIFY("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
PORT_START("FAKE")
PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, su9_state, su9_cpu_freq, nullptr) // factory set
PORT_CONFSETTING( 0x00, "1.95MHz (SU9)" )
PORT_CONFSETTING( 0x01, "2.5MHz (DS9)" )
INPUT_PORTS_END
static INPUT_PORTS_START( rsc )
PORT_INCLUDE( fidel_cb_buttons )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("ST")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("RV")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("DM")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("CL")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("LV")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PV")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void csc_state::csc(machine_config &config)
{
/* basic machine hardware */
M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // from 3.9MHz resonator
m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::csc_map);
const attotime irq_period = attotime::from_hz(38.4_kHz_XTAL/64); // through 4060 IC, 600Hz
TIMER(config, m_irq_on).configure_periodic(FUNC(csc_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
TIMER(config, "irq_off").configure_periodic(FUNC(csc_state::irq_off<M6502_IRQ_LINE>), irq_period);
PIA6821(config, m_pia[0], 0);
m_pia[0]->readpa_handler().set(FUNC(csc_state::pia0_pa_r));
m_pia[0]->readca1_handler().set(FUNC(csc_state::pia0_ca1_r));
m_pia[0]->readcb1_handler().set(FUNC(csc_state::pia0_cb1_r));
m_pia[0]->writepa_handler().set(FUNC(csc_state::pia0_pa_w));
m_pia[0]->writepb_handler().set(FUNC(csc_state::pia0_pb_w));
m_pia[0]->ca2_handler().set(FUNC(csc_state::pia0_ca2_w));
m_pia[0]->cb2_handler().set(FUNC(csc_state::pia0_cb2_w));
PIA6821(config, m_pia[1], 0);
m_pia[1]->readpb_handler().set(FUNC(csc_state::pia1_pb_r));
m_pia[1]->writepa_handler().set(FUNC(csc_state::pia1_pa_w));
m_pia[1]->writepb_handler().set(FUNC(csc_state::pia1_pb_w));
m_pia[1]->ca2_handler().set(FUNC(csc_state::pia1_ca2_w));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_csc);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
m_speech->ext_read().set(FUNC(csc_state::speech_r));
m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
void csc_state::su9(machine_config &config)
{
csc(config);
m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::su9_map);
config.set_default_layout(layout_fidel_su9);
}
void csc_state::rsc(machine_config &config)
{
/* basic machine hardware */
M6502(config, m_maincpu, 1800000); // measured approx 1.81MHz
m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::rsc_map);
const attotime irq_period = attotime::from_hz(546); // from 555 timer, measured
TIMER(config, m_irq_on).configure_periodic(FUNC(csc_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_usec(38)); // active for 38us
TIMER(config, "irq_off").configure_periodic(FUNC(csc_state::irq_off<M6502_IRQ_LINE>), irq_period);
PIA6821(config, m_pia[0], 0); // MOS 6520
m_pia[0]->readpa_handler().set(FUNC(csc_state::pia0_pa_r));
m_pia[0]->readca1_handler().set(FUNC(csc_state::pia0_ca1_r));
m_pia[0]->readcb1_handler().set(FUNC(csc_state::pia0_cb1_r));
m_pia[0]->writepa_handler().set(FUNC(csc_state::pia0_pa_w));
m_pia[0]->writepb_handler().set(FUNC(csc_state::pia0_pb_w));
m_pia[0]->ca2_handler().set(FUNC(csc_state::pia0_ca2_w));
m_pia[0]->cb2_handler().set(FUNC(csc_state::pia0_cb2_w));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_rsc_v2);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( csc )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
ROM_REGION( 0x2000, "speech", 0 )
ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) )
ROM_RELOAD( 0x1000, 0x1000)
ROM_END
ROM_START( cscg )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
ROM_REGION( 0x2000, "speech", 0 )
ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
ROM_END
ROM_START( cscsp )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
ROM_REGION( 0x2000, "speech", 0 )
ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
ROM_END
ROM_START( cscfr )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
ROM_REGION( 0x2000, "speech", 0 )
ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
ROM_END
ROM_START( super9cc )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
ROM_REGION( 0x2000, "speech", 0 )
ROM_LOAD("101-32107", 0x0000, 0x1000, BAD_DUMP CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // taken from csc, assume correct
ROM_RELOAD( 0x1000, 0x1000)
ROM_END
ROM_START( super9ccg )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
ROM_REGION( 0x2000, "speech", 0 )
ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
ROM_END
ROM_START( super9ccsp )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
ROM_REGION( 0x2000, "speech", 0 )
ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
ROM_END
ROM_START( super9ccfr )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
ROM_REGION( 0x2000, "speech", 0 )
ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
ROM_END
ROM_START( reversic )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1000a01", 0xf000, 0x1000, CRC(ca7723a7) SHA1(bd92330f2d9494fa408f5a2ca300d7a755bdf489) )
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1981, csc, 0, 0, csc, csc, csc_state, init_language<0>, "Fidelity Electronics", "Champion Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1981, cscg, csc, 0, csc, csc, csc_state, init_language<1>, "Fidelity Electronics", "Champion Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1981, cscsp, csc, 0, csc, csc, csc_state, init_language<2>, "Fidelity Electronics", "Champion Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1981, cscfr, csc, 0, csc, csc, csc_state, init_language<3>, "Fidelity Electronics", "Champion Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1983, super9cc, 0, 0, su9, su9, su9_state, init_language<0>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1983, super9ccg, super9cc, 0, su9, su9, su9_state, init_language<1>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1983, super9ccsp, super9cc, 0, su9, su9, su9_state, init_language<2>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1983, super9ccfr, super9cc, 0, su9, su9, su9_state, init_language<3>, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1981, reversic, 0, 0, rsc, rsc, csc_state, empty_init, "Fidelity Electronics", "Reversi Sensory Challenger (green version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -3,6 +3,10 @@
// thanks-to:Berger,yoyo_chessboard // thanks-to:Berger,yoyo_chessboard
/****************************************************************************** /******************************************************************************
Fidelity Designer Display series (6502-based displayless Designer is in fidel_excel.cpp)
*******************************************************************************
Designer 2100 Display (model 6106) Designer 2100 Display (model 6106)
---------------- ----------------
8KB RAM(MS6264L-10), 2*32KB ROM(27C256) 8KB RAM(MS6264L-10), 2*32KB ROM(27C256)
@ -12,7 +16,7 @@ PCB label 510.1130A01
Designer 2000 Display (model 6105): same hardware, no bookrom, 3MHz Designer 2000 Display (model 6105): same hardware, no bookrom, 3MHz
****************************************************************************** *******************************************************************************
Designer Mach III Master 2265 (model 6113) Designer Mach III Master 2265 (model 6113)
------------------------------------------ ------------------------------------------

View File

@ -16,7 +16,7 @@ TODO:
at twice the frequency due to lack of superscalar. at twice the frequency due to lack of superscalar.
- V11 beeper is too high pitched, obviously related to wrong CPU type too - V11 beeper is too high pitched, obviously related to wrong CPU type too
****************************************************************************** *******************************************************************************
Excel 68000 (model 6094) Excel 68000 (model 6094)
------------------------ ------------------------
@ -32,7 +32,7 @@ Mach IV has 2*256KB DRAM, and a daughterboard(510.1123B01) for the 68020.
I/O is via TTL, overall very similar to EAG. I/O is via TTL, overall very similar to EAG.
****************************************************************************** *******************************************************************************
Elite Avant Garde (EAG, model 6114) Elite Avant Garde (EAG, model 6114)
----------------------------------- -----------------------------------
@ -82,7 +82,7 @@ Memory map: (of what is known)
700002-700003 R lo d7: 74251: keypad row 8 700002-700003 R lo d7: 74251: keypad row 8
604000-607FFF: 16KB EEPROM 604000-607FFF: 16KB EEPROM
****************************************************************************** *******************************************************************************
Elite Avant Garde (EAG, model 6117) Elite Avant Garde (EAG, model 6117)
----------------------------------- -----------------------------------

View File

@ -9,7 +9,7 @@ TODO:
- granits gives error beeps at start, need to press clear to play - granits gives error beeps at start, need to press clear to play
- granits buttons seem too sensitive - granits buttons seem too sensitive
****************************************************************************** *******************************************************************************
Voice Excellence (model 6092) Voice Excellence (model 6092)
---------------- ----------------
@ -110,7 +110,7 @@ VFD display, and some buttons for controlling the clock. IRQ frequency is double
presumedly for using the blinking led as seconds counter. It only tracks player time, 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. not of the opponent. And it obviously doesn't show chessmove coordinates either.
****************************************************************************** *******************************************************************************
Designer 2000 (model 6102) Designer 2000 (model 6102)
---------------- ----------------

View File

@ -0,0 +1,144 @@
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************
Fidelity Phantom Chess Challenger
TODO:
- everything
*******************************************************************************
Fidelity licensed the design of the Milton/Phantom motorized chessboard and released
their own version. It has a small LCD panel added, the rest looks nearly the same from
the outside. After Fidelity was taken over by H&G, it was rereleased in 1990 as the
Mephisto Phantom. This is assumed to be identical.
Phantom (model 6100)
----------------
R65C02P4, XTAL marked 4.91?200
2*32KB ROM 27C256-15, 8KB RAM MS6264L-10
LCD driver, display panel for digits
magnetized x/y motor under chessboard, chesspieces have magnet underneath
piezo speaker, LEDs, 8*8 chessboard buttons
PCB label 510.1128A01
******************************************************************************/
#include "emu.h"
#include "includes/fidelbase.h"
#include "cpu/m6502/r65c02.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
//#include "fidel_phantom.lh" // clickable
namespace {
class phantom_state : public fidelbase_state
{
public:
phantom_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
void fphantom(machine_config &config);
void init_fphantom();
private:
void main_map(address_map &map);
virtual void machine_reset() override;
};
void phantom_state::machine_reset()
{
fidelbase_state::machine_reset();
m_rombank->set_entry(0);
}
void phantom_state::init_fphantom()
{
m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
}
/******************************************************************************
Devices, I/O
******************************************************************************/
//..
/******************************************************************************
Address Maps
******************************************************************************/
void phantom_state::main_map(address_map &map)
{
map(0x0000, 0x1fff).ram();
map(0x4000, 0x7fff).bankr("rombank");
map(0x8000, 0xffff).rom();
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( fphantom )
PORT_INCLUDE( fidel_cb_buttons )
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void phantom_state::fphantom(machine_config &config)
{
/* basic machine hardware */
R65C02(config, m_maincpu, 4.9152_MHz_XTAL); // R65C02P4
m_maincpu->set_periodic_int(FUNC(phantom_state::irq0_line_hold), attotime::from_hz(600)); // guessed
m_maincpu->set_addrmap(AS_PROGRAM, &phantom_state::main_map);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
//config.set_default_layout(layout_fidel_phantom);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( fphantom ) // model 6100, PCB label 510.1128A01
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("u_3c_yellow.u3", 0x8000, 0x8000, CRC(fb7c38ae) SHA1(a1aa7637705052cb4eec92644dc79aee7ba4d77c) ) // 27C256
ROM_REGION( 0x8000, "rombank", 0 )
ROM_LOAD("u_4_white.u4", 0x0000, 0x8000, CRC(e4181ba2) SHA1(1f77d1867c6f566be98645fc252a01108f412c96) ) // 27C256
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1988, fphantom, 0, 0, fphantom, fphantom, phantom_state, init_fphantom, "Fidelity Electronics", "Phantom Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING )

View File

@ -0,0 +1,241 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger,yoyo_chessboard
/******************************************************************************
Sensory 12 Chess Challenger (SC12-B, 6086)
4 versions are known to exist: A,B,C, and X, with increasing CPU speed.
---------------------------------
RE information from netlist by Berger
8*(8+1) buttons, 8+8+2 red LEDs
DIN 41524C printer port
36-pin edge connector
CPU is a R65C02P4, running at 4MHz*
*By default, the CPU frequency is lowered on A13/A14 access, with a factory-set jumper:
/2 on model SC12(1.5MHz), /4 on model 6086(1MHz)
NE556 dual-timer IC:
- timer#1, one-shot at power-on, to CPU _RESET
- timer#2: R1=82K+50K pot at 26K, R2=1K, C=22nF, to CPU _IRQ: ~596Hz, active low=15.25us
Memory map:
-----------
0000-0FFF: 4K RAM (2016 * 2)
2000-5FFF: cartridge
6000-7FFF: control(W)
8000-9FFF: 8K ROM SSS SCM23C65E4
A000-BFFF: keypad(R)
C000-DFFF: 4K ROM TI TMS2732AJL-45
E000-FFFF: 8K ROM Toshiba TMM2764D-2
control: (74LS377)
--------
Q0-Q3: 7442 A0-A3
Q4: enable printer port pin 1 input
Q5: printer port pin 5 output
Q6,Q7: LEDs common anode
7442 0-8: input mux and LEDs cathode
7442 9: buzzer
The keypad is read through a 74HC251, where S0,1,2 is from CPU A0,1,2, Y is connected to CPU D7.
If control Q4 is set, printer data can be read from I0.
******************************************************************************/
#include "emu.h"
#include "includes/fidelbase.h"
#include "cpu/m6502/r65c02.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "fidel_sc12.lh" // clickable
namespace {
class sc12_state : public fidelbase_state
{
public:
sc12_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
// machine drivers
void sc12(machine_config &config);
void sc12b(machine_config &config);
private:
void main_map(address_map &map);
// I/O handlers
DECLARE_WRITE8_MEMBER(control_w);
DECLARE_READ8_MEMBER(input_r);
};
/******************************************************************************
Devices, I/O
******************************************************************************/
// TTL/generic
WRITE8_MEMBER(sc12_state::control_w)
{
// d0-d3: 7442 a0-a3
// 7442 0-8: led data, input mux
u16 sel = 1 << (data & 0xf) & 0x3ff;
m_inp_mux = sel & 0x1ff;
// 7442 9: speaker out
m_dac->write(BIT(sel, 9));
// d6,d7: led select (active low)
display_matrix(9, 2, sel & 0x1ff, ~data >> 6 & 3);
// d4,d5: printer
//..
}
READ8_MEMBER(sc12_state::input_r)
{
// a0-a2,d7: multiplexed inputs (active low)
return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
}
/******************************************************************************
Address Maps
******************************************************************************/
void sc12_state::main_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x0fff).ram();
map(0x2000, 0x5fff).r(FUNC(sc12_state::cartridge_r));
map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(sc12_state::control_w));
map(0x8000, 0x9fff).rom();
map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(sc12_state::input_r));
map(0xc000, 0xcfff).mirror(0x1000).rom();
map(0xe000, 0xffff).rom();
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( sc12_sidepanel )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
INPUT_PORTS_END
static INPUT_PORTS_START( sc12 )
PORT_INCLUDE( fidel_cpu_div_2 )
PORT_INCLUDE( fidel_cb_buttons )
PORT_INCLUDE( sc12_sidepanel )
INPUT_PORTS_END
static INPUT_PORTS_START( sc12b )
PORT_INCLUDE( fidel_cpu_div_4 )
PORT_INCLUDE( fidel_cb_buttons )
PORT_INCLUDE( sc12_sidepanel )
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void sc12_state::sc12(machine_config &config)
{
/* basic machine hardware */
R65C02(config, m_maincpu, 3_MHz_XTAL); // R65C02P3
m_maincpu->set_addrmap(AS_PROGRAM, &sc12_state::div_trampoline);
ADDRESS_MAP_BANK(config, m_mainmap).set_map(&sc12_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(3_MHz_XTAL));
const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
TIMER(config, m_irq_on).configure_periodic(FUNC(sc12_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
TIMER(config, "irq_off").configure_periodic(FUNC(sc12_state::irq_off<M6502_IRQ_LINE>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_sc12);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* cartridge */
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat"));
cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
}
void sc12_state::sc12b(machine_config &config)
{
sc12(config);
/* basic machine hardware */
m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4
TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
// change irq timer frequency
const attotime irq_period = attotime::from_hz(596); // from 556 timer (22nF, 82K+26K, 1K)
TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(sc12_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
TIMER(config.replace(), "irq_off").configure_periodic(FUNC(sc12_state::irq_off<M6502_IRQ_LINE>), irq_period);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( fscc12 ) // model SC12, PCB label 510-1084B01
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(ed5289b2) SHA1(9b0c7f9ae4102d4a66eb8c91d4e84b9eec2ffb3d) ) // TI TMS2732AJL-45, no label, orange sticker
ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(0c4968c4) SHA1(965a66870b0f8ce9549418cbda09d2ff262a1504) ) // TI TMS2764JL-25, no label, red sticker
ROM_END
ROM_START( fscc12b ) // model 6086, PCB label 510-1084B01
ROM_REGION( 0x10000, "mainmap", 0 )
ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(45070a71) SHA1(8aeecff828f26fb7081902c757559903be272649) ) // TI TMS2732AJL-45, no label, orange sticker
ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(183d3edc) SHA1(3296a4c3bce5209587d4a1694fce153558544e63) ) // Toshiba TMM2764D-2, no label, red sticker
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1984, fscc12, 0, 0, sc12, sc12, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
CONS( 1984, fscc12b, fscc12, 0, sc12b, sc12b, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )

View File

@ -0,0 +1,294 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger,yoyo_chessboard
/******************************************************************************
Sensory Chess Challenger "9" (SC9)
3 versions were available, the newest "B" version was 2MHz and included the Budapest program.
The Playmatic S was only released in Germany, it's basically a 'deluxe' version of SC9
with magnet sensors and came with CB9 and CB16.
---------------------------------
8*(8+1) buttons, 8*8+1 LEDs
36-pin edge connector, assume same as SC12
2KB RAM(TMM2016P), 2*8KB ROM(HN48364P)
R6502-13, 1.4MHz from resonator, another pcb with the same resonator was measured 1.49MHz*
PCB label 510-1046C01 2-1-82
*: 2 other boards were measured 1.60MHz and 1.88MHz(newest serial). Online references
suggest 3 versions of SC9(C01) total: 1.5MHz, 1.6MHz, and 1.9MHz.
I/O is via TTL, not further documented here
******************************************************************************/
#include "emu.h"
#include "includes/fidelbase.h"
#include "cpu/m6502/m6502.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "fidel_playmatic.lh" // clickable
#include "fidel_sc9.lh" // clickable
namespace {
class sc9_state : public fidelbase_state
{
public:
sc9_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
// machine drivers
void sc9b(machine_config &config);
void sc9c(machine_config &config);
void sc9d(machine_config &config);
void playmatic(machine_config &config);
protected:
// address maps
void sc9_map(address_map &map);
void sc9d_map(address_map &map);
// I/O handlers
void prepare_display();
DECLARE_WRITE8_MEMBER(control_w);
DECLARE_WRITE8_MEMBER(led_w);
DECLARE_READ8_MEMBER(input_r);
DECLARE_READ8_MEMBER(input_d7_r);
};
class sc9c_state : public sc9_state
{
public:
sc9c_state(const machine_config &mconfig, device_type type, const char *tag) :
sc9_state(mconfig, type, tag)
{ }
DECLARE_INPUT_CHANGED_MEMBER(sc9c_cpu_freq) { sc9c_set_cpu_freq(); }
protected:
virtual void machine_reset() override;
void sc9c_set_cpu_freq();
};
void sc9c_state::machine_reset()
{
sc9_state::machine_reset();
sc9c_set_cpu_freq();
}
void sc9c_state::sc9c_set_cpu_freq()
{
// SC9(C01) was released with 1.5MHz, 1.6MHz, or 1.9MHz CPU
u8 inp = ioport("FAKE")->read();
m_maincpu->set_unscaled_clock((inp & 2) ? 1900000 : ((inp & 1) ? 1600000 : 1500000));
}
/******************************************************************************
Devices, I/O
******************************************************************************/
// TTL/generic
void sc9_state::prepare_display()
{
// 8*8 chessboard leds + 1 corner led
display_matrix(8, 9, m_led_data, m_inp_mux);
}
WRITE8_MEMBER(sc9_state::control_w)
{
// d0-d3: 74245 P0-P3
// 74245 Q0-Q8: input mux, led select
u16 sel = 1 << (data & 0xf) & 0x3ff;
m_inp_mux = sel & 0x1ff;
prepare_display();
// 74245 Q9: speaker out
m_dac->write(BIT(sel, 9));
// d4,d5: ?
// d6,d7: N/C
}
WRITE8_MEMBER(sc9_state::led_w)
{
// a0-a2,d0: led data via NE591N
m_led_data = (data & 1) << offset;
prepare_display();
}
READ8_MEMBER(sc9_state::input_r)
{
// multiplexed inputs (active low)
return read_inputs(9) ^ 0xff;
}
READ8_MEMBER(sc9_state::input_d7_r)
{
// a0-a2,d7: multiplexed inputs (active low)
return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
}
/******************************************************************************
Address Maps
******************************************************************************/
void sc9_state::sc9_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x07ff).mirror(0x1800).ram();
map(0x2000, 0x5fff).r(FUNC(sc9_state::cartridge_r));
map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(sc9_state::control_w));
map(0x8000, 0x8007).mirror(0x1ff8).w(FUNC(sc9_state::led_w)).nopr();
map(0xa000, 0xa000).mirror(0x1fff).r(FUNC(sc9_state::input_r));
map(0xc000, 0xffff).rom();
}
void sc9_state::sc9d_map(address_map &map)
{
sc9_map(map);
map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(sc9_state::input_d7_r));
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( sc9_sidepanel )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
INPUT_PORTS_END
static INPUT_PORTS_START( sc9 )
PORT_INCLUDE( fidel_cb_buttons )
PORT_INCLUDE( sc9_sidepanel )
INPUT_PORTS_END
static INPUT_PORTS_START( playmatic )
PORT_INCLUDE( fidel_cb_magnets )
PORT_INCLUDE( sc9_sidepanel )
INPUT_PORTS_END
static INPUT_PORTS_START( sc9c )
PORT_INCLUDE( sc9 )
PORT_START("FAKE")
PORT_CONFNAME( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, sc9c_state, sc9c_cpu_freq, nullptr) // factory set
PORT_CONFSETTING( 0x00, "1.5MHz" )
PORT_CONFSETTING( 0x01, "1.6MHz" )
PORT_CONFSETTING( 0x02, "1.9MHz" )
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void sc9_state::sc9d(machine_config &config)
{
/* basic machine hardware */
M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // R6502AP, 3.9MHz resonator
m_maincpu->set_addrmap(AS_PROGRAM, &sc9_state::sc9d_map);
const attotime irq_period = attotime::from_hz(610); // from 555 timer (22nF, 102K, 2.7K)
TIMER(config, m_irq_on).configure_periodic(FUNC(sc9_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us
TIMER(config, "irq_off").configure_periodic(FUNC(sc9_state::irq_off<M6502_IRQ_LINE>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_sc9);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* cartridge */
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat"));
cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
}
void sc9_state::sc9b(machine_config &config)
{
sc9d(config);
/* basic machine hardware */
m_maincpu->set_clock(1500000); // from ceramic resonator "681 JSA", measured
m_maincpu->set_addrmap(AS_PROGRAM, &sc9_state::sc9_map);
}
void sc9_state::playmatic(machine_config &config)
{
sc9b(config);
/* basic machine hardware */
m_maincpu->set_clock(3100000); // approximation
config.set_default_layout(layout_fidel_playmatic);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( fscc9 ) // PCB label 510-1046D01
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1034b01", 0xc000, 0x2000, CRC(65288753) SHA1(651f5ca5969ddd72a20cbebdec2de83c4bf10650) )
ROM_LOAD("101-1034c02", 0xe000, 0x2000, CRC(238b092f) SHA1(7ddffc6dba822aee9d8ad6815b23024ed5cdfd26) )
ROM_END
ROM_START( fscc9b ) // PCB label 510-1046B01
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) )
ROM_LOAD("101-1034a02", 0xe000, 0x2000, CRC(ecfa0a4c) SHA1(738df99a250fad0b1da5ebeb8c92a9ad1461417b) )
ROM_END
ROM_START( fscc9c ) // PCB label 510-1046C01
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) ) // HN48364P
ROM_LOAD("101-1034b02", 0xe000, 0x2000, CRC(cbaf97d7) SHA1(7ed8e68bb74713d9e2ff1d9c037012320b7bfcbf) ) // "
ROM_END
ROM_START( fscc9ps )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("play64c1.bin", 0xc000, 0x2000, CRC(e96aa95d) SHA1(16d90cf0ef166aef579d442671290a2c43e24dfe) )
ROM_LOAD("play64en.bin", 0xe000, 0x2000, CRC(6fa188d2) SHA1(1b9b0209c496c89ecb7f9ec07bfd9429ff9b275e) )
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1982, fscc9, 0, 0, sc9d, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. D)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // aka version "B"
CONS( 1982, fscc9b, fscc9, 0, sc9b, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1982, fscc9c, fscc9, 0, sc9b, sc9c, sc9c_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1983, fscc9ps, fscc9, 0, playmatic, playmatic, sc9_state, empty_init, "Fidelity Electronics", "Sensory 9 Playmatic 'S'", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // by Fidelity West Germany

View File

@ -17,6 +17,15 @@
sub driverclass, and separate files. sub driverclass, and separate files.
- card games aren't playable without the barcode scanner - card games aren't playable without the barcode scanner
- Z80 WAIT pin is not fully emulated, affecting VBRC speech busy state - Z80 WAIT pin is not fully emulated, affecting VBRC speech busy state
TODO:
- Source organization is a big mess. Each machine family could be in its own
sub driverclass, and separate files.
- verify cpu speed and rom labels where unknown
- improve EAS/SC12/etc CPU divider? it seems a little bit slower than the real machine.
Currently, a dummy timer workaround is needed, or it's much worse.
Is the problem here is due to timing of CPU addressbus changes? We can only 'sense'
the addressbus at read or write accesses.
- finish fphantom emulation
Read the official manual(s) on how to play. Read the official manual(s) on how to play.
@ -45,7 +54,7 @@
Board hardware descriptions below. Board hardware descriptions below.
Detailed RE work done by Kevin 'kevtris' Horton, except where noted Detailed RE work done by Kevin 'kevtris' Horton, except where noted
****************************************************************************** *******************************************************************************
Voice Chess Challenger (VCC) (version A and B?) Voice Chess Challenger (VCC) (version A and B?)
Advanced Voice Chess Challenger (UVC) Advanced Voice Chess Challenger (UVC)
@ -139,7 +148,7 @@ automatically select the correct ROM(s). I have to test whether it will do auto
determination and give you a language option on power up or something. determination and give you a language option on power up or something.
****************************************************************************** *******************************************************************************
Chess Challenger 10 (CCX) Chess Challenger 10 (CCX)
------------------- -------------------
@ -185,7 +194,7 @@ PC.6 - button column C (W)
PC.7 - button column D (W) PC.7 - button column D (W)
****************************************************************************** *******************************************************************************
Chess Challenger 7 (BCC) Chess Challenger 7 (BCC)
------------------------ ------------------------
@ -221,7 +230,7 @@ Port map (Read):
D0-D3: keypad row D0-D3: keypad row
****************************************************************************** *******************************************************************************
Voice Bridge Challenger (Model VBRC, later reissued as Model 7002) Voice Bridge Challenger (Model VBRC, later reissued as Model 7002)
and Bridge Challenger 3 (Model 7014) and Bridge Challenger 3 (Model 7014)
@ -352,7 +361,7 @@ by the grids. hi = grid on, hi = segment on.
A detailed description of the hardware can be found also in the patent 4,373,719. A detailed description of the hardware can be found also in the patent 4,373,719.
****************************************************************************** *******************************************************************************
Voice Sensory Chess Challenger (VSC) Voice Sensory Chess Challenger (VSC)
------------------------------------ ------------------------------------

View File

@ -17,7 +17,7 @@
- sforte/sexpert led handling is correct? - sforte/sexpert led handling is correct?
- printer port - printer port
****************************************************************************** *******************************************************************************
Super Constellation Chess Computer (model 844): Super Constellation Chess Computer (model 844):
- UMC UM6502C @ 4 MHz (8MHz XTAL), 600Hz? IRQ(source unknown?) - UMC UM6502C @ 4 MHz (8MHz XTAL), 600Hz? IRQ(source unknown?)
@ -26,7 +26,7 @@ Super Constellation Chess Computer (model 844):
- external ports for clock and printer, not emulated here - external ports for clock and printer, not emulated here
****************************************************************************** *******************************************************************************
Constellation Forte: Constellation Forte:
- R65C02P4 @ 5MHz (10MHz XTAL) - R65C02P4 @ 5MHz (10MHz XTAL)
@ -38,7 +38,7 @@ When it was first added to MAME as skeleton driver in mmodular.c, cforteb romset
was assumed to be Super Forte B, but it definitely isn't. I/O is similar to supercon. was assumed to be Super Forte B, but it definitely isn't. I/O is similar to supercon.
****************************************************************************** *******************************************************************************
Super Expert (model 878/887/902): Super Expert (model 878/887/902):
- 65C02 @ 5MHz or 6MHz (10MHz or 12MHz XTAL) - 65C02 @ 5MHz or 6MHz (10MHz or 12MHz XTAL)

View File

@ -13,7 +13,7 @@
TODO: TODO:
- RS232 port (when connected, I'm only getting "New Game") - RS232 port (when connected, I'm only getting "New Game")
****************************************************************************** *******************************************************************************
Diablo 68000: Diablo 68000:
- M68000 @ 16MHz, IPL1 256Hz, IPL2 from ACIA IRQ(always high) - M68000 @ 16MHz, IPL1 256Hz, IPL2 from ACIA IRQ(always high)

View File

@ -10,7 +10,7 @@
- hardware is similar to MK I, the drivers can be merged in theory. - hardware is similar to MK I, the drivers can be merged in theory.
But I prefer my source code to be licensed BSD3, mk1.cpp is GPL2. But I prefer my source code to be licensed BSD3, mk1.cpp is GPL2.
****************************************************************************** *******************************************************************************
Delta-1: Delta-1:
- 3850PK CPU at ~2MHz, 3853PK memory interface - 3850PK CPU at ~2MHz, 3853PK memory interface

View File

@ -14,7 +14,7 @@
- is presto led handling correct? mux data needs to be auto cleared - is presto led handling correct? mux data needs to be auto cleared
similar to diablo/sexpert similar to diablo/sexpert
****************************************************************************** *******************************************************************************
Presto: Presto:
- NEC D80C49C MCU(serial 186), OSC from LC circuit measured ~6MHz - NEC D80C49C MCU(serial 186), OSC from LC circuit measured ~6MHz

View File

@ -12849,6 +12849,25 @@ feversoc // (c) 2004
fgoal // TF (c) 1979 Taito Corporation fgoal // TF (c) 1979 Taito Corporation
fgoala // MF (c) 1979 Taito Corporation fgoala // MF (c) 1979 Taito Corporation
@source:fidel_as12.cpp
feleg //
@source:fidel_chesster.cpp
chesster //
chesstera //
kishon //
@source:fidel_csc.cpp
csc // CSC: Champion Sensory Chess Challenger (English)
cscfr // * French
cscg // * German
cscsp // * Spanish
reversic //
super9cc // SU9: Super 9 Sensory Chess Challenger (English)
super9ccfr // * French
super9ccg // * German
super9ccsp // * Spanish
@source:fidel_desdis.cpp @source:fidel_desdis.cpp
fdes2000d // fdes2000d //
fdes2100d // fdes2100d //
@ -12883,17 +12902,23 @@ fexcelpb //
fexcelv // fexcelv //
granits // RCS granits // RCS
@source:fidel_phantom.cpp
fphantom //
@source:fidel_sc12.cpp
fscc12 //
fscc12b //
@source:fidel_sc6.cpp @source:fidel_sc6.cpp
fscc6 // fscc6 //
@source:fidel_sc9.cpp
fscc9 //
fscc9b //
fscc9c //
fscc9ps //
@source:fidel6502.cpp @source:fidel6502.cpp
chesster //
chesstera //
kishon //
csc // CSC: Champion Sensory Chess Challenger (English)
cscfr // * French
cscg // * German
cscsp // * Spanish
feasbu // EAS: Elite A/S Challenger (Budapest program, English) feasbu // EAS: Elite A/S Challenger (Budapest program, English)
feasbufr // * French feasbufr // * French
feasbug // * German feasbug // * German
@ -12906,8 +12931,6 @@ feag2100 // EAG: Elite Avant Garde 2100 (English)
feag2100fr // * French feag2100fr // * French
feag2100g // * German feag2100g // * German
feag2100sp // * Spanish feag2100sp // * Spanish
feleg //
fphantom //
fpres // fpres //
fpressp // fpressp //
fpresg // fpresg //
@ -12916,17 +12939,6 @@ fpresbu //
fpresbusp // fpresbusp //
fpresbug // fpresbug //
fpresbufr // fpresbufr //
fscc9 //
fscc9b //
fscc9c //
fscc9ps //
fscc12 //
fscc12b //
reversic //
super9cc // SU9: Super 9 Sensory Chess Challenger (English)
super9ccfr // * French
super9ccg // * German
super9ccsp // * Spanish
@source:fidelbase.cpp @source:fidelbase.cpp
backgamc // backgamc //

View File

@ -241,10 +241,16 @@ fb01.cpp
fc100.cpp fc100.cpp
fccpu20.cpp fccpu20.cpp
fccpu30.cpp fccpu30.cpp
fidel_as12.cpp
fidel_chesster.cpp
fidel_csc.cpp
fidel_desdis.cpp fidel_desdis.cpp
fidel_eag68k.cpp fidel_eag68k.cpp
fidel_excel.cpp fidel_excel.cpp
fidel_phantom.cpp
fidel_sc12.cpp
fidel_sc6.cpp fidel_sc6.cpp
fidel_sc9.cpp
fidel6502.cpp fidel6502.cpp
fidelbase.cpp fidelbase.cpp
fk1.cpp fk1.cpp