From 441ec9efb7e54d4ae3331beb9b5452b464312298 Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 21 Dec 2019 23:25:43 -0500 Subject: vt52: Fill in and fix a whole bunch of things (nw) --- src/devices/cpu/vt50/vt50.cpp | 74 +++++++++++---- src/devices/cpu/vt50/vt50.h | 18 +++- src/devices/cpu/vt50/vt50dasm.cpp | 2 +- src/mame/drivers/vt52.cpp | 183 ++++++++++++++++++++------------------ 4 files changed, 168 insertions(+), 109 deletions(-) diff --git a/src/devices/cpu/vt50/vt50.cpp b/src/devices/cpu/vt50/vt50.cpp index 71f996696d5..e2fa195f6b2 100644 --- a/src/devices/cpu/vt50/vt50.cpp +++ b/src/devices/cpu/vt50/vt50.cpp @@ -26,7 +26,10 @@ vt5x_cpu_device::vt5x_cpu_device(const machine_config &mconfig, device_type type , m_ut_flag_callback(*this) , m_ruf_callback(*this) , m_key_up_callback(*this) + , m_kclk_callback(*this) + , m_frq_callback(*this) , m_bell_callback(*this) + , m_cen_callback(*this) , m_bbits(bbits) , m_ybits(ybits) , m_pc(0) @@ -39,6 +42,7 @@ vt5x_cpu_device::vt5x_cpu_device(const machine_config &mconfig, device_type type , m_y(0) , m_x8(false) , m_cursor_ff(false) + , m_cursor_active(false) , m_video_process(false) , m_ram_do(0) , m_t(0) @@ -61,6 +65,7 @@ vt50_cpu_device::vt50_cpu_device(const machine_config &mconfig, const char *tag, vt52_cpu_device::vt52_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : vt5x_cpu_device(mconfig, VT52_CPU, tag, owner, clock, 7, 5) + , m_graphic_callback(*this) { } @@ -91,7 +96,17 @@ void vt5x_cpu_device::device_resolve_objects() m_ut_flag_callback.resolve_safe(0); m_ruf_callback.resolve_safe(); m_key_up_callback.resolve_safe(1); + m_kclk_callback.resolve_safe(1); + m_frq_callback.resolve_safe(1); m_bell_callback.resolve_safe(); + m_cen_callback.resolve_safe(); +} + +void vt52_cpu_device::device_resolve_objects() +{ + vt5x_cpu_device::device_resolve_objects(); + + m_graphic_callback.resolve_safe(); } void vt5x_cpu_device::device_start() @@ -131,6 +146,7 @@ void vt5x_cpu_device::device_start() save_item(NAME(m_y)); save_item(NAME(m_x8)); save_item(NAME(m_cursor_ff)); + save_item(NAME(m_cursor_active)); save_item(NAME(m_video_process)); save_item(NAME(m_ram_do)); save_item(NAME(m_t)); @@ -323,11 +339,13 @@ void vt5x_cpu_device::execute_tw(u8 inst) break; case 0140: - // EPR (TODO: start printer) + // EPR + m_cen_callback(1); break; case 0160: - // HPR!ZY (TODO: halt printer) + // HPR!ZY + m_cen_callback(0); m_y = 0; break; } @@ -367,8 +385,8 @@ void vt50_cpu_device::execute_tg(u8 inst) break; default: - // LD - m_ram_do = inst & 0177; + // LD (TODO: B/C masking in mode 0 is determined by optional jumpers) + m_ram_do = inst & (!m_mode_ff && m_cursor_ff ? 0037 : 0177); break; } @@ -396,8 +414,8 @@ void vt52_cpu_device::execute_tg(u8 inst) break; default: - // LD - m_ram_do = inst & 0177; + // LD (TODO: B/C masking in mode 0 is determined by optional jumpers) + m_ram_do = inst & (!m_mode_ff && m_cursor_ff ? 0037 : 0177); break; } @@ -407,25 +425,27 @@ void vt52_cpu_device::execute_tg(u8 inst) void vt5x_cpu_device::execute_th(u8 inst) { - if (inst == 0002) + switch (inst & 0362) { + case 0002: // M2A m_ac = m_ram_do; - } - else if (inst == 0042) - { + break; + + case 0042: // M2U m_m2u_ff = true; - } - else if (inst == 0102) - { + break; + + case 0102: // M2X m_x = m_ram_do; - } - else if (inst == 0142) - { + break; + + case 0142: // M2B m_buffer = m_ram_do & ((1 << m_bbits) - 1); + break; } if (m_flag_test_ff) @@ -437,6 +457,8 @@ void vt5x_cpu_device::execute_th(u8 inst) // M1: URJ if (m_mode_ff) m_load_pc = m_ur_flag_callback(); + else + m_load_pc = true; break; case 0020: @@ -449,17 +471,21 @@ void vt5x_cpu_device::execute_th(u8 inst) break; case 0040: - // M0: KCLJ (TODO) + // M0: KCLJ // M1: ALMJ if (m_mode_ff) m_load_pc = m_ac < m_ram_do; + else + m_load_pc = m_kclk_callback(); break; case 0060: - // M0: FRQJ (TODO) + // M0: FRQJ // M1: ADXJ if (m_mode_ff) m_load_pc = m_ac != (m_x ^ (m_x8 ? 8 : 0)); + else + m_load_pc = m_frq_callback(); break; case 0100: @@ -467,6 +493,8 @@ void vt5x_cpu_device::execute_th(u8 inst) // M1: AEM2J if (m_mode_ff) m_load_pc = m_ac == m_ram_do; + else + m_load_pc = true; break; case 0120: @@ -495,6 +523,15 @@ void vt5x_cpu_device::execute_th(u8 inst) m_pc = (m_pc + 1) & 03777; } +void vt52_cpu_device::execute_th(u8 inst) +{ + // not actually synchronized to TH + if ((inst & 0362) == 0162) + m_graphic_callback(m_ram_do); + + vt5x_cpu_device::execute_th(inst); +} + void vt5x_cpu_device::execute_tj(u8 dest) { if (m_load_pc) @@ -526,6 +563,7 @@ void vt5x_cpu_device::execute_run() execute_tf(m_rom_cache->read_byte(m_pc)); if (!m_write_ff) m_ram_do = m_ram_cache->read_byte(translate_xy()) & 0177; + m_cursor_active = m_ac == (m_x ^ (m_x8 ? 8 : 0)); m_t = 3; break; diff --git a/src/devices/cpu/vt50/vt50.h b/src/devices/cpu/vt50/vt50.h index ad29f48f265..81c49358f70 100644 --- a/src/devices/cpu/vt50/vt50.h +++ b/src/devices/cpu/vt50/vt50.h @@ -23,7 +23,10 @@ public: auto ut_flag_callback() { return m_ut_flag_callback.bind(); } auto ruf_callback() { return m_ruf_callback.bind(); } auto key_up_callback() { return m_key_up_callback.bind(); } + auto kclk_callback() { return m_kclk_callback.bind(); } + auto frq_callback() { return m_frq_callback.bind(); } auto bell_callback() { return m_bell_callback.bind(); } + auto cen_callback() { return m_cen_callback.bind(); } protected: // construction/destruction @@ -51,7 +54,7 @@ protected: void execute_tf(u8 inst); virtual void execute_tg(u8 inst) = 0; void execute_tw(u8 inst); - void execute_th(u8 inst); + virtual void execute_th(u8 inst); void execute_tj(u8 dest); // address spaces @@ -67,7 +70,10 @@ protected: devcb_read_line m_ut_flag_callback; devcb_write_line m_ruf_callback; devcb_read8 m_key_up_callback; + devcb_read_line m_kclk_callback; + devcb_read_line m_frq_callback; devcb_write_line m_bell_callback; + devcb_write_line m_cen_callback; // register dimensions const u8 m_bbits; @@ -84,6 +90,7 @@ protected: u8 m_y; bool m_x8; bool m_cursor_ff; + bool m_cursor_active; bool m_video_process; u8 m_ram_do; @@ -117,11 +124,20 @@ public: // device type constructor vt52_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + auto graphic_callback() { return m_graphic_callback.bind(); } + protected: + // device-level overrides + virtual void device_resolve_objects() override; + // device_disasm_interface overrides virtual std::unique_ptr create_disassembler() override; virtual void execute_tg(u8 inst) override; + virtual void execute_th(u8 inst) override; + +private: + devcb_write8 m_graphic_callback; }; DECLARE_DEVICE_TYPE(VT50_CPU, vt50_cpu_device) diff --git a/src/devices/cpu/vt50/vt50dasm.cpp b/src/devices/cpu/vt50/vt50dasm.cpp index 69d0d5b68f8..6b450364b76 100644 --- a/src/devices/cpu/vt50/vt50dasm.cpp +++ b/src/devices/cpu/vt50/vt50dasm.cpp @@ -42,7 +42,7 @@ const char *const vt50_disassembler::s_opcodes_g[8] = { }; const char *const vt52_disassembler::s_opcodes_g[8] = { - "M2A", "A2M", "M2U", "B2M", "M2X", "U2M", "M2B", "SPARE" + "M2A", "A2M", "M2U", "B2M", "M2X", "U2M", "M2B", "GRAPHIC" }; const char *const vt5x_disassembler::s_jumps_h[2][8] = { diff --git a/src/mame/drivers/vt52.cpp b/src/mame/drivers/vt52.cpp index 1cc7dd2799d..74aa84e39e2 100644 --- a/src/mame/drivers/vt52.cpp +++ b/src/mame/drivers/vt52.cpp @@ -69,7 +69,8 @@ u32 vt52_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const u8 vt52_state::key_r(offs_t offset) { - return BIT(m_keys[offset & 7]->read(), (offset & 0170) >> 3); + // double negative logic courtesy of 7430 NOR gates and 74150 multiplexer + return !BIT(~m_keys[offset & 7]->read() & 0x3ff, (offset & 0170) >> 3); } READ_LINE_MEMBER(vt52_state::xrdy_eoc_r) @@ -89,108 +90,110 @@ void vt52_state::ram_2k(address_map &map) static INPUT_PORTS_START(vt52) PORT_START("KEY0") - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNUSED) // must always be low - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD) // S78 - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2) // S3 - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W) // S19 - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S) // S35 - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C) // S52 - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X) // S51 - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z) // S50 - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT) // S76 - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD) // S81 - PORT_BIT(0xfc00, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED) // must always be low + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD) // S78 + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2) // S3 + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W) // S19 + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S) // S35 + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C) // S52 + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X) // S51 + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z) // S50 + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT) // S76 + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD) // S81 PORT_START("KEY1") - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD) // S69 - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L) // S42 - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON) // S43 - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O) // S26 - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9) // S10 - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P) // S27 - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(012) PORT_CODE(KEYCODE_INSERT) // S30 - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0) // S11 - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD) // S71 - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD) // S83 - PORT_BIT(0xfc00, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD) // S69 + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L) // S42 + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON) // S43 + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O) // S26 + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9) // S10 + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P) // S27 + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(012) PORT_CODE(KEYCODE_INSERT) // S30 + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0) // S11 + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD) // S71 + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD) // S83 PORT_START("KEY2") - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete") PORT_CHAR(0177) PORT_CODE(KEYCODE_DEL) // S31 - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5) // S6 - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T) // S22 - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4) // S5 - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H) // S39 - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R) // S21 - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH) // S29 - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G Bell") PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G) // S38 - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN) // S72 - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD) // S70 - PORT_BIT(0xfc00, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete") PORT_CHAR(0177) PORT_CODE(KEYCODE_DEL) // S31 + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5) // S6 + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T) // S22 + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4) // S5 + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H) // S39 + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R) // S21 + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH) // S29 + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G Bell") PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G) // S38 + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN) // S72 + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD) // S70 PORT_START("KEY3") - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Back Space") PORT_CHAR(010) PORT_CODE(KEYCODE_BACKSPACE) // S15 - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3) // S4 - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F) // S37 - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V) // S53 - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B) // S54 - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D) // S36 - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS) // S13 - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E) // S20 - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad C (unlabeled)") PORT_CODE(KEYCODE_ASTERISK) // S67 - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad A (unlabeled)") PORT_CODE(KEYCODE_NUMLOCK) // S65 - PORT_BIT(0xfc00, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Back Space") PORT_CHAR(010) PORT_CODE(KEYCODE_BACKSPACE) // S15 + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3) // S4 + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F) // S37 + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V) // S53 + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B) // S54 + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D) // S36 + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS) // S13 + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E) // S20 + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad C (unlabeled)") PORT_CODE(KEYCODE_ASTERISK) // S67 + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad A (unlabeled)") PORT_CODE(KEYCODE_NUMLOCK) // S65 PORT_START("KEY4") - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad B (unlabeled)") PORT_CODE(KEYCODE_SLASH_PAD) // S66 - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8) // S9 - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I) // S25 - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U) // S24 - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7) // S8 - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6) // S7 - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE) // S14 - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K) // S41 - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP) // S68 - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_PAUSE) // S16 - PORT_BIT(0xfc00, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad B (unlabeled)") PORT_CODE(KEYCODE_SLASH_PAD) // S66 + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8) // S9 + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I) // S25 + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U) // S24 + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7) // S8 + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6) // S7 + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE) // S14 + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K) // S41 + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP) // S68 + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_PAUSE) // S16 PORT_START("KEY5") - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD) // S77 - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space Bar") PORT_CHAR(040) PORT_CODE(KEYCODE_SPACE) // S63 - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N) // S55 - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M) // S56 - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J) // S40 - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y) // S23 - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP) // S58 - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA) // S57 - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD) // S79 - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Repeat") PORT_CODE(KEYCODE_RALT) // S61 - PORT_BIT(0xfc00, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD) // S77 + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space Bar") PORT_CHAR(040) PORT_CODE(KEYCODE_SPACE) // S63 + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N) // S55 + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M) // S56 + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J) // S40 + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y) // S23 + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP) // S58 + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA) // S57 + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD) // S79 + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Repeat") PORT_CODE(KEYCODE_RALT) // S61 PORT_START("KEY6") - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD) // S73 - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Scroll") PORT_CODE(KEYCODE_LALT) // S48 - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CHAR(011) PORT_CODE(KEYCODE_TAB) // S17 - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc (Sel)") PORT_CHAR(033) PORT_CODE(KEYCODE_ESC) // S1 - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A) // S34 - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q) // S18 - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(015) PORT_CODE(KEYCODE_ENTER) // S64/S47/S46 - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1) // S2 - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD) // S75 - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) // S32 - PORT_BIT(0xfc00, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD) // S73 + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Scroll") PORT_CODE(KEYCODE_LALT) // S48 + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CHAR(011) PORT_CODE(KEYCODE_TAB) // S17 + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc (Sel)") PORT_CHAR(033) PORT_CODE(KEYCODE_ESC) // S1 + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A) // S34 + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q) // S18 + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(015) PORT_CODE(KEYCODE_ENTER) // S64/S47/S46 + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1) // S2 + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD) // S75 + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) // S32 PORT_START("KEY7") - PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD) // S74 - PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD) // S82 - PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('{') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE) // S45 - PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH) // S59 - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE) // S44 - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS) // S12 - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Copy") PORT_CODE(KEYCODE_RCONTROL) // S62 - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR(']') PORT_CODE(KEYCODE_OPENBRACE) // S28 - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT) // S80 - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) // S49(L)/S60(R) - PORT_BIT(0xfc00, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD) // S74 + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD) // S82 + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('{') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE) // S45 + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH) // S59 + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE) // S44 + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS) // S12 + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Copy") PORT_CODE(KEYCODE_RCONTROL) // S62 + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR(']') PORT_CODE(KEYCODE_OPENBRACE) // S28 + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT) // S80 + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) // S49(L)/S60(R) + + PORT_START("KEYCLICK") + PORT_DIPNAME(1, 1, "Key Click") PORT_DIPLOCATION("S4:1") // actually two switches, but with only one effect + PORT_DIPSETTING(0, DEF_STR(Off)) + PORT_DIPSETTING(1, DEF_STR(On)) + + PORT_START("60HJ") + PORT_DIPNAME(1, 1, "Unit Frequency") PORT_DIPLOCATION("W7:1") + PORT_DIPSETTING(0, "50 Hz") + PORT_DIPSETTING(1, "60 Hz") INPUT_PORTS_END void vt52_state::vt52(machine_config &mconfig) @@ -204,6 +207,8 @@ void vt52_state::vt52(machine_config &mconfig) m_maincpu->ut_flag_callback().set(FUNC(vt52_state::xrdy_eoc_r)); m_maincpu->ruf_callback().set(m_uart, FUNC(ay51013_device::write_rdav)); m_maincpu->key_up_callback().set(FUNC(vt52_state::key_r)); + m_maincpu->kclk_callback().set_ioport("KEYCLICK"); + m_maincpu->frq_callback().set_ioport("60HJ"); m_maincpu->bell_callback().set("bell", FUNC(speaker_sound_device::level_w)); AY51013(mconfig, m_uart); // TR1402 or equivalent -- cgit v1.2.3