From 52e0c86f66faf7bd8bfb0e9ab243f37451d7dbe7 Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 25 Dec 2022 06:57:28 -0500 Subject: [PATCH] braiplus: Add preliminary keyboard --- src/mame/homelab/braiplus.cpp | 158 +++++++++++++++++++++++++++++----- 1 file changed, 135 insertions(+), 23 deletions(-) diff --git a/src/mame/homelab/braiplus.cpp b/src/mame/homelab/braiplus.cpp index 4fd85db6c9c..73d57b47e75 100644 --- a/src/mame/homelab/braiplus.cpp +++ b/src/mame/homelab/braiplus.cpp @@ -25,6 +25,7 @@ Floppy disk holds 792kb (formatted). #include "emu.h" #include "cpu/z80/z80.h" #include "machine/clock.h" +#include "machine/f4702.h" #include "machine/i8251.h" #include "machine/wd_fdc.h" #include "machine/z80pio.h" @@ -36,26 +37,41 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_pio(*this, "pio%u", 1U) + , m_keyboard(*this, "K%u", 0U) + , m_baud_rate(0) { } void braiplus(machine_config &config); private: + void baud_rate_w(u8 data); + u8 baud_rate_r(); void bank_w(u8 data); void unknown_w(u8 data); - u8 unknown1_r(); - u8 unknown2_r(); - u8 unknown_dummy_r(); + u8 keyboard_r(offs_t offset); void mem_map(address_map &map); void io_map(address_map &map); required_device m_maincpu; required_device_array m_pio; + required_ioport_array<10> m_keyboard; + + u8 m_baud_rate; }; +void braiplus_state::baud_rate_w(u8 data) +{ + m_baud_rate = data >> 4; +} + +u8 braiplus_state::baud_rate_r() +{ + return m_baud_rate; +} + void braiplus_state::bank_w(u8 data) { // TODO: bankswitching @@ -66,33 +82,24 @@ void braiplus_state::unknown_w(u8 data) // TODO: unknown (only high nibble used) } -u8 braiplus_state::unknown1_r() +u8 braiplus_state::keyboard_r(offs_t offset) { - // TODO: keyboard input? (only high nibble used) - return 0; -} + u8 ret = offset < 0x14 ? m_keyboard[offset >> 1]->read() : 0xff; + if (BIT(offset, 0)) + ret >>= 4; + else + ret &= 0x0f; -u8 braiplus_state::unknown2_r() -{ - // TODO: keyboard input? (only high nibble used) - return 0; -} - -u8 braiplus_state::unknown_dummy_r() -{ - // TODO: what is this? (value always discarded) - return 0xff; + // TODO: high nibble appears to be used by an optional PC/XT keyboard adapter + return ret | 0xf0; } void braiplus_state::mem_map(address_map &map) { map(0x0000, 0x3fff).rom().region("maincpu", 0); - map(0x8000, 0x8000).r(FUNC(braiplus_state::unknown1_r)); - map(0x8001, 0x8001).r(FUNC(braiplus_state::unknown2_r)); - map(0x8002, 0x8002).r(FUNC(braiplus_state::unknown_dummy_r)); + map(0x8000, 0x801f).r(FUNC(braiplus_state::keyboard_r)); map(0xa000, 0xbfff).ram(); - map(0xf200, 0xf2ff).ram(); - map(0xf800, 0xffff).ram(); + map(0xf000, 0xffff).ram(); } void braiplus_state::io_map(address_map &map) @@ -101,13 +108,112 @@ void braiplus_state::io_map(address_map &map) map(0x04, 0x07).rw(m_pio[0], FUNC(z80pio_device::read), FUNC(z80pio_device::write)); map(0x08, 0x0b).rw(m_pio[1], FUNC(z80pio_device::read), FUNC(z80pio_device::write)); map(0x0c, 0x0d).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write)); - map(0x10, 0x10).rw("fdc", FUNC(wd2793_device::read), FUNC(wd2793_device::write)); + map(0x10, 0x13).rw("fdc", FUNC(wd2793_device::read), FUNC(wd2793_device::write)); map(0x14, 0x14).w(FUNC(braiplus_state::bank_w)); map(0x18, 0x18).w(FUNC(braiplus_state::unknown_w)); } static INPUT_PORTS_START(braiplus) + PORT_START("K0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Ctrl") PORT_CODE(KEYCODE_LCONTROL) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Ctrl") PORT_CODE(KEYCODE_RCONTROL) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key A0") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key A1") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key A2") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key A3") + + PORT_START("K1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('"') PORT_CODE(KEYCODE_2) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('&') PORT_CODE(KEYCODE_6) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('\'') PORT_CODE(KEYCODE_7) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('(') PORT_CODE(KEYCODE_8) + + PORT_START("K2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I) + + PORT_START("K3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K) + + PORT_START("K4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA) + + PORT_START("K5") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x00e9, 0x7b) PORT_CHAR(0x00c9, 0x5b) PORT_NAME("\xc3\x89") PORT_CODE(KEYCODE_COLON) // É + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x1b) PORT_CODE(KEYCODE_ESC) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x00e1, 0x60) PORT_CHAR(0x00c1, 0x40) PORT_NAME("\xc3\x81") PORT_CODE(KEYCODE_QUOTE) // Á + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(':') PORT_CHAR('*') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR('_') PORT_CODE(KEYCODE_0) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR(')') PORT_CODE(KEYCODE_9) + + PORT_START("K6") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('?') PORT_CHAR('/') PORT_CODE(KEYCODE_SLASH) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('-') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR('+') + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x0d) PORT_NAME("CR") PORT_CODE(KEYCODE_ENTER) + + PORT_START("K7") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x00f3, 0x7e) PORT_CHAR(0x00d3, 0x5e) PORT_NAME("\xc3\x93") PORT_CODE(KEYCODE_CLOSEBRACE) // Ó + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x00f6, 0x7c) PORT_CHAR(0x00d6, 0x5c) PORT_NAME("\xc3\x96") PORT_CODE(KEYCODE_MINUS) // Ö + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 5F") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x00fc, 0x7d) PORT_CHAR(0x00dc, 0x5d) PORT_NAME("\xc3\x9c") PORT_CODE(KEYCODE_EQUALS) // Ü + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 05") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 08") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 18") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 04") + + PORT_START("K8") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E0") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E1") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E2") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E3") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E4") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E5") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E6") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E7") + + PORT_START("K9") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E8") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E9") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key EA") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key EB") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key EC") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key ED") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key EE") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key EF") INPUT_PORTS_END static const z80_daisy_config daisy_chain[] = @@ -129,6 +235,12 @@ void braiplus_state::braiplus(machine_config &config) Z80PIO(config, m_pio[1], 4'000'000); m_pio[1]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + m_pio[1]->out_pa_callback().set(FUNC(braiplus_state::baud_rate_w)); + + f4702_device &brg(F4702(config, "brg", 2.4576_MHz_XTAL)); + brg.s_callback().set(FUNC(braiplus_state::baud_rate_r)); + brg.z_callback().set("usart", FUNC(i8251_device::write_txc)); + brg.z_callback().append("usart", FUNC(i8251_device::write_rxc)); i8251_device &usart(I8251(config, "usart", 2'000'000)); usart.rxrdy_handler().set(m_pio[1], FUNC(z80pio_device::pa3_w));