diff options
author | 2025-04-25 12:37:44 -0400 | |
---|---|---|
committer | 2025-04-26 02:37:44 +1000 | |
commit | bbb45dfa649e7d5901ea26cd4b7b2d5e8f6f4aca (patch) | |
tree | 9ef6c7e3c2c620acd78944f47534418a0cc44cbd | |
parent | 43e8643d27cc6612e2c2b7856e4e048cd8b58db1 (diff) |
cpu/mpk1839/kl1839vm1.cpp: Improved save state support. (#13303)
-rw-r--r-- | src/devices/cpu/mpk1839/kl1839vm1.cpp | 47 | ||||
-rw-r--r-- | src/devices/cpu/mpk1839/kl1839vm1.h | 31 |
2 files changed, 43 insertions, 35 deletions
diff --git a/src/devices/cpu/mpk1839/kl1839vm1.cpp b/src/devices/cpu/mpk1839/kl1839vm1.cpp index 7bcf7bcf264..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; - m_pcm_queue.clear(); 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: - m_pcm_queue.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 { - m_pcm_queue.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)+ { - m_pcm_queue.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 { - m_pcm_queue.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: - m_pcm_queue.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 { - m_pcm_queue.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)+ { - m_pcm_queue.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 { - m_pcm_queue.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); - m_pcm_queue.clear(); m_op_size = 0; break; } @@ -776,10 +774,12 @@ void kl1839vm1_device::vax_decode_pc() ++arg_n; } while ((arg_n < 6) && (args[arg_n] != vax_disassembler::mode::none)); + m_pcm_queue_size = 0; if (m_op_size > 0) // above completed without failure { + 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) { @@ -889,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.front(); - m_pcm_queue.pop_front(); + PCM = m_pcm_queue[0]; bool is_mem = (m_mem_reg[0] & 0xf0) == 0x80; if (is_bo && !is_mem) @@ -909,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; @@ -932,8 +934,13 @@ void kl1839vm1_device::device_start() save_item(NAME(m_amc)); save_item(NAME(m_ppc)); save_item(NAME(m_fp)); - save_pointer(NAME(m_reg), 0x20); + save_item(NAME(m_jzdra_waiting)); save_pointer(NAME(m_consts), 0x10); + save_pointer(NAME(m_reg), 0x20); + save_item(NAME(m_op_size)); + save_item(NAME(m_pcm_queue_size)); + save_pointer(NAME(m_pcm_queue), 6); + save_pointer(NAME(m_mem_reg), 6); // Register debugger state state_add(KL1839_AMC, "AMC", AMC).formatstr("%08X"); @@ -1047,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 4ee4d9eaeae..3d8c32dffe9 100644 --- a/src/devices/cpu/mpk1839/kl1839vm1.h +++ b/src/devices/cpu/mpk1839/kl1839vm1.h @@ -98,21 +98,22 @@ private: std::unique_ptr<util::disasm_interface> m_vax_dasm; - PAIR m_vma_tmp; // do we have int reg for this? - PAIR m_rv; - PAIR m_sch; - PAIR m_rsp; - PAIR m_amc; // Microdode PC - PAIR m_ppc; // previous program counter - bool m_fp; - bool m_jzdra_waiting; - u32 m_consts[0x10] = { 0x4, 0x2, 0x8, 0x1, 0x0, 0, 0, 0x66, 0, 0xc00000, 0xffffffff, 0x1f0000, 0x4000000, 0, 0, 0 }; - PAIR m_reg[0x20]; - int m_icount; - u32 m_op_size; - - std::deque<u32> m_pcm_queue; - u8 m_mem_reg[6]; + PAIR m_vma_tmp; // do we have int reg for this? + PAIR m_rv; + PAIR m_sch; + PAIR m_rsp; + PAIR m_amc; // Microcode PC + PAIR m_ppc; // previous program counter + bool m_fp; + bool m_jzdra_waiting; + u32 m_consts[0x10] = { 0x4, 0x2, 0x8, 0x1, 0x0, 0, 0, 0x66, 0, 0xc00000, 0xffffffff, 0x1f0000, 0x4000000, 0, 0, 0 }; + PAIR m_reg[0x20]; + int m_icount; + u32 m_op_size; + + u8 m_pcm_queue_size; + u32 m_pcm_queue[6]; + u8 m_mem_reg[6]; }; DECLARE_DEVICE_TYPE(KL1839VM1, kl1839vm1_device) |