summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author holub <andrei.holub@gmail.com>2025-04-25 12:37:44 -0400
committer GitHub <noreply@github.com>2025-04-26 02:37:44 +1000
commitbbb45dfa649e7d5901ea26cd4b7b2d5e8f6f4aca (patch)
tree9ef6c7e3c2c620acd78944f47534418a0cc44cbd
parent43e8643d27cc6612e2c2b7856e4e048cd8b58db1 (diff)
cpu/mpk1839/kl1839vm1.cpp: Improved save state support. (#13303)
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1.cpp47
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1.h31
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)