Skip to content

Commit 7bd9ea4

Browse files
committed
cpu/kl1839vm1.cpp: Updated save state
1 parent 0df543d commit 7bd9ea4

File tree

2 files changed

+40
-28
lines changed

2 files changed

+40
-28
lines changed

src/devices/cpu/mpk1839/kl1839vm1.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ void kl1839vm1_device::vax_decode_pc()
671671
m_op_size = 1;
672672
AMC = op << 4;
673673

674-
m_pcm_queue.clear();
674+
std::vector<u32> tmp_args;
675675
const vax_disassembler::mode* args = vax_disassembler::get_operands(op);
676676
u8 arg_n = 0;
677677
do
@@ -686,7 +686,7 @@ void kl1839vm1_device::vax_decode_pc()
686686

687687
// byte
688688
case vax_disassembler::mode::bb:
689-
m_pcm_queue.push_back(s8(m_ram.read_byte(PC + m_op_size)));
689+
tmp_args.push_back(s8(m_ram.read_byte(PC + m_op_size)));
690690
m_mem_reg[arg_n] = 0x8f;
691691
m_op_size += 1;
692692
break;
@@ -700,19 +700,19 @@ void kl1839vm1_device::vax_decode_pc()
700700
u8 p = m_ram.read_byte(PC + m_op_size);
701701
if (p == 0x8f) // M
702702
{
703-
m_pcm_queue.push_back(m_ram.read_byte(PC + m_op_size + 1));
703+
tmp_args.push_back(m_ram.read_byte(PC + m_op_size + 1));
704704
m_mem_reg[arg_n] = p;
705705
m_op_size += 2;
706706
}
707707
else if ((p & 0xf0) == 0x80) // M = R(n)+
708708
{
709-
m_pcm_queue.push_back(p & 0x0f);
709+
tmp_args.push_back(p & 0x0f);
710710
m_mem_reg[arg_n] = p;
711711
m_op_size += 1;
712712
}
713713
else if ((p & 0xf0) == 0x50) // R
714714
{
715-
m_pcm_queue.push_back(p & 0x0f);
715+
tmp_args.push_back(p & 0x0f);
716716
m_mem_reg[arg_n] = p;
717717
m_op_size += 1;
718718
}
@@ -726,7 +726,7 @@ void kl1839vm1_device::vax_decode_pc()
726726

727727
// word
728728
case vax_disassembler::mode::bw:
729-
m_pcm_queue.push_back(s16(m_ram.read_word(PC + m_op_size)));
729+
tmp_args.push_back(s16(m_ram.read_word(PC + m_op_size)));
730730
m_mem_reg[arg_n] = 0x8f;
731731
m_op_size += 2;
732732
break;
@@ -742,19 +742,19 @@ void kl1839vm1_device::vax_decode_pc()
742742
u8 p = m_ram.read_byte(PC + m_op_size);
743743
if (p == 0x8f) // M
744744
{
745-
m_pcm_queue.push_back(m_ram.read_dword(PC + m_op_size + 1));
745+
tmp_args.push_back(m_ram.read_dword(PC + m_op_size + 1));
746746
m_mem_reg[arg_n] = p;
747747
m_op_size += 5;
748748
}
749749
else if ((p & 0xf0) == 0x80) // M = R(n)+
750750
{
751-
m_pcm_queue.push_back(p & 0x0f);
751+
tmp_args.push_back(p & 0x0f);
752752
m_mem_reg[arg_n] = p;
753753
m_op_size += 1;
754754
}
755755
else if ((p & 0xf0) == 0x50) // R
756756
{
757-
m_pcm_queue.push_back(p & 0x0f);
757+
tmp_args.push_back(p & 0x0f);
758758
m_mem_reg[arg_n] = p;
759759
m_op_size += 1;
760760
}
@@ -768,16 +768,23 @@ void kl1839vm1_device::vax_decode_pc()
768768

769769
default:
770770
LOGVAX("(%x): unknown operand mode %02d in OP=%02x (n=%d)\n", PC, u8(mode), op, arg_n + 1);
771-
m_pcm_queue.clear();
771+
tmp_args.clear();
772772
m_op_size = 0;
773773
break;
774774
}
775775

