diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 6d53cb3f789..42a4ef5580c 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -3763,6 +3763,7 @@ files { MAME_DIR .. "src/mame/drivers/acd.cpp", MAME_DIR .. "src/mame/drivers/aceex.cpp", MAME_DIR .. "src/mame/drivers/aci_boris.cpp", + MAME_DIR .. "src/mame/drivers/aci_borisdpl.cpp", MAME_DIR .. "src/mame/drivers/adm23.cpp", MAME_DIR .. "src/mame/drivers/adm31.cpp", MAME_DIR .. "src/mame/drivers/akaiax80.cpp", diff --git a/src/devices/machine/f3853.cpp b/src/devices/machine/f3853.cpp index b8fd94f9d1d..45511f334ab 100644 --- a/src/devices/machine/f3853.cpp +++ b/src/devices/machine/f3853.cpp @@ -9,7 +9,7 @@ low-level ROMC signals. F3853: Static memory interface with integrated interrupt controller and timer. -The timer is a shift register: +The timer is an 8-bit linear feedback shift register: Feedback in0 = !((out3 ^ out4) ^ (out5 ^ out7)) Interrupts are at 0xfe 0xff stops the register (0xfe is never reached) diff --git a/src/mame/drivers/aci_boris.cpp b/src/mame/drivers/aci_boris.cpp index 2d565714354..d7707a1f378 100644 --- a/src/mame/drivers/aci_boris.cpp +++ b/src/mame/drivers/aci_boris.cpp @@ -21,6 +21,7 @@ your move"(same as Boris Master) instead of "Boris plays black". #include "machine/f3853.h" #include "machine/timer.h" +// internal artwork #include "aci_boris.lh" @@ -32,15 +33,14 @@ public: boris_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_delay_display(*this, "delay_display_%u", 0), m_inp_matrix(*this, "IN.%u", 0), + m_delay_display(*this, "delay_display_%u", 0), m_out_digit(*this, "digit%u", 0U) { } void boris(machine_config &config); - // reset switch is tied to MK3850 RESET pin - DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); } + DECLARE_INPUT_CHANGED_MEMBER(reset_switch); protected: virtual void machine_start() override; @@ -48,8 +48,8 @@ protected: private: // devices/pointers required_device m_maincpu; - required_device_array m_delay_display; required_ioport_array<4> m_inp_matrix; + required_device_array m_delay_display; output_finder<8> m_out_digit; void main_map(address_map &map); @@ -81,6 +81,19 @@ void boris_state::machine_start() save_item(NAME(m_4042)); } +INPUT_CHANGED_MEMBER(boris_state::reset_switch) +{ + // reset switch is tied to MK3850 RESET pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); + + // clear display + if (newval) + { + for (int i = 0; i < 8; i++) + m_delay_display[i]->adjust(attotime::zero, i); + } +} + /****************************************************************************** @@ -92,7 +105,7 @@ void boris_state::machine_start() TIMER_DEVICE_CALLBACK_MEMBER(boris_state::delay_display) { // 16 segments via port 1 and 4042 output (latched port 1) - u16 mask = (param & 0x10) ? 0xffff : 0; + u16 mask = (param & 8) ? 0xffff : 0; m_out_digit[param & 7] = ~(m_4042 << 8 | m_io[1]) & mask; } @@ -111,12 +124,12 @@ WRITE8_MEMBER(boris_state::mux_w) u8 sel = ~data & 7; if (sel != prev) { - // digits are strobed, so on falling edge, delay them going off to prevent flicker + // digits are strobed, so on falling edge, delay them going off to prevent flicker or stuck display m_delay_display[prev]->adjust(attotime::from_msec(50), prev); // need a short delay on rising edge too, while boris sets up digit segments // (it writes port 1, increments digit, latches port 1, writes port 1 again) - m_delay_display[sel]->adjust(attotime::from_usec(50), sel | 0x10); + m_delay_display[sel]->adjust(attotime::from_usec(50), sel | 8); } // IO03: clock 4042 @@ -172,7 +185,7 @@ static INPUT_PORTS_START( boris ) PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G.7") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H.8") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Set / 9") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Set / 9") // labeled just "SET" on 1st version PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry PORT_START("IN.1") @@ -194,7 +207,7 @@ static INPUT_PORTS_START( boris ) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") PORT_START("RESET") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_R) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, boris_state, reset_button, nullptr) PORT_NAME("Reset Switch") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_R) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, boris_state, reset_switch, nullptr) PORT_NAME("Reset Switch") INPUT_PORTS_END diff --git a/src/mame/drivers/aci_borisdpl.cpp b/src/mame/drivers/aci_borisdpl.cpp new file mode 100644 index 00000000000..d2210d63df8 --- /dev/null +++ b/src/mame/drivers/aci_borisdpl.cpp @@ -0,0 +1,236 @@ +// license:BSD-3-Clause +// copyright-holders:Sandro Ronco, hap +// thanks-to:Sean Riddle +/****************************************************************************** + +Applied Concepts Boris Diplomat + +- F3870 MCU (Motorola SC80265P or Fairchild SL90259) +- 256 bytes RAM(2*2112-1) +- 8-digit 7seg led panel + +Two versions exists, a blue one(seen with SC80265P) and a brown one(seen with +either MCU). The one emulated here is from a brown version with the SC80265P. +Motorola SC80265P is a 3870 clone, it's assumed that the program is the same +as SL90259. + +******************************************************************************/ + +#include "emu.h" +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "machine/timer.h" + +// internal artwork +#include "aci_borisdpl.lh" // clickable + + +namespace { + +class borisdpl_state : public driver_device +{ +public: + borisdpl_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_keypad(*this, "LINE%u", 1U), + m_delay_display(*this, "delay_display_%u", 0), + m_out_digit(*this, "digit%u", 0U) + { } + + void borisdpl(machine_config &config); + + // reset button is tied to MCU RESET pin + DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); } + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_ioport_array<4> m_keypad; + required_device_array m_delay_display; + output_finder<8> m_out_digit; + + void main_map(address_map &map); + void main_io(address_map &map); + + TIMER_DEVICE_CALLBACK_MEMBER(delay_display); + + DECLARE_WRITE8_MEMBER(digit_w); + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(matrix_w); + + // 256 bytes data RAM accessed via I/O ports + DECLARE_READ8_MEMBER(ram_address_r) { return m_ram_address; } + DECLARE_WRITE8_MEMBER(ram_address_w) { m_ram_address = data; } + DECLARE_READ8_MEMBER(ram_data_r) { return m_ram[m_ram_address]; } + DECLARE_WRITE8_MEMBER(ram_data_w) { m_ram[m_ram_address] = data; } + + std::unique_ptr m_ram; + u8 m_ram_address; + u8 m_matrix; +}; + +void borisdpl_state::machine_start() +{ + // resolve handlers + m_out_digit.resolve(); + + // zerofill + m_ram = make_unique_clear(0x100); + m_ram_address = 0; + m_matrix = 0; + + // register for savestates + save_pointer(NAME(m_ram), 0x100); + save_item(NAME(m_ram_address)); + save_item(NAME(m_matrix)); +} + + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// F3870 ports + +TIMER_DEVICE_CALLBACK_MEMBER(borisdpl_state::delay_display) +{ + // clear digits if inactive + if (param != (m_matrix & 7)) + m_out_digit[param] = 0; +} + +WRITE8_MEMBER(borisdpl_state::digit_w) +{ + // digit segments, update display here + m_out_digit[m_matrix & 7] = ~data & 0x7f; +} + +WRITE8_MEMBER(borisdpl_state::matrix_w) +{ + // d0-d2: MC14028B to input/digit select + // digits are strobed, so on falling edge, delay them going off to prevent flicker or stuck display + if ((data & 7) != (m_matrix & 7)) + m_delay_display[m_matrix & 7]->adjust(attotime::from_msec(20), m_matrix & 7); + + m_matrix = data; +} + +READ8_MEMBER(borisdpl_state::input_r) +{ + // d4-d7: multiplexed inputs (only one lane can be selected at the same time) + u8 data = m_matrix; + if ((m_matrix & 7) < 4) + data |= m_keypad[m_matrix & 3]->read() << 4; + + return data; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void borisdpl_state::main_map(address_map &map) +{ + map.global_mask(0x7ff); + map(0x0000, 0x07ff).rom(); +} + +void borisdpl_state::main_io(address_map &map) +{ + map(0x00, 0x00).rw(FUNC(borisdpl_state::input_r), FUNC(borisdpl_state::matrix_w)); + map(0x01, 0x01).w(FUNC(borisdpl_state::digit_w)); + map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( borisdpl ) + PORT_START("LINE1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("B/W") // black/white + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + + PORT_START("LINE2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A.1 / Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B.2 / Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C.3 / Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("Rank") + + PORT_START("LINE3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D.4 / Rook") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E.5 / Queen") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F.6 / King") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Time") + + PORT_START("LINE4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G.7") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H.8") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Set") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry + + PORT_START("RESET") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, borisdpl_state, reset_button, nullptr) PORT_NAME("Reset") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void borisdpl_state::borisdpl(machine_config &config) +{ + /* basic machine hardware */ + F8(config, m_maincpu, 3000000/2); // frequency approximated from video reference + m_maincpu->set_addrmap(AS_PROGRAM, &borisdpl_state::main_map); + m_maincpu->set_addrmap(AS_IO, &borisdpl_state::main_io); + m_maincpu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge)); + + f38t56_device &psu(F38T56(config, "psu", 3000000/2)); + psu.set_int_vector(0x5020); + psu.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); + psu.read_a().set(FUNC(borisdpl_state::ram_data_r)); + psu.write_a().set(FUNC(borisdpl_state::ram_data_w)); + psu.read_b().set(FUNC(borisdpl_state::ram_address_r)); + psu.write_b().set(FUNC(borisdpl_state::ram_address_w)); + + /* video hardware */ + for (int i = 0; i < 8; i++) + TIMER(config, m_delay_display[i]).configure_generic(FUNC(borisdpl_state::delay_display)); + + config.set_default_layout(layout_aci_borisdpl); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( borisdpl ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("007-7024-00_7847.u8", 0x0000, 0x0800, CRC(e20bac03) SHA1(9e17b9d90522371fbf7018926356150f70b9a3b6) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, borisdpl, 0, 0, borisdpl, borisdpl, borisdpl_state, empty_init, "Applied Concepts", "Boris Diplomat", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/chesstrv.cpp b/src/mame/drivers/chesstrv.cpp index d525b75dfc8..873e34bba5d 100644 --- a/src/mame/drivers/chesstrv.cpp +++ b/src/mame/drivers/chesstrv.cpp @@ -1,8 +1,20 @@ // license:BSD-3-Clause -// copyright-holders:Sandro Ronco +// copyright-holders:Sandro Ronco, hap +// thanks-to:Sean Riddle /****************************************************************************** - Acetronic Chess Traveller +SciSys Chess Traveler + +- Fairchild 3870 MCU, label SL90387 (does not use the timer or irq at all) +- 256 bytes RAM(3539) +- 4-digit 7seg led panel + +It was also redistributed by Acetronic as "Chess Traveller"(British spelling there), +and by Prinztronic as well, another British brand + +SciSys/Novag's "Chess Champion: Pocket Chess" is assumed to be the same game, +with the exception that they added battery low voltage detection to it (rightmost +digit DP lights up). ******************************************************************************/ @@ -10,253 +22,179 @@ #include "cpu/f8/f8.h" #include "machine/f3853.h" #include "machine/timer.h" -#include "chesstrv.lh" -#include "borisdpl.lh" -class chesstrv_base_state : public driver_device -{ -protected: - chesstrv_base_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - { - } +// internal artwork +#include "chesstrv.lh" // clickable - virtual void machine_start() override; - DECLARE_READ8_MEMBER(ram_addr_r); - DECLARE_WRITE8_MEMBER(ram_addr_w); - DECLARE_READ8_MEMBER(ram_r); - DECLARE_WRITE8_MEMBER(ram_w); - DECLARE_WRITE8_MEMBER(matrix_w); +namespace { - void chesstrv_mem(address_map &map); - - uint8_t m_ram_addr; - uint8_t *m_ram; - uint8_t m_matrix; - required_device m_maincpu; -}; - -class chesstrv_state : public chesstrv_base_state +class chesstrv_state : public driver_device { public: - chesstrv_state(const machine_config &mconfig, device_type type, const char *tag) - : chesstrv_base_state(mconfig, type, tag) - , m_digits(*this, "digit%u", 0U) - , m_keypad(*this, "LINE%u", 1U) - { - } + chesstrv_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_keypad(*this, "LINE%u", 1U), + m_delay_display(*this, "delay_display_%u", 0), + m_out_digit(*this, "digit%u", 0U) + { } void chesstrv(machine_config &config); + protected: virtual void machine_start() override; + private: + // devices/pointers + required_device m_maincpu; + required_ioport_array<4> m_keypad; + required_device_array m_delay_display; + output_finder<4> m_out_digit; + + void chesstrv_mem(address_map &map); void chesstrv_io(address_map &map); - DECLARE_WRITE8_MEMBER(display_w); - DECLARE_READ8_MEMBER(keypad_r); + TIMER_DEVICE_CALLBACK_MEMBER(delay_display); - output_finder<4> m_digits; - required_ioport_array<4> m_keypad; + DECLARE_WRITE8_MEMBER(matrix_w); + DECLARE_WRITE8_MEMBER(digit_w); + DECLARE_READ8_MEMBER(input_r); + + // 256 bytes data RAM accessed via I/O ports + DECLARE_READ8_MEMBER(ram_address_r) { return m_ram_address; } + DECLARE_WRITE8_MEMBER(ram_address_w) { m_ram_address = data; } + DECLARE_READ8_MEMBER(ram_data_r) { return m_ram[m_ram_address]; } + DECLARE_WRITE8_MEMBER(ram_data_w) { m_ram[m_ram_address] = data; } + + std::unique_ptr m_ram; + u8 m_ram_address; + u8 m_matrix; }; -class borisdpl_state : public chesstrv_base_state +void chesstrv_state::machine_start() { -public: - borisdpl_state(const machine_config &mconfig, device_type type, const char *tag) - : chesstrv_base_state(mconfig, type, tag) - , m_digits(*this, "digit%u", 0U) - , m_keypad(*this, "LINE%u", 1U) - { - } + // resolve handlers + m_out_digit.resolve(); - void borisdpl(machine_config &config); -protected: - virtual void machine_start() override; -private: - void borisdpl_io(address_map &map); + // zerofill + m_ram = make_unique_clear(0x100); + m_ram_address = 0; + m_matrix = 0; - DECLARE_WRITE8_MEMBER(display_w); - DECLARE_READ8_MEMBER(keypad_r); - - output_finder<8> m_digits; - required_ioport_array<4> m_keypad; -}; - -WRITE8_MEMBER(chesstrv_base_state::ram_addr_w) -{ - m_ram_addr = data; + // register for savestates + save_pointer(NAME(m_ram), 0x100); + save_item(NAME(m_ram_address)); + save_item(NAME(m_matrix)); } -READ8_MEMBER(chesstrv_base_state::ram_addr_r) + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// F3870 ports + +TIMER_DEVICE_CALLBACK_MEMBER(chesstrv_state::delay_display) { - return m_ram_addr; + // clear digits if inactive + if (BIT(m_matrix, 3 - param)) + m_out_digit[param] = 0; } -READ8_MEMBER(chesstrv_base_state::ram_r) +WRITE8_MEMBER(chesstrv_state::digit_w) { - return m_ram[m_ram_addr]; + // digit segments, update display here + for (int i = 0; i < 4; i++) + if (!BIT(m_matrix, 3 - i)) + m_out_digit[i] = bitswap<8>(data,0,1,2,3,4,5,6,7) & 0x7f; } -WRITE8_MEMBER(chesstrv_base_state::ram_w) +WRITE8_MEMBER(chesstrv_state::matrix_w) { - m_ram[m_ram_addr] = data; -} + // d0-d3: input/digit select (active low) + // they're strobed, so on rising edge, delay them going off to prevent flicker or stuck display + for (int i = 0; i < 4; i++) + if (BIT(~m_matrix & data, 3 - i)) + m_delay_display[i]->adjust(attotime::from_msec(20), i); -WRITE8_MEMBER(chesstrv_state::display_w) -{ - uint8_t seg_data = bitswap<8>(data,0,1,2,3,4,5,6,7); - - for (int digit = 0; digit < 4; digit++) - if (!BIT(m_matrix, 3 - digit)) - m_digits[digit] = seg_data; -} - -WRITE8_MEMBER(chesstrv_base_state::matrix_w) -{ m_matrix = data; } -READ8_MEMBER(chesstrv_state::keypad_r) +READ8_MEMBER(chesstrv_state::input_r) { - uint8_t data = 0; + u8 data = m_matrix; - data |= m_keypad[0]->read(); - data |= m_keypad[1]->read(); - data |= m_keypad[2]->read(); - data |= m_keypad[3]->read(); - data |= (m_keypad[0]->read() ? 0x10 : 0); - data |= (m_keypad[1]->read() ? 0x20 : 0); - data |= (m_keypad[2]->read() ? 0x40 : 0); - data |= (m_keypad[3]->read() ? 0x80 : 0); + // d0-d3: multiplexed inputs from d4-d7 + for (int i = 0; i < 4; i++) + if (BIT(m_matrix, i+4)) + data |= m_keypad[i]->read(); + + // d4-d7: multiplexed inputs from d0-d3 + for (int i = 0; i < 4; i++) + if (m_matrix & m_keypad[i]->read()) + data |= 1 << (i+4); return data; } -WRITE8_MEMBER(borisdpl_state::display_w) -{ - m_digits[m_matrix & 7] = data ^ 0xff; -} - -READ8_MEMBER(borisdpl_state::keypad_r) -{ - uint8_t data = m_matrix & 0x07; - - switch (m_matrix & 7) - { - case 0: data |= m_keypad[0]->read(); break; - case 1: data |= m_keypad[1]->read(); break; - case 2: data |= m_keypad[2]->read(); break; - case 3: data |= m_keypad[3]->read(); break; - } - - return data | m_matrix; -} -void chesstrv_base_state::chesstrv_mem(address_map &map) +/****************************************************************************** + Address Maps +******************************************************************************/ + +void chesstrv_state::chesstrv_mem(address_map &map) { map.global_mask(0x7ff); map(0x0000, 0x07ff).rom(); } - void chesstrv_state::chesstrv_io(address_map &map) { - map(0x00, 0x00).rw(FUNC(chesstrv_state::ram_addr_r), FUNC(chesstrv_state::ram_addr_w)); - map(0x01, 0x01).w(FUNC(chesstrv_state::display_w)); - map(0x04, 0x04).rw(FUNC(chesstrv_state::ram_r), FUNC(chesstrv_state::ram_w)); - map(0x05, 0x05).rw(FUNC(chesstrv_state::keypad_r), FUNC(chesstrv_state::matrix_w)); -} - -void borisdpl_state::borisdpl_io(address_map &map) -{ - map(0x00, 0x00).rw(FUNC(borisdpl_state::keypad_r), FUNC(borisdpl_state::matrix_w)); - map(0x01, 0x01).w(FUNC(borisdpl_state::display_w)); + map(0x00, 0x00).rw(FUNC(chesstrv_state::ram_address_r), FUNC(chesstrv_state::ram_address_w)); + map(0x01, 0x01).w(FUNC(chesstrv_state::digit_w)); map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write)); } + + +/****************************************************************************** + Input Ports +******************************************************************************/ + static INPUT_PORTS_START( chesstrv ) PORT_START("LINE1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) - PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A 1 / Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B 2 / Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C 3 / Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D 4 / Rook") PORT_START("LINE2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) - PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E 5 / Queen") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F 6 / King") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G 7 / White") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H 8 / Black") PORT_START("LINE3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FP") PORT_CODE(KEYCODE_K) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EP") PORT_CODE(KEYCODE_O) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CB") PORT_CODE(KEYCODE_Q) - PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV / CS") // level/clear square + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("FP") // find position + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("EP") // enter position + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("CB") // clear board PORT_START("LINE4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CE") PORT_CODE(KEYCODE_DEL) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MM") PORT_CODE(KEYCODE_M) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MM") // multi move PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED) -INPUT_PORTS_END - -static INPUT_PORTS_START( borisdpl ) - PORT_START("LINE1") - PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B/W") PORT_CODE(KEYCODE_W) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) - - PORT_START("LINE2") - PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RANK") PORT_CODE(KEYCODE_R) - - PORT_START("LINE3") - PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TIME") PORT_CODE(KEYCODE_T) - - PORT_START("LINE4") - PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9/SET") PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_9) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CE") PORT_CODE(KEYCODE_DEL) INPUT_PORTS_END -void chesstrv_base_state::machine_start() -{ - m_ram = memregion("ram")->base(); - save_item(NAME(m_ram_addr)); - save_item(NAME(m_matrix)); -} - -void chesstrv_state::machine_start() -{ - chesstrv_base_state::machine_start(); - m_digits.resolve(); -} - -void borisdpl_state::machine_start() -{ - chesstrv_base_state::machine_start(); - m_digits.resolve(); -} +/****************************************************************************** + Machine Configs +******************************************************************************/ void chesstrv_state::chesstrv(machine_config &config) { @@ -265,46 +203,37 @@ void chesstrv_state::chesstrv(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &chesstrv_state::chesstrv_mem); m_maincpu->set_addrmap(AS_IO, &chesstrv_state::chesstrv_io); + f38t56_device &psu(F38T56(config, "psu", 3000000/2)); + psu.read_a().set(FUNC(chesstrv_state::ram_data_r)); + psu.write_a().set(FUNC(chesstrv_state::ram_data_w)); + psu.read_b().set(FUNC(chesstrv_state::input_r)); + psu.write_b().set(FUNC(chesstrv_state::matrix_w)); + /* video hardware */ + for (int i = 0; i < 4; i++) + TIMER(config, m_delay_display[i]).configure_generic(FUNC(chesstrv_state::delay_display)); + config.set_default_layout(layout_chesstrv); } -void borisdpl_state::borisdpl(machine_config &config) -{ - /* basic machine hardware */ - F8(config, m_maincpu, 3000000/2); // Motorola SC80265P, frequency approximated from video reference - m_maincpu->set_addrmap(AS_PROGRAM, &borisdpl_state::chesstrv_mem); - m_maincpu->set_addrmap(AS_IO, &borisdpl_state::borisdpl_io); - m_maincpu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge)); - f38t56_device &psu(F38T56(config, "psu", 3000000/2)); - psu.set_int_vector(0x5020); - psu.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); - psu.read_a().set(FUNC(borisdpl_state::ram_r)); - psu.write_a().set(FUNC(borisdpl_state::ram_w)); - psu.read_b().set(FUNC(borisdpl_state::ram_addr_r)); - psu.write_b().set(FUNC(borisdpl_state::ram_addr_w)); - - /* video hardware */ - config.set_default_layout(layout_borisdpl); -} +/****************************************************************************** + ROM Definitions +******************************************************************************/ ROM_START( chesstrv ) - ROM_REGION(0x0800, "maincpu", 0) - ROM_LOAD("3870-sl90387", 0x0000, 0x0800, CRC(b76214d8) SHA1(7760903a64d9c513eb54c4787f535dabec62eb64)) - - ROM_REGION(0x0100, "ram", ROMREGION_ERASE) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("3870-sl90387", 0x0000, 0x0800, CRC(b76214d8) SHA1(7760903a64d9c513eb54c4787f535dabec62eb64) ) ROM_END -ROM_START( borisdpl ) - ROM_REGION(0x0800, "maincpu", 0) - ROM_LOAD("007-7024-00_7847.u8", 0x0000, 0x0800, CRC(e20bac03) SHA1(9e17b9d90522371fbf7018926356150f70b9a3b6)) - - ROM_REGION(0x0100, "ram", ROMREGION_ERASE) -ROM_END +} // anonymous namespace -// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS -CONS( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "Acetronic", "Chess Traveller", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) -CONS( 1979, borisdpl, 0, 0, borisdpl, borisdpl, borisdpl_state, empty_init, "Applied Concepts", "Boris Diplomat", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "SciSys", "Chess Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/gamemachine.cpp b/src/mame/drivers/gamemachine.cpp index 5b714e1dd77..5a06a242196 100644 --- a/src/mame/drivers/gamemachine.cpp +++ b/src/mame/drivers/gamemachine.cpp @@ -53,8 +53,8 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_beeper(*this, "beeper"), + m_keypad(*this, "IN.%u", 0), m_delay_display(*this, "delay_display_%u", 0), - m_inp_matrix(*this, "IN.%u", 0), m_out_digit(*this, "digit%u", 0U) { } @@ -67,8 +67,8 @@ private: // devices/pointers required_device m_maincpu; required_device m_beeper; + required_ioport_array<10> m_keypad; required_device_array m_delay_display; - required_ioport_array<10> m_inp_matrix; output_finder<12> m_out_digit; void main_map(address_map &map); @@ -127,7 +127,7 @@ void tgm_state::update_display(u16 edge) if (BIT(m_digit_select, i)) m_out_digit[i] = m_digit_data; - // they're strobed, so on falling edge, delay them going off to prevent flicker + // they're strobed, so on falling edge, delay them going off to prevent flicker or stuck display // BTANB: some digit segments get stuck after crashing in the GP game, it's not due to the simulated delay here else if (BIT(edge, i)) m_delay_display[i]->adjust(attotime::from_msec(20), i); @@ -173,7 +173,7 @@ READ8_MEMBER(tgm_state::input_r) // P12,P13: multiplexed inputs for (int i = 0; i < 10; i++) if (m_inp_mux >> i & 1) - data |= m_inp_matrix[i]->read(); + data |= m_keypad[i]->read(); return data << 2; } diff --git a/src/mame/drivers/intellect02.cpp b/src/mame/drivers/intellect02.cpp index 010c597f6dc..98d43091362 100644 --- a/src/mame/drivers/intellect02.cpp +++ b/src/mame/drivers/intellect02.cpp @@ -197,7 +197,7 @@ WRITE8_MEMBER(intel02_state::control_w) if (BIT(data, i)) m_led_active |= 1 << i; - // they're strobed, so on falling edge, delay them going off to prevent flicker + // they're strobed, so on falling edge, delay them going off to prevent flicker or stuck display else if (BIT(m_led_select, i)) m_delay_display[i]->adjust(attotime::from_msec(10), i); } diff --git a/src/mame/layout/aci_borisdpl.lay b/src/mame/layout/aci_borisdpl.lay new file mode 100644 index 00000000000..afe0bbd64c0 --- /dev/null +++ b/src/mame/layout/aci_borisdpl.lay @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/borisdpl.lay b/src/mame/layout/borisdpl.lay deleted file mode 100644 index 2ca7ceae315..00000000000 --- a/src/mame/layout/borisdpl.lay +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mame/layout/chesstrv.lay b/src/mame/layout/chesstrv.lay index 34e9509d990..2e09672a0a4 100644 --- a/src/mame/layout/chesstrv.lay +++ b/src/mame/layout/chesstrv.lay @@ -1,23 +1,117 @@ - - - - + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index ba80aff6ef1..38bb23a2e21 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -875,6 +875,9 @@ sp_zigzgm // @source:aci_boris.cpp boris // +@source:aci_borisdpl.cpp +borisdpl // + @source:acommand.cpp acommand // (c) 1990 @@ -9758,7 +9761,6 @@ chessmsta // chessmstdm // @source:chesstrv.cpp -borisdpl // chesstrv // @source:chexx.cpp diff --git a/src/mame/mess.flt b/src/mame/mess.flt index d9f9e315029..9d851735886 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -17,6 +17,7 @@ accomm.cpp acd.cpp aceex.cpp aci_boris.cpp +aci_borisdpl.cpp acrnsys1.cpp acrnsys.cpp acvirus.cpp