diff --git a/src/devices/cpu/mpk1839/kl1839vm1.cpp b/src/devices/cpu/mpk1839/kl1839vm1.cpp index 19107030fc3..7bacc2fec5d 100644 --- a/src/devices/cpu/mpk1839/kl1839vm1.cpp +++ b/src/devices/cpu/mpk1839/kl1839vm1.cpp @@ -291,7 +291,7 @@ void kl1839vm1_device::ma(u32 op) u32 kob_data = kop1 ? R(x) : K(am); - if (!m_pcm_queue.empty()) + if (m_pcm_queue_size > 0) { if (py) am = vax_pcm_pull(); @@ -345,7 +345,7 @@ void kl1839vm1_device::mb(u32 op) u32 kob_data = kop2 ? R(x) : R(y); - if (!m_pcm_queue.empty()) + if (m_pcm_queue_size > 0) { if (py) y = vax_pcm_pull(); @@ -383,7 +383,7 @@ void kl1839vm1_device::mc(u32 op) const bool py = BIT(op, 2); const bool px = BIT(op, 1); - if (!m_pcm_queue.empty()) + if (m_pcm_queue_size > 0) { if (py) y = vax_pcm_pull(); @@ -661,7 +661,7 @@ void kl1839vm1_device::decode_op(u32 op) void kl1839vm1_device::vax_decode_pc() { - if (!m_pcm_queue.empty()) + if (m_pcm_queue_size > 0) { LOGVAX("Unused decoded data\n"); } @@ -671,7 +671,6 @@ void kl1839vm1_device::vax_decode_pc() m_op_size = 1; AMC = op << 4; - std::vector tmp_args; const vax_disassembler::mode* args = vax_disassembler::get_operands(op); u8 arg_n = 0; do @@ -686,7 +685,7 @@ void kl1839vm1_device::vax_decode_pc() // byte case vax_disassembler::mode::bb: - tmp_args.push_back(s8(m_ram.read_byte(PC + m_op_size))); + m_pcm_queue[arg_n] = s8(m_ram.read_byte(PC + m_op_size)); m_mem_reg[arg_n] = 0x8f; m_op_size += 1; break; @@ -700,19 +699,19 @@ void kl1839vm1_device::vax_decode_pc() u8 p = m_ram.read_byte(PC + m_op_size); if (p == 0x8f) // M { - tmp_args.push_back(m_ram.read_byte(PC + m_op_size + 1)); + m_pcm_queue[arg_n] = m_ram.read_byte(PC + m_op_size + 1); m_mem_reg[arg_n] = p; m_op_size += 2; } else if ((p & 0xf0) == 0x80) // M = R(n)+ { - tmp_args.push_back(p & 0x0f); + m_pcm_queue[arg_n] = p & 0x0f; m_mem_reg[arg_n] = p; m_op_size += 1; } else if ((p & 0xf0) == 0x50) // R { - tmp_args.push_back(p & 0x0f); + m_pcm_queue[arg_n] = p & 0x0f; m_mem_reg[arg_n] = p; m_op_size += 1; } @@ -726,7 +725,7 @@ void kl1839vm1_device::vax_decode_pc() // word case vax_disassembler::mode::bw: - tmp_args.push_back(s16(m_ram.read_word(PC + m_op_size))); + m_pcm_queue[arg_n] = s16(m_ram.read_word(PC + m_op_size)); m_mem_reg[arg_n] = 0x8f; m_op_size += 2; break; @@ -742,19 +741,19 @@ void kl1839vm1_device::vax_decode_pc() u8 p = m_ram.read_byte(PC + m_op_size); if (p == 0x8f) // M { - tmp_args.push_back(m_ram.read_dword(PC + m_op_size + 1)); + m_pcm_queue[arg_n] = m_ram.read_dword(PC + m_op_size + 1); m_mem_reg[arg_n] = p; m_op_size += 5; } else if ((p & 0xf0) == 0x80) // M = R(n)+ { - tmp_args.push_back(p & 0x0f); + m_pcm_queue[arg_n] = p & 0x0f; m_mem_reg[arg_n] = p; m_op_size += 1; } else if ((p & 0xf0) == 0x50) // R { - tmp_args.push_back(p & 0x0f); + m_pcm_queue[arg_n] = p & 0x0f; m_mem_reg[arg_n] = p; m_op_size += 1; } @@ -768,7 +767,6 @@ void kl1839vm1_device::vax_decode_pc() default: LOGVAX("(%x): unknown operand mode %02d in OP=%02x (n=%d)\n", PC, u8(mode), op, arg_n + 1); - tmp_args.clear(); m_op_size = 0; break; } @@ -776,17 +774,12 @@ void kl1839vm1_device::vax_decode_pc() ++arg_n; } while ((arg_n < 6) && (args[arg_n] != vax_disassembler::mode::none)); - m_pcm_queue.clear(); + m_pcm_queue_size = 0; if (m_op_size > 0) // above completed without failure { - while (!tmp_args.empty()) - { - m_pcm_queue.push_back(tmp_args.back()); - tmp_args.pop_back(); - } - + m_pcm_queue_size = (arg_n == 1 && m_mem_reg[0] == u8(~0)) ? 0 : arg_n; // none args case u8 args_type = 0; - if (!m_pcm_queue.empty()) + if (m_pcm_queue_size > 0) { for (u8 i = 0; i < arg_n; ++i) { @@ -896,14 +889,13 @@ void kl1839vm1_device::vax_decode_pc() u32 kl1839vm1_device::vax_pcm_pull(bool is_bo) { - if (m_pcm_queue.empty()) + if (m_pcm_queue_size == 0) { LOGVAX("Pooling empty decoder queue\n"); } else { - PCM = m_pcm_queue.back(); - m_pcm_queue.pop_back(); + PCM = m_pcm_queue[0]; bool is_mem = (m_mem_reg[0] & 0xf0) == 0x80; if (is_bo && !is_mem) @@ -916,7 +908,10 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo) PCM = R(PCM); R(r) = PCM + 1; } + + std::copy(std::begin(m_pcm_queue) + 1, std::end(m_pcm_queue), std::begin(m_pcm_queue)); std::copy(std::begin(m_mem_reg) + 1, std::end(m_mem_reg), std::begin(m_mem_reg)); + m_pcm_queue_size--; } return PCM; @@ -926,7 +921,6 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo) void kl1839vm1_device::device_start() { m_vax_dasm = std::make_unique(); - m_pcm_queue.resize(6); space(AS_OPCODES).cache(m_microcode); space(AS_DATA).specific(m_sysram); @@ -944,7 +938,8 @@ void kl1839vm1_device::device_start() save_pointer(NAME(m_consts), 0x10); save_pointer(NAME(m_reg), 0x20); save_item(NAME(m_op_size)); - save_item(NAME(m_pcm_queue)); + save_item(NAME(m_pcm_queue_size)); + save_pointer(NAME(m_pcm_queue), 6); save_pointer(NAME(m_mem_reg), 6); // Register debugger state @@ -1059,7 +1054,7 @@ void kl1839vm1_device::device_reset() m_vma_tmp.d = 0; RV = 0; SCH = 0; - m_pcm_queue.clear(); + m_pcm_queue_size = 0; m_op_size = 0; } diff --git a/src/devices/cpu/mpk1839/kl1839vm1.h b/src/devices/cpu/mpk1839/kl1839vm1.h index 46191a51c6f..3d8c32dffe9 100644 --- a/src/devices/cpu/mpk1839/kl1839vm1.h +++ b/src/devices/cpu/mpk1839/kl1839vm1.h @@ -111,7 +111,8 @@ private: int m_icount; u32 m_op_size; - std::vector m_pcm_queue; + u8 m_pcm_queue_size; + u32 m_pcm_queue[6]; u8 m_mem_reg[6]; };