summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/amigakbd.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/amigakbd.h')
-rw-r--r--src/mame/machine/amigakbd.h144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/mame/machine/amigakbd.h b/src/mame/machine/amigakbd.h
new file mode 100644
index 00000000000..68ffdb42200
--- /dev/null
+++ b/src/mame/machine/amigakbd.h
@@ -0,0 +1,144 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ Amiga Keyboard
+
+ We currently emulate the Amiga 500 keyboard controller, which was
+ also used in later Amiga 2000 keyboards.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __AMIGAKBD_H__
+#define __AMIGAKBD_H__
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(_write) \
+ devcb = &amigakbd_device::set_kclk_wr_callback(*device, DEVCB_##_write);
+
+#define MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(_write) \
+ devcb = &amigakbd_device::set_kdat_wr_callback(*device, DEVCB_##_write);
+
+#define MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(_write) \
+ devcb = &amigakbd_device::set_krst_wr_callback(*device, DEVCB_##_write);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> amigakbd_device
+
+class amigakbd_device : public device_t
+{
+public:
+ // construction/destruction
+ amigakbd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ template<class _Object> static devcb_base &set_kclk_wr_callback(device_t &device, _Object object)
+ { return downcast<amigakbd_device &>(device).m_write_kclk.set_callback(object); }
+ template<class _Object> static devcb_base &set_kdat_wr_callback(device_t &device, _Object object)
+ { return downcast<amigakbd_device &>(device).m_write_kdat.set_callback(object); }
+ template<class _Object> static devcb_base &set_krst_wr_callback(device_t &device, _Object object)
+ { return downcast<amigakbd_device &>(device).m_write_krst.set_callback(object); }
+
+ DECLARE_WRITE_LINE_MEMBER( kdat_w );
+
+ // 6500/1 internal
+ DECLARE_READ8_MEMBER( port_a_r );
+ DECLARE_WRITE8_MEMBER( port_a_w );
+ DECLARE_READ8_MEMBER( port_b_r );
+ DECLARE_WRITE8_MEMBER( port_b_w );
+ DECLARE_WRITE8_MEMBER( port_c_w );
+ DECLARE_WRITE8_MEMBER( port_d_w );
+ DECLARE_WRITE8_MEMBER( latch_w );
+ DECLARE_READ8_MEMBER( counter_r );
+ DECLARE_WRITE8_MEMBER( transfer_latch_w );
+ DECLARE_WRITE8_MEMBER( clear_pa0_detect );
+ DECLARE_WRITE8_MEMBER( clear_pa1_detect );
+ DECLARE_READ8_MEMBER( control_r );
+ DECLARE_WRITE8_MEMBER( control_w );
+
+ DECLARE_INPUT_CHANGED_MEMBER( check_reset );
+
+protected:
+ // device-level overrides
+ virtual const rom_entry *device_rom_region() const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual ioport_constructor device_input_ports() const;
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+private:
+ enum
+ {
+ // counter modes
+ COUNTER_INTERVAL = 0x00,
+ COUNTER_PULSE = 0x01,
+ COUNTER_EVENT = 0x02,
+ COUNTER_PWM = 0x03,
+
+ // interrupt enables
+ PA1_INT_ENABLED = 0x04,
+ PA0_INT_ENABLED = 0x08,
+ COUNTER_INT_ENABLED = 0x10,
+
+ // status
+ PA1_NEGATIVE_EDGE = 0x20,
+ PA0_POSITIVE_EDGE = 0x40,
+ COUNTER_OVERFLOW = 0x80
+ };
+
+ void update_irqs();
+
+ devcb_write_line m_write_kclk;
+ devcb_write_line m_write_kdat;
+ devcb_write_line m_write_krst;
+
+ required_device<m6502_device> m_mpu;
+
+ required_ioport m_special;
+ required_ioport m_row_d6;
+ required_ioport m_row_d5;
+ required_ioport m_row_d4;
+ required_ioport m_row_d3;
+ required_ioport m_row_d2;
+ required_ioport m_row_d1;
+ required_ioport m_row_d0;
+ required_ioport m_row_c7;
+ required_ioport m_row_c6;
+ required_ioport m_row_c5;
+ required_ioport m_row_c4;
+ required_ioport m_row_c3;
+ required_ioport m_row_c2;
+ required_ioport m_row_c1;
+ required_ioport m_row_c0;
+
+ emu_timer *m_timer;
+ emu_timer *m_watchdog;
+ emu_timer *m_reset;
+
+ int m_kdat;
+ int m_kclk;
+
+ UINT8 m_port_c;
+ UINT8 m_port_d;
+ UINT16 m_latch;
+ UINT16 m_counter;
+ UINT8 m_control;
+};
+
+// device type definition
+extern const device_type AMIGAKBD;
+
+#endif // __AMIGAKBD_H__