// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:yoyo_chessboard
/******************************************************************************
Fidelity Electronics generic MCS-48 based chess computer driver
NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
greatly affecting user playability of emulated electronic board games.
As workaround for the chess games, use an external chess GUI on the side,
such as Arena(in editmode).
TODO:
- nothing
******************************************************************************
Sensory Chess Challenger 6 (model SC6):
- PCB label 510-1045B01
- INS8040N-11 MCU, 11MHz XTAL
- external 4KB ROM 2332 101-1035A01, in module slot
- buzzer, 2 7seg LEDs, 8*8 chessboard buttons
******************************************************************************/
#include "emu.h"
#include "includes/fidelbase.h"
#include "cpu/mcs48/mcs48.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "fidel_sc6.lh" // clickable
class fidelmcs48_state : public fidelbase_state
{
public:
fidelmcs48_state(const machine_config &mconfig, device_type type, const char *tag)
: fidelbase_state(mconfig, type, tag)
{ }
// SC6
void sc6_prepare_display();
DECLARE_WRITE8_MEMBER(sc6_mux_w);
DECLARE_WRITE8_MEMBER(sc6_select_w);
DECLARE_READ8_MEMBER(sc6_input_r);
DECLARE_READ_LINE_MEMBER(sc6_input6_r);
DECLARE_READ_LINE_MEMBER(sc6_input7_r);
void sc6_map(address_map &map);
void sc6(machine_config &config);
};
// Devices, I/O
/******************************************************************************
SC6
******************************************************************************/
// MCU ports/generic
void fidelmcs48_state::sc6_prepare_display()
{
// 2 7seg leds
set_display_segmask(3, 0x7f);
display_matrix(7, 2, m_7seg_data, m_led_select);
}
WRITE8_MEMBER(fidelmcs48_state::sc6_mux_w)
{
// P24-P27: 7442 A-D
u16 sel = 1 << (data >> 4 & 0xf) & 0x3ff;
// 7442 0-8: input mux, 7seg data
m_inp_mux = sel & 0x1ff;
m_7seg_data = sel & 0x7f;
sc6_prepare_display();
// 7442 9: speaker out
m_dac->write(BIT(sel, 9));
}
WRITE8_MEMBER(fidelmcs48_state::sc6_select_w)
{
// P16,P17: digit select
m_led_select = ~data >> 6 & 3;
sc6_prepare_display();
}
READ8_MEMBER(fidelmcs48_state::sc6_input_r)
{
// P10-P15: multiplexed inputs low
return (~read_inputs(9) & 0x3f) | 0xc0;
}
READ_LINE_MEMBER(fidelmcs48_state::sc6_input6_r)
{
// T0: multiplexed inputs bit 6
return ~read_inputs(9) >> 6 & 1;
}
READ_LINE_MEMBER(fidelmcs48_state::sc6_input7_r)
{
// T1: multiplexed inputs bit 7
return ~read_inputs(9) >> 7 & 1;
}
/******************************************************************************
Address Maps
******************************************************************************/
// SC6
void fidelmcs48_state::sc6_map(address_map &map)
{
map(0x0000, 0x0fff).rom();
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( sc6 )
PORT_INCLUDE( fidel_cb_buttons )
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
******************************************************************************/
MACHINE_CONFIG_START(fidelmcs48_state::sc6)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", I8040, 11_MHz_XTAL)
MCFG_DEVICE_PROGRAM_MAP(sc6_map)
MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(*this, fidelmcs48_state, sc6_mux_w))
MCFG_MCS48_PORT_P1_IN_CB(READ8(*this, fidelmcs48_state, sc6_input_r))
MCFG_MCS48_PORT_P1_OUT_CB(WRITE8(*this, fidelmcs48_state, sc6_select_w))
MCFG_MCS48_PORT_T0_IN_CB(READLINE(*this, fidelmcs48_state, sc6_input6_r))
MCFG_MCS48_PORT_T1_IN_CB(READLINE(*this, fidelmcs48_state, sc6_input7_r))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_sc6)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
MACHINE_CONFIG_END
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( fscc6 )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD("101-1035a01", 0x0000, 0x1000, CRC(0024971f) SHA1(76b16364913ada2fb94b9e6a8524b924e6832ddf) ) // 2332
ROM_END
/******************************************************************************
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
CONS( 1982, fscc6, 0, 0, sc6, sc6, fidelmcs48_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )