// 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 - Elite Champion Challenger - Super 9 Sensory Chess Challenger - Reversi Sensory Challenger TODO: - verify csce original roms (current set came from an overclock mod) - hook up csce I/O properly, it doesn't have PIAs ******************************************************************************* 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". ******************************************************************************* Elite Champion Challenger This is a limited-release chess computer based on the CSC. They removed the PIAs and did the I/O with TTL instead (PIAs will still work from software point of view). --------------------------------- R6502B? CPU @ 4MHz 32KB ROMs total size, 4KB RAM(8*HM6147P) In the 90s, Wilfried Bucke provided an upgrade to make it more similar to the one that won the 1981 Travemünde contest. CPU was changed to R65C02 or UM6502C at 5MHz. ******************************************************************************* 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. Septennial(SCC) is the same as well, but clocked even higher. --------------------------------- 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. Not sure if the 1st version was even released, or just a prototype. --------------------------------- 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 To play it on MAME with the sensorboard device, it is recommended to set up keyboard shortcuts for the spawn inputs. Then hold the spawn input down while clicking on the game board. ******************************************************************************/ #include "emu.h" #include "cpu/m6502/m6502.h" #include "machine/6821pia.h" #include "machine/timer.h" #include "machine/sensorboard.h" #include "sound/s14001a.h" #include "sound/dac.h" #include "sound/volt_reg.h" #include "video/pwm.h" #include "speaker.h" // internal artwork #include "fidel_csc.lh" // clickable #include "fidel_rsc.lh" // clickable #include "fidel_su9.lh" // clickable namespace { // CSC / shared class csc_state : public driver_device { public: csc_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_irq_on(*this, "irq_on"), m_pia(*this, "pia%u", 0), 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) { } // machine drivers void csc(machine_config &config); void csce(machine_config &config); void su9(machine_config &config); void rsc(machine_config &config); DECLARE_INPUT_CHANGED_MEMBER(rsc_init_board); protected: virtual void machine_start() override; // devices/pointers required_device m_maincpu; required_device m_irq_on; optional_device_array m_pia; required_device m_board; required_device m_display; required_device m_dac; optional_device m_speech; optional_region_ptr m_speech_rom; optional_region_ptr m_language; optional_ioport_array<9> m_inputs; // address maps void csc_map(address_map &map); void su9_map(address_map &map); void rsc_map(address_map &map); // periodic interrupts template TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); } template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); } // I/O handlers u16 read_inputs(); void update_display(); void update_sound(); 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); u8 m_led_data; u8 m_7seg_data; u8 m_inp_mux; u8 m_speech_bank; }; void csc_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)); } // SU9 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, SCC is 3MHz u8 inp = ioport("FAKE")->read(); m_maincpu->set_unscaled_clock((inp & 2) ? (3_MHz_XTAL) : ((inp & 1) ? (5_MHz_XTAL/2) : (3.9_MHz_XTAL/2))); } /****************************************************************************** I/O ******************************************************************************/ // misc handlers INPUT_CHANGED_MEMBER(csc_state::rsc_init_board) { if (!newval) return; m_board->cancel_sensor(); m_board->cancel_hand(); m_board->clear_board(); // 2 possible initial board positions if (param) { m_board->write_piece(3, 3, 2); m_board->write_piece(4, 3, 1); m_board->write_piece(3, 4, 2); m_board->write_piece(4, 4, 1); } else { m_board->write_piece(3, 3, 1); m_board->write_piece(4, 3, 2); m_board->write_piece(3, 4, 2); m_board->write_piece(4, 4, 1); } m_board->refresh(); } u16 csc_state::read_inputs() { u16 data = 0; // read (chess)board sensors if (m_inp_mux < 8) data = m_board->read_file(m_inp_mux); // read other buttons if (m_inp_mux < 9) data |= m_inputs[m_inp_mux].read_safe(0); return ~data; } void csc_state::update_display() { // 7442 0-8: led select (also input mux) // 7seg leds+H (not on all models), 8*8(+1) chessboard leds m_display->matrix(1 << m_inp_mux, m_led_data << 8 | m_7seg_data); } void csc_state::update_sound() { // 7442 9: speaker out m_dac->write(BIT(1 << m_inp_mux, 9)); } 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 return (read_inputs() & 0x3f) | 0xc0; } WRITE8_MEMBER(csc_state::pia0_pa_w) { // d6,d7: 7442 A0,A1 m_inp_mux = (m_inp_mux & ~3) | (data >> 6 & 3); update_display(); update_sound(); } WRITE8_MEMBER(csc_state::pia0_pb_w) { // d0-d7: led row data m_led_data = data; update_display(); } READ_LINE_MEMBER(csc_state::pia0_ca1_r) { // button row 6 return read_inputs() >> 6 & 1; } READ_LINE_MEMBER(csc_state::pia0_cb1_r) { // button row 7 return read_inputs() >> 7 & 1; } WRITE_LINE_MEMBER(csc_state::pia0_cb2_w) { // 7442 A2 m_inp_mux = (m_inp_mux & ~4) | (state ? 4 : 0); update_display(); update_sound(); } WRITE_LINE_MEMBER(csc_state::pia0_ca2_w) { // 7442 A3 m_inp_mux = (m_inp_mux & ~8) | (state ? 8 : 0); update_display(); update_sound(); } // 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); update_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.25 : 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 data |= (read_inputs() >> 3 & 0x20); // d6,d7: language switches(hardwired with 2 resistors/jumpers) return data | (*m_language << 6 & 0xc0); } 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, 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_START("IN.0") PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") PORT_START("IN.1") PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") PORT_START("IN.2") PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM") PORT_START("IN.3") PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV") PORT_START("IN.4") PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") PORT_START("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( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, su9_state, su9_cpu_freq, 0) // factory set PORT_CONFSETTING( 0x00, "1.95MHz (original)" ) PORT_CONFSETTING( 0x01, "2.5MHz (Deluxe)" ) PORT_CONFSETTING( 0x02, "3MHz (Septennial)" ) INPUT_PORTS_END static INPUT_PORTS_START( rsc ) PORT_START("IN.8") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("ST") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("RV") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("DM") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("CL") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("LV") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) 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") PORT_START("BOARD") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, csc_state, rsc_init_board, 0) PORT_NAME("Board Reset A") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, csc_state, rsc_init_board, 1) PORT_NAME("Board Reset B") 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), 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), 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)); SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); m_board->set_delay(attotime::from_msec(200)); /* video hardware */ PWM_DISPLAY(config, m_display).set_size(9, 16); m_display->set_segmask(0xf, 0x7f); 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).add_route(ALL_OUTPUTS, "speaker", 0.25); VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); } void csc_state::csce(machine_config &config) { csc(config); /* basic machine hardware */ m_maincpu->set_clock(4_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::su9_map); } void csc_state::su9(machine_config &config) { csc(config); /* basic machine hardware */ 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), 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), 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)); SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); m_board->set_spawnpoints(2); m_board->set_delay(attotime::from_msec(300)); /* video hardware */ PWM_DISPLAY(config, m_display).set_size(9, 16); config.set_default_layout(layout_fidel_rsc); /* sound hardware */ SPEAKER(config, "speaker").front_center(); 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); } /****************************************************************************** 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) ) // 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( csce ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD("03", 0x2000, 0x2000, CRC(22e43531) SHA1(696dc019bea3812ae6cf9c2b2c4d3a7b9017807d) ) ROM_LOAD("02", 0xa000, 0x2000, CRC(e593f114) SHA1(4dc5a2456a87c128235958f046cee9502cb3ac65) ) ROM_LOAD("06", 0xc000, 0x0800, CRC(5d41b1e5) SHA1(fe95d8811d8894688336b798212c397bdb216956) ) ROM_LOAD("07", 0xc800, 0x0800, CRC(9078d40a) SHA1(4ffd36a4fcde1988e42543652e29463bc6ad5a8f) ) ROM_LOAD("08", 0xd000, 0x0800, CRC(c9472cc1) SHA1(ef4b1ae99e81689efeae323fe6ed58cf2c773fd6) ) ROM_LOAD("09", 0xd800, 0x0800, CRC(255c94a0) SHA1(d8e79213b69710e9d94c698492ec7b7420c9c7d8) ) ROM_LOAD("04", 0xe000, 0x1000, CRC(098873bd) SHA1(86001129a57db390e565f59a5677ec0b34b41d99) ) ROM_LOAD("05", 0xf000, 0x1000, CRC(1a516bfe) SHA1(2a2b252ca5d425fdf162cbc53077aee448b94437) ) // 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( super9cc ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) 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) ) // 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( 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, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) CONS( 1981, csce, 0, 0, csce, csc, csc_state, empty_init, "Fidelity Electronics", "Elite Champion Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) CONS( 1983, super9cc, 0, 0, su9, su9, su9_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) CONS( 1981, reversic, 0, 0, rsc, rsc, csc_state, empty_init, "Fidelity Electronics", "Reversi Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )