From a61700b33b5ca87ee36f9ae3b06957ccbf87adfe Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 24 Jul 2016 21:01:18 -0500 Subject: [PATCH] tvi990: use hle keyboard so arrow keys work (nw) --- src/mame/drivers/tv990.cpp | 137 ++++++------------------------------- 1 file changed, 20 insertions(+), 117 deletions(-) diff --git a/src/mame/drivers/tv990.cpp b/src/mame/drivers/tv990.cpp index 17b39e57524..45071cac86c 100644 --- a/src/mame/drivers/tv990.cpp +++ b/src/mame/drivers/tv990.cpp @@ -37,10 +37,8 @@ #include "emu.h" #include "cpu/m68000/m68000.h" #include "machine/ins8250.h" -#include "machine/at_keybc.h" +#include "machine/8042kbdc.h" #include "bus/rs232/rs232.h" -#include "bus/pc_kbd/pc_kbdc.h" -#include "bus/pc_kbd/keyboards.h" #define UART0_TAG "ns16450_0" #define UART1_TAG "ns16450_1" @@ -57,7 +55,8 @@ public: m_fontram(*this, "fontram"), m_uart0(*this, UART0_TAG), m_uart1(*this, UART1_TAG), - m_screen(*this, "screen") + m_screen(*this, "screen"), + m_kbdc(*this, "pc_kbdc") { } @@ -66,7 +65,8 @@ public: required_shared_ptr m_fontram; required_device m_uart0, m_uart1; required_device m_screen; - + required_device m_kbdc; + virtual void machine_reset() override; virtual void machine_start() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; @@ -75,23 +75,15 @@ public: DECLARE_READ16_MEMBER(tvi1111_r); DECLARE_WRITE16_MEMBER(tvi1111_w); - DECLARE_READ16_MEMBER(keyb_r); - DECLARE_WRITE16_MEMBER(keyb_w); + DECLARE_READ8_MEMBER(kbdc_r); + DECLARE_WRITE8_MEMBER(kbdc_w); WRITE_LINE_MEMBER(uart0_irq); WRITE_LINE_MEMBER(uart1_irq); - DECLARE_WRITE_LINE_MEMBER(keyboard_clock_w); - DECLARE_WRITE_LINE_MEMBER(keyboard_data_w); INTERRUPT_GEN_MEMBER(vblank); private: UINT16 tvi1111_regs[(0x100/2)+2]; - - bool m_kclk; - UINT8 m_kdata; - UINT8 m_scancode; - int m_kbit; - int m_idstage; emu_timer *m_rowtimer; }; @@ -254,104 +246,20 @@ UINT32 tv990_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c return 0; } -// AT keyboard interface - done in an AMI ASIC -WRITE_LINE_MEMBER(tv990_state::keyboard_clock_w) +READ8_MEMBER(tv990_state::kbdc_r) { -// printf("KCLK: %d\n", state ? 1 : 0); - - if (m_scancode == 0x55) return; - - // rising edge? - if ((state == ASSERT_LINE) && (!m_kclk)) - { - if (m_kbit >= 1 && m_kbit <= 8) - { - m_scancode >>= 1; - m_scancode |= m_kdata; - } - - // stop bit? - if (m_kbit == 9) - { - //printf("scancode %02x\n", m_scancode); - m_kbit = 0; - m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); - // irq here - } - else - { - m_kbit++; - } - } - - m_kclk = (state == ASSERT_LINE) ? true : false; -} - -WRITE_LINE_MEMBER(tv990_state::keyboard_data_w) -{ -// printf("KDATA: %d\n", state ? 1 : 0); - m_kdata = (state == ASSERT_LINE) ? 0x80 : 0x00; -} - -// 2ac = test -READ16_MEMBER(tv990_state::keyb_r) -{ - if (offset == 0) - { - m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); - //printf("reading m_scancode = %02x\n", m_scancode); - - switch (m_idstage) - { - case 1: - m_idstage++; - return 0xfa; - - case 2: - m_idstage++; - return 0xab; - - case 3: - m_idstage = 0; - return 0x83; - - default: - break; - } - - - return m_scancode; - } + if(offset) + return m_kbdc->data_r(space, 4); else - { - return 0; - } + return m_kbdc->data_r(space, 0); } -WRITE16_MEMBER(tv990_state::keyb_w) +WRITE8_MEMBER(tv990_state::kbdc_w) { - if (offset == 0) - { - //printf("%02x to keyboard\n", data); - m_scancode = 0xfa; // pretend keyboard responded "ACK" - - if (data == 0xf2) // get PS/2 ID - { - m_idstage = 1; - } - } + if(offset) + m_kbdc->data_w(space, 4, data); else - { - //printf("AT command %02x\n", data); - if (data == 0xaa) - { - m_scancode = 0x55; - } - else if (data == 0xab) - { - m_scancode = 0; - } - } + m_kbdc->data_w(space, 0, data); } static ADDRESS_MAP_START(tv990_mem, AS_PROGRAM, 16, tv990_state) @@ -361,21 +269,17 @@ static ADDRESS_MAP_START(tv990_mem, AS_PROGRAM, 16, tv990_state) AM_RANGE(0x090000, 0x0900ff) AM_READWRITE(tvi1111_r, tvi1111_w) AM_RANGE(0x0a0000, 0x0a000f) AM_DEVREADWRITE8(UART0_TAG, ns16450_device, ins8250_r, ins8250_w, 0x00ff) AM_RANGE(0x0a0010, 0x0a001f) AM_DEVREADWRITE8(UART1_TAG, ns16450_device, ins8250_r, ins8250_w, 0x00ff) - AM_RANGE(0x0b0000, 0x0b0003) AM_READWRITE(keyb_r, keyb_w) + AM_RANGE(0x0b0000, 0x0b0003) AM_READWRITE8(kbdc_r, kbdc_w, 0x00ff) AM_RANGE(0x0c0000, 0x0c7fff) AM_RAM // work RAM ADDRESS_MAP_END /* Input ports */ static INPUT_PORTS_START( tv990 ) + PORT_INCLUDE( at_keyboard ) INPUT_PORTS_END - void tv990_state::machine_reset() { - m_kclk = true; - m_kbit = 0; - m_scancode = 0; - m_idstage = 0; m_rowtimer->adjust(m_screen->time_until_pos(0)); memset(tvi1111_regs, 0, sizeof(tvi1111_regs)); @@ -411,10 +315,9 @@ static MACHINE_CONFIG_START( tv990, tv990_state ) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(UART1_TAG, ns16450_device, dcd_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(UART1_TAG, ns16450_device, cts_w)) - MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0) - MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(tv990_state, keyboard_clock_w)) - MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(tv990_state, keyboard_data_w)) - MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83) + MCFG_DEVICE_ADD("pc_kbdc", KBDC8042, 0) + MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_AT386) + MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(INPUTLINE("maincpu", M68K_IRQ_2)) MACHINE_CONFIG_END /* ROM definition */