summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/fidel6502.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/fidel6502.cpp')
-rw-r--r--src/mame/drivers/fidel6502.cpp824
1 files changed, 597 insertions, 227 deletions
diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp
index 2a17baa6590..43bdd8337c8 100644
--- a/src/mame/drivers/fidel6502.cpp
+++ b/src/mame/drivers/fidel6502.cpp
@@ -3,10 +3,260 @@
/******************************************************************************
Fidelity Electronics 6502 based board driver
- See drivers/fidelz80.cpp for hardware description
+
+******************************************************************************
+
+Champion Sensory Chess Challenger (CSC)
+---------------------------------------
+
+Memory map:
+-----------
+0000-07FF: 2K of RAM
+0800-0FFF: 1K of RAM (note: mirrored twice)
+1000-17FF: PIA 0 (display, TSI speech chip)
+1800-1FFF: PIA 1 (keypad, LEDs)
+2000-3FFF: 101-64019 ROM (also used on the regular sensory chess challenger)
+4000-7FFF: mirror of 0000-3FFF
+8000-9FFF: not used
+A000-BFFF: 101-1025A03 ROM
+C000-DFFF: 101-1025A02 ROM
+E000-FDFF: 101-1025A01 ROM
+FE00-FFFF: 512 byte 74S474 PROM
+
+CPU is a 6502 running at 1.95MHz (3.9MHz resonator, divided by 2)
+
+NMI is not used.
+IRQ is connected to a 600Hz oscillator (38.4KHz divided by 64).
+Reset is connected to a power-on reset circuit.
+
+PIA 0:
+------
+PA0 - 7seg segments E, TSI A0
+PA1 - 7seg segments D, TSI A1
+PA2 - 7seg segments C, TSI A2
+PA3 - 7seg segments H, TSI A3
+PA4 - 7seg segments G, TSI A4
+PA5 - 7seg segments F, TSI A5
+PA6 - 7seg segments B
+PA7 - 7seg segments A
+
+PB0 - A12 on speech ROM (if used... not used on this model, ROM is 4K)
+PB1 - START line on TSI
+PB2 - white wire
+PB3 - BUSY line from TSI
+PB4 - hi/lo TSI speaker volume
+PB5 - button row 9
+PB6 - selection jumper (resistor to 5V)
+PB7 - selection jumper (resistor to ground)
+
+CA1 - NC
+CA2 - violet wire
+
+CB1 - NC
+CB2 - NC (connects to pin 14 of soldered connector)
+
+PIA 1:
+------
+PA0 - button row 1
+PA1 - button row 2
+PA2 - button row 3
+PA3 - button row 4
+PA4 - button row 5
+PA5 - button row 6
+PA6 - 7442 selector bit 0
+PA7 - 7442 selector bit 1
+
+PB0 - LED row 1
+PB1 - LED row 2
+PB2 - LED row 3
+PB3 - LED row 4
+PB4 - LED row 5
+PB5 - LED row 6
+PB6 - LED row 7
+PB7 - LED row 8
+
+CA1 - button row 7
+CA2 - selector bit 3
+
+CB1 - button row 8
+CB2 - selector bit 2
+
+Selector: (attached to PIA 1, outputs 1 of 10 pins low. 7442)
+---------
+output # (selected turns this column on, and all others off)
+0 - LED column A, button column A, 7seg digit 1
+1 - LED column B, button column B, 7seg digit 2
+2 - LED column C, button column C, 7seg digit 3
+3 - LED column D, button column D, 7seg digit 4
+4 - LED column E, button column E
+5 - LED column F, button column F
+6 - LED column G, button column G
+7 - LED column H, button column H
+8 - button column I
+9 - Tone line (toggle to make a tone in the buzzer)
+
+The rows/columns are indicated on the game board:
+
+ ABCDEFGH I
+--------------
+| | 8
+| | 7
+| | 6
+| | 5
+| | 4
+| | 3
+| | 2
+| | 1
+--------------
+
+The "lone LED" is above the control column.
+column I is the "control column" on the right for starting a new game, etc.
+
+The upper 6 buttons are connected as such:
+
+column A - speak
+column B - RV
+column C - TM
+column D - LV
+column E - DM
+column F - ST
+
+these 6 buttons use row 9 (connects to PIA 0)
+
+LED display:
+------------
+43 21 (digit number)
+-----
+88:88
+
+The LED display is four 7 segment digits. normal ABCDEFG lettering is used for segments.
+
+The upper dot is connected to digit 3 common
+The lower dot is connected to digit 4 common
+The lone LED is connected to digit 1 common
+
+All three of the above are called "segment H".
+
+
+******************************************************************************
+
+Sensory 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
+
+NE556 dual-timer IC:
+- timer#1, one-shot at power-on, to CPU _RESET
+- timer#2: R1=82K, R2=1K, C=22nf, to CPU _IRQ: ~780Hz, active low=15.25us
+
+Memory map:
+-----------
+6000-0FFF: 4K RAM (2016 * 2)
+2000-5FFF: cartridge
+6000-7FFF: control(W)
+8000-9FFF: 8K ROM SSS SCM23C65E4
+A000-BFFF: keypad(R)
+C000-DFFF: 4K ROM TI TMS2732AJL-45
+E000-FFFF: 8K ROM Toshiba TMM2764D-2
+
+control: (74LS377)
+--------
+Q0-Q3: 7442 A0-A3
+Q4: enable printer port pin 1 input
+Q5: printer port pin 5 output
+Q6,Q7: LEDs common anode
+
+7442 0-8: input mux and LEDs cathode
+7442 9: buzzer
+
+The keypad is read through a 74HC251, where S0,1,2 is from CPU A0,1,2, Y is connected to CPU D7.
+If control Q4 is set, printer data can be read from I0.
+
+
+******************************************************************************
+
+Voice Excellence (model 6092)
+----------------
+PCB 1: 510.1117A02, appears to be identical to other "Excellence" boards
+CPU: GTE G65SC102P-3, 32 KB PRG ROM: AMI 101-1080A01(IC5), 8192x8 SRAM SRM2264C10(IC6)
+2 rows of LEDs on the side: 1*8 green, 1*8 red
+
+PCB 2: 510.1117A01
+Speech: TSI S14001A, 32 KB ROM: AMI 101-1081A01(IC2)
+Dip Switches set ROM A13 and ROM A14, on the side of the board
+
+ROM A12 is tied to S14001A's A11 (yuck)
+ROM A11 is however tied to the CPU's XYZ
+
+0000_07FF - Spanish 1/4
+0800_0FFF - Spanish 3/4
+1000_17FF - Spanish 2/4
+1800_1FFF - Spanish 4/4
+
+2000_27FF - French 1/4
+2800_2FFF - French 3/4
+3000_3FFF - French 2/4
+3800_3FFF - French 4/4
+
+4000_47FF - German 1/4
+4800_4FFF - German 3/4
+5000_57FF - German 2/4
+5800_5FFF - German 4/4
- TODO:
- - x
+6000_67FF - English 1/2
+6800_6FFF - Bridge Challenger 1/2
+7000_77FF - English 2/2
+7800_7FFF - Bridge Challenger 2/2
+
+------------------
+RE info by hap, based on PCB photos
+
+Memory map:
+-----------
+0000-3FFF: 8K RAM (SRM2264)
+4000-7FFF: control (R/W)
+8000-FFFF: 32K ROM (M27256 compatible)
+
+control (W):
+------------
+Z80 A0-A2 to 3*74259, Z80 Dx to D (_C unused)
+
+Z80 D0:
+- Q4,Q5: led commons
+- Q6,Q7,Q2,Q1: 7seg panel digit select
+- Q0-Q3: 7442 A0-A3
+ + 0-7: led data
+ + 0-8: keypad mux
+ + 9: buzzer out
+
+Z80 D1: (model 6093)
+- Q0-Q7: 7seg data
+
+Z80 D2: (model 6092)
+- Q0-Q5: TSI C0-C5
+- Q6: TSI START pin
+- Q7: TSI ROM A11
+
+A11 from TSI is tied to TSI ROM A12(!)
+TSI ROM A13,A14 are hardwired to the 2 language switches.
+Sound comes from the Audio out pin, digital out pins are N/C.
+
+control (R):
+------------
+Z80 A0-A2 to 2*74251, Z80 Dx to output
+
+Z80 D7 to Y:
+- D0-D7: keypad row data
+
+Z80 D6 to W: (model 6092, tied to VCC otherwise)
+- D0,D1: language switches
+- D2-D6: VCC
+- D7: TSI BUSY
******************************************************************************/
@@ -15,15 +265,13 @@
#include "cpu/m6502/r65c02.h"
#include "cpu/m6502/m65sc02.h"
#include "machine/6821pia.h"
-#include "sound/speaker.h"
#include "includes/fidelz80.h"
// internal artwork
-#include "fidel_sc12.lh"
-#include "fidel_fev.lh"
-
-extern const char layout_fidel_vsc[]; // same layout as fidelz80/vsc
+#include "fidel_csc.lh" // clickable
+#include "fidel_fev.lh" // clickable
+#include "fidel_sc12.lh" // clickable
class fidel6502_state : public fidelz80base_state
@@ -32,16 +280,17 @@ public:
fidel6502_state(const machine_config &mconfig, device_type type, const char *tag)
: fidelz80base_state(mconfig, type, tag),
m_6821pia(*this, "6821pia"),
- m_speaker(*this, "speaker"),
- m_irq_off(*this, "irq_off")
+ m_cart(*this, "cartslot")
{ }
// devices/pointers
optional_device<pia6821_device> m_6821pia;
- optional_device<speaker_sound_device> m_speaker;
- optional_device<timer_device> m_irq_off;
+ optional_device<generic_slot_device> m_cart;
+
+ TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); }
+ TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); }
- // model CSC
+ // CSC
void csc_prepare_display();
DECLARE_READ8_MEMBER(csc_speech_r);
DECLARE_WRITE8_MEMBER(csc_pia0_pa_w);
@@ -56,11 +305,16 @@ public:
DECLARE_READ_LINE_MEMBER(csc_pia1_ca1_r);
DECLARE_READ_LINE_MEMBER(csc_pia1_cb1_r);
- // model SC12
- TIMER_DEVICE_CALLBACK_MEMBER(irq_off);
- TIMER_DEVICE_CALLBACK_MEMBER(sc12_irq);
+ // SC12/6086
DECLARE_WRITE8_MEMBER(sc12_control_w);
DECLARE_READ8_MEMBER(sc12_input_r);
+ DECLARE_READ8_MEMBER(sc12_cart_r);
+
+ // 6080/6092/6093 (Excellence)
+ DECLARE_INPUT_CHANGED_MEMBER(fexcelv_bankswitch);
+ DECLARE_READ8_MEMBER(fexcelv_speech_r);
+ DECLARE_WRITE8_MEMBER(fexcel_ttl_w);
+ DECLARE_READ8_MEMBER(fexcel_ttl_r);
};
@@ -75,21 +329,22 @@ public:
void fidel6502_state::csc_prepare_display()
{
- // 7442 output, also update input mux (9 is unused)
- m_inp_mux = (1 << m_led_select) & 0x1ff;
+ // 7442 0-8: led select, input mux
+ m_inp_mux = 1 << m_led_select & 0x3ff;
+
+ // 7442 9: speaker out
+ m_speaker->level_w(m_inp_mux >> 9 & 1);
// 4 7seg leds + H
for (int i = 0; i < 4; i++)
- {
- m_display_segmask[i] = 0x7f;
m_display_state[i] = (m_inp_mux >> i & 1) ? m_7seg_data : 0;
- }
// 8*8 chessboard leds
for (int i = 0; i < 8; i++)
m_display_state[i+4] = (m_inp_mux >> i & 1) ? m_led_data : 0;
- set_display_size(8, 12);
+ set_display_size(8, 4+8);
+ set_display_segmask(0xf, 0x7f);
display_update();
}
@@ -119,9 +374,9 @@ WRITE8_MEMBER(fidel6502_state::csc_pia0_pb_w)
// d1: TSI START line
m_speech->start_w(data >> 1 & 1);
-
- // d4: tone line
- m_speaker->level_w(data >> 4 & 1);
+
+ // d4: lower TSI volume
+ m_speech->set_output_gain(0, (data & 0x10) ? 0.5 : 1.0);
}
READ8_MEMBER(fidel6502_state::csc_pia0_pb_r)
@@ -134,12 +389,9 @@ READ8_MEMBER(fidel6502_state::csc_pia0_pb_r)
data |= 0x08;
// d5: button row 8 (active low)
- if (!(read_inputs(9) & 0x100))
- data |= 0x20;
-
// d6,d7: language switches
- data|=0xc0;
-
+ data |= (~read_inputs(9) >> 3 & 0x20) | (~m_inp_matrix[9]->read() << 6 & 0xc0);
+
return data;
}
@@ -200,24 +452,12 @@ WRITE_LINE_MEMBER(fidel6502_state::csc_pia1_ca2_w)
/******************************************************************************
- SC12
+ SC12/6086
******************************************************************************/
-// interrupt handling
-TIMER_DEVICE_CALLBACK_MEMBER(fidel6502_state::irq_off)
-{
- m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(fidel6502_state::sc12_irq)
-{
- m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
- m_irq_off->adjust(attotime::from_nsec(15250)); // active low for 15.25us
-}
-
-// TTL
+// TTL/generic
WRITE8_MEMBER(fidel6502_state::sc12_control_w)
{
@@ -239,7 +479,96 @@ WRITE8_MEMBER(fidel6502_state::sc12_control_w)
READ8_MEMBER(fidel6502_state::sc12_input_r)
{
// a0-a2,d7: multiplexed inputs (active low)
- return (read_inputs(9) << (offset^7) & 0x80) ^ 0xff;
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+READ8_MEMBER(fidel6502_state::sc12_cart_r)
+{
+ if (m_cart->exists())
+ return m_cart->read_rom(space, offset);
+ else
+ return 0;
+}
+
+
+
+/******************************************************************************
+ 6080/6092/6093 (Excellence)
+******************************************************************************/
+
+// misc handlers
+
+INPUT_CHANGED_MEMBER(fidel6502_state::fexcelv_bankswitch)
+{
+ // tied to speech ROM highest bits
+ m_speech->force_update();
+ m_speech_bank = (m_speech_bank & 1) | newval << 1;
+}
+
+READ8_MEMBER(fidel6502_state::fexcelv_speech_r)
+{
+ // TSI A11 is A12, program controls A11, user controls A13,A14(language switches)
+ offset = (offset & 0x7ff) | (offset << 1 & 0x1000);
+ return m_speech_rom[offset | (m_speech_bank << 11 & 0x800) | (~m_speech_bank << 12 & 0x6000)];
+}
+
+
+// TTL
+
+WRITE8_MEMBER(fidel6502_state::fexcel_ttl_w)
+{
+ // a0-a2,d0: 74259(1)
+ UINT8 mask = 1 << offset;
+ m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
+
+ // 74259 Q0-Q3: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ UINT16 sel = 1 << (m_led_select & 0xf) & 0x3ff;
+ UINT8 led_data = sel & 0xff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 7442 9: speaker out (optional?)
+ m_speaker->level_w(sel >> 9 & 1);
+
+ // 74259 Q4-Q7,Q2,Q1: digit/led select (active low)
+ UINT8 led_sel = ~BITSWAP8(m_led_select,0,3,1,2,7,6,5,4) & 0x3f;
+
+ // a0-a2,d1: digit segment data (model 6093)
+ m_7seg_data = (m_7seg_data & ~mask) | ((data & 2) ? mask : 0);
+ UINT8 seg_data = BITSWAP8(m_7seg_data,0,1,3,2,7,5,6,4);
+
+ // update display: 4 7seg leds, 2*8 chessboard leds
+ for (int i = 0; i < 6; i++)
+ m_display_state[i] = (led_sel >> i & 1) ? ((i < 2) ? led_data : seg_data) : 0;
+
+ set_display_size(8, 2+4);
+ set_display_segmask(0x3c, 0x7f);
+ display_update();
+
+ // speech (model 6092)
+ if (m_speech != nullptr)
+ {
+ // a0-a2,d2: 74259(2) to speech board
+ m_speech_data = (m_speech_data & ~mask) | ((data & 4) ? mask : 0);
+
+ // 74259 Q6: TSI ROM A11
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = (m_speech_bank & ~1) | (m_speech_data >> 6 & 1);
+
+ // Q0-Q5: TSI C0-C5
+ // Q7: TSI START line
+ m_speech->data_w(space, 0, m_speech_data & 0x3f);
+ m_speech->start_w(m_speech_data >> 7 & 1);
+ }
+}
+
+READ8_MEMBER(fidel6502_state::fexcel_ttl_r)
+{
+ // a0-a2,d6: from speech board: language switches and TSI BUSY line, otherwise tied to VCC
+ UINT8 d6 = (read_safe(m_inp_matrix[9], 0xff) >> offset & 1) ? 0x40 : 0;
+
+ // a0-a2,d7: multiplexed inputs (active low)
+ return d6 | ((read_inputs(9) >> offset & 1) ? 0 : 0x80);
}
@@ -261,11 +590,12 @@ static ADDRESS_MAP_START( csc_map, AS_PROGRAM, 8, fidel6502_state )
ADDRESS_MAP_END
-// SC12
+// SC12/6086
static ADDRESS_MAP_START( sc12_map, AS_PROGRAM, 8, fidel6502_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x0fff) AM_RAM
+ AM_RANGE(0x2000, 0x5fff) AM_READ(sc12_cart_r)
AM_RANGE(0x6000, 0x6000) AM_MIRROR(0x1fff) AM_WRITE(sc12_control_w)
AM_RANGE(0x8000, 0x9fff) AM_ROM
AM_RANGE(0xa000, 0xa007) AM_MIRROR(0x1ff8) AM_READ(sc12_input_r)
@@ -274,11 +604,11 @@ static ADDRESS_MAP_START( sc12_map, AS_PROGRAM, 8, fidel6502_state )
ADDRESS_MAP_END
-// FEV
+// 6080/6092/6093 (Excellence)
-static ADDRESS_MAP_START( fev_map, AS_PROGRAM, 8, fidel6502_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x1fff) AM_RAM
+static ADDRESS_MAP_START( fexcel_map, AS_PROGRAM, 8, fidel6502_state )
+ AM_RANGE(0x0000, 0x1fff) AM_MIRROR(0x2000) AM_RAM
+ AM_RANGE(0x4000, 0x4007) AM_MIRROR(0x3ff8) AM_READWRITE(fexcel_ttl_r, fexcel_ttl_w)
AM_RANGE(0x8000, 0xffff) AM_ROM
ADDRESS_MAP_END
@@ -288,197 +618,171 @@ ADDRESS_MAP_END
Input Ports
******************************************************************************/
-static INPUT_PORTS_START( csc )
+static INPUT_PORTS_START( sc12 )
PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speak") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square a1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square a2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square a3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square a4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square a5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square a6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square a7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square a8")
PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RV") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square b1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square b2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square b3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square b4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square b5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square b6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square b7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square b8")
PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TM") PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square c1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square c2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square c3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square c4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square c5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square c6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square c7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square c8")
PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) // level
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square d1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square d2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square d3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square d4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square d5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square d6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square d7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square d8")
PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square e1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square e2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square e3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square e4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square e5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square e6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square e7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square e8")
PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ST") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square f1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square f2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square f3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square f4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square f5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square f6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square f7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square f8")
PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square g1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square g2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square g3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square g4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square g5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square g6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square g7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square g8")
PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square h1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square h2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square h3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square h4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square h5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square h6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square h7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Square h8")
PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Pawn") PORT_CODE(KEYCODE_1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Rook") PORT_CODE(KEYCODE_2)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Knight") PORT_CODE(KEYCODE_3)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Bishop") PORT_CODE(KEYCODE_4)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Queen") PORT_CODE(KEYCODE_5)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("King") PORT_CODE(KEYCODE_6)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) // clear
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) // reset
- PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_UNUSED
+ 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_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
+static INPUT_PORTS_START( fexcel )
+ PORT_INCLUDE( sc12 )
+
+ PORT_MODIFY("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Move/Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hint/Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Take Back/Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Level/Rook")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Options/Queen")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Verify/King")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
+INPUT_PORTS_END
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
+static INPUT_PORTS_START( fexcelv )
+ PORT_INCLUDE( fexcel )
+
+ PORT_START("IN.9")
+ PORT_CONFNAME( 0x03, 0x00, "Language" ) PORT_CHANGED_MEMBER(DEVICE_SELF, fidel6502_state, fexcelv_bankswitch, 0)
+ PORT_CONFSETTING( 0x00, "English" )
+ PORT_CONFSETTING( 0x01, "German" )
+ PORT_CONFSETTING( 0x02, "French" )
+ PORT_CONFSETTING( 0x03, "Spanish" )
+ PORT_BIT(0x7c, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_READ_LINE_DEVICE_MEMBER("speech", s14001a_device, busy_r)
+INPUT_PORTS_END
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
+static INPUT_PORTS_START( csc )
+ PORT_INCLUDE( sc12 )
- PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
- PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
- PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM")
- PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD)
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV")
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RV / Pawn") PORT_CODE(KEYCODE_1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM / Knight") PORT_CODE(KEYCODE_2)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TB / Bishop") PORT_CODE(KEYCODE_3)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV / Rook") PORT_CODE(KEYCODE_4)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV / Queen") PORT_CODE(KEYCODE_5)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB / King") PORT_CODE(KEYCODE_6)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) // clear
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) // reset
+ 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_MODIFY("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_START("IN.9") // hardwired
+ PORT_CONFNAME( 0x01, 0x00, "Language" )
+ PORT_CONFSETTING( 0x00, "English" )
+ PORT_CONFSETTING( 0x01, "Other" )
+ PORT_CONFNAME( 0x02, 0x00, DEF_STR( Unknown ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x02, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( cscg )
+ PORT_INCLUDE( csc )
+
+ PORT_MODIFY("IN.9")
+ PORT_CONFNAME( 0x01, 0x01, "Language" )
+ PORT_CONFSETTING( 0x00, "English" )
+ PORT_CONFSETTING( 0x01, "Other" )
INPUT_PORTS_END
@@ -510,7 +814,7 @@ static MACHINE_CONFIG_START( csc, fidel6502_state )
MCFG_PIA_CB2_HANDLER(WRITELINE(fidel6502_state, csc_pia1_cb2_w))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
- MCFG_DEFAULT_LAYOUT(layout_fidel_vsc)
+ MCFG_DEFAULT_LAYOUT(layout_fidel_csc)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -527,8 +831,9 @@ static MACHINE_CONFIG_START( sc12, fidel6502_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", R65C02, XTAL_4MHz)
MCFG_CPU_PROGRAM_MAP(sc12_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("sc12_irq", fidel6502_state, sc12_irq, attotime::from_hz(780)) // from 556 timer
- MCFG_TIMER_DRIVER_ADD("irq_off", fidel6502_state, irq_off)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(780)) // from 556 timer
+ MCFG_TIMER_START_DELAY(attotime::from_hz(780) - attotime::from_nsec(15250)) // active for 15.25us
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel6502_state, irq_off, attotime::from_hz(780))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_sc12)
@@ -537,21 +842,37 @@ static MACHINE_CONFIG_START( sc12, fidel6502_state )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ /* cartridge */
+ MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "fidel_scc")
+ MCFG_GENERIC_EXTENSIONS("bin,dat")
+ MCFG_GENERIC_LOAD(fidelz80base_state, scc_cartridge)
+ MCFG_SOFTWARE_LIST_ADD("cart_list", "fidel_scc")
MACHINE_CONFIG_END
-static MACHINE_CONFIG_START( fev, fidel6502_state )
+static MACHINE_CONFIG_START( fexcel, fidel6502_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M65SC02, XTAL_3MHz) // M65SC102 (CMD)
- MCFG_CPU_PROGRAM_MAP(fev_map)
+ MCFG_CPU_ADD("maincpu", M65SC02, XTAL_12MHz/4) // G65SC102P-3, 12.0M ceramic resonator
+ MCFG_CPU_PROGRAM_MAP(fexcel_map)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(780)) // from 556 timer, PCB photo suggests it's same as sc12
+ MCFG_TIMER_START_DELAY(attotime::from_hz(780) - attotime::from_nsec(15250)) // active for 15.25us
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel6502_state, irq_off, attotime::from_hz(780))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_fev)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( fexcelv, fexcel )
+
+ /* sound hardware */
MCFG_SOUND_ADD("speech", S14001A, 25000) // R/C circuit, around 25khz
- MCFG_S14001A_EXT_READ_HANDLER(READ8(fidel6502_state, csc_speech_r))
+ MCFG_S14001A_EXT_READ_HANDLER(READ8(fidel6502_state, fexcelv_speech_r))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
MACHINE_CONFIG_END
@@ -574,6 +895,43 @@ ROM_START( csc )
ROM_RELOAD( 0x1000, 0x1000)
ROM_END
+ROM_START( cscsp )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("1025a03.bin", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
+ ROM_LOAD("1025a02.bin", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
+ ROM_LOAD("1025a01.bin", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
+ ROM_LOAD("74s474.bin", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROM_LOAD("vcc-spanish.bin", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
+ROM_END
+
+ROM_START( cscg )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("1025a03.bin", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
+ ROM_LOAD("1025a02.bin", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
+ ROM_LOAD("1025a01.bin", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
+ ROM_LOAD("74s474.bin", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROM_LOAD("vcc-german.bin", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
+ROM_END
+
+ROM_START( cscfr )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("1025a03.bin", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
+ ROM_LOAD("1025a02.bin", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
+ ROM_LOAD("1025a01.bin", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
+ ROM_LOAD("74s474.bin", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROM_LOAD("vcc-french.bin", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
+ROM_END
+
+
ROM_START( fscc12 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("101-1068a01", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
@@ -581,21 +939,33 @@ ROM_START( fscc12 )
ROM_LOAD("tmm2764d-2", 0xe000, 0x2000, CRC(183d3edc) SHA1(3296a4c3bce5209587d4a1694fce153558544e63) ) // Toshiba TMM2764D-2
ROM_END
+
+ROM_START( fexcel )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) ) // same as fexcelv
+ROM_END
+
ROM_START( fexcelv )
ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) )
+ ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) ) // PCB1, M27256
ROM_REGION( 0x8000, "speech", 0 )
- ROM_LOAD("101-1081a01.ic2", 0x0000, 0x8000, CRC(c8ae1607) SHA1(6491ce6be60ed77f3dd931c0ca17616f13af943e) )
+ ROM_LOAD("101-1081a01.ic2", 0x0000, 0x8000, CRC(c8ae1607) SHA1(6491ce6be60ed77f3dd931c0ca17616f13af943e) ) // PCB2, M27256
ROM_END
+
+
/******************************************************************************
Drivers
******************************************************************************/
-/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */
-COMP( 1981, csc, 0, 0, csc, csc, driver_device, 0, "Fidelity Electronics", "Champion Sensory Chess Challenger", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */
+COMP( 1981, csc, 0, 0, csc, csc, driver_device, 0, "Fidelity Electronics", "Champion Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+COMP( 1981, cscsp, csc, 0, csc, cscg, driver_device, 0, "Fidelity Electronics", "Champion Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+COMP( 1981, cscg, csc, 0, csc, cscg, driver_device, 0, "Fidelity Electronics", "Champion Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+COMP( 1981, cscfr, csc, 0, csc, cscg, driver_device, 0, "Fidelity Electronics", "Champion Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-COMP( 1984, fscc12, 0, 0, sc12, sc12, driver_device, 0, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_NOT_WORKING )
+COMP( 1984, fscc12, 0, 0, sc12, sc12, driver_device, 0, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-COMP( 1987, fexcelv, 0, 0, fev, csc, driver_device, 0, "Fidelity Electronics", "Voice Excellence", MACHINE_NOT_WORKING )
+COMP( 1987, fexcel, 0, 0, fexcel, fexcel, driver_device, 0, "Fidelity Electronics", "Excellence (model 6080/6093)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+COMP( 1987, fexcelv, 0, 0, fexcelv, fexcelv, driver_device, 0, "Fidelity Electronics", "Voice Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )