From 56008072aeeb41c008b714a7cc6852042b3ea69e Mon Sep 17 00:00:00 2001 From: holub Date: Mon, 7 Oct 2024 09:44:07 -0400 Subject: -sinclair/chloe.cpp: Added external PC keyboard support; Fixed ULA attributes decoding (#12845) -sinclair/screen_ula.cpp: Fixed attributes decoding. -sinclair/tsconf.cpp: Document DMA controller clock source. --- src/mame/sinclair/chloe.cpp | 76 +++++++++++++++++++++++++++++----------- src/mame/sinclair/screen_ula.cpp | 12 +++++-- src/mame/sinclair/tsconf.cpp | 2 +- 3 files changed, 67 insertions(+), 23 deletions(-) diff --git a/src/mame/sinclair/chloe.cpp b/src/mame/sinclair/chloe.cpp index 7f88fcebd59..16bc9c0ecf9 100644 --- a/src/mame/sinclair/chloe.cpp +++ b/src/mame/sinclair/chloe.cpp @@ -9,6 +9,7 @@ #include "screen_ula.h" #include "spec128.h" +#include "machine/8042kbdc.h" #include "machine/spi_sdcard.h" #include "sound/ay8910.h" #include "sound/dac.h" @@ -55,6 +56,7 @@ public: , m_io_mouse(*this, "mouse_input%u", 1U) , m_ay(*this, "ay%u", 0U) , m_covox(*this, "covox") + , m_kbdc(*this, "pc_kbdc") {} void chloe(machine_config &config); @@ -73,6 +75,7 @@ protected: void map_mem(address_map &map) ATTR_COLD; void map_io(address_map &map) ATTR_COLD; + void irq_keyboard_w(int state); u8 kbd_fe_r(offs_t offset); u8 divmmc_neutral_r(offs_t offset); u8 divmmc_enable_r(offs_t offset); @@ -110,6 +113,7 @@ private: required_ioport_array<3> m_io_mouse; required_device_array m_ay; required_device m_covox; + required_device m_kbdc; u8 m_timex_mmu; u8 m_port_ff_data; @@ -584,6 +588,21 @@ void chloe_state::map_regs(address_map &map) m_uno_regs_data[0x01] = data; LOGMEM("UnoMapper %d\n", data); })); + map(0x04, 0x04).lr8(NAME([this]() // SCANCODE + { + u8 dat = m_kbdc->data_r(0); + if (dat == 0xf0) + { + dat = 0; + m_kbdc->data_r(0); + } + return dat; + })); + map(0x05, 0x05).lr8(NAME([this]() // KBSTATUS + { + return m_uno_regs_data[0x05]; + })); + // 0x07 KEYMAP map(0x0b, 0x0b).lw8(NAME([this](u8 data) { m_uno_regs_data[0x0b] = data; @@ -597,6 +616,14 @@ void chloe_state::map_regs(address_map &map) map(0xa0, 0xa6).w(FUNC(chloe_state::dma_reg_w)); } +void chloe_state::irq_keyboard_w(int state) +{ + if (state) + m_uno_regs_data[0x05] |= 5; + else + m_uno_regs_data[0x05] &= ~5; +} + u8 chloe_state::kbd_fe_r(offs_t offset) { u16 data = 0xffff; @@ -686,16 +713,16 @@ INPUT_PORTS_START(chloe) PORT_BIT(0xe720, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("IO_LINE3") /* 0xF7FE */ - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 Tab !") PORT_CODE(KEYCODE_1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHAR('1') PORT_CHAR('!') - PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_TAB) PORT_CODE(KEYCODE_1_PAD) - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 CLk @") PORT_CODE(KEYCODE_2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CHAR('2') PORT_CHAR('@') - PORT_CODE(KEYCODE_F2) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CODE(KEYCODE_2_PAD) - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 PgU #") PORT_CODE(KEYCODE_3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CHAR('3') PORT_CHAR('#') - PORT_CODE(KEYCODE_F3) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_3_PAD) - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 PgD $") PORT_CODE(KEYCODE_4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_CHAR('4') PORT_CHAR('$') - PORT_CODE(KEYCODE_F4) PORT_CODE(KEYCODE_PGDN) PORT_CODE(KEYCODE_4_PAD) - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 Lft %") PORT_CODE(KEYCODE_5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CHAR('5') PORT_CHAR('%') - PORT_CODE(KEYCODE_F5) PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_5_PAD) + PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 Tab !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_CODE(KEYCODE_TAB) PORT_CODE(KEYCODE_1_PAD) + PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 CLk @") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_CODE(KEYCODE_CAPSLOCK) PORT_CODE(KEYCODE_2_PAD) + PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 PgU #") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_3_PAD) + PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 PgD $") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_CODE(KEYCODE_PGDN) PORT_CODE(KEYCODE_4_PAD) + PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 Lft %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_5_PAD) PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CS Line3") PORT_CODE(KEYCODE_TAB) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_PGDN) PORT_CODE(KEYCODE_LEFT) PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SS Line3") PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("! (SS+KEY)") PORT_CODE(KEYCODE_1) @@ -706,16 +733,16 @@ INPUT_PORTS_START(chloe) PORT_BIT(0xe020, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("IO_LINE4") /* 0xEFFE */ - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0 BSp _") PORT_CODE(KEYCODE_0) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_CHAR('0') PORT_CHAR('_') - PORT_CODE(KEYCODE_F10) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_0_PAD) - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 Ctr )") PORT_CODE(KEYCODE_9) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_CHAR('9') PORT_CHAR(')') - PORT_CODE(KEYCODE_F9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_LCONTROL) - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 Rgt (") PORT_CODE(KEYCODE_8) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_CHAR('8') PORT_CHAR('(') - PORT_CODE(KEYCODE_F8) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(KEYCODE_8_PAD) - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 Up '") PORT_CODE(KEYCODE_7) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_CHAR('7') PORT_CHAR('\'') - PORT_CODE(KEYCODE_F7) PORT_CODE(KEYCODE_UP) PORT_CODE(KEYCODE_QUOTE) PORT_CODE(KEYCODE_7_PAD) - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 Dwn &") PORT_CODE(KEYCODE_6) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_CHAR('6') PORT_CHAR('&') - PORT_CODE(KEYCODE_F6) PORT_CODE(KEYCODE_DOWN) PORT_CODE(KEYCODE_6_PAD) + PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0 BSp _") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('_') + PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_0_PAD) + PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 Ctr )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') + PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_LCONTROL) + PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 Rgt (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') + PORT_CODE(KEYCODE_RIGHT) PORT_CODE(KEYCODE_8_PAD) + PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 Up '") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') + PORT_CODE(KEYCODE_UP) PORT_CODE(KEYCODE_QUOTE) PORT_CODE(KEYCODE_7_PAD) + PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 Dwn &") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') + PORT_CODE(KEYCODE_DOWN) PORT_CODE(KEYCODE_6_PAD) PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CS Line4") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(KEYCODE_UP) PORT_CODE(KEYCODE_DOWN) PORT_CODE(KEYCODE_LCONTROL) PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SS Line4") PORT_CODE(KEYCODE_QUOTE) PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("_ (SS+KEY)") PORT_CODE(KEYCODE_MINUS) @@ -951,6 +978,15 @@ void chloe_state::chloe(machine_config &config) .add_route(ALL_OUTPUTS, "lspeaker", 0.75) .add_route(ALL_OUTPUTS, "rspeaker", 0.75); + KBDC8042(config, m_kbdc); + m_kbdc->set_keyboard_type(kbdc8042_device::KBDC8042_STANDARD); + m_kbdc->set_interrupt_type(kbdc8042_device::KBDC8042_SINGLE); + m_kbdc->input_buffer_full_callback().set(FUNC(chloe_state::irq_keyboard_w)); + m_kbdc->set_keyboard_tag("at_keyboard"); + + at_keyboard_device &at_keyb(AT_KEYB(config, "at_keyboard", pc_keyboard_device::KEYBOARD_TYPE::AT, 2)); + at_keyb.keypress().set(m_kbdc, FUNC(kbdc8042_device::keyboard_w)); + SOFTWARE_LIST(config, "cass_list_t").set_original("timex_cass"); } diff --git a/src/mame/sinclair/screen_ula.cpp b/src/mame/sinclair/screen_ula.cpp index ef455e80603..12635c832dc 100644 --- a/src/mame/sinclair/screen_ula.cpp +++ b/src/mame/sinclair/screen_ula.cpp @@ -215,8 +215,16 @@ std::pair screen_ula_device::parse_attribute(u8 attr) } else if (m_ulap_en) { - ink = 0xc0 | ((attr & 0xc0) >> 3) | BIT(attr, 0, 3); - pap = 0xe0 | ((attr & 0xc0) >> 3) | BIT(attr, 3, 3); + if (m_ula_type == ULA_TYPE_NEXT) + { + ink = 0xc0 | ((attr & 0xc0) >> 3) | BIT(attr, 0, 3); + pap = 0xe0 | ((attr & 0xc0) >> 3) | BIT(attr, 3, 3); + } + else + { + ink = 0xc0 | ((attr & 0xc0) >> 2) | BIT(attr, 0, 3); + pap = 0xc8 | ((attr & 0xc0) >> 2) | BIT(attr, 3, 3); + } } else { diff --git a/src/mame/sinclair/tsconf.cpp b/src/mame/sinclair/tsconf.cpp index feae471d8d9..ebe7ec88a71 100644 --- a/src/mame/sinclair/tsconf.cpp +++ b/src/mame/sinclair/tsconf.cpp @@ -284,7 +284,7 @@ void tsconf_state::tsconf(machine_config &config) GLUKRS(config, m_glukrs); - TSCONF_DMA(config, m_dma, 14_MHz_XTAL * 2); + TSCONF_DMA(config, m_dma, 28_MHz_XTAL); m_dma->in_mreq_callback().set(FUNC(tsconf_state::ram_read16)); m_dma->out_mreq_callback().set(FUNC(tsconf_state::ram_write16)); m_dma->in_spireq_callback().set(FUNC(tsconf_state::spi_read16)); -- cgit v1.2.3