trunk/src/mess/drivers/ie15.c
| r29640 | r29641 | |
| 56 | 56 | m_maincpu(*this, "maincpu"), |
| 57 | 57 | m_beeper(*this, "beeper"), |
| 58 | 58 | m_rs232(*this, "rs232"), |
| 59 | m_screen(*this, "screen"), |
| 59 | 60 | m_io_keyboard(*this, "keyboard") |
| 60 | 61 | { } |
| 61 | 62 | |
| r29640 | r29641 | |
| 127 | 128 | required_device<cpu_device> m_maincpu; |
| 128 | 129 | required_device<beep_device> m_beeper; |
| 129 | 130 | required_device<rs232_port_device> m_rs232; |
| 131 | required_device<screen_device> m_screen; |
| 130 | 132 | required_ioport m_io_keyboard; |
| 131 | 133 | }; |
| 132 | 134 | |
| r29640 | r29641 | |
| 337 | 339 | switch (offset) |
| 338 | 340 | { |
| 339 | 341 | case 0: // hsync pulse (not hblank) |
| 340 | | ret = machine().first_screen()->hpos() < IE15_HORZ_START; |
| 342 | ret = m_screen->hpos() < IE15_HORZ_START; |
| 341 | 343 | break; |
| 342 | 344 | case 1: // marker scanline |
| 343 | | ret = (machine().first_screen()->vpos() % 11) > 7; |
| 345 | ret = (m_screen->vpos() % 11) > 7; |
| 344 | 346 | break; |
| 345 | 347 | case 2: // vblank |
| 346 | | ret = !machine().first_screen()->vblank(); |
| 348 | ret = !m_screen->vblank(); |
| 347 | 349 | break; |
| 348 | 350 | case 4: |
| 349 | 351 | ret = m_kb_ruslat; |
| r29640 | r29641 | |
| 438 | 440 | } |
| 439 | 441 | } |
| 440 | 442 | |
| 441 | | static IE15_KEYBOARD_INTERFACE( keyboard_intf ) |
| 442 | | { |
| 443 | | DEVCB_DRIVER_MEMBER16(ie15_state, kbd_put) |
| 444 | | }; |
| 445 | | |
| 446 | 443 | void ie15_state::machine_reset() |
| 447 | 444 | { |
| 448 | 445 | memset(&m_video, 0, sizeof(m_video)); |
| r29640 | r29641 | |
| 509 | 506 | UINT16 x, chr; |
| 510 | 507 | |
| 511 | 508 | bg = 0; fg = 1; ra = scanline % 8; |
| 512 | | blink = (machine().first_screen()->frame_number() % 10) > 4; |
| 509 | blink = (m_screen->frame_number() % 10) > 4; |
| 513 | 510 | red = m_io_keyboard->read() & IE_KB_RED; |
| 514 | 511 | |
| 515 | 512 | for (x = offset; x < offset + 80; x++) |
| r29640 | r29641 | |
| 559 | 556 | */ |
| 560 | 557 | TIMER_DEVICE_CALLBACK_MEMBER(ie15_state::scanline_callback) |
| 561 | 558 | { |
| 562 | | UINT16 y = machine().first_screen()->vpos(); |
| 559 | UINT16 y = m_screen->vpos(); |
| 563 | 560 | |
| 564 | 561 | DBG_LOG(3,"scanline_cb", |
| 565 | 562 | ("addr %03x frame %" I64FMT "d x %.4d y %.3d row %.2d e:c:s %d:%d:%d\n", |
| 566 | | m_video.ptr2, machine().first_screen()->frame_number(), machine().first_screen()->hpos(), y, |
| 563 | m_video.ptr2, m_screen->frame_number(), m_screen->hpos(), y, |
| 567 | 564 | y%11, m_video.enable, m_video.cursor, m_video.line25)); |
| 568 | 565 | |
| 569 | 566 | if (y < IE15_VERT_START) return; |
| r29640 | r29641 | |
| 625 | 622 | MCFG_DEFAULT_LAYOUT( layout_ie15 ) |
| 626 | 623 | |
| 627 | 624 | /* Devices */ |
| 628 | | MCFG_IE15_KEYBOARD_ADD("keyboard", keyboard_intf) |
| 625 | MCFG_DEVICE_ADD("keyboard", IE15_KEYBOARD, 0) |
| 626 | MCFG_IE15_KEYBOARD_CB(WRITE16(ie15_state, kbd_put)) |
| 629 | 627 | |
| 630 | 628 | MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL) |
| 631 | 629 | MCFG_RS232_RXD_HANDLER(WRITELINE(ie15_state, serial_rx_callback)) |
trunk/src/mess/machine/ie15_kbd.c
| r29640 | r29641 | |
| 19 | 19 | , m_io_kbd2(*this, "TERM_LINE2") |
| 20 | 20 | , m_io_kbd3(*this, "TERM_LINE3") |
| 21 | 21 | , m_io_kbdc(*this, "TERM_LINEC") |
| 22 | , m_keyboard_cb(*this) |
| 22 | 23 | { |
| 23 | 24 | } |
| 24 | 25 | |
| r29640 | r29641 | |
| 29 | 30 | , m_io_kbd2(*this, "TERM_LINE2") |
| 30 | 31 | , m_io_kbd3(*this, "TERM_LINE3") |
| 31 | 32 | , m_io_kbdc(*this, "TERM_LINEC") |
| 33 | , m_keyboard_cb(*this) |
| 32 | 34 | { |
| 33 | 35 | } |
| 34 | 36 | |
| r29640 | r29641 | |
| 152 | 154 | |
| 153 | 155 | void ie15_keyboard_device::device_start() |
| 154 | 156 | { |
| 155 | | m_keyboard_func.resolve(m_keyboard_cb, *this); |
| 157 | m_keyboard_cb.resolve_safe(); |
| 156 | 158 | m_timer = timer_alloc(); |
| 157 | 159 | m_rom = (UINT8*)memregion("ie15kbd")->base(); |
| 158 | 160 | } |
| 159 | 161 | |
| 160 | | void ie15_keyboard_device::device_config_complete() |
| 161 | | { |
| 162 | | const ie15_keyboard_interface *intf = reinterpret_cast<const ie15_keyboard_interface *>(static_config()); |
| 163 | | if(intf != NULL) |
| 164 | | { |
| 165 | | *static_cast<ie15_keyboard_interface *>(this) = *intf; |
| 166 | | } |
| 167 | | else |
| 168 | | { |
| 169 | | memset(&m_keyboard_cb, 0, sizeof(m_keyboard_cb)); |
| 170 | | } |
| 171 | | } |
| 172 | | |
| 173 | 162 | void ie15_keyboard_device::device_reset() |
| 174 | 163 | { |
| 175 | 164 | m_last_code = 0; |
trunk/src/mess/machine/ie15_kbd.h
| r29640 | r29641 | |
| 24 | 24 | #define IE_KB_SI 0x0f |
| 25 | 25 | #define IE_KB_SO 0x0e |
| 26 | 26 | |
| 27 | | /*************************************************************************** |
| 28 | | TYPE DEFINITIONS |
| 29 | | ***************************************************************************/ |
| 30 | 27 | |
| 31 | | struct ie15_keyboard_interface |
| 32 | | { |
| 33 | | devcb_write16 m_keyboard_cb; |
| 34 | | }; |
| 35 | | |
| 36 | | #define IE15_KEYBOARD_INTERFACE(name) const ie15_keyboard_interface (name) = |
| 37 | | |
| 38 | 28 | /*************************************************************************** |
| 39 | 29 | DEVICE CONFIGURATION MACROS |
| 40 | 30 | ***************************************************************************/ |
| 41 | 31 | |
| 42 | | #define MCFG_IE15_KEYBOARD_ADD(_tag, _intrf) \ |
| 43 | | MCFG_DEVICE_ADD(_tag, IE15_KEYBOARD, 0) \ |
| 44 | | MCFG_DEVICE_CONFIG(_intrf) |
| 32 | #define MCFG_IE15_KEYBOARD_CB(_devcb) \ |
| 33 | devcb = &ie15_keyboard_device::set_keyboard_callback(*device, DEVCB2_##_devcb); |
| 45 | 34 | |
| 46 | 35 | /*************************************************************************** |
| 47 | 36 | FUNCTION PROTOTYPES |
| 48 | 37 | ***************************************************************************/ |
| 49 | 38 | |
| 50 | 39 | class ie15_keyboard_device : |
| 51 | | public device_t, |
| 52 | | public ie15_keyboard_interface |
| 40 | public device_t |
| 53 | 41 | { |
| 54 | 42 | public: |
| 55 | 43 | ie15_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); |
| 56 | 44 | ie15_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 45 | |
| 46 | template<class _Object> static devcb2_base &set_keyboard_callback(device_t &device, _Object object) { return downcast<ie15_keyboard_device &>(device).m_keyboard_cb.set_callback(object); } |
| 57 | 47 | |
| 58 | 48 | virtual ioport_constructor device_input_ports() const; |
| 59 | 49 | virtual machine_config_constructor device_mconfig_additions() const; |
| r29640 | r29641 | |
| 69 | 59 | virtual void device_start(); |
| 70 | 60 | virtual void device_reset(); |
| 71 | 61 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 72 | | virtual void device_config_complete(); |
| 73 | | virtual void send_key(UINT16 code) { m_keyboard_func(0, code); } |
| 62 | virtual void send_key(UINT16 code) { m_keyboard_cb((offs_t)0, code); } |
| 74 | 63 | emu_timer *m_timer; |
| 75 | 64 | |
| 76 | 65 | private: |
| r29640 | r29641 | |
| 81 | 70 | UINT8 m_ruslat; |
| 82 | 71 | UINT8 *m_rom; |
| 83 | 72 | |
| 84 | | devcb_resolved_write16 m_keyboard_func; |
| 73 | devcb2_write16 m_keyboard_cb; |
| 85 | 74 | }; |
| 86 | 75 | |
| 87 | 76 | extern const device_type IE15_KEYBOARD; |