summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit1269b4d1255e9e84f14de7a022af64fec56c825c (patch)
treee8ef854e82e3cff10ed716e7ac410c9ffbbb98d5
parent181ee183c99b4f2ff643dcd5bc198476eef2fc5e (diff)
sc2: use pwm_display_device (nw)
-rw-r--r--src/mame/drivers/sc2.cpp209
-rw-r--r--src/mame/layout/sc2.lay34
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>