@@ -671,7 +671,7 @@ void kl1839vm1_device::vax_decode_pc()
671
671
m_op_size = 1 ;
672
672
AMC = op << 4 ;
673
673
674
- m_pcm_queue. clear () ;
674
+ std::vector<u32> tmp_args ;
675
675
const vax_disassembler::mode* args = vax_disassembler::get_operands (op);
676
676
u8 arg_n = 0 ;
677
677
do
@@ -686,7 +686,7 @@ void kl1839vm1_device::vax_decode_pc()
686
686
687
687
// byte
688
688
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)));
690
690
m_mem_reg[arg_n] = 0x8f ;
691
691
m_op_size += 1 ;
692
692
break ;
@@ -700,19 +700,19 @@ void kl1839vm1_device::vax_decode_pc()
700
700
u8 p = m_ram.read_byte (PC + m_op_size);
701
701
if (p == 0x8f ) // M
702
702
{
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 ));
704
704
m_mem_reg[arg_n] = p;
705
705
m_op_size += 2 ;
706
706
}
707
707
else if ((p & 0xf0 ) == 0x80 ) // M = R(n)+
708
708
{
709
- m_pcm_queue .push_back (p & 0x0f );
709
+ tmp_args .push_back (p & 0x0f );
710
710
m_mem_reg[arg_n] = p;
711
711
m_op_size += 1 ;
712
712
}
713
713
else if ((p & 0xf0 ) == 0x50 ) // R
714
714
{
715
- m_pcm_queue .push_back (p & 0x0f );
715
+ tmp_args .push_back (p & 0x0f );
716
716
m_mem_reg[arg_n] = p;
717
717
m_op_size += 1 ;
718
718
}
@@ -726,7 +726,7 @@ void kl1839vm1_device::vax_decode_pc()
726
726
727
727
// word
728
728
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)));
730
730
m_mem_reg[arg_n] = 0x8f ;
731
731
m_op_size += 2 ;
732
732
break ;
@@ -742,19 +742,19 @@ void kl1839vm1_device::vax_decode_pc()
742
742
u8 p = m_ram.read_byte (PC + m_op_size);
743
743
if (p == 0x8f ) // M
744
744
{
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 ));
746
746
m_mem_reg[arg_n] = p;
747
747
m_op_size += 5 ;
748
748
}
749
749
else if ((p & 0xf0 ) == 0x80 ) // M = R(n)+
750
750
{
751
- m_pcm_queue .push_back (p & 0x0f );
751
+ tmp_args .push_back (p & 0x0f );
752
752
m_mem_reg[arg_n] = p;
753
753
m_op_size += 1 ;
754
754
}
755
755
else if ((p & 0xf0 ) == 0x50 ) // R
756
756
{
757
- m_pcm_queue .push_back (p & 0x0f );
757
+ tmp_args .push_back (p & 0x0f );
758
758
m_mem_reg[arg_n] = p;
759
759
m_op_size += 1 ;
760
760
}
@@ -768,16 +768,23 @@ void kl1839vm1_device::vax_decode_pc()
768
768
769
769
default :
770
770
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 ();
772
772
m_op_size = 0 ;
773
773
break ;
774
774
}
775
775
776
776
++arg_n;
777
777
} while ((arg_n < 6 ) && (args[arg_n] != vax_disassembler::mode::none));
778
778
779
+ m_pcm_queue.clear ();
779
780
if (m_op_size > 0 ) // above completed without failure
780
781
{
782
+ while (!tmp_args.empty ())
783
+ {
784
+ m_pcm_queue.push_back (tmp_args.back ());
785
+ tmp_args.pop_back ();
786
+ }
787
+
781
788
u8 args_type = 0 ;
782
789
if (!m_pcm_queue.empty ())
783
790
{
@@ -895,8 +902,8 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
895
902
}
896
903
else
897
904
{
898
- PCM = m_pcm_queue.front ();
899
- m_pcm_queue.pop_front ();
905
+ PCM = m_pcm_queue.back ();
906
+ m_pcm_queue.pop_back ();
900
907
901
908
bool is_mem = (m_mem_reg[0 ] & 0xf0 ) == 0x80 ;
902
909
if (is_bo && !is_mem)
@@ -919,6 +926,7 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
919
926
void kl1839vm1_device::device_start ()
920
927
{
921
928
m_vax_dasm = std::make_unique<vax_disassembler>();
929
+ m_pcm_queue.resize (6 );
922
930
923
931
space (AS_OPCODES).cache (m_microcode);
924
932
space (AS_DATA).specific (m_sysram);
@@ -932,8 +940,12 @@ void kl1839vm1_device::device_start()
932
940
save_item (NAME (m_amc));
933
941
save_item (NAME (m_ppc));
934
942
save_item (NAME (m_fp));
935
- save_pointer (NAME (m_reg), 0x20 );
943
+ save_item (NAME (m_jzdra_waiting) );
936
944
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 );
937
949
938
950
// Register debugger state
939
951
state_add (KL1839_AMC, " AMC" , AMC).formatstr (" %08X" );
0 commit comments