From 2f72738fd5b8752197da985d77fde8f7a3668eca Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 4 Apr 2018 12:46:03 -0400 Subject: chesstrv.cpp: Separate base classes; make better use of finders (nw) --- src/mame/drivers/chesstrv.cpp | 171 ++++++++++++++++++++++++++---------------- 1 file changed, 108 insertions(+), 63 deletions(-) diff --git a/src/mame/drivers/chesstrv.cpp b/src/mame/drivers/chesstrv.cpp index f3a6e85adc2..c59b1ceeae5 100644 --- a/src/mame/drivers/chesstrv.cpp +++ b/src/mame/drivers/chesstrv.cpp @@ -16,117 +16,151 @@ #include "chesstrv.lh" #include "borisdpl.lh" -class chesstrv_state : public driver_device +class chesstrv_base_state : public driver_device { -public: - chesstrv_state(const machine_config &mconfig, device_type type, const char *tag) +protected: + chesstrv_base_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - , m_digits(*this, "digit%u", 0U) - { } - - 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( display_w ); - DECLARE_WRITE8_MEMBER( matrix_w ); - DECLARE_READ8_MEMBER( keypad_r ); - DECLARE_WRITE8_MEMBER( diplomat_display_w ); - DECLARE_READ8_MEMBER( diplomat_keypad_r ); - //TIMER_DEVICE_CALLBACK_MEMBER(borisdpl_timer_interrupt); - void chesstrv(machine_config &config); - void borisdpl(machine_config &config); - void borisdpl_io(address_map &map); - void chesstrv_io(address_map &map); + { + } + + 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); + void chesstrv_mem(address_map &map); -private: uint8_t m_ram_addr; uint8_t *m_ram; uint8_t m_matrix; - virtual void machine_start() override; required_device m_maincpu; +}; + +class chesstrv_state : public chesstrv_base_state +{ +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) + { + } + + void chesstrv(machine_config &config); +protected: + virtual void machine_start() override; +private: + void chesstrv_io(address_map &map); + + DECLARE_WRITE8_MEMBER(display_w); + DECLARE_READ8_MEMBER(keypad_r); + + output_finder<4> m_digits; + required_ioport_array<4> m_keypad; +}; + +class borisdpl_state : public chesstrv_base_state +{ +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) + { + } + + void borisdpl(machine_config &config); +protected: + virtual void machine_start() override; +private: + void borisdpl_io(address_map &map); + + DECLARE_WRITE8_MEMBER(display_w); + DECLARE_READ8_MEMBER(keypad_r); + + //TIMER_DEVICE_CALLBACK_MEMBER(timer_interrupt); + output_finder<8> m_digits; + required_ioport_array<4> m_keypad; }; -WRITE8_MEMBER( chesstrv_state::ram_addr_w ) +WRITE8_MEMBER(chesstrv_base_state::ram_addr_w) { m_ram_addr = data; } -READ8_MEMBER( chesstrv_state::ram_addr_r ) +READ8_MEMBER(chesstrv_base_state::ram_addr_r) { return m_ram_addr; } -READ8_MEMBER( chesstrv_state::ram_r ) +READ8_MEMBER(chesstrv_base_state::ram_r) { return m_ram[m_ram_addr]; } -WRITE8_MEMBER( chesstrv_state::ram_w ) +WRITE8_MEMBER(chesstrv_base_state::ram_w) { m_ram[m_ram_addr] = data; } -WRITE8_MEMBER( chesstrv_state::display_w ) +WRITE8_MEMBER(chesstrv_state::display_w) { uint8_t seg_data = bitswap<8>(data,0,1,2,3,4,5,6,7); - if(!(m_matrix & 0x01)) - m_digits[ 3 ] = seg_data; - if(!(m_matrix & 0x02)) - m_digits[ 2 ] = seg_data; - if(!(m_matrix & 0x04)) - m_digits[ 1 ] = seg_data; - if(!(m_matrix & 0x08)) - m_digits[ 0 ] = seg_data; + for (int digit = 0; digit < 4; digit++) + if (!BIT(m_matrix, 3 - digit)) + m_digits[digit] = seg_data; } -WRITE8_MEMBER( chesstrv_state::matrix_w ) +WRITE8_MEMBER(chesstrv_base_state::matrix_w) { m_matrix = data; } -READ8_MEMBER( chesstrv_state::keypad_r ) +READ8_MEMBER(chesstrv_state::keypad_r) { uint8_t data = 0; - data |= ioport("LINE1")->read(); - data |= ioport("LINE2")->read(); - data |= ioport("LINE3")->read(); - data |= ioport("LINE4")->read(); - data |= (ioport("LINE1")->read() ? 0x10 : 0); - data |= (ioport("LINE2")->read() ? 0x20 : 0); - data |= (ioport("LINE3")->read() ? 0x40 : 0); - data |= (ioport("LINE4")->read() ? 0x80 : 0); + 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); return data; } -WRITE8_MEMBER( chesstrv_state::diplomat_display_w ) +WRITE8_MEMBER(borisdpl_state::display_w) { m_digits[m_matrix & 7] = data ^ 0xff; } -READ8_MEMBER( chesstrv_state::diplomat_keypad_r ) +READ8_MEMBER(borisdpl_state::keypad_r) { uint8_t data = m_matrix & 0x07; switch (m_matrix & 7) { - case 0: data |= ioport("LINE1")->read(); break; - case 1: data |= ioport("LINE2")->read(); break; - case 2: data |= ioport("LINE3")->read(); break; - case 3: data |= ioport("LINE4")->read(); break; + 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; } -void chesstrv_state::chesstrv_mem(address_map &map) +void chesstrv_base_state::chesstrv_mem(address_map &map) { map.global_mask(0x7ff); map(0x0000, 0x07ff).rom(); @@ -141,12 +175,12 @@ void chesstrv_state::chesstrv_io(address_map &map) map(0x05, 0x05).rw(this, FUNC(chesstrv_state::keypad_r), FUNC(chesstrv_state::matrix_w)); } -void chesstrv_state::borisdpl_io(address_map &map) +void borisdpl_state::borisdpl_io(address_map &map) { - map(0x00, 0x00).rw(this, FUNC(chesstrv_state::diplomat_keypad_r), FUNC(chesstrv_state::matrix_w)); - map(0x01, 0x01).w(this, FUNC(chesstrv_state::diplomat_display_w)); - map(0x04, 0x04).rw(this, FUNC(chesstrv_state::ram_r), FUNC(chesstrv_state::ram_w)); - map(0x05, 0x05).rw(this, FUNC(chesstrv_state::ram_addr_r), FUNC(chesstrv_state::ram_addr_w)); + map(0x00, 0x00).rw(this, FUNC(borisdpl_state::keypad_r), FUNC(borisdpl_state::matrix_w)); + map(0x01, 0x01).w(this, FUNC(borisdpl_state::display_w)); + map(0x04, 0x04).rw(this, FUNC(borisdpl_state::ram_r), FUNC(borisdpl_state::ram_w)); + map(0x05, 0x05).rw(this, FUNC(borisdpl_state::ram_addr_r), FUNC(borisdpl_state::ram_addr_w)); } static INPUT_PORTS_START( chesstrv ) @@ -211,21 +245,32 @@ static INPUT_PORTS_START( borisdpl ) INPUT_PORTS_END /* -TIMER_DEVICE_CALLBACK_MEMBER(chesstrv_state::borisdpl_timer_interrupt) +TIMER_DEVICE_CALLBACK_MEMBER(borisdpl_state::timer_interrupt) { m_maincpu->set_input_line_and_vector(F8_INPUT_LINE_INT_REQ, HOLD_LINE, 0x20); } */ -void chesstrv_state::machine_start() +void chesstrv_base_state::machine_start() { - m_digits.resolve(); 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_CONFIG_START(chesstrv_state::chesstrv) /* basic machine hardware */ MCFG_CPU_ADD( "maincpu", F8, 3000000 ) // Fairchild 3870 @@ -236,7 +281,7 @@ MACHINE_CONFIG_START(chesstrv_state::chesstrv) MCFG_DEFAULT_LAYOUT( layout_chesstrv ) MACHINE_CONFIG_END -MACHINE_CONFIG_START(chesstrv_state::borisdpl) +MACHINE_CONFIG_START(borisdpl_state::borisdpl) /* basic machine hardware */ MCFG_CPU_ADD( "maincpu", F8, 30000000 ) // Motorola SC80265P MCFG_CPU_PROGRAM_MAP( chesstrv_mem ) @@ -245,7 +290,7 @@ MACHINE_CONFIG_START(chesstrv_state::borisdpl) /* video hardware */ MCFG_DEFAULT_LAYOUT( layout_borisdpl ) - //MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_interrupt", chesstrv_state, borisdpl_timer_interrupt, attotime::from_hz(40)) + //MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_interrupt", borisdpl_state, timer_interrupt, attotime::from_hz(40)) MACHINE_CONFIG_END @@ -266,4 +311,4 @@ ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS CONS( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, 0, "Acetronic", "Chess Traveller", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) -CONS( 1979, borisdpl, 0, 0, borisdpl, borisdpl, chesstrv_state, 0, "Applied Concepts", "Boris Diplomat", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) +CONS( 1979, borisdpl, 0, 0, borisdpl, borisdpl, borisdpl_state, 0, "Applied Concepts", "Boris Diplomat", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3