summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
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
commit441ec9efb7e54d4ae3331beb9b5452b464312298 (patch)
tree77f52d25cc0734a42b691112295258cc446de0a0 /src/devices/cpu
parentf9b15f8b5aa5b4f476b63ffad285c6f478a69418 (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.cpp74
-rw-r--r--src/devices/cpu/vt50/vt50.h18
-rw-r--r--src/devices/cpu/vt50/vt50dasm.cpp2
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] = {