diff options
Diffstat (limited to 'src/mame/drivers/sc2.cpp')
-rw-r--r-- | src/mame/drivers/sc2.cpp | 248 |
1 files changed, 116 insertions, 132 deletions
diff --git a/src/mame/drivers/sc2.cpp b/src/mame/drivers/sc2.cpp index 32c1131b695..4d265c0a336 100644 --- a/src/mame/drivers/sc2.cpp +++ b/src/mame/drivers/sc2.cpp @@ -2,124 +2,74 @@ // copyright-holders:Sandro Ronco /*************************************************************************** - Schachcomputer SC2 - - Note: - The HW is very similar to Fidelity Chess Challenger series - - 12/05/2009 Skeleton driver. + Schachcomputer SC 2 ****************************************************************************/ #include "emu.h" #include "cpu/z80/z80.h" -#include "sound/beep.h" #include "machine/z80pio.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" #include "speaker.h" #include "sc2.lh" + +namespace { + class sc2_state : public driver_device { public: - sc2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_beep(*this, "beeper"), + sc2_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_pio(*this, "z80pio"), + m_dac(*this, "dac"), + m_keypad(*this, "LINE%u", 1), m_digits(*this, "digit%u", 0U), m_leds(*this, "led%u", 0U) { } void sc2(machine_config &config); -private: - DECLARE_READ8_MEMBER(pio_port_a_r); - DECLARE_READ8_MEMBER(pio_port_b_r); - DECLARE_WRITE8_MEMBER(pio_port_a_w); - DECLARE_WRITE8_MEMBER(pio_port_b_w); - DECLARE_READ8_MEMBER(sc2_beep); - uint8_t m_kp_matrix; - uint8_t m_led_7seg_data[4]; - uint8_t m_led_selected; - uint8_t m_digit_data; - uint8_t m_beep_state; - void sc2_update_display(); +protected: virtual void machine_start() override; virtual void machine_reset() override; - void sc2_io(address_map &map); - void sc2_mem(address_map &map); - required_device<beep_device> m_beep; +private: required_device<cpu_device> m_maincpu; + required_device<z80pio_device> m_pio; + required_device<dac_bit_interface> m_dac; + required_ioport_array<4> m_keypad; + output_finder<4> m_digits; output_finder<2> m_leds; -}; - -READ8_MEMBER( sc2_state::sc2_beep ) -{ - //if (!machine().side_effects_disabled()) - { - m_beep_state = ~m_beep_state; - - m_beep->set_state(m_beep_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(0x3c00, 0x3c00).r(FUNC(sc2_state::sc2_beep)); -} - -void sc2_state::sc2_io(address_map &map) -{ - map.unmap_value_high(); - map.global_mask(0xff); - map(0x00, 0x03).mirror(0xfc).rw("z80pio", 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_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) - - PORT_START("LINE2") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) + void sc2_io(address_map &map); + void sc2_mem(address_map &map); - PORT_START("LINE3") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) + uint8_t m_kp_matrix; + uint8_t m_led_selected; + uint8_t m_digit_data; - 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_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_O) -INPUT_PORTS_END + void sc2_update_display(); + DECLARE_READ8_MEMBER(pio_port_a_r); + 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(); - save_item(NAME(m_led_7seg_data)); save_item(NAME(m_kp_matrix)); save_item(NAME(m_led_selected)); save_item(NAME(m_digit_data)); - save_item(NAME(m_beep_state)); } void sc2_state::machine_reset() @@ -127,40 +77,51 @@ void sc2_state::machine_reset() m_kp_matrix = 0; m_led_selected = 0; m_digit_data = 0; - m_beep_state = 0; - memset(m_led_7seg_data, 0, ARRAY_LENGTH(m_led_7seg_data)); } -void sc2_state::sc2_update_display() + +template<int State> +READ8_MEMBER( sc2_state::speaker_w ) { - uint8_t digit_data = bitswap<8>( m_digit_data,7,0,1,2,3,4,5,6 ) & 0x7f; + if (!machine().side_effects_disabled()) + m_dac->write(State); - if (!BIT(m_led_selected, 0)) - { - m_digits[0] = digit_data; - m_led_7seg_data[0] = digit_data; + return 0xff; +} - m_leds[0] = BIT(m_digit_data, 7); - } +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>)); +} - if (!BIT(m_led_selected, 1)) - { - m_digits[1] = digit_data; - m_led_7seg_data[1] = digit_data; +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)); +} - m_leds[1] = BIT(m_digit_data, 7); - } - if (!BIT(m_led_selected, 2)) - { - m_digits[2] = digit_data; - m_led_7seg_data[2] = digit_data; - } +void sc2_state::sc2_update_display() +{ + uint8_t digit_data = bitswap<8>(m_digit_data,7,0,1,2,3,4,5,6) & 0x7f; - if (!BIT(m_led_selected, 3)) + // latch display data + for (int i = 0; i < 4; i++) { - m_digits[3] = digit_data; - m_led_7seg_data[3] = digit_data; + if (!BIT(m_led_selected, i)) + { + m_digits[i] = digit_data; + + // schach/matt leds + if (i < 2) + m_leds[i] = BIT(m_digit_data, 7); + } } } @@ -173,25 +134,10 @@ READ8_MEMBER( sc2_state::pio_port_b_r ) { uint8_t data = m_led_selected & 0x0f; - if (BIT(m_kp_matrix, 0)) - { - data |= ioport("LINE1")->read(); - } - - if (BIT(m_kp_matrix, 1)) - { - data |= ioport("LINE2")->read(); - } - - if (BIT(m_kp_matrix, 2)) - { - data |= ioport("LINE3")->read(); - } - - if (BIT(m_kp_matrix, 3)) - { - data |= ioport("LINE4")->read(); - } + // read keypad matrix + for (int i = 0; i < 4; i++) + if (BIT(m_kp_matrix, i)) + data |= m_keypad[i]->read(); return data; } @@ -212,6 +158,38 @@ WRITE8_MEMBER( sc2_state::pio_port_b_w ) m_kp_matrix = data; } + +/* 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_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_O) +INPUT_PORTS_END + + +/* Machine config */ + void sc2_state::sc2(machine_config &config) { /* basic machine hardware */ @@ -223,18 +201,21 @@ void sc2_state::sc2(machine_config &config) config.set_default_layout(layout_sc2); /* devices */ - z80pio_device& pio(Z80PIO(config, "z80pio", 9.8304_MHz_XTAL/4)); - pio.in_pa_callback().set(FUNC(sc2_state::pio_port_a_r)); - pio.out_pa_callback().set(FUNC(sc2_state::pio_port_a_w)); - pio.in_pb_callback().set(FUNC(sc2_state::pio_port_b_r)); - pio.out_pb_callback().set(FUNC(sc2_state::pio_port_b_w)); + Z80PIO(config, m_pio, 9.8304_MHz_XTAL/4); + m_pio->in_pa_callback().set(FUNC(sc2_state::pio_port_a_r)); + 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)); /* sound hardware */ - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 0.50); + 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); } + /* ROM definition */ + ROM_START( sc2 ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) ROM_LOAD( "bm008.bin", 0x0000, 0x0400, CRC(3023ea82) SHA1(07020d153d802c672c39e1af3c716dbe35e23f08)) @@ -248,7 +229,10 @@ ROM_START( sc2 ) ROM_LOAD( "bm016.bin", 0x3000, 0x0400, CRC(4fe0853a) SHA1(c2253e320778b0ea468fb54f26ae83d07f9700e6)) ROM_END +} // anonymous namespace + + /* Driver */ -// 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 SC2", MACHINE_SUPPORTS_SAVE ) +// 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", MACHINE_SUPPORTS_SAVE ) |