diff options
author | hap <happppp@users.noreply.github.com> | 2019-06-27 16:32:48 +0200 |
---|---|---|
committer | hap <happppp@users.noreply.github.com> | 2019-06-27 16:33:16 +0200 |
commit | 1269b4d1255e9e84f14de7a022af64fec56c825c (patch) | |
tree | e8ef854e82e3cff10ed716e7ac410c9ffbbb98d5 | |
parent | 181ee183c99b4f2ff643dcd5bc198476eef2fc5e (diff) |
sc2: use pwm_display_device (nw)
-rw-r--r-- | src/mame/drivers/sc2.cpp | 209 | ||||
-rw-r--r-- | src/mame/layout/sc2.lay | 34 |
2 files changed, 121 insertions, 122 deletions
diff --git a/src/mame/drivers/sc2.cpp b/src/mame/drivers/sc2.cpp index a6bacd50ea2..da729bb7dbb 100644 --- a/src/mame/drivers/sc2.cpp +++ b/src/mame/drivers/sc2.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Sandro Ronco +// copyright-holders:Sandro Ronco, hap /*************************************************************************** Schachcomputer SC 2 driver @@ -29,6 +29,7 @@ Fidelity CC10 synonyms: RE, LV, RV, PB, ♪, CL, EN #include "emu.h" #include "cpu/z80/z80.h" #include "machine/z80pio.h" +#include "video/pwm.h" #include "sound/dac.h" #include "sound/volt_reg.h" #include "speaker.h" @@ -45,10 +46,9 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_pio(*this, "z80pio"), + m_display(*this, "display"), m_dac(*this, "dac"), - m_keypad(*this, "LINE%u", 1), - m_digits(*this, "digit%u", 0U), - m_leds(*this, "led%u", 0U) + m_inputs(*this, "IN.%u", 0) { } void sc2(machine_config &config); @@ -62,163 +62,156 @@ protected: private: required_device<cpu_device> m_maincpu; required_device<z80pio_device> m_pio; + required_device<pwm_display_device> m_display; required_device<dac_bit_interface> m_dac; - required_ioport_array<4> m_keypad; + required_ioport_array<4> m_inputs; - output_finder<4> m_digits; - output_finder<2> m_leds; + void main_io(address_map &map); + void main_map(address_map &map); - void sc2_io(address_map &map); - void sc2_mem(address_map &map); + u8 m_inp_mux; + u8 m_digit_data; - uint8_t m_kp_matrix; - uint8_t m_led_selected; - uint8_t m_digit_data; - - void sc2_update_display(); + void update_display(); DECLARE_READ8_MEMBER(pio_port_b_r); DECLARE_WRITE8_MEMBER(pio_port_a_w); DECLARE_WRITE8_MEMBER(pio_port_b_w); - DECLARE_READ8_MEMBER(speaker_w); template<int State> DECLARE_READ8_MEMBER(speaker_w); }; void sc2_state::machine_start() { - m_digits.resolve(); - m_leds.resolve(); - - m_kp_matrix = 0; - m_led_selected = 0; + // zerofill + m_inp_mux = 0; m_digit_data = 0; - save_item(NAME(m_kp_matrix)); - save_item(NAME(m_led_selected)); + // register for savestates + save_item(NAME(m_inp_mux)); save_item(NAME(m_digit_data)); } -template<int State> -READ8_MEMBER(sc2_state::speaker_w) -{ - if (!machine().side_effects_disabled()) - m_dac->write(State); - - return 0xff; -} - -void sc2_state::sc2_mem(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x0fff).rom(); - map(0x1000, 0x13ff).ram(); - map(0x2000, 0x33ff).rom(); - map(0x3400, 0x3400).r(FUNC(sc2_state::speaker_w<1>)); - map(0x3c00, 0x3c00).r(FUNC(sc2_state::speaker_w<0>)); -} - -void sc2_state::sc2_io(address_map &map) -{ - map.unmap_value_high(); - map.global_mask(0xff); - map(0x00, 0x03).mirror(0xfc).rw(m_pio, FUNC(z80pio_device::read), FUNC(z80pio_device::write)); -} +/****************************************************************************** + Devices, I/O +******************************************************************************/ -void sc2_state::sc2_update_display() +void sc2_state::update_display() { - // latch display data - for (int i = 0; i < 4; i++) - { - if (!BIT(m_led_selected, i)) - { - m_digits[i] = m_digit_data & 0x7f; - - // schach/matt leds - if (i < 2) - m_leds[i] = BIT(m_digit_data, 7); - } - } + m_display->matrix(~m_inp_mux, m_digit_data); } READ8_MEMBER(sc2_state::pio_port_b_r) { - uint8_t data = 0x0f; + u8 data = 0; - // read keypad matrix + // read keypad for (int i = 0; i < 4; i++) - if (BIT(m_kp_matrix, i)) - data |= m_keypad[i]->read(); + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); - return data; + return data << 4 | 0xf; } WRITE8_MEMBER(sc2_state::pio_port_a_w) { // digit segment data m_digit_data = bitswap<8>(data,7,0,1,2,3,4,5,6); + update_display(); } WRITE8_MEMBER(sc2_state::pio_port_b_w) { // d0-d3: keypad mux(active high), led mux(active low) - if (data != 0xf1 && data != 0xf2 && data != 0xf4 && data != 0xf8) - { - m_led_selected = data; - sc2_update_display(); - } - else - m_kp_matrix = data; + m_inp_mux = data; + update_display(); } +template<int State> +READ8_MEMBER(sc2_state::speaker_w) +{ + if (!machine().side_effects_disabled()) + m_dac->write(State); -/* Input ports */ + return 0xff; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void sc2_state::main_map(address_map &map) +{ + map(0x0000, 0x0fff).rom(); + map(0x1000, 0x13ff).ram(); + map(0x2000, 0x33ff).rom(); + map(0x3400, 0x3400).r(FUNC(sc2_state::speaker_w<1>)); + map(0x3c00, 0x3c00).r(FUNC(sc2_state::speaker_w<0>)); +} + +void sc2_state::main_io(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0x03).mirror(0xfc).rw(m_pio, FUNC(z80pio_device::read), FUNC(z80pio_device::write)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ static INPUT_PORTS_START( sc2 ) - PORT_START("LINE1") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("T") PORT_CODE(KEYCODE_T) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) - - PORT_START("LINE2") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) - - PORT_START("LINE3") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) - - PORT_START("LINE4") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("K") PORT_CODE(KEYCODE_K) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("W") PORT_CODE(KEYCODE_W) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, sc2_state, reset_button, nullptr) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_O) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("T") PORT_CODE(KEYCODE_T) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("K") PORT_CODE(KEYCODE_K) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("W") PORT_CODE(KEYCODE_W) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, sc2_state, reset_button, nullptr) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_O) INPUT_PORTS_END -/* Machine config */ + +/****************************************************************************** + Machine Drivers +******************************************************************************/ void sc2_state::sc2(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 9.8304_MHz_XTAL/4); // U880 Z80 clone - m_maincpu->set_addrmap(AS_PROGRAM, &sc2_state::sc2_mem); - m_maincpu->set_addrmap(AS_IO, &sc2_state::sc2_io); - - /* video hardware */ - config.set_default_layout(layout_sc2); + m_maincpu->set_addrmap(AS_PROGRAM, &sc2_state::main_map); + m_maincpu->set_addrmap(AS_IO, &sc2_state::main_io); - /* devices */ Z80PIO(config, m_pio, 9.8304_MHz_XTAL/4); m_pio->out_pa_callback().set(FUNC(sc2_state::pio_port_a_w)); m_pio->in_pb_callback().set(FUNC(sc2_state::pio_port_b_r)); m_pio->out_pb_callback().set(FUNC(sc2_state::pio_port_b_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 8); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_sc2); + /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); @@ -226,7 +219,10 @@ void sc2_state::sc2(machine_config &config) } -/* ROM definition */ + +/****************************************************************************** + ROM Definitions +******************************************************************************/ ROM_START( sc2 ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) @@ -257,7 +253,10 @@ ROM_END } // anonymous namespace -/* Driver */ + +/****************************************************************************** + Drivers +******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS COMP( 1981, sc2, 0, 0, sc2, sc2, sc2_state, empty_init, "VEB Mikroelektronik Erfurt", "Schachcomputer SC 2 (rev. E)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/layout/sc2.lay b/src/mame/layout/sc2.lay index 8ca6bdcf911..e2fab6f2bea 100644 --- a/src/mame/layout/sc2.lay +++ b/src/mame/layout/sc2.lay @@ -134,8 +134,8 @@ <bezel name="digit2" element="digit"><bounds x="150" y="10" width="50" height="80" /></bezel> <bezel name="digit3" element="digit"><bounds x="210" y="10" width="50" height="80" /></bezel> - <bezel name="led0" element="led"><bounds x="12.5" y="152.5" width="20" height="20" /></bezel> - <bezel name="led1" element="led"><bounds x="237.5" y="152.5" width="20" height="20" /></bezel> + <bezel name="0.7" element="led"><bounds x="12.5" y="152.5" width="20" height="20" /></bezel> + <bezel name="1.7" element="led"><bounds x="237.5" y="152.5" width="20" height="20" /></bezel> <bezel element="text_schach"><bounds x="5" y="110" width="100" height="20" /></bezel> <bezel element="text_matt"><bounds x="165" y="110" width="100" height="20" /></bezel> @@ -183,21 +183,21 @@ <bezel element="text_b15a"><bounds x="207.5" y="332.5" width="50" height="25" /></bezel> <bezel element="text_b15b"><bounds x="207.5" y="357.5" width="50" height="25" /></bezel> - <bezel element="hl" inputtag="LINE4" inputmask="0x40"><bounds x="42.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel> - <bezel element="hl" inputtag="LINE4" inputmask="0x10"><bounds x="107.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel> - <bezel element="hl" inputtag="LINE4" inputmask="0x20"><bounds x="172.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel> - <bezel element="hl" inputtag="LINE4" inputmask="0x80"><bounds x="10" y="200" width="55" height="55" /><color alpha="0.22" /></bezel> - <bezel element="hl" inputtag="LINE1" inputmask="0x20"><bounds x="75" y="200" width="55" height="55" /><color alpha="0.22" /></bezel> - <bezel element="hl" inputtag="LINE1" inputmask="0x40"><bounds x="140" y="200" width="55" height="55" /><color alpha="0.22" /></bezel> - <bezel element="hl" inputtag="LINE1" inputmask="0x80"><bounds x="205" y="200" width="55" height="55" /><color alpha="0.22" /></bezel> - <bezel element="hl" inputtag="LINE2" inputmask="0x10"><bounds x="10" y="265" width="55" height="55" /><color alpha="0.25" /></bezel> - <bezel element="hl" inputtag="LINE2" inputmask="0x20"><bounds x="75" y="265" width="55" height="55" /><color alpha="0.25" /></bezel> - <bezel element="hl" inputtag="LINE2" inputmask="0x40"><bounds x="140" y="265" width="55" height="55" /><color alpha="0.25" /></bezel> - <bezel element="hl" inputtag="LINE2" inputmask="0x80"><bounds x="205" y="265" width="55" height="55" /><color alpha="0.25" /></bezel> - <bezel element="hl" inputtag="LINE3" inputmask="0x10"><bounds x="10" y="330" width="55" height="55" /><color alpha="0.25" /></bezel> - <bezel element="hl" inputtag="LINE3" inputmask="0x20"><bounds x="75" y="330" width="55" height="55" /><color alpha="0.25" /></bezel> - <bezel element="hl" inputtag="LINE3" inputmask="0x40"><bounds x="140" y="330" width="55" height="55" /><color alpha="0.25" /></bezel> - <bezel element="hl" inputtag="LINE3" inputmask="0x80"><bounds x="205" y="330" width="55" height="55" /><color alpha="0.25" /></bezel> + <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="42.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel> + <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="107.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel> + <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="172.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel> + <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="10" y="200" width="55" height="55" /><color alpha="0.22" /></bezel> + <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="75" y="200" width="55" height="55" /><color alpha="0.22" /></bezel> + <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="140" y="200" width="55" height="55" /><color alpha="0.22" /></bezel> + <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="205" y="200" width="55" height="55" /><color alpha="0.22" /></bezel> + <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="10" y="265" width="55" height="55" /><color alpha="0.25" /></bezel> + <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="75" y="265" width="55" height="55" /><color alpha="0.25" /></bezel> + <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="140" y="265" width="55" height="55" /><color alpha="0.25" /></bezel> + <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="205" y="265" width="55" height="55" /><color alpha="0.25" /></bezel> + <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="10" y="330" width="55" height="55" /><color alpha="0.25" /></bezel> + <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="75" y="330" width="55" height="55" /><color alpha="0.25" /></bezel> + <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="140" y="330" width="55" height="55" /><color alpha="0.25" /></bezel> + <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="205" y="330" width="55" height="55" /><color alpha="0.25" /></bezel> </view> </mamelayout> |