trunk/src/mess/machine/amigakbd.c
| r32278 | r32279 | |
| 18 | 18 | ***************************************************************************/ |
| 19 | 19 | |
| 20 | 20 | #include "amigakbd.h" |
| 21 | #include "machine/rescap.h" |
| 21 | 22 | |
| 22 | 23 | |
| 23 | 24 | //************************************************************************** |
| r32278 | r32279 | |
| 79 | 80 | static INPUT_PORTS_START( a500_us_keyboard ) |
| 80 | 81 | PORT_START("special") |
| 81 | 82 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) |
| 82 | | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN) PORT_CHAR(UCHAR_MAMEKEY(LWIN)) PORT_NAME("Left Amiga") |
| 83 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN) PORT_CHAR(UCHAR_MAMEKEY(LWIN)) PORT_NAME("Left Amiga") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, NULL) |
| 83 | 84 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) |
| 84 | 85 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 85 | | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Ctrl") |
| 86 | | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN) PORT_CHAR(UCHAR_MAMEKEY(RWIN)) PORT_NAME("Right Amiga") |
| 86 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Ctrl") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, NULL) |
| 87 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN) PORT_CHAR(UCHAR_MAMEKEY(RWIN)) PORT_NAME("Right Amiga") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, NULL) |
| 87 | 88 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) |
| 88 | 89 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 89 | 90 | |
| r32278 | r32279 | |
| 256 | 257 | : device_t(mconfig, AMIGAKBD, "Amiga 500 Keyboard with 6570-036 MPU", tag, owner, clock, "amigakbd", __FILE__), |
| 257 | 258 | m_write_kclk(*this), |
| 258 | 259 | m_write_kdat(*this), |
| 260 | m_write_krst(*this), |
| 259 | 261 | m_mpu(*this, "mos6570_036"), |
| 262 | m_special(*this, "special"), |
| 260 | 263 | m_row_d6(*this, "row_d6"), |
| 261 | 264 | m_row_d5(*this, "row_d5"), |
| 262 | 265 | m_row_d4(*this, "row_d4"), |
| r32278 | r32279 | |
| 274 | 277 | m_row_c0(*this, "row_c0"), |
| 275 | 278 | m_timer(NULL), |
| 276 | 279 | m_watchdog(NULL), |
| 280 | m_reset(NULL), |
| 277 | 281 | m_kdat(1), |
| 278 | 282 | m_kclk(1), |
| 279 | 283 | m_port_c(0xff), |
| r32278 | r32279 | |
| 292 | 296 | { |
| 293 | 297 | m_write_kclk.resolve_safe(); |
| 294 | 298 | m_write_kdat.resolve_safe(); |
| 299 | m_write_krst.resolve_safe(); |
| 295 | 300 | m_timer = timer_alloc(0, NULL); |
| 296 | 301 | m_watchdog = timer_alloc(1, NULL); |
| 302 | m_reset = timer_alloc(2, NULL); |
| 297 | 303 | } |
| 298 | 304 | |
| 299 | 305 | //------------------------------------------------- |
| r32278 | r32279 | |
| 321 | 327 | { |
| 322 | 328 | switch (tid) |
| 323 | 329 | { |
| 330 | // 6500/1 internal timer |
| 324 | 331 | case 0: |
| 325 | 332 | switch (m_control & 0x03) |
| 326 | 333 | { |
| r32278 | r32279 | |
| 348 | 355 | } |
| 349 | 356 | break; |
| 350 | 357 | |
| 358 | // watchdog |
| 351 | 359 | case 1: |
| 352 | 360 | m_mpu->reset(); |
| 353 | 361 | m_watchdog->adjust(attotime::from_msec(54)); |
| 354 | 362 | break; |
| 363 | |
| 364 | // keyboard reset timer |
| 365 | case 2: |
| 366 | m_write_krst(1); |
| 367 | break; |
| 355 | 368 | } |
| 356 | 369 | } |
| 357 | 370 | |
| r32278 | r32279 | |
| 360 | 373 | // IMPLEMENTATION |
| 361 | 374 | //************************************************************************** |
| 362 | 375 | |
| 376 | INPUT_CHANGED_MEMBER( amigakbd_device::check_reset ) |
| 377 | { |
| 378 | UINT8 keys = m_special->read(); |
| 379 | |
| 380 | // ctrl-amiga-amiga pressed? |
| 381 | if (!BIT(keys, 6) && !BIT(keys, 3) && !BIT(keys, 2)) |
| 382 | { |
| 383 | m_write_krst(0); |
| 384 | m_reset->adjust(PERIOD_OF_555_MONOSTABLE(RES_K(47), CAP_U(10))); |
| 385 | } |
| 386 | } |
| 387 | |
| 363 | 388 | void amigakbd_device::update_irqs() |
| 364 | 389 | { |
| 365 | 390 | if ((m_control & PA1_INT_ENABLED) && (m_control & PA1_NEGATIVE_EDGE)) |
trunk/src/mess/machine/amigakbd.h
| r32278 | r32279 | |
| 29 | 29 | #define MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(_write) \ |
| 30 | 30 | devcb = &amigakbd_device::set_kdat_wr_callback(*device, DEVCB_##_write); |
| 31 | 31 | |
| 32 | #define MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(_write) \ |
| 33 | devcb = &amigakbd_device::set_krst_wr_callback(*device, DEVCB_##_write); |
| 32 | 34 | |
| 35 | |
| 33 | 36 | //************************************************************************** |
| 34 | 37 | // TYPE DEFINITIONS |
| 35 | 38 | //************************************************************************** |
| r32278 | r32279 | |
| 46 | 49 | { return downcast<amigakbd_device &>(device).m_write_kclk.set_callback(object); } |
| 47 | 50 | template<class _Object> static devcb_base &set_kdat_wr_callback(device_t &device, _Object object) |
| 48 | 51 | { return downcast<amigakbd_device &>(device).m_write_kdat.set_callback(object); } |
| 52 | template<class _Object> static devcb_base &set_krst_wr_callback(device_t &device, _Object object) |
| 53 | { return downcast<amigakbd_device &>(device).m_write_krst.set_callback(object); } |
| 49 | 54 | |
| 50 | 55 | DECLARE_WRITE_LINE_MEMBER( kdat_w ); |
| 51 | 56 | |
| r32278 | r32279 | |
| 64 | 69 | DECLARE_READ8_MEMBER( control_r ); |
| 65 | 70 | DECLARE_WRITE8_MEMBER( control_w ); |
| 66 | 71 | |
| 72 | DECLARE_INPUT_CHANGED_MEMBER( check_reset ); |
| 73 | |
| 67 | 74 | protected: |
| 68 | 75 | // device-level overrides |
| 69 | 76 | virtual const rom_entry *device_rom_region() const; |
| r32278 | r32279 | |
| 97 | 104 | |
| 98 | 105 | devcb_write_line m_write_kclk; |
| 99 | 106 | devcb_write_line m_write_kdat; |
| 107 | devcb_write_line m_write_krst; |
| 100 | 108 | |
| 101 | 109 | required_device<m6502_device> m_mpu; |
| 102 | 110 | |
| 111 | required_ioport m_special; |
| 103 | 112 | required_ioport m_row_d6; |
| 104 | 113 | required_ioport m_row_d5; |
| 105 | 114 | required_ioport m_row_d4; |
| r32278 | r32279 | |
| 118 | 127 | |
| 119 | 128 | emu_timer *m_timer; |
| 120 | 129 | emu_timer *m_watchdog; |
| 130 | emu_timer *m_reset; |
| 121 | 131 | |
| 122 | 132 | int m_kdat; |
| 123 | 133 | int m_kclk; |