From fc855bc922616385964c3fde9f0a3cb715de3e74 Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Sun, 6 Sep 2020 03:38:21 +0200 Subject: New not working machine ----------------------- Informer 207/376 [Dirk Best] --- scripts/target/mame/mess.lua | 8 + src/mame/drivers/informer_207_376.cpp | 293 +++++++++++++++++++++++++++++ src/mame/machine/informer_207_376_kbd.cpp | 299 ++++++++++++++++++++++++++++++ src/mame/machine/informer_207_376_kbd.h | 60 ++++++ src/mame/mame.lst | 3 + src/mame/mess.flt | 1 + 6 files changed, 664 insertions(+) create mode 100644 src/mame/drivers/informer_207_376.cpp create mode 100644 src/mame/machine/informer_207_376_kbd.cpp create mode 100644 src/mame/machine/informer_207_376_kbd.h diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 44910c79d44..a462b5ea6f9 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1227,6 +1227,7 @@ function linkProjects_mame_mess(_target, _subtarget) "ibm6580", "ie15", "imp", + "informer", "intel", "interpro", "interton", @@ -2598,6 +2599,13 @@ files { MAME_DIR .. "src/mame/drivers/ie15.cpp", } +createMESSProjects(_target, _subtarget, "informer") +files { + MAME_DIR .. "src/mame/drivers/informer_207_376.cpp", + MAME_DIR .. "src/mame/machine/informer_207_376_kbd.cpp", + MAME_DIR .. "src/mame/machine/informer_207_376_kbd.h", +} + createMESSProjects(_target, _subtarget, "intel") files { MAME_DIR .. "src/mame/drivers/basic52.cpp", diff --git a/src/mame/drivers/informer_207_376.cpp b/src/mame/drivers/informer_207_376.cpp new file mode 100644 index 00000000000..a8eb6500334 --- /dev/null +++ b/src/mame/drivers/informer_207_376.cpp @@ -0,0 +1,293 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Informer 207/376 + + IBM 3270 compatible terminal + + Hardware: + - M6809 + - Z80SCC 8530 + - 6850 ACIA (up to 4) + - X2212P NVRAM + + TODO: + - Redump bad ROMs + - Dump keyboard controller and emulate it (currently HLE'd) + - Problably needs improvements to at least the Z80SCC to + properly support synchrous modes + - Figure out unknown reads/writes to the memory + - Verify NMI hookup + - Verify clock speeds + + Notes: + - Thanks to charcole and his zmachine3270 project at + https://github.com/charcole/zmachine3270 + +***************************************************************************/ + +#include "emu.h" +#include "cpu/m6809/m6809.h" +#include "machine/6850acia.h" +#include "machine/clock.h" +#include "machine/input_merger.h" +#include "machine/nvram.h" +#include "machine/z80scc.h" +#include "video/mc6845.h" +#include "bus/rs232/rs232.h" +#include "bus/rs232/printer.h" +#include "machine/informer_207_376_kbd.h" +#include "emupal.h" +#include "screen.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class informer_207_376_state : public driver_device +{ +public: + informer_207_376_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_crtc(*this, "crtc"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), + m_scc(*this, "scc"), + m_acia(*this, "acia%u", 0U), + m_ram(*this, "ram"), + m_chargen(*this, "chargen"), + m_nmi_enabled(false) + { } + + void informer_207_376(machine_config &config); + +protected: + void machine_start() override; + void machine_reset() override; + +private: + required_device m_maincpu; + required_device m_crtc; + required_device m_screen; + required_device m_palette; + required_device m_scc; + required_device_array m_acia; + required_shared_ptr m_ram; + required_region_ptr m_chargen; + + void mem_map(address_map &map); + + MC6845_UPDATE_ROW(crtc_update_row); + + void vsync_w(int state); + void nmi_control_w(uint8_t data); + + bool m_nmi_enabled; +}; + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void informer_207_376_state::mem_map(address_map &map) +{ + map(0x0000, 0x7fff).ram().share("ram"); + map(0x8000, 0x8000).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); + map(0x8001, 0x8001).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); + map(0x8400, 0x8400).lr8(NAME([] () { return 0xff; })).nopw(); // ? + map(0x8802, 0x8803).rw(m_acia[0], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); + map(0x8804, 0x8805).rw(m_acia[1], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); + map(0x8c00, 0x8c00).w(FUNC(informer_207_376_state::nmi_control_w)); + map(0x9400, 0x9403).rw(m_scc, FUNC(scc85c30_device::ab_dc_r), FUNC(scc85c30_device::ab_dc_w)); + map(0x9c00, 0x9cff).ram().share("nvram"); + map(0xa000, 0xffff).rom().region("maincpu", 0); +} + + +//************************************************************************** +// INPUT PORT DEFINITIONS +//************************************************************************** + +static INPUT_PORTS_START( informer_207_376 ) +INPUT_PORTS_END + + +//************************************************************************** +// VIDEO EMULATION +//************************************************************************** + +void informer_207_376_state::vsync_w(int state) +{ + if (m_nmi_enabled && state == 1) + { + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + } +} + +MC6845_UPDATE_ROW( informer_207_376_state::crtc_update_row ) +{ + const pen_t *pen = m_palette->pens(); + + for (int x = 0; x < x_count; x++) + { + uint8_t code = m_ram[ma + x]; + uint8_t data = m_chargen[(code << 4) + ra]; + + if (x == cursor_x) + data = 0xff; + + // draw 8 pixels of the character + bitmap.pix32(y, x * 8 + 7) = pen[BIT(data, 0)]; + bitmap.pix32(y, x * 8 + 6) = pen[BIT(data, 1)]; + bitmap.pix32(y, x * 8 + 5) = pen[BIT(data, 2)]; + bitmap.pix32(y, x * 8 + 4) = pen[BIT(data, 3)]; + bitmap.pix32(y, x * 8 + 3) = pen[BIT(data, 4)]; + bitmap.pix32(y, x * 8 + 2) = pen[BIT(data, 5)]; + bitmap.pix32(y, x * 8 + 1) = pen[BIT(data, 6)]; + bitmap.pix32(y, x * 8 + 0) = pen[BIT(data, 7)]; + } +} + +static const gfx_layout char_layout = +{ + 8,11, + RGN_FRAC(1,1), + 1, + { 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8 }, + 8*16 +}; + +static GFXDECODE_START(chars) + GFXDECODE_ENTRY("chargen", 0, char_layout, 0, 1) +GFXDECODE_END + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +void informer_207_376_state::nmi_control_w(uint8_t data) +{ + // 76543--- unused? + // -----21- nmi enable? + // -------0 unused? + + m_nmi_enabled = bool(data & 0x06); +} + +void informer_207_376_state::machine_start() +{ + // register for save states + save_item(NAME(m_nmi_enabled)); +} + +void informer_207_376_state::machine_reset() +{ + m_nmi_enabled = false; +} + + +//************************************************************************** +// MACHINE DEFINTIONS +//************************************************************************** + +void printer_devices(device_slot_interface &device) +{ + device.option_add("printer", SERIAL_PRINTER); +} + +void informer_207_376_state::informer_207_376(machine_config &config) +{ + MC6809(config, m_maincpu, 36_MHz_XTAL / 4); // unknown clock + m_maincpu->set_addrmap(AS_PROGRAM, &informer_207_376_state::mem_map); + + input_merger_device &cpu_irq(INPUT_MERGER_ANY_HIGH(config, "cpu_irq")); + cpu_irq.output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 2x X2212P + + SCC85C30(config, m_scc, 0); // unknown clock + m_scc->out_txda_callback().set("com1", FUNC(rs232_port_device::write_txd)); + m_scc->out_dtra_callback().set("com1", FUNC(rs232_port_device::write_dtr)); + m_scc->out_rtsa_callback().set("com1", FUNC(rs232_port_device::write_rts)); + m_scc->out_txdb_callback().set("com2", FUNC(rs232_port_device::write_txd)); + m_scc->out_dtrb_callback().set("com2", FUNC(rs232_port_device::write_dtr)); + m_scc->out_rtsb_callback().set("com2", FUNC(rs232_port_device::write_rts)); + m_scc->out_int_callback().set("cpu_irq", FUNC(input_merger_device::in_w<0>)); + + ACIA6850(config, m_acia[0], 0); // unknown clock + m_acia[0]->txd_handler().set("kbd", FUNC(informer_207_376_kbd_hle_device::rx_w)); + m_acia[0]->irq_handler().set("cpu_irq", FUNC(input_merger_device::in_w<1>)); + + ACIA6850(config, m_acia[1], 0); // unknown clock + m_acia[1]->txd_handler().set("printer", FUNC(rs232_port_device::write_txd)); + + clock_device &acia_clock(CLOCK(config, "acia_clock", 153600)); // source? + acia_clock.signal_handler().set(m_acia[0], FUNC(acia6850_device::write_txc)); + acia_clock.signal_handler().append(m_acia[0], FUNC(acia6850_device::write_rxc)); + acia_clock.signal_handler().append(m_acia[1], FUNC(acia6850_device::write_txc)); + acia_clock.signal_handler().append(m_acia[1], FUNC(acia6850_device::write_rxc)); + + rs232_port_device &com1(RS232_PORT(config, "com1", default_rs232_devices, nullptr)); + com1.rxd_handler().set(m_scc, FUNC(scc85c30_device::rxa_w)); + com1.dcd_handler().set(m_scc, FUNC(scc85c30_device::dcda_w)); + com1.cts_handler().set(m_scc, FUNC(scc85c30_device::ctsa_w)); + + rs232_port_device &com2(RS232_PORT(config, "com2", default_rs232_devices, nullptr)); + com2.rxd_handler().set(m_scc, FUNC(scc85c30_device::rxb_w)); + com2.dcd_handler().set(m_scc, FUNC(scc85c30_device::dcdb_w)); + com2.cts_handler().set(m_scc, FUNC(scc85c30_device::ctsb_w)); + + RS232_PORT(config, "printer", printer_devices, nullptr); + + informer_207_376_kbd_hle_device &kbd(INFORMER_207_376_KBD_HLE(config, "kbd")); + kbd.tx_handler().set(m_acia[0], FUNC(acia6850_device::write_rxd)); + + // video + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_color(rgb_t::green()); + m_screen->set_raw(14400000, 800, 0, 640, 300, 0, 286); // unknown clock + m_screen->set_screen_update("crtc", FUNC(mc6845_device::screen_update)); + + PALETTE(config, m_palette, palette_device::MONOCHROME); + + GFXDECODE(config, "gfxdecode", m_palette, chars); + + MC6845(config, m_crtc, 1800000); // unknown clock + m_crtc->set_screen("screen"); + m_crtc->set_show_border_area(false); + m_crtc->set_char_width(8); + m_crtc->set_update_row_callback(FUNC(informer_207_376_state::crtc_update_row)); + m_crtc->out_vsync_callback().set(FUNC(informer_207_376_state::vsync_w)); +} + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( in207376 ) + ROM_REGION(0x6000, "maincpu", 0) + // 79590-023 376SNA V1.00 201C 7224 (our checksum: 7264) + ROM_LOAD("79590-023.bin", 0x0000, 0x2000, BAD_DUMP CRC(ed4ff488) SHA1(fdd95c520d0288ea483b5d2e8e6c8eecb04063c1)) + // 79589-023 376 SNAV1.00 201C E86F (checksum matches) + ROM_LOAD("79589-023.bin", 0x2000, 0x4000, CRC(cdfaf629) SHA1(1f21ef6848020726ef3d7ab05166ac8590d58476)) + + ROM_REGION(0x1000, "chargen", 0) + ROM_LOAD("chargen.bin", 0x0000, 0x1000, BAD_DUMP CRC(819e4b4e) SHA1(4937e49b2d91af993e8f65f5df1d6f729e775fc4)) +ROM_END + + +//************************************************************************** +// SYSTEM DRIVERS +//************************************************************************** + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1986, in207376, 0, 0, informer_207_376, informer_207_376, informer_207_376_state, empty_init, "Informer", "Informer 207/376", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/machine/informer_207_376_kbd.cpp b/src/mame/machine/informer_207_376_kbd.cpp new file mode 100644 index 00000000000..8bbe4e62ac3 --- /dev/null +++ b/src/mame/machine/informer_207_376_kbd.cpp @@ -0,0 +1,299 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Informer 207/376 Keyboard (HLE) + +***************************************************************************/ + +#include "emu.h" +#include "informer_207_376_kbd.h" +#include "machine/keyboard.ipp" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(INFORMER_207_376_KBD_HLE, informer_207_376_kbd_hle_device, "in207376kbd_hle", "Informer 207/376 Keyboard (HLE)") + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +// keys not mapped yet: +// +// PF13 PF14 PF15 PF16 PF17 PF18 PF19 PF20 PF21 PF22 PF23 (PF24 = cursor up?) +// ATTN CLICK_KEY + +static INPUT_PORTS_START( keyboard ) + PORT_START("row_0") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 00 */ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 01 */ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 02 */ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 03 */ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 04 */ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 05 */ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 06 */ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 07 */ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 08 */ PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0d) PORT_NAME("\xe2\x86\xb2") // ↲ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 09 */ PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('<') PORT_CHAR('>') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 0a */ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 0b */ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0c */ PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0d */ PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0e */ PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_NAME("\xe2\x86\x91") + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0f */ PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('{') PORT_CHAR('}') + + PORT_START("row_1") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 10 */ PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 11 */ PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 12 */ PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 13 */ PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME("\xe2\x86\x93") + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 14 */ PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 15 */ PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_NAME(u8"\\ ¦") + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 16 */ PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME("\xe2\x86\x90") + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 17 */ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 18 */ PORT_CODE(KEYCODE_F1) PORT_NAME("Enter") // but should be the same as the setup key? + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 19 */ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1a */ PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME("\xe2\x86\x92") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1b */ PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR(0) PORT_CHAR('!') PORT_NAME(u8"¢ !") + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 1c */ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 1d */ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 1e */ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 1f */ + + 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_NAME(u8"6 ¬") + 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_UNKNOWN) /* 2a */ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 2b */ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 2c */ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 2d */ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 2e */ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 2f */ + + PORT_START("row_3") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 30 */ PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 31 */ PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 32 */ PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') // same as 0x4b? + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 33 */ PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') // same as 0x49? + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 34 */ PORT_CODE(KEYCODE_ESC) PORT_NAME("Reset") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 35 */ PORT_CODE(KEYCODE_TAB) PORT_NAME("Tab or Back-Tab") + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 36 */ PORT_CODE(KEYCODE_HOME) PORT_NAME("Tab or Back-Tab") + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 37 */ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 38 */ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 39 */ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 3a */ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 3b */ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 3c */ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3d */ PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 3e */ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 3f */ + + PORT_START("row_4") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 40 */ // 7 + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 41 */ // 8 + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 42 */ // 9 + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 43 */ // 4 + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 44 */ // 5 + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 45 */ // 6 + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 46 */ // 1 + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 47 */ // 2 + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 48 */ // 3 + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 49 */ PORT_CODE(KEYCODE_F2) // , + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 4a */ // 0 + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4b */ PORT_CODE(KEYCODE_F3) // . with alt key unknown function + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4c */ PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_NAME("Lock") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4d */ PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Left Shift") // or right? + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4e */ PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Right Shift") // or left? + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4f */ PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Alt") + + PORT_START("row_5") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 50 */ PORT_CODE(KEYCODE_F4) PORT_NAME("Cursor Sel Clear") + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 51 */ PORT_CODE(KEYCODE_F5) // X + human? + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 52 */ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 53 */ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 54 */ PORT_CODE(KEYCODE_F6) PORT_NAME("Cursor Blink Alt Cursor") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 55 */ PORT_CODE(KEYCODE_END) PORT_NAME("Erase EOF") + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 56 */ PORT_CODE(KEYCODE_PRTSCR) PORT_NAME("Print") + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 57 */ PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Setup (with Alt)") // but should be the same as the enter key? + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 58 */ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 59 */ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 5a */ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 5b */ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 5c */ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 5d */ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5e */ PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Field Mark") + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5f */ PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("Dup") + + PORT_START("row_6") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 60 */ PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 61 */ PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 62 */ PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 63 */ PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 64 */ PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 65 */ PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 66 */ PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 67 */ PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 68 */ PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 69 */ PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6a */ PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6b */ PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6c */ PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6d */ PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6e */ PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6f */ PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + + PORT_START("row_7") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 70 */ PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 71 */ PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 72 */ PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 73 */ PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 74 */ PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 75 */ PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 76 */ PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 77 */ PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 78 */ PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 79 */ PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 7a */ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 7b */ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 7c */ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 7d */ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 7e */ PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN) /* 7f */ +INPUT_PORTS_END + +ioport_constructor informer_207_376_kbd_hle_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( keyboard ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// informer_207_376_kbd_hle_device - constructor +//------------------------------------------------- + +informer_207_376_kbd_hle_device::informer_207_376_kbd_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, INFORMER_207_376_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) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void informer_207_376_kbd_hle_device::device_start() +{ + // resolve callbacks + m_tx_handler.resolve_safe(); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void informer_207_376_kbd_hle_device::device_reset() +{ + clear_fifo(); + + receive_register_reset(); + transmit_register_reset(); + + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_2); + set_rcv_rate(2400); + set_tra_rate(2400); + + reset_key_state(); + start_processing(attotime::from_hz(2400)); + typematic_stop(); +} + +//------------------------------------------------- +// tra_callback - send bit to host +//------------------------------------------------- + +void informer_207_376_kbd_hle_device::tra_callback() +{ + m_tx_handler(transmit_register_get_data_bit()); +} + +//------------------------------------------------- +// received_byte - handle received byte +//------------------------------------------------- + +void informer_207_376_kbd_hle_device::received_byte(uint8_t byte) +{ + logerror("Received from host: %02x\n", byte); + + // correct? also gets 0x10 from host + if (byte == 0x0a) + transmit_byte(0x34); // send RESET +} + +//------------------------------------------------- +// key_make - handle a key being pressed +//------------------------------------------------- + +void informer_207_376_kbd_hle_device::key_make(uint8_t row, uint8_t column) +{ + // send the code + uint8_t code = row * 16 + column; + + transmit_byte(code); + + // no typematic for modifier keys + if (code != 0x4c && code != 0x4d && code != 0x4e && code != 0x4f) + typematic_start(row, column, attotime::from_msec(750), attotime::from_msec(50)); +} + +//------------------------------------------------- +// key_break - handle a key being released +//------------------------------------------------- + +void informer_207_376_kbd_hle_device::key_break(uint8_t row, uint8_t column) +{ + // send the break code (only for modifier keys: shift and alt) + uint8_t code = row * 16 + column; + + if (typematic_is(row, column)) + typematic_stop(); + + if (code == 0x4d || code == 0x4e || code == 0x4f) + transmit_byte(0x80 | code); +} + +//------------------------------------------------- +// key_repeat - handle a key being repeated +//------------------------------------------------- + +void informer_207_376_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 informer_207_376_kbd_hle_device::rx_w(int state) +{ + device_buffered_serial_interface::rx_w(state); +} diff --git a/src/mame/machine/informer_207_376_kbd.h b/src/mame/machine/informer_207_376_kbd.h new file mode 100644 index 00000000000..ff802e0487b --- /dev/null +++ b/src/mame/machine/informer_207_376_kbd.h @@ -0,0 +1,60 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Informer 207/376 Keyboard (HLE) + +***************************************************************************/ + +#ifndef MAME_MACHINE_INFORMER_207_376_KBD_H +#define MAME_MACHINE_INFORMER_207_376_KBD_H + +#pragma once + +#include "machine/keyboard.h" +#include "diserial.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> informer_207_376_kbd_hle_device + +class informer_207_376_kbd_hle_device : public device_t, + public device_buffered_serial_interface<16>, + protected device_matrix_keyboard_interface<8> +{ +public: + // construction/destruction + informer_207_376_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(); } + + // 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; +}; + +// device type definition +DECLARE_DEVICE_TYPE(INFORMER_207_376_KBD_HLE, informer_207_376_kbd_hle_device) + +#endif // MAME_MACHINE_INFORMER_207_376_KBD_H diff --git a/src/mame/mame.lst b/src/mame/mame.lst index e501c8b2a97..09375c62165 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -16709,6 +16709,9 @@ indy_4613 // IP22: Indy, R4600, 133MHz indy_5015 // IP22: Indy, R5000, 150MHz indigo2_4415 // IP24: Indigo 2, R4400, 150MHz +@source:informer_207_376.cpp +in207376 // Informer 207/376 + @source:instantm.cpp instantm // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 706fe06e487..49207d932a7 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -420,6 +420,7 @@ imsai.cpp indiana.cpp indigo.cpp indy_indigo2.cpp +informer_207_376.cpp instruct.cpp inteladv.cpp intellec4.cpp -- cgit v1.2.3