diff options
Diffstat (limited to 'src/devices/bus/amiga/keyboard/a1200.cpp')
-rw-r--r-- | src/devices/bus/amiga/keyboard/a1200.cpp | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/src/devices/bus/amiga/keyboard/a1200.cpp b/src/devices/bus/amiga/keyboard/a1200.cpp index 5534e07c15d..70222635578 100644 --- a/src/devices/bus/amiga/keyboard/a1200.cpp +++ b/src/devices/bus/amiga/keyboard/a1200.cpp @@ -47,6 +47,8 @@ #include "a1200.h" #include "matrix.h" +#include "cpu/m6805/m68hc05.h" + //#define VERBOSE 1 #include "logmacro.h" @@ -55,11 +57,11 @@ // GLOBAL VARIABLES //************************************************************************** -DEFINE_DEVICE_TYPE_NS(A1200_KBD, bus::amiga::keyboard, a1200_kbd_device, "a1200kbd_rb", "Amiga 1200 Keyboard Rev B") +DEFINE_DEVICE_TYPE(A1200_KBD, bus::amiga::keyboard::a1200_kbd_device, "a1200kbd_rb", "Amiga 1200 Keyboard Rev B") -namespace bus { namespace amiga { namespace keyboard { +namespace bus::amiga::keyboard { namespace { @@ -81,7 +83,7 @@ INPUT_PORTS_START(a1200_us_keyboard) // FIXME: split compact mode into a separate device without the numeric keypad PORT_START("IRQ") - PORT_CONFNAME(0x01, 0x01, "Layout") PORT_CHANGED_MEMBER(DEVICE_SELF, a1200_kbd_device, layout_changed, 0) + PORT_CONFNAME(0x01, 0x01, "Layout") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(a1200_kbd_device::layout_changed), 0) PORT_CONFSETTING(0x01, "Full Size") PORT_CONFSETTING(0x00, "Compact") INPUT_PORTS_END @@ -105,13 +107,14 @@ a1200_kbd_device::a1200_kbd_device(machine_config const &mconfig, char const *ta , device_amiga_keyboard_interface(mconfig, *this) , m_rows(*this, "ROW%u", 0) , m_mpu(*this, "mpu") + , m_led_kbd_caps(*this, "led_kbd_caps") , m_row_drive(0xffff) , m_host_kdat(true) , m_mpu_kdat(true) { } -WRITE_LINE_MEMBER(a1200_kbd_device::kdat_w) +void a1200_kbd_device::kdat_w(int state) { if (bool(state) != m_host_kdat) { @@ -127,7 +130,7 @@ INPUT_CHANGED_MEMBER(a1200_kbd_device::layout_changed) m_mpu->set_input_line(M68HC05_IRQ_LINE, newval ? CLEAR_LINE : ASSERT_LINE); } -READ8_MEMBER(a1200_kbd_device::mpu_portb_r) +u8 a1200_kbd_device::mpu_portb_r() { u8 result(m_host_kdat ? 0xff : 0xfe); for (unsigned row = 0; m_rows.size() > row; ++row) @@ -138,12 +141,12 @@ READ8_MEMBER(a1200_kbd_device::mpu_portb_r) return result; } -WRITE8_MEMBER(a1200_kbd_device::mpu_porta_w) +void a1200_kbd_device::mpu_porta_w(offs_t offset, u8 data, u8 mem_mask) { m_row_drive = (m_row_drive & 0xff00) | u16(u8(data | ~mem_mask)); } -WRITE8_MEMBER(a1200_kbd_device::mpu_portb_w) +void a1200_kbd_device::mpu_portb_w(offs_t offset, u8 data, u8 mem_mask) { u8 const kdat(BIT(data, 0) | BIT(~mem_mask, 0)); m_host->kdat_w(kdat ? 1 : 0); @@ -158,26 +161,26 @@ WRITE8_MEMBER(a1200_kbd_device::mpu_portb_w) } } -WRITE8_MEMBER(a1200_kbd_device::mpu_portc_w) +void a1200_kbd_device::mpu_portc_w(offs_t offset, u8 data, u8 mem_mask) { m_row_drive = (m_row_drive & 0x80ff) | (u16(u8(data | ~mem_mask) & 0x7f) << 8); - machine().output().set_value("led_kbd_caps", BIT(~data, 7)); + m_led_kbd_caps = BIT(~data, 7); } -WRITE_LINE_MEMBER(a1200_kbd_device::mpu_tcmp) +void a1200_kbd_device::mpu_tcmp(int state) { m_host->krst_w(state); } void a1200_kbd_device::device_add_mconfig(machine_config &config) { - M68HC705C8A(config, m_mpu, XTAL(3'000'000)); - m_mpu->port_r<1>().set(FUNC(a1200_kbd_device::mpu_portb_r)); - m_mpu->port_r<3>().set_ioport("MOD"); - m_mpu->port_w<0>().set(FUNC(a1200_kbd_device::mpu_porta_w)); - m_mpu->port_w<1>().set(FUNC(a1200_kbd_device::mpu_portb_w)); - m_mpu->port_w<2>().set(FUNC(a1200_kbd_device::mpu_portc_w)); - m_mpu->tcmp().set(FUNC(a1200_kbd_device::mpu_tcmp)); + m68hc705c8a_device &mpu(M68HC705C8A(config, m_mpu, XTAL(3'000'000))); + mpu.portb_r().set(FUNC(a1200_kbd_device::mpu_portb_r)); + mpu.portd_r().set_ioport("MOD"); + mpu.porta_w().set(FUNC(a1200_kbd_device::mpu_porta_w)); + mpu.portb_w().set(FUNC(a1200_kbd_device::mpu_portb_w)); + mpu.portc_w().set(FUNC(a1200_kbd_device::mpu_portc_w)); + mpu.tcmp().set(FUNC(a1200_kbd_device::mpu_tcmp)); } tiny_rom_entry const *a1200_kbd_device::device_rom_region() const @@ -192,6 +195,8 @@ ioport_constructor a1200_kbd_device::device_input_ports() const void a1200_kbd_device::device_start() { + m_led_kbd_caps.resolve(); + save_item(NAME(m_row_drive)); save_item(NAME(m_host_kdat)); save_item(NAME(m_mpu_kdat)); @@ -206,4 +211,4 @@ void a1200_kbd_device::device_reset_after_children() m_mpu->set_input_line(M68HC05_IRQ_LINE, BIT(ioport("IRQ")->read(), 0) ? CLEAR_LINE : ASSERT_LINE); } -} } } // namespace bus::amiga::keyboard +} // namespace bus::amiga::keyboard |