From eb23db35d9ee4a1bad90b3b7ebf37266934a5994 Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Wed, 13 Mar 2024 17:56:49 +0100 Subject: New systems marked not working ------------------------------ XDS-19P [Dirk Best, Bitsavers] --- src/emu/xtal.cpp | 1 + src/mame/mame.lst | 3 + src/mame/visual/xds.cpp | 357 ++++++++++++++++++++++++++++++++++++++++++++ src/mame/visual/xds_kbd.cpp | 295 ++++++++++++++++++++++++++++++++++++ src/mame/visual/xds_kbd.h | 61 ++++++++ 5 files changed, 717 insertions(+) create mode 100644 src/mame/visual/xds.cpp create mode 100644 src/mame/visual/xds_kbd.cpp create mode 100644 src/mame/visual/xds_kbd.h diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index 4f541f5a518..f6a54115faa 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -280,6 +280,7 @@ const double XTAL::known_xtals[] = { 16'572'000, /* 16.572_MHz_XTAL Micro-Term ACT-5A */ 16'588'800, /* 16.5888_MHz_XTAL SM 7238 */ 16'666'600, /* 16.6666_MHz_XTAL Firebeat GCU */ + 16'667'000, /* 16.667_MHz_XTAL Visual XDS-19P */ 16'669'800, /* 16.6698_MHz_XTAL Qume QVT-102 */ 16'670'000, /* 16.67_MHz_XTAL - */ 16'777'216, /* 16.777216_MHz_XTAL Nintendo Game Boy Advance */ diff --git a/src/mame/mame.lst b/src/mame/mame.lst index ee14df3f066..3699278479f 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -45693,6 +45693,9 @@ v550 // @source:visual/v1050.cpp v1050 // +@source:visual/xds.cpp +xds19p // (c) 1990 Visual Technology + @source:votrax/votrhv.cpp hc110 // 1978 Votrax/Phonic Mirror HandiVoice HC-110 hc120 // 1978 Votrax/Phonic Mirror HandiVoice HC-120 diff --git a/src/mame/visual/xds.cpp b/src/mame/visual/xds.cpp new file mode 100644 index 00000000000..b9fa325692e --- /dev/null +++ b/src/mame/visual/xds.cpp @@ -0,0 +1,357 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual Technology X Display Station (XDS19P) + + Hardware: + - MC68HC000P12F + - 2x 27C010L-15 EPROM on cartridge (+ 4 empty sockets) + - 32x KM44C256AP-8 / MCM514256AP80 / MT4C4256-8 (4M DRAM) + - 4x HM53461P-10 (128k VRAM) + - DS1225Y NVRAM + - AM7990PC LANCE + - MC68B45 CRTC + - SCN68681C1N40 + - MC68B50P + - 16.667 MHz XTAL, 100 MHz XTAL + - XTAL X1 3.6864 MHz (assumed, unreadable), XTAL X2 (unreadable) + - 4 position DIP switch + - Buzzer + + TODO: + - Verify and hook up irq mask + - Source and timing of clock interrupt + - What's irq1 connected to? + - Remaining DUART output/input port bits + - Real DIP switch meaning + - Buzzer + - Better screen rendering using the MC6845? + - Configurable RAM + - Mouse port loopback test + - "romboot" just reboots the system, something else needed? + + Notes: + - PCB marked "VISUAL 55-0106-000 REV A WL3-94V1" + - The diagnostic serial loopback test passes if you attach + the "dec_loopback" slot device + +***************************************************************************/ + +#include "emu.h" + +#include "xds_kbd.h" + +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/rs232.h" +#include "cpu/m68000/m68000.h" +#include "machine/6850acia.h" +#include "machine/am79c90.h" +#include "machine/clock.h" +#include "machine/mc68681.h" +#include "machine/nvram.h" +#include "video/mc6845.h" + +#include "screen.h" + + +namespace { + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class xds_state : public driver_device +{ +public: + xds_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_screen(*this, "screen"), + m_crtc(*this, "crtc"), + m_lance(*this, "lance"), + m_duart(*this, "duart"), + m_serialport(*this, "serialport"), + m_mouseport(*this, "mouseport"), + m_acia(*this, "acia"), + m_vram(*this, "vram"), + m_nvram(*this, "nvram", 0x2000, ENDIANNESS_BIG), + m_prom(*this, "prom"), + m_sw1(*this, "sw1") + { } + + void xds19p(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_maincpu; + required_device m_screen; + required_device m_crtc; + required_device m_lance; + required_device m_duart; + required_device m_serialport; + required_device m_mouseport; + required_device m_acia; + required_shared_ptr m_vram; + memory_share_creator m_nvram; + required_memory_region m_prom; + required_ioport m_sw1; + + uint8_t m_irq_mask = 0x00; + + void mem_map(address_map &map); + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + uint16_t lance_dma_r(offs_t offset, uint16_t mem_mask); + void lance_dma_w(offs_t offset, uint16_t data, uint16_t mem_mask); + + uint8_t dip_prom_r(offs_t offset); + void output_w(uint8_t data); + uint8_t nvram_r(offs_t offset); + void nvram_w(offs_t offset, uint8_t data); + uint8_t irq_mask_r(); + void irq_mask_w(uint8_t data); +}; + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void xds_state::mem_map(address_map &map) +{ + map(0x000000, 0x03ffff).rom().region("maincpu", 0); + map(0x200000, 0x2001ff).r(FUNC(xds_state::dip_prom_r)).umask16(0x00ff); + map(0x400000, 0x400003).rw(m_lance, FUNC(am7990_device::regs_r), FUNC(am7990_device::regs_w)); + map(0x500000, 0x500003).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)).umask16(0x00ff); + map(0x600000, 0x60001f).rw(m_duart, FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0x00ff); + map(0x700000, 0x700001).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)).umask16(0x00ff); + map(0x700002, 0x700003).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)).umask16(0x00ff); + map(0x800000, 0xbfffff).ram(); // fixed 4M for now + map(0xc00000, 0xc00003).rw(FUNC(xds_state::irq_mask_r), FUNC(xds_state::irq_mask_w)).umask16(0xff00); + map(0xd00000, 0xd1ffff).ram().share("vram"); + map(0xe00000, 0xe03fff).ram().rw(FUNC(xds_state::nvram_r), FUNC(xds_state::nvram_w)).umask16(0xff00); +} + + +//************************************************************************** +// INPUT PORT DEFINITIONS +//************************************************************************** + +static INPUT_PORTS_START( xds ) + PORT_START("sw1") + PORT_DIPNAME( 0xf, 0x5, "Video Mode?") + PORT_DIPSETTING( 0x0, "0" ) + PORT_DIPSETTING( 0x1, "1 - 1152x904 @72" ) + PORT_DIPSETTING( 0x2, "2 - 1024x864 @72" ) + PORT_DIPSETTING( 0x3, "3" ) + PORT_DIPSETTING( 0x4, "4" ) + PORT_DIPSETTING( 0x5, "5 - 1152x904 @72" ) // this (and 1) seems to be correct for this model + PORT_DIPSETTING( 0x6, "6 - 1152x904 @66" ) + PORT_DIPSETTING( 0x7, "7 - 1024x800 @88" ) + PORT_DIPSETTING( 0x8, "8" ) + PORT_DIPSETTING( 0x9, "9" ) + PORT_DIPSETTING( 0xa, "a" ) + PORT_DIPSETTING( 0xb, "b" ) + PORT_DIPSETTING( 0xc, "c" ) + PORT_DIPSETTING( 0xd, "d" ) + PORT_DIPSETTING( 0xe, "e" ) + PORT_DIPSETTING( 0xf, "f" ) +INPUT_PORTS_END + + +//************************************************************************** +// VIDEO EMULATION +//************************************************************************** + +uint32_t xds_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + for (unsigned y = 0; y < 904; y++) + { + uint32_t *line = &bitmap.pix(y); + + for (unsigned x = 0; x < 1152 / 16; x++) + { + uint16_t data = m_vram[y * (1152 / 16) + x]; + + for (unsigned b = 0; b < 16; b++) + *line++ = BIT(data, 15 - b) ? rgb_t::white() : rgb_t::black(); + } + } + + return 0; +} + + +//************************************************************************** +// NETWORK +//************************************************************************** + +uint16_t xds_state::lance_dma_r(offs_t offset, uint16_t mem_mask) +{ + return m_maincpu->space(AS_PROGRAM).read_word(offset, mem_mask); +} + +void xds_state::lance_dma_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + m_maincpu->space(AS_PROGRAM).write_word(offset, data, mem_mask); +} + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +uint8_t xds_state::dip_prom_r(offs_t offset) +{ + uint8_t data = 0; + + data |= (m_sw1->read() & 0xf) << 4; + data |= (m_prom->as_u8(offset) & 0xf); + + return data; +} + +void xds_state::output_w(uint8_t data) +{ + // 76------ unknown + // --5----- serial port spds + // ---4---- unknown + // ----3--- toggles at a rate of 32 hz + // -----2-- unknown + // ------1- serial rts + // -------0 serial dtr + + // maybe, but gives ~80 instead of ~100 in the clocktest diagnostic + if (BIT(data, 3)) + m_maincpu->pulse_input_line(2, attotime::from_usec(1)); + + m_serialport->write_dtr(BIT(~data, 0)); + m_serialport->write_rts(BIT(data, 1)); + m_serialport->write_spds(BIT(~data, 5)); +} + +uint8_t xds_state::nvram_r(offs_t offset) +{ + return m_nvram[offset]; +} + +void xds_state::nvram_w(offs_t offset, uint8_t data) +{ + m_nvram[offset] = data; +} + +uint8_t xds_state::irq_mask_r() +{ + return m_irq_mask; +} + +void xds_state::irq_mask_w(uint8_t data) +{ + logerror("irq_mask_w: %02x\n", data); + m_irq_mask = data; +} + +void xds_state::machine_start() +{ + // register for save states + save_item(NAME(m_irq_mask)); +} + +void xds_state::machine_reset() +{ +} + + +//************************************************************************** +// MACHINE DEFINTIONS +//************************************************************************** + +static void mouse_devices(device_slot_interface &device) +{ + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); +} + +void xds_state::xds19p(machine_config &config) +{ + M68000(config, m_maincpu, 16.667_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &xds_state::mem_map); + + NVRAM(config, "nvram"); + + // video hardware + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(100_MHz_XTAL, 1472, 0, 1152, 941, 0, 904); + m_screen->set_screen_update(FUNC(xds_state::screen_update)); + + MC6845(config, m_crtc, 100_MHz_XTAL / 64); + m_crtc->set_screen("screen"); + m_crtc->set_show_border_area(false); + m_crtc->set_char_width(64); + + AM7990(config, m_lance, 0); + m_lance->intr_out().set_inputline(m_maincpu, 5).invert(); + m_lance->dma_in().set(FUNC(xds_state::lance_dma_r)); + m_lance->dma_out().set(FUNC(xds_state::lance_dma_w)); + + MC68681(config, m_duart, 3.6864_MHz_XTAL); // xtal unreadable + m_duart->irq_cb().set_inputline(m_maincpu, 4); + m_duart->outport_cb().set(FUNC(xds_state::output_w)); + m_duart->a_tx_cb().set(m_mouseport, FUNC(rs232_port_device::write_txd)); + m_duart->b_tx_cb().set(m_serialport, FUNC(rs232_port_device::write_txd)); + + RS232_PORT(config, m_mouseport, mouse_devices, "msystems_mouse"); + m_mouseport->rxd_handler().set(m_duart, FUNC(mc68681_device::rx_a_w)); + m_mouseport->dsr_handler().set(m_duart, FUNC(mc68681_device::ip4_w)); + + RS232_PORT(config, m_serialport, default_rs232_devices, nullptr); + m_serialport->rxd_handler().set(m_duart, FUNC(mc68681_device::rx_b_w)); + m_serialport->dsr_handler().set(m_duart, FUNC(mc68681_device::ip0_w)); + m_serialport->cts_handler().set(m_duart, FUNC(mc68681_device::ip1_w)); + m_serialport->dcd_handler().set(m_duart, FUNC(mc68681_device::ip2_w)); + m_serialport->si_handler().set(m_duart, FUNC(mc68681_device::ip5_w)); + + ACIA6850(config, m_acia, 0); + m_acia->irq_handler().set_inputline(m_maincpu, 3); + m_acia->txd_handler().set("kbd", FUNC(xds_kbd_hle_device::rx_w)); + + // probably clocked externally instead + clock_device &acia_clock(CLOCK(config, "acia_clock", 1200 * 16)); + acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_rxc)); + acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_txc)); + + // keyboard + xds_kbd_hle_device &kbd(XDS_KBD_HLE(config, "kbd")); + kbd.tx_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); + kbd.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts)); +} + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( xds19p ) + ROM_REGION16_BE(0x40000, "maincpu", 0) + ROM_LOAD16_BYTE("boot_30.e6", 0x00000, 0x20000, CRC(32449da2) SHA1(e1bc41987fb9c7da5b7fed5d6714c3451be4438c)) + ROM_LOAD16_BYTE("boot_30.e5", 0x00001, 0x20000, CRC(a577087f) SHA1(2fe9d4d49fd6e8ecd230f8097f7004238afbb626)) + + ROM_REGION(0x100, "prom", 0) + ROM_LOAD("1837.e06d", 0x000, 0x100, CRC(b5d9f883) SHA1(28303155c515ac2638a06123fbf7e55f89dd2af9)) +ROM_END + + +} // anonymous namespace + + +//************************************************************************** +// SYSTEM DRIVERS +//************************************************************************** + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1990, xds19p, 0, 0, xds19p, xds, xds_state, empty_init, "Visual Technology", "XDS-19P", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/visual/xds_kbd.cpp b/src/mame/visual/xds_kbd.cpp new file mode 100644 index 00000000000..ed96caad39f --- /dev/null +++ b/src/mame/visual/xds_kbd.cpp @@ -0,0 +1,295 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual X Display Station Keyboard (HLE) + + TODO: + - Map unknown keys + + Notes: + - Everything here is guessed, no picture of the keyboard available + - Possibly identical to the Visual 220 keyboard + +***************************************************************************/ + +#include "emu.h" +#include "xds_kbd.h" +#include "machine/keyboard.ipp" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(XDS_KBD_HLE, xds_kbd_hle_device, "xds_kbd_hle", "XDS Keyboard (HLE)") + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +static INPUT_PORTS_START( keyboard ) + PORT_START("row_0") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 00 */ PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 01 */ PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 02 */ PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 03 */ PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 04 */ PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 05 */ PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 06 */ PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 07 */ PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 08 */ PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 09 */ PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0a */ PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0b */ PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0c */ PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0d */ PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0e */ PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0f */ PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + + PORT_START("row_1") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 10 */ PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 11 */ PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 12 */ PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 13 */ PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 14 */ PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 15 */ PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 16 */ PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 17 */ PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 18 */ PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 19 */ PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1a */ PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1b */ PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1c */ PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1d */ PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1e */ PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1f */ PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + + PORT_START("row_2") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 20 */ PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 21 */ PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 22 */ PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 23 */ PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 24 */ PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 25 */ PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 26 */ PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 27 */ PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 28 */ PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 29 */ PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2a */ PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2b */ PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2c */ PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('<') PORT_CHAR('>') + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2d */ PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2e */ PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2f */ PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + + PORT_START("row_3") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 30 */ PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 31 */ PORT_NAME("31") // shown in keyboard test + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 32 */ PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 33 */ PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 34 */ PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 35 */ PORT_NAME("35") + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 36 */ PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // or rshift + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 37 */ PORT_NAME("37") + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 38 */ PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // or lshift + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 39 */ PORT_NAME("39") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3a */ PORT_NAME("3a") // shown in keyboard test + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3b */ PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3c */ PORT_NAME("PF1") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3d */ PORT_NAME("PF2") + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3e */ PORT_NAME("PF3") + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3f */ PORT_NAME("PF4") + + PORT_START("row_4") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 40 */ PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 41 */ PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 42 */ PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 43 */ PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 44 */ PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 45 */ PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 46 */ PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 47 */ PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 48 */ PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 49 */ PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4a */ PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4b */ PORT_CODE(KEYCODE_COMMA_PAD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4c */ PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Keypad .") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4d */ PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4e */ PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4f */ PORT_NAME("4f") // shown in keyboard test + + PORT_START("row_5") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 50 */ PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_NAME("F1 (HOLD SCREEN)") + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 51 */ PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_NAME("F2 (PRINT SCREEN)") + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 52 */ PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_NAME("F3 (SET-UP)") + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 53 */ PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_NAME("F4 (DATA/TALK)") + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 54 */ PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_NAME("F5 (BREAK)") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 55 */ PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 56 */ PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 57 */ PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 58 */ PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 59 */ PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5a */ PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_NAME("F11 (ESC)") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5b */ PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_NAME("F12 (BS)") + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5c */ PORT_CODE(KEYCODE_F13) PORT_CHAR(UCHAR_MAMEKEY(F13)) PORT_NAME("F13 (LF)") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5d */ PORT_CODE(KEYCODE_F14) PORT_CHAR(UCHAR_MAMEKEY(F14)) + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5e */ PORT_CODE(KEYCODE_F15) PORT_CHAR(UCHAR_MAMEKEY(F15)) PORT_NAME("F15 (HELP)") + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5f */ PORT_CODE(KEYCODE_F16) PORT_CHAR(UCHAR_MAMEKEY(F16)) PORT_NAME("F16 (DO)") + + PORT_START("row_6") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 60 */ PORT_CODE(KEYCODE_F17) PORT_CHAR(UCHAR_MAMEKEY(F17)) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 61 */ PORT_CODE(KEYCODE_F18) PORT_CHAR(UCHAR_MAMEKEY(F18)) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 62 */ PORT_CODE(KEYCODE_F19) PORT_CHAR(UCHAR_MAMEKEY(F19)) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 63 */ PORT_CODE(KEYCODE_F20) PORT_CHAR(UCHAR_MAMEKEY(F20)) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 64 */ PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 65 */ PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 66 */ PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 67 */ PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 68 */ PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 69 */ PORT_NAME("Find") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6a */ PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_NAME("Insert Here") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6b */ PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_NAME("Remove") + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6c */ PORT_NAME("Select") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6d */ PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) PORT_NAME("Prev. Screen") + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6e */ PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_NAME("Next Screen") + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 6f */ + + PORT_START("row_7") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNUSED) /* 70 */ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_UNUSED) /* 71 */ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNUSED) /* 72 */ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_UNUSED) /* 73 */ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_UNUSED) /* 74 */ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_UNUSED) /* 75 */ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_UNUSED) /* 76 */ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNUSED) /* 77 */ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_UNUSED) /* 78 */ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_UNUSED) /* 79 */ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7a */ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7b */ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7c */ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7d */ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7e */ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7f */ +INPUT_PORTS_END + +ioport_constructor xds_kbd_hle_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( keyboard ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// xds_kbd_hle_device - constructor +//------------------------------------------------- + +xds_kbd_hle_device::xds_kbd_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, XDS_KBD_HLE, tag, owner, clock), + device_buffered_serial_interface(mconfig, *this), + device_matrix_keyboard_interface(mconfig, *this, "row_0", "row_1", "row_2", "row_3", "row_4", "row_5", "row_6", "row_7"), + m_tx_handler(*this), + m_cts_handler(*this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void xds_kbd_hle_device::device_start() +{ + // signal ready + m_cts_handler(0); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void xds_kbd_hle_device::device_reset() +{ + clear_fifo(); + + receive_register_reset(); + transmit_register_reset(); + + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1); + set_rcv_rate(1200); + set_tra_rate(1200); + + reset_key_state(); + start_processing(attotime::from_hz(1200)); + typematic_stop(); +} + +//------------------------------------------------- +// tra_callback - send bit to host +//------------------------------------------------- + +void xds_kbd_hle_device::tra_callback() +{ + m_tx_handler(transmit_register_get_data_bit()); +} + +//------------------------------------------------- +// received_byte - handle received byte +//------------------------------------------------- + +void xds_kbd_hle_device::received_byte(uint8_t byte) +{ + logerror("Received from host: %02x\n", byte); +} + +//------------------------------------------------- +// key_make - handle a key being pressed +//------------------------------------------------- + +void xds_kbd_hle_device::key_make(uint8_t row, uint8_t column) +{ + // send the make code + uint8_t code = row * 16 + column; + transmit_byte(code); + + // no typematic for modifier keys + if (code != 0x34 && code != 0x36 && code != 0x38) + typematic_start(row, column, attotime::from_msec(750), attotime::from_msec(50)); +} + +//------------------------------------------------- +// key_break - handle a key being released +//------------------------------------------------- + +void xds_kbd_hle_device::key_break(uint8_t row, uint8_t column) +{ + // send the break code + uint8_t code = row * 16 + column; + transmit_byte(0x80 | code); + + if (typematic_is(row, column)) + typematic_stop(); +} + +//------------------------------------------------- +// key_repeat - handle a key being repeated +//------------------------------------------------- + +void xds_kbd_hle_device::key_repeat(u8 row, u8 column) +{ + uint8_t code = row * 16 + column; + transmit_byte(code); +} + +//------------------------------------------------- +// rx_w - receive bit from host +//------------------------------------------------- + +void xds_kbd_hle_device::rx_w(int state) +{ + device_buffered_serial_interface::rx_w(state); +} diff --git a/src/mame/visual/xds_kbd.h b/src/mame/visual/xds_kbd.h new file mode 100644 index 00000000000..85f61188d78 --- /dev/null +++ b/src/mame/visual/xds_kbd.h @@ -0,0 +1,61 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual X Display Station Keyboard (HLE) + +***************************************************************************/ + +#ifndef MAME_VISUAL_XDS_KBD_H +#define MAME_VISUAL_XDS_KBD_H + +#pragma once + +#include "machine/keyboard.h" +#include "diserial.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class xds_kbd_hle_device : + public device_t, + public device_buffered_serial_interface<16>, + protected device_matrix_keyboard_interface<8> +{ +public: + // construction/destruction + xds_kbd_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + // callbacks + auto tx_handler() { return m_tx_handler.bind(); } + auto cts_handler() { return m_cts_handler.bind(); } + + // from host + void rx_w(int state); + +protected: + // device_t overrides + virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + virtual void device_reset() override; + + // device_buffered_serial_interface overrides + virtual void tra_callback() override; + virtual void received_byte(uint8_t byte) override; + + // device_matrix_keyboard_interface overrides + virtual void key_make(uint8_t row, uint8_t column) override; + virtual void key_break(uint8_t row, uint8_t column) override; + virtual void key_repeat(uint8_t row, uint8_t column) override; + +private: + devcb_write_line m_tx_handler; + devcb_write_line m_cts_handler; +}; + +// device type definition +DECLARE_DEVICE_TYPE(XDS_KBD_HLE, xds_kbd_hle_device) + +#endif // MAME_VISUAL_XDS_KBD_H -- cgit v1.2.3