diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index e51d2af6641..e914629150a 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -829,6 +829,8 @@ if (BUSES["BBC_USERPORT"]~=null) then MAME_DIR .. "src/devices/bus/bbc/userport/beebspch.h", MAME_DIR .. "src/devices/bus/bbc/userport/lcd.cpp", MAME_DIR .. "src/devices/bus/bbc/userport/lcd.h", + MAME_DIR .. "src/devices/bus/bbc/userport/lvlecho.cpp", + MAME_DIR .. "src/devices/bus/bbc/userport/lvlecho.h", MAME_DIR .. "src/devices/bus/bbc/userport/m4000.cpp", MAME_DIR .. "src/devices/bus/bbc/userport/m4000.h", MAME_DIR .. "src/devices/bus/bbc/userport/palext.cpp", diff --git a/src/devices/bus/bbc/userport/lvlecho.cpp b/src/devices/bus/bbc/userport/lvlecho.cpp new file mode 100644 index 00000000000..04f6ed2db71 --- /dev/null +++ b/src/devices/bus/bbc/userport/lvlecho.cpp @@ -0,0 +1,278 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + LVL Echo Keyboard + + Notes: + - the Echo is a 3 octave keyboard with 37 keys, but the software seems to + support a 5 octave keyboard. + - keys 33, 34, 35 are polled additionally for an unknown reason, maybe an + octave offset switch? + +**********************************************************************/ + + +#include "emu.h" +#include "lvlecho.h" + + +namespace { + +class bbc_lvlecho_device : public device_t, public device_bbc_userport_interface +{ +public: + bbc_lvlecho_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BBC_LVLECHO, tag, owner, clock) + , device_bbc_userport_interface(mconfig, *this) + , m_kbd(*this, "KEY_%u", 0) + , m_key(0) + { + } + +protected: + // device_t overrides + virtual void device_start() override; + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + + virtual uint8_t pb_r() override + { + return m_kbd[m_key]->read(); + } + + virtual void pb_w(uint8_t data) override + { + m_key = data & 0x3f; + } + +private: + required_ioport_array<64> m_kbd; + + uint8_t m_key; +}; + + +//------------------------------------------------- +// INPUT_PORTS( lvlecho ) +//------------------------------------------------- + +static INPUT_PORTS_START( lvlecho ) + PORT_START("KEY_0") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C2") + + PORT_START("KEY_1") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C2#") + + PORT_START("KEY_2") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D2") + + PORT_START("KEY_3") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D2#") + + PORT_START("KEY_4") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E2") + + PORT_START("KEY_5") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") + + PORT_START("KEY_6") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2#") + + PORT_START("KEY_7") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G2") + + PORT_START("KEY_8") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G2#") + + PORT_START("KEY_9") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A2") + + PORT_START("KEY_10") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A2#") + + PORT_START("KEY_11") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B2") + + PORT_START("KEY_12") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C3") PORT_CODE(KEYCODE_TAB) + + PORT_START("KEY_13") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C3#") PORT_CODE(KEYCODE_1) + + PORT_START("KEY_14") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D3") PORT_CODE(KEYCODE_Q) + + PORT_START("KEY_15") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D3#") PORT_CODE(KEYCODE_2) + + PORT_START("KEY_16") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E3") PORT_CODE(KEYCODE_W) + + PORT_START("KEY_17") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_E) + + PORT_START("KEY_18") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3#") PORT_CODE(KEYCODE_4) + + PORT_START("KEY_19") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G3") PORT_CODE(KEYCODE_R) + + PORT_START("KEY_20") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G3#") PORT_CODE(KEYCODE_5) + + PORT_START("KEY_21") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A3") PORT_CODE(KEYCODE_T) + + PORT_START("KEY_22") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A3#") PORT_CODE(KEYCODE_6) + + PORT_START("KEY_23") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B3") PORT_CODE(KEYCODE_Y) + + PORT_START("KEY_24") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C4") PORT_CODE(KEYCODE_U) + + PORT_START("KEY_25") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C4#") PORT_CODE(KEYCODE_8) + + PORT_START("KEY_26") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D4") PORT_CODE(KEYCODE_I) + + PORT_START("KEY_27") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D4#") PORT_CODE(KEYCODE_9) + + PORT_START("KEY_28") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E4") PORT_CODE(KEYCODE_O) + + PORT_START("KEY_29") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_P) + + PORT_START("KEY_30") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4#") PORT_CODE(KEYCODE_A) + + PORT_START("KEY_31") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G4") PORT_CODE(KEYCODE_Z) + + PORT_START("KEY_32") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G4#") PORT_CODE(KEYCODE_S) + + PORT_START("KEY_33") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A4") PORT_CODE(KEYCODE_X) + + PORT_START("KEY_34") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A4#") PORT_CODE(KEYCODE_D) + + PORT_START("KEY_35") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B4") PORT_CODE(KEYCODE_C) + + PORT_START("KEY_36") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C5") PORT_CODE(KEYCODE_V) + + PORT_START("KEY_37") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C5#") PORT_CODE(KEYCODE_G) + + PORT_START("KEY_38") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D5") PORT_CODE(KEYCODE_B) + + PORT_START("KEY_39") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D5#") PORT_CODE(KEYCODE_H) + + PORT_START("KEY_40") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E5") PORT_CODE(KEYCODE_N) + + PORT_START("KEY_41") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_M) + + PORT_START("KEY_42") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5#") PORT_CODE(KEYCODE_K) + + PORT_START("KEY_43") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G5") PORT_CODE(KEYCODE_COMMA) + + PORT_START("KEY_44") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G5#") PORT_CODE(KEYCODE_L) + + PORT_START("KEY_45") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A5") PORT_CODE(KEYCODE_STOP) + + PORT_START("KEY_46") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A5#") PORT_CODE(KEYCODE_COLON) + + PORT_START("KEY_47") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B5") PORT_CODE(KEYCODE_SLASH) + + PORT_START("KEY_48") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C6") PORT_CODE(KEYCODE_RSHIFT) + + PORT_START("KEY_49") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C6#") + + PORT_START("KEY_50") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D6") + + PORT_START("KEY_51") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D6#") + + PORT_START("KEY_52") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E6") + + PORT_START("KEY_53") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6") + + PORT_START("KEY_54") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6#") + + PORT_START("KEY_55") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G6") + + PORT_START("KEY_56") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G6#") + + PORT_START("KEY_57") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A6") + + PORT_START("KEY_58") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A6#") + + PORT_START("KEY_59") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B6") + + PORT_START("KEY_60") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C7") + + PORT_START("KEY_61") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("KEY_62") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("KEY_63") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor bbc_lvlecho_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( lvlecho ); +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bbc_lvlecho_device::device_start() +{ + save_item(NAME(m_key)); +} + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(BBC_LVLECHO, device_bbc_userport_interface, bbc_lvlecho_device, "bbc_lvlecho", "LVL Echo Keyboard") diff --git a/src/devices/bus/bbc/userport/lvlecho.h b/src/devices/bus/bbc/userport/lvlecho.h new file mode 100644 index 00000000000..f089459eec8 --- /dev/null +++ b/src/devices/bus/bbc/userport/lvlecho.h @@ -0,0 +1,13 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +#ifndef MAME_BUS_BBC_USERPORT_LVLECHO_H +#define MAME_BUS_BBC_USERPORT_LVLECHO_H + +#pragma once + +#include "userport.h" + + +DECLARE_DEVICE_TYPE(BBC_LVLECHO, device_bbc_userport_interface) + +#endif // MAME_BUS_BBC_USERPORT_LVLECHO_H diff --git a/src/devices/bus/bbc/userport/userport.cpp b/src/devices/bus/bbc/userport/userport.cpp index 0c189608699..d3b6467dd21 100644 --- a/src/devices/bus/bbc/userport/userport.cpp +++ b/src/devices/bus/bbc/userport/userport.cpp @@ -26,10 +26,10 @@ DEFINE_DEVICE_TYPE(BBC_USERPORT_SLOT, bbc_userport_slot_device, "bbc_userport_sl // device_bbc_userport_interface - constructor //------------------------------------------------- -device_bbc_userport_interface::device_bbc_userport_interface(const machine_config &mconfig, device_t &device) : - device_interface(device, "bbcuserport") +device_bbc_userport_interface::device_bbc_userport_interface(const machine_config &mconfig, device_t &device) + : device_interface(device, "bbcuserport") + , m_slot(dynamic_cast(device.owner())) { - m_slot = dynamic_cast(device.owner()); } @@ -128,6 +128,7 @@ void bbc_userport_slot_device::write_cb2(int state) //#include "digitiser.h" //#include "ev1.h" #include "lcd.h" +#include "lvlecho.h" #include "m4000.h" #include "palext.h" #include "pointer.h" @@ -149,6 +150,7 @@ void bbc_userport_devices(device_slot_interface &device) //device.option_add("ev1", BBC_EV1); /* Micro-Robotics EV1 */ //device.option_add("hobbit", BBC_HOBBIT); /* Hobbit Floppy Tape System (Ikon) */ device.option_add("lcd", BBC_LCD); /* Sprow LCD Display */ + device.option_add("lvlecho", BBC_LVLECHO); /* LVL Echo Keyboard */ device.option_add("m4000", BBC_M4000); /* Hybrid Music 4000 Keyboard */ device.option_add("m512mouse", BBC_M512MOUSE); /* Acorn Mouse (provided with Master 512) */ device.option_add("sdcard", BBC_SDCARD); /* SD Card */ diff --git a/src/devices/bus/bbc/userport/userport.h b/src/devices/bus/bbc/userport/userport.h index dba6c7b6e98..222e05efd24 100644 --- a/src/devices/bus/bbc/userport/userport.h +++ b/src/devices/bus/bbc/userport/userport.h @@ -99,7 +99,7 @@ public: protected: device_bbc_userport_interface(const machine_config &mconfig, device_t &device); - bbc_userport_slot_device *m_slot; + bbc_userport_slot_device *const m_slot; };