mirror of
https://github.com/holub/mame
synced 2025-10-06 17:08:28 +03:00
wicat: added very basic keyboard handling. Mostly for testing right now, but allows you to interact with the system.
This commit is contained in:
parent
a0d7e3ca1d
commit
b3398bb399
@ -81,6 +81,7 @@ public:
|
|||||||
DECLARE_WRITE_LINE_MEMBER(crtc_cb);
|
DECLARE_WRITE_LINE_MEMBER(crtc_cb);
|
||||||
DECLARE_READ8_MEMBER(hdc_r);
|
DECLARE_READ8_MEMBER(hdc_r);
|
||||||
DECLARE_WRITE8_MEMBER(hdc_w);
|
DECLARE_WRITE8_MEMBER(hdc_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(kb_data_ready);
|
||||||
|
|
||||||
required_shared_ptr<UINT8> m_vram;
|
required_shared_ptr<UINT8> m_vram;
|
||||||
required_device<m68000_device> m_maincpu;
|
required_device<m68000_device> m_maincpu;
|
||||||
@ -123,10 +124,12 @@ private:
|
|||||||
UINT8 m_portA;
|
UINT8 m_portA;
|
||||||
UINT8 m_portB;
|
UINT8 m_portB;
|
||||||
bool m_video_timer_irq;
|
bool m_video_timer_irq;
|
||||||
|
bool m_video_kb_irq;
|
||||||
UINT8 m_nmi_enable;
|
UINT8 m_nmi_enable;
|
||||||
UINT8 m_crtc_irq;
|
UINT8 m_crtc_irq;
|
||||||
UINT16 m_kb_data;
|
UINT16 m_kb_data;
|
||||||
UINT8 m_kb_bit;
|
UINT8 m_kb_bit;
|
||||||
|
UINT32 m_kb_keys[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -168,9 +171,8 @@ static ADDRESS_MAP_START(wicat_video_io, AS_IO, 8, wicat_state)
|
|||||||
AM_RANGE(0x0400,0x047f) AM_READWRITE(videosram_r,videosram_w) // XD2210 4-bit NOVRAM
|
AM_RANGE(0x0400,0x047f) AM_READWRITE(videosram_r,videosram_w) // XD2210 4-bit NOVRAM
|
||||||
AM_RANGE(0x0500,0x0500) AM_WRITE(videosram_recall_w)
|
AM_RANGE(0x0500,0x0500) AM_WRITE(videosram_recall_w)
|
||||||
AM_RANGE(0x0600,0x0600) AM_WRITE(videosram_store_w)
|
AM_RANGE(0x0600,0x0600) AM_WRITE(videosram_store_w)
|
||||||
AM_RANGE(0x0700,0x0700) AM_DEVREADWRITE("videouart",im6402_device,read,write) // UART?
|
|
||||||
AM_RANGE(0x0800,0x080f) AM_READWRITE(video_ctrl_r,video_ctrl_w)
|
AM_RANGE(0x0800,0x080f) AM_READWRITE(video_ctrl_r,video_ctrl_w)
|
||||||
AM_RANGE(0x0a00,0x0a1f) AM_READWRITE(video_dma_r,video_dma_w) // DMA
|
AM_RANGE(0x0a00,0x0a1f) AM_READWRITE(video_dma_r,video_dma_w) // AM9517A DMA
|
||||||
AM_RANGE(0x0b00,0x0b03) AM_READWRITE(video_r,video_w) // i8275 CRTC
|
AM_RANGE(0x0b00,0x0b03) AM_READWRITE(video_r,video_w) // i8275 CRTC
|
||||||
AM_RANGE(0x0e00,0x0eff) AM_RAM
|
AM_RANGE(0x0e00,0x0eff) AM_RAM
|
||||||
AM_RANGE(0x4000,0x5fff) AM_RAM AM_SHARE("vram") // video RAM?
|
AM_RANGE(0x4000,0x5fff) AM_RAM AM_SHARE("vram") // video RAM?
|
||||||
@ -192,11 +194,10 @@ ADDRESS_MAP_END
|
|||||||
/* Input ports */
|
/* Input ports */
|
||||||
static INPUT_PORTS_START( wicat )
|
static INPUT_PORTS_START( wicat )
|
||||||
PORT_START("kb0")
|
PORT_START("kb0")
|
||||||
PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
|
PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Retrn") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
|
||||||
PORT_BIT(0xfff7ffff,IP_ACTIVE_HIGH,IPT_UNUSED)
|
|
||||||
|
|
||||||
PORT_START("kb1")
|
PORT_START("kb1")
|
||||||
|
PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
|
||||||
PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
|
PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
|
||||||
PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1')
|
PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1')
|
||||||
PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2')
|
PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2')
|
||||||
@ -208,6 +209,36 @@ static INPUT_PORTS_START( wicat )
|
|||||||
PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8')
|
PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8')
|
||||||
PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9')
|
PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9')
|
||||||
|
|
||||||
|
PORT_START("kb2")
|
||||||
|
PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@')
|
||||||
|
|
||||||
|
PORT_START("kb3")
|
||||||
|
PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A')
|
||||||
|
PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B')
|
||||||
|
PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C')
|
||||||
|
PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D')
|
||||||
|
PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E')
|
||||||
|
PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F')
|
||||||
|
PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G')
|
||||||
|
PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H')
|
||||||
|
PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I')
|
||||||
|
PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J')
|
||||||
|
PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K')
|
||||||
|
PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L')
|
||||||
|
PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M')
|
||||||
|
PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N')
|
||||||
|
PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O')
|
||||||
|
PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P')
|
||||||
|
PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
|
||||||
|
PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
|
||||||
|
PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S')
|
||||||
|
PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T')
|
||||||
|
PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U')
|
||||||
|
PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V')
|
||||||
|
PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W')
|
||||||
|
PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X')
|
||||||
|
PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
|
||||||
|
PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
void wicat_state::driver_start()
|
void wicat_state::driver_start()
|
||||||
@ -232,11 +263,22 @@ void wicat_state::machine_reset()
|
|||||||
m_uart3->dcd_w(0);
|
m_uart3->dcd_w(0);
|
||||||
m_uart4->dcd_w(0);
|
m_uart4->dcd_w(0);
|
||||||
m_uart5->dcd_w(0);
|
m_uart5->dcd_w(0);
|
||||||
|
|
||||||
|
// initialise im6402 (terminal board)
|
||||||
|
m_videouart->cls1_w(1);
|
||||||
|
m_videouart->cls2_w(1);
|
||||||
|
m_videouart->pi_w(1);
|
||||||
|
m_videouart->sbs_w(0);
|
||||||
|
m_videouart->crl_w(1);
|
||||||
|
|
||||||
m_video_timer_irq = false;
|
m_video_timer_irq = false;
|
||||||
|
m_video_kb_irq = false;
|
||||||
m_video_timer->adjust(attotime::zero,0,attotime::from_hz(60));
|
m_video_timer->adjust(attotime::zero,0,attotime::from_hz(60));
|
||||||
m_kb_timer->adjust(attotime::zero,0,attotime::from_msec(50));
|
m_kb_timer->adjust(attotime::zero,0,attotime::from_msec(50));
|
||||||
m_nmi_enable = 0;
|
m_nmi_enable = 0;
|
||||||
m_crtc_irq = CLEAR_LINE;
|
m_crtc_irq = CLEAR_LINE;
|
||||||
|
for(int x=0;x<8;x++)
|
||||||
|
m_kb_keys[x] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wicat_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
void wicat_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||||
@ -251,12 +293,11 @@ void wicat_state::device_timer(emu_timer &timer, device_timer_id id, int param,
|
|||||||
poll_kb();
|
poll_kb();
|
||||||
break;
|
break;
|
||||||
case KB_SERIAL_TIMER:
|
case KB_SERIAL_TIMER:
|
||||||
m_videouart1->rx_w((m_kb_data >> (m_kb_bit)) & 0x01);
|
m_videouart->write_rx((m_kb_data >> (m_kb_bit)) & 0x01);
|
||||||
m_kb_bit++;
|
m_kb_bit++;
|
||||||
if(m_kb_bit > 10)
|
if(m_kb_bit > 10)
|
||||||
{
|
{
|
||||||
m_kb_serial_timer->reset();
|
m_kb_serial_timer->reset();
|
||||||
m_videouart1->dsr_w(0);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -270,17 +311,19 @@ void wicat_state::poll_kb()
|
|||||||
UINT32 data;
|
UINT32 data;
|
||||||
char kbtag[8];
|
char kbtag[8];
|
||||||
|
|
||||||
for(line=0;line<2;line++)
|
for(line=0;line<4;line++)
|
||||||
{
|
{
|
||||||
sprintf(kbtag,"kb%i",line);
|
sprintf(kbtag,"kb%i",line);
|
||||||
data = ioport(kbtag)->read();
|
data = ioport(kbtag)->read();
|
||||||
for(x=0;x<32;x++)
|
for(x=0;x<32;x++)
|
||||||
{
|
{
|
||||||
if(data & (1<<x))
|
if((data & (1<<x)) && !(m_kb_keys[line] & (1<<x)))
|
||||||
{
|
{
|
||||||
send_key(val);
|
send_key(val);
|
||||||
|
m_kb_keys[line] |= (1 << x);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
m_kb_keys[line] &= ~(1 << x);
|
||||||
val++;
|
val++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -290,7 +333,7 @@ void wicat_state::send_key(UINT8 val)
|
|||||||
{
|
{
|
||||||
// based on settings in the terminal NOVRAM, the keyboard is using 1200 baud, 7 bits, 2 stop bits
|
// based on settings in the terminal NOVRAM, the keyboard is using 1200 baud, 7 bits, 2 stop bits
|
||||||
logerror("Sending key %i\n",val);
|
logerror("Sending key %i\n",val);
|
||||||
m_kb_data = 0x0003 | (val << 3);
|
m_kb_data = 0x0001 | (val << 2);
|
||||||
m_kb_bit = 0;
|
m_kb_bit = 0;
|
||||||
m_kb_serial_timer->adjust(attotime::zero,0,attotime::from_hz(1200));
|
m_kb_serial_timer->adjust(attotime::zero,0,attotime::from_hz(1200));
|
||||||
}
|
}
|
||||||
@ -499,13 +542,23 @@ READ8_MEMBER(wicat_state::video_timer_r)
|
|||||||
m_video_timer_irq = false;
|
m_video_timer_irq = false;
|
||||||
m_videocpu->set_input_line(INPUT_LINE_IRQ0,CLEAR_LINE);
|
m_videocpu->set_input_line(INPUT_LINE_IRQ0,CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
if(m_video_kb_irq)
|
||||||
|
{
|
||||||
|
ret |= 0x10;
|
||||||
|
m_video_kb_irq = false;
|
||||||
|
m_videocpu->set_input_line(INPUT_LINE_IRQ0,CLEAR_LINE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if(offset == 0x02)
|
||||||
|
return m_videouart->read(space,0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER(wicat_state::video_timer_w)
|
WRITE8_MEMBER(wicat_state::video_timer_w)
|
||||||
{
|
{
|
||||||
logerror("I/O port 0x%04x write %02x\n",offset,data);
|
logerror("I/O port 0x%04x write %02x\n",offset,data);
|
||||||
|
if(offset == 0x02)
|
||||||
|
m_videouart->write(space,0,data);
|
||||||
}
|
}
|
||||||
|
|
||||||
READ8_MEMBER(wicat_state::video_ctrl_r)
|
READ8_MEMBER(wicat_state::video_ctrl_r)
|
||||||
@ -543,6 +596,12 @@ WRITE_LINE_MEMBER(wicat_state::dma_nmi_cb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(wicat_state::kb_data_ready)
|
||||||
|
{
|
||||||
|
m_video_kb_irq = state ? ASSERT_LINE : CLEAR_LINE;
|
||||||
|
m_videocpu->set_input_line(INPUT_LINE_IRQ0,m_video_kb_irq);
|
||||||
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(wicat_state::crtc_cb)
|
WRITE_LINE_MEMBER(wicat_state::crtc_cb)
|
||||||
{
|
{
|
||||||
m_crtc_irq = state ? ASSERT_LINE : CLEAR_LINE;
|
m_crtc_irq = state ? ASSERT_LINE : CLEAR_LINE;
|
||||||
@ -701,9 +760,8 @@ struct im6402_interface wicat_video_uart_intf =
|
|||||||
{
|
{
|
||||||
0, // RRC
|
0, // RRC
|
||||||
0, // TRC
|
0, // TRC
|
||||||
|
|
||||||
DEVCB_NULL, //m_out_tro_cb;
|
DEVCB_NULL, //m_out_tro_cb;
|
||||||
DEVCB_NULL, //m_out_dr_cb;
|
DEVCB_DRIVER_LINE_MEMBER(wicat_state,kb_data_ready), //m_out_dr_cb;
|
||||||
DEVCB_NULL, //m_out_tbre_cb;
|
DEVCB_NULL, //m_out_tbre_cb;
|
||||||
DEVCB_NULL, //m_out_tre_cb;
|
DEVCB_NULL, //m_out_tre_cb;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user