diff options
Diffstat (limited to 'src/devices/bus/nes_ctrl/dorepiano.cpp')
-rw-r--r-- | src/devices/bus/nes_ctrl/dorepiano.cpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/devices/bus/nes_ctrl/dorepiano.cpp b/src/devices/bus/nes_ctrl/dorepiano.cpp new file mode 100644 index 00000000000..6fd4179d2f0 --- /dev/null +++ b/src/devices/bus/nes_ctrl/dorepiano.cpp @@ -0,0 +1,158 @@ +// license:BSD-3-Clause +// copyright-holders:kmg +/********************************************************************** + + Nintendo Family Computer Konami 'Doremikko' RJ250 Piano Keyboard + +**********************************************************************/ + +#include "emu.h" +#include "dorepiano.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(NES_DOREPIANO, nes_dorepiano_device, "nes_dorepiano", "Konami 'Doremikko' Piano Keyboard") + + +static INPUT_PORTS_START( nes_dorepiano ) + PORT_START("PIANO.0") + PORT_BIT( 0x3f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("PIANO.1") + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 F") PORT_CODE(KEYCODE_Z) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 F#") PORT_CODE(KEYCODE_S) + + PORT_START("PIANO.2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 G") PORT_CODE(KEYCODE_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 G#") PORT_CODE(KEYCODE_D) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 A") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 A#") PORT_CODE(KEYCODE_F) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 B") PORT_CODE(KEYCODE_V) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 C") PORT_CODE(KEYCODE_B) + + PORT_START("PIANO.3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 C#") PORT_CODE(KEYCODE_H) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 D") PORT_CODE(KEYCODE_N) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 D#") PORT_CODE(KEYCODE_J) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 0 E") PORT_CODE(KEYCODE_M) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 F") PORT_CODE(KEYCODE_COMMA) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 F#") PORT_CODE(KEYCODE_L) + + PORT_START("PIANO.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 G") PORT_CODE(KEYCODE_STOP) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 G#") PORT_CODE(KEYCODE_COLON) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 A") PORT_CODE(KEYCODE_SLASH) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 A#") PORT_CODE(KEYCODE_QUOTE) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 B") PORT_CODE(KEYCODE_Q) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 C") PORT_CODE(KEYCODE_W) + + PORT_START("PIANO.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 C#") PORT_CODE(KEYCODE_3) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 D") PORT_CODE(KEYCODE_E) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 D#") PORT_CODE(KEYCODE_4) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 1 E") PORT_CODE(KEYCODE_R) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 F") PORT_CODE(KEYCODE_T) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 F#") PORT_CODE(KEYCODE_6) + + PORT_START("PIANO.6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 G") PORT_CODE(KEYCODE_Y) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 G#") PORT_CODE(KEYCODE_7) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 A") PORT_CODE(KEYCODE_U) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 A#") PORT_CODE(KEYCODE_8) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 B") PORT_CODE(KEYCODE_I) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 C") PORT_CODE(KEYCODE_O) + + PORT_START("PIANO.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 C#") PORT_CODE(KEYCODE_0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 D") PORT_CODE(KEYCODE_OPENBRACE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 D#") PORT_CODE(KEYCODE_EQUALS) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Octave 2 E") PORT_CODE(KEYCODE_CLOSEBRACE) + PORT_BIT( 0x30, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor nes_dorepiano_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( nes_dorepiano ); +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// nes_dorepiano_device - constructor +//------------------------------------------------- + +nes_dorepiano_device::nes_dorepiano_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, NES_DOREPIANO, tag, owner, clock) + , device_nes_control_port_interface(mconfig, *this) + , m_port(*this, "PIANO.%u", 0) + , m_cur_port(0) + , m_latch(0) + , m_mask(0) +{ +} + + +//------------------------------------------------- +// device_start +//------------------------------------------------- + +void nes_dorepiano_device::device_start() +{ + save_item(NAME(m_cur_port)); + save_item(NAME(m_latch)); + save_item(NAME(m_mask)); + + m_mask = 0x0f; +} + + +//------------------------------------------------- +// read +//------------------------------------------------- + +u8 nes_dorepiano_device::read_exp(offs_t offset) +{ + u8 ret = 0; + + if (offset == 1) // $4017 + { + ret = m_port[m_cur_port]->read() & m_mask; + m_mask = ~m_mask; + ret >>= m_mask & 0x04; + ret <<= 1; + } + + return ret; +} + +//------------------------------------------------- +// write +//------------------------------------------------- + +void nes_dorepiano_device::write(u8 data) +{ + if (BIT(data, 1)) + { + m_cur_port = 0; + m_mask = 0x0f; + } + else if (BIT(data, 0) && !BIT(m_latch, 0)) + { + m_cur_port = (m_cur_port + 1) & 0x07; + m_mask = 0x0f; + } + + m_latch = data; +} |