diff options
author | AJR <ajrhacker@users.noreply.github.com> | 2019-12-21 23:25:43 -0500 |
---|---|---|
committer | AJR <ajrhacker@users.noreply.github.com> | 2019-12-21 23:26:09 -0500 |
commit | 441ec9efb7e54d4ae3331beb9b5452b464312298 (patch) | |
tree | 77f52d25cc0734a42b691112295258cc446de0a0 /src/devices/cpu | |
parent | f9b15f8b5aa5b4f476b63ffad285c6f478a69418 (diff) |
vt52: Fill in and fix a whole bunch of things (nw)
Diffstat (limited to 'src/devices/cpu')
-rw-r--r-- | src/devices/cpu/vt50/vt50.cpp | 74 | ||||
-rw-r--r-- | src/devices/cpu/vt50/vt50.h | 18 | ||||
-rw-r--r-- | src/devices/cpu/vt50/vt50dasm.cpp | 2 |
3 files changed, 74 insertions, 20 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<util::disasm_interface> 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] = { |