mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
tvi990: use hle keyboard so arrow keys work (nw)
This commit is contained in:
parent
8c22a3d31e
commit
a61700b33b
@ -37,10 +37,8 @@
|
|||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "cpu/m68000/m68000.h"
|
#include "cpu/m68000/m68000.h"
|
||||||
#include "machine/ins8250.h"
|
#include "machine/ins8250.h"
|
||||||
#include "machine/at_keybc.h"
|
#include "machine/8042kbdc.h"
|
||||||
#include "bus/rs232/rs232.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 UART0_TAG "ns16450_0"
|
||||||
#define UART1_TAG "ns16450_1"
|
#define UART1_TAG "ns16450_1"
|
||||||
@ -57,7 +55,8 @@ public:
|
|||||||
m_fontram(*this, "fontram"),
|
m_fontram(*this, "fontram"),
|
||||||
m_uart0(*this, UART0_TAG),
|
m_uart0(*this, UART0_TAG),
|
||||||
m_uart1(*this, UART1_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<UINT16> m_fontram;
|
required_shared_ptr<UINT16> m_fontram;
|
||||||
required_device<ns16450_device> m_uart0, m_uart1;
|
required_device<ns16450_device> m_uart0, m_uart1;
|
||||||
required_device<screen_device> m_screen;
|
required_device<screen_device> m_screen;
|
||||||
|
required_device<kbdc8042_device> m_kbdc;
|
||||||
|
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) 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_READ16_MEMBER(tvi1111_r);
|
||||||
DECLARE_WRITE16_MEMBER(tvi1111_w);
|
DECLARE_WRITE16_MEMBER(tvi1111_w);
|
||||||
DECLARE_READ16_MEMBER(keyb_r);
|
DECLARE_READ8_MEMBER(kbdc_r);
|
||||||
DECLARE_WRITE16_MEMBER(keyb_w);
|
DECLARE_WRITE8_MEMBER(kbdc_w);
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(uart0_irq);
|
WRITE_LINE_MEMBER(uart0_irq);
|
||||||
WRITE_LINE_MEMBER(uart1_irq);
|
WRITE_LINE_MEMBER(uart1_irq);
|
||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(keyboard_clock_w);
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(keyboard_data_w);
|
|
||||||
INTERRUPT_GEN_MEMBER(vblank);
|
INTERRUPT_GEN_MEMBER(vblank);
|
||||||
private:
|
private:
|
||||||
UINT16 tvi1111_regs[(0x100/2)+2];
|
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;
|
emu_timer *m_rowtimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -254,104 +246,20 @@ UINT32 tv990_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// AT keyboard interface - done in an AMI ASIC
|
READ8_MEMBER(tv990_state::kbdc_r)
|
||||||
WRITE_LINE_MEMBER(tv990_state::keyboard_clock_w)
|
|
||||||
{
|
{
|
||||||
// printf("KCLK: %d\n", state ? 1 : 0);
|
if(offset)
|
||||||
|
return m_kbdc->data_r(space, 4);
|
||||||
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;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
return m_kbdc->data_r(space, 0);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(tv990_state::keyb_w)
|
WRITE8_MEMBER(tv990_state::kbdc_w)
|
||||||
{
|
{
|
||||||
if (offset == 0)
|
if(offset)
|
||||||
{
|
m_kbdc->data_w(space, 4, data);
|
||||||
//printf("%02x to keyboard\n", data);
|
|
||||||
m_scancode = 0xfa; // pretend keyboard responded "ACK"
|
|
||||||
|
|
||||||
if (data == 0xf2) // get PS/2 ID
|
|
||||||
{
|
|
||||||
m_idstage = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
m_kbdc->data_w(space, 0, data);
|
||||||
//printf("AT command %02x\n", data);
|
|
||||||
if (data == 0xaa)
|
|
||||||
{
|
|
||||||
m_scancode = 0x55;
|
|
||||||
}
|
|
||||||
else if (data == 0xab)
|
|
||||||
{
|
|
||||||
m_scancode = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ADDRESS_MAP_START(tv990_mem, AS_PROGRAM, 16, tv990_state)
|
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(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(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(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
|
AM_RANGE(0x0c0000, 0x0c7fff) AM_RAM // work RAM
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
/* Input ports */
|
/* Input ports */
|
||||||
static INPUT_PORTS_START( tv990 )
|
static INPUT_PORTS_START( tv990 )
|
||||||
|
PORT_INCLUDE( at_keyboard )
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
void tv990_state::machine_reset()
|
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));
|
m_rowtimer->adjust(m_screen->time_until_pos(0));
|
||||||
|
|
||||||
memset(tvi1111_regs, 0, sizeof(tvi1111_regs));
|
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_DCD_HANDLER(DEVWRITELINE(UART1_TAG, ns16450_device, dcd_w))
|
||||||
MCFG_RS232_CTS_HANDLER(DEVWRITELINE(UART1_TAG, ns16450_device, cts_w))
|
MCFG_RS232_CTS_HANDLER(DEVWRITELINE(UART1_TAG, ns16450_device, cts_w))
|
||||||
|
|
||||||
MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0)
|
MCFG_DEVICE_ADD("pc_kbdc", KBDC8042, 0)
|
||||||
MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(tv990_state, keyboard_clock_w))
|
MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_AT386)
|
||||||
MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(tv990_state, keyboard_data_w))
|
MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(INPUTLINE("maincpu", M68K_IRQ_2))
|
||||||
MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
|
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
/* ROM definition */
|
/* ROM definition */
|
||||||
|
Loading…
Reference in New Issue
Block a user