diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 6a054877d48..3fbecb615a1 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2343,6 +2343,7 @@ files { MAME_DIR .. "src/mame/drivers/fidel_eag68k.cpp", MAME_DIR .. "src/mame/drivers/fidel_elite.cpp", MAME_DIR .. "src/mame/drivers/fidel_excel.cpp", + MAME_DIR .. "src/mame/drivers/fidel_msc.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", diff --git a/src/mame/drivers/fidel_msc.cpp b/src/mame/drivers/fidel_msc.cpp new file mode 100644 index 00000000000..08581d7deaa --- /dev/null +++ b/src/mame/drivers/fidel_msc.cpp @@ -0,0 +1,254 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** + +Fidelity Mini Sensory Chess Challenger (model MSC, 1981 version) + +Two versions exist, both of them are model MSC. The 1981 version has a Z8 MCU, +the 1982 version has an I8049. They can also be distinguished from the button +panel design, the 2nd version has rectangular buttons. See fidel_sc6.cpp for +the 2nd version. + +Hardware notes: +- Z8 MCU(custom label, probably Z8601), 8MHz XTAL +- buzzer, 18 leds, 8*8 chessboard buttons, module slot + +released modules, * denotes not dumped yet: +- CAC: Challenger Advanced Chess +- *CBO: Challenger Book Openings +- *CGG: Challenger Greatest Games + +As noted in the hash file: The modules have 2 programs in them, one for Z8 +and one for MCS48. A12 is forced high or low to select the bank. + +TODO: +- dump internal Z8 ROM, then it can be marked working, right now only the + external module is playable (luckily it doesn't jump to the internal ROM) + +******************************************************************************/ + +#include "emu.h" + +#include "cpu/z8/z8.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" +#include "video/pwm.h" +#include "bus/generic/slot.h" +#include "bus/generic/carts.h" + +#include "softlist.h" +#include "speaker.h" + +// internal artwork +#include "fidel_msc_v1.lh" // clickable + + +namespace { + +class msc_state : public driver_device +{ +public: + msc_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.0") + { } + + // machine configs + void msc(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_device m_display; + required_device m_dac; + required_ioport m_inputs; + + // address maps + void main_map(address_map &map); + + // I/O handlers + void update_display(); + void mux_w(u8 data); + void control_w(u8 data); + u8 rom_r(offs_t offset); + + u8 read_inputs(); + u8 input_hi_r(); + u8 input_lo_r(); + + u8 m_led_select = 0; + u16 m_inp_mux = 0; +}; + +void msc_state::machine_start() +{ + // register for savestates + save_item(NAME(m_led_select)); + save_item(NAME(m_inp_mux)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +// MCU ports/generic + +void msc_state::update_display() +{ + m_display->matrix(m_led_select, m_inp_mux); +} + +void msc_state::mux_w(u8 data) +{ + // P20-P27: input mux, led data + m_inp_mux = (m_inp_mux & 0x100) | data; + update_display(); +} + +void msc_state::control_w(u8 data) +{ + // P37: input mux highest bit + // P35,P36: led select + m_inp_mux = (m_inp_mux & 0xff) | (data << 1 & 0x100); + m_led_select = ~data >> 5 & 3; + update_display(); + + // P34: speaker out + m_dac->write(BIT(~data, 4)); +} + +u8 msc_state::read_inputs() +{ + u8 data = 0; + + // read chessboard sensors + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_file(i); + + // read button panel + if (m_inp_mux & 0x100) + data |= m_inputs->read(); + + return bitswap<8>(~data,0,1,2,3,4,5,6,7); +} + +u8 msc_state::input_hi_r() +{ + // P04-P07: multiplexed inputs high + return read_inputs() | 0x0f; +} + +u8 msc_state::input_lo_r() +{ + // P30-P33: multiplexed inputs low + return read_inputs() | 0xf0; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void msc_state::main_map(address_map &map) +{ + map(0x0000, 0x0fff).mirror(0xf000).r("cartslot", FUNC(generic_slot_device::read_rom)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( msc ) + PORT_START("IN.0") + 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("Speaker / 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_CODE(KEYCODE_BACKSPACE) PORT_NAME("CL") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void msc_state::msc(machine_config &config) +{ + /* basic machine hardware */ + Z8601(config, m_maincpu, 8_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &msc_state::main_map); + m_maincpu->p0_in_cb().set(FUNC(msc_state::input_hi_r)); + m_maincpu->p2_out_cb().set(FUNC(msc_state::mux_w)); + m_maincpu->p3_in_cb().set(FUNC(msc_state::input_lo_r)); + m_maincpu->p3_out_cb().set(FUNC(msc_state::control_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(150)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(2, 9); + config.set_default_layout(layout_fidel_msc_v1); + + /* 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); + + /* cartridge */ + GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_msc"); + SOFTWARE_LIST(config, "cart_list").set_original("fidel_msc"); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( miniscco ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD("sr0016_1001011a01", 0x0000, 0x0800, NO_DUMP ) // internal ROM + + // force jump to external module + ROM_FILL(0x000a, 1, 0x08) // timer IRQ vector + ROM_FILL(0x000b, 1, 0x05) // " + + ROM_FILL(0x000c, 1, 0xe6) // LD P01M, #4fh + ROM_FILL(0x000d, 1, 0xf8) // " + ROM_FILL(0x000e, 1, 0x4f) // " + + ROM_FILL(0x000f, 1, 0x8d) // JP 0800h + ROM_FILL(0x0010, 1, 0x08) // " + ROM_FILL(0x0011, 1, 0x00) // " +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1981, miniscco, miniscc, 0, msc, msc, msc_state, empty_init, "Fidelity Electronics", "Mini Sensory Chess Challenger (1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/fidel_sc6.cpp b/src/mame/drivers/fidel_sc6.cpp index be59d2bb58a..97e861c0063 100644 --- a/src/mame/drivers/fidel_sc6.cpp +++ b/src/mame/drivers/fidel_sc6.cpp @@ -6,7 +6,7 @@ Fidelity Sensory Chess Challenger 6 (model SC6) Fidelity Mini Sensory Chess Challenger (model MSC, 1982 version) -SC6 Hardware notes: +SC6 hardware notes: - PCB label 510-1045B01 - INS8040N-11 MCU, 11MHz XTAL - external 4KB ROM 2332 101-1035A01, in module slot @@ -27,21 +27,13 @@ MSC hardware notes: - 2KB internal ROM, module slot - buzzer, 18 leds, 8*8 chessboard buttons -I/O is identical to SC6. +MCU ports I/O is identical to SC6. -MSC released modules, * denotes not dumped yet: -- CAC: Challenger Advanced Chess -- *CBO: Challenger Book Openings -- *CGG: Challenger Greatest Games - -The modules take over the internal ROM, by asserting the EA pin. - -2 MSC versions exist, they can be distinguished from the button panel design. -The 2nd version has rectangular buttons. The one in MAME came from the 2nd one. +It accepts the same modules as the 1st MSC version. See fidel_msc.cpp for known +modules. The module overrides the internal ROM, by asserting the EA pin. TODO: - MSC MCU is currently emulated as I8039, due to missing EA pin emulation -- msc internal artwork (game works fine, but not really playable at the moment) ******************************************************************************/ @@ -58,6 +50,7 @@ TODO: #include "speaker.h" // internal artwork +#include "fidel_msc_v2.lh" // clickable #include "fidel_sc6.lh" // clickable @@ -130,7 +123,7 @@ void sc6_state::machine_start() void sc6_state::update_display() { - // 2 7seg leds + // MSC: 18 leds, SC6: 2 7seg leds m_display->matrix(m_led_select, 1 << m_inp_mux); } @@ -255,8 +248,7 @@ void sc6_state::msc(machine_config &config) /* video hardware */ PWM_DISPLAY(config, m_display).set_size(2, 9); - m_display->set_segmask(0x3, 0xff); - config.set_default_layout(layout_fidel_sc6); + config.set_default_layout(layout_fidel_msc_v2); /* sound hardware */ SPEAKER(config, "speaker").front_center(); @@ -282,7 +274,6 @@ void sc6_state::sc6(machine_config &config) m_maincpu->t1_in_cb().set(FUNC(sc6_state::input7_r)); /* video hardware */ - m_display->set_size(2, 7); m_display->set_segmask(0x3, 0x7f); config.set_default_layout(layout_fidel_sc6); diff --git a/src/mame/layout/fidel_msc_v1.lay b/src/mame/layout/fidel_msc_v1.lay new file mode 100644 index 00000000000..bae4fac4582 --- /dev/null +++ b/src/mame/layout/fidel_msc_v1.lay @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/fidel_msc_v2.lay b/src/mame/layout/fidel_msc_v2.lay new file mode 100644 index 00000000000..3cfac1a3495 --- /dev/null +++ b/src/mame/layout/fidel_msc_v2.lay @@ -0,0 +1,545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index d5007938d6a..f02d9cd1d95 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -13533,6 +13533,9 @@ fexcelpb // fexcelv // granits // RCS +@source:fidel_msc.cpp +miniscco + @source:fidel_phantom.cpp fphantom // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 6913666b253..e16309c2809 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -294,6 +294,7 @@ fidel_desdis.cpp fidel_eag68k.cpp fidel_elite.cpp fidel_excel.cpp +fidel_msc.cpp fidel_phantom.cpp fidel_sc12.cpp fidel_sc6.cpp