776776
++arg_n;
777777
} while ((arg_n < 6) && (args[arg_n] != vax_disassembler::mode::none));
778778

779+
m_pcm_queue.clear();
779780
if (m_op_size > 0) // above completed without failure
780781
{
782+
while (!tmp_args.empty())
783+
{
784+
m_pcm_queue.push_back(tmp_args.back());
785+
tmp_args.pop_back();
786+
}
787+
781788
u8 args_type = 0;
782789
if (!m_pcm_queue.empty())
783790
{
@@ -895,8 +902,8 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
895902
}
896903
else
897904
{
898-
PCM = m_pcm_queue.front();
899-
m_pcm_queue.pop_front();
905+
PCM = m_pcm_queue.back();
906+
m_pcm_queue.pop_back();
900907

901908
bool is_mem = (m_mem_reg[0] & 0xf0) == 0x80;
902909
if (is_bo && !is_mem)
@@ -919,6 +926,7 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
919926
void kl1839vm1_device::device_start()
920927
{
921928
m_vax_dasm = std::make_unique<vax_disassembler>();
929+
m_pcm_queue.resize(6);
922930

923931
space(AS_OPCODES).cache(m_microcode);
924932
space(AS_DATA).specific(m_sysram);
@@ -932,8 +940,12 @@ void kl1839vm1_device::device_start()
932940
save_item(NAME(m_amc));
933941
save_item(NAME(m_ppc));
934942
save_item(NAME(m_fp));
935-
save_pointer(NAME(m_reg), 0x20);
943+
save_item(NAME(m_jzdra_waiting));
936944
save_pointer(NAME(m_consts), 0x10);
945+
save_pointer(NAME(m_reg), 0x20);
946+
save_item(NAME(m_op_size));
947+
save_item(NAME(m_pcm_queue));
948+
save_pointer(NAME(m_mem_reg), 6);
937949

938950
// Register debugger state
939951
state_add(KL1839_AMC, "AMC", AMC).formatstr("%08X");

src/devices/cpu/mpk1839/kl1839vm1.h

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,21 +98,21 @@ class kl1839vm1_device : public cpu_device
9898

9999
std::unique_ptr<util::disasm_interface> m_vax_dasm;
100100

101-
PAIR m_vma_tmp; // do we have int reg for this?
102-
PAIR m_rv;
103-
PAIR m_sch;
104-
PAIR m_rsp;
105-
PAIR m_amc; // Microdode PC
106-
PAIR m_ppc; // previous program counter
107-
bool m_fp;
108-
bool m_jzdra_waiting;
109-
u32 m_consts[0x10] = { 0x4, 0x2, 0x8, 0x1, 0x0, 0, 0, 0x66, 0, 0xc00000, 0xffffffff, 0x1f0000, 0x4000000, 0, 0, 0 };
110-
PAIR m_reg[0x20];
111-
int m_icount;
112-
u32 m_op_size;
113-
114-
std::deque<u32> m_pcm_queue;
115-
u8 m_mem_reg[6];
101+
PAIR m_vma_tmp; // do we have int reg for this?
102+
PAIR m_rv;
103+
PAIR m_sch;
104+
PAIR m_rsp;
105+
PAIR m_amc; // Microcode PC
106+
PAIR m_ppc; // previous program counter
107+
bool m_fp;
108+
bool m_jzdra_waiting;
109+
u32 m_consts[0x10] = { 0x4, 0x2, 0x8, 0x1, 0x0, 0, 0, 0x66, 0, 0xc00000, 0xffffffff, 0x1f0000, 0x4000000, 0, 0, 0 };
110+
PAIR m_reg[0x20];
111+
int m_icount;
112+
u32 m_op_size;
113+
114+
std::vector<u32> m_pcm_queue;
115+
u8 m_mem_reg[6];
116116
};
117117

118118
DECLARE_DEVICE_TYPE(KL1839VM1, kl1839vm1_device)

0 commit comments

Comments
 (0)