@@ -291,7 +291,7 @@ void kl1839vm1_device::ma(u32 op)
291
291
292
292
u32 kob_data = kop1 ? R (x) : K (am);
293
293
294
- if (!m_pcm_queue. empty () )
294
+ if (m_pcm_queue_size > 0 )
295
295
{
296
296
if (py)
297
297
am = vax_pcm_pull ();
@@ -345,7 +345,7 @@ void kl1839vm1_device::mb(u32 op)
345
345
346
346
u32 kob_data = kop2 ? R (x) : R (y);
347
347
348
- if (!m_pcm_queue. empty () )
348
+ if (m_pcm_queue_size > 0 )
349
349
{
350
350
if (py)
351
351
y = vax_pcm_pull ();
@@ -383,7 +383,7 @@ void kl1839vm1_device::mc(u32 op)
383
383
const bool py = BIT (op, 2 );
384
384
const bool px = BIT (op, 1 );
385
385
386
- if (!m_pcm_queue. empty () )
386
+ if (m_pcm_queue_size > 0 )
387
387
{
388
388
if (py)
389
389
y = vax_pcm_pull ();
@@ -661,7 +661,7 @@ void kl1839vm1_device::decode_op(u32 op)
661
661
662
662
void kl1839vm1_device::vax_decode_pc ()
663
663
{
664
- if (!m_pcm_queue. empty () )
664
+ if (m_pcm_queue_size > 0 )
665
665
{
666
666
LOGVAX (" Unused decoded data\n " );
667
667
}
@@ -671,7 +671,6 @@ void kl1839vm1_device::vax_decode_pc()
671
671
m_op_size = 1 ;
672
672
AMC = op << 4 ;
673
673
674
- std::vector<u32> tmp_args;
675
674
const vax_disassembler::mode* args = vax_disassembler::get_operands (op);
676
675
u8 arg_n = 0 ;
677
676
do
@@ -686,7 +685,7 @@ void kl1839vm1_device::vax_decode_pc()
686
685
687
686
// byte
688
687
case vax_disassembler::mode::bb:
689
- tmp_args. push_back ( s8 (m_ram.read_byte (PC + m_op_size) ));
688
+ m_pcm_queue[arg_n] = s8 (m_ram.read_byte (PC + m_op_size));
690
689
m_mem_reg[arg_n] = 0x8f ;
691
690
m_op_size += 1 ;
692
691
break ;
@@ -700,19 +699,19 @@ void kl1839vm1_device::vax_decode_pc()
700
699
u8 p = m_ram.read_byte (PC + m_op_size);
701
700
if (p == 0x8f ) // M
702
701
{
703
- tmp_args. push_back ( m_ram.read_byte (PC + m_op_size + 1 ) );
702
+ m_pcm_queue[arg_n] = m_ram.read_byte (PC + m_op_size + 1 );
704
703
m_mem_reg[arg_n] = p;
705
704
m_op_size += 2 ;
706
705
}
707
706
else if ((p & 0xf0 ) == 0x80 ) // M = R(n)+
708
707
{
709
- tmp_args. push_back ( p & 0x0f ) ;
708
+ m_pcm_queue[arg_n] = p & 0x0f ;
710
709
m_mem_reg[arg_n] = p;
711
710
m_op_size += 1 ;
712
711
}
713
712
else if ((p & 0xf0 ) == 0x50 ) // R
714
713
{
715
- tmp_args. push_back ( p & 0x0f ) ;
714
+ m_pcm_queue[arg_n] = p & 0x0f ;
716
715
m_mem_reg[arg_n] = p;
717
716
m_op_size += 1 ;
718
717
}
@@ -726,7 +725,7 @@ void kl1839vm1_device::vax_decode_pc()
726
725
727
726
// word
728
727
case vax_disassembler::mode::bw:
729
- tmp_args. push_back ( s16 (m_ram.read_word (PC + m_op_size) ));
728
+ m_pcm_queue[arg_n] = s16 (m_ram.read_word (PC + m_op_size));
730
729
m_mem_reg[arg_n] = 0x8f ;
731
730
m_op_size += 2 ;
732
731
break ;
@@ -742,19 +741,19 @@ void kl1839vm1_device::vax_decode_pc()
742
741
u8 p = m_ram.read_byte (PC + m_op_size);
743
742
if (p == 0x8f ) // M
744
743
{
745
- tmp_args. push_back ( m_ram.read_dword (PC + m_op_size + 1 ) );
744
+ m_pcm_queue[arg_n] = m_ram.read_dword (PC + m_op_size + 1 );
746
745
m_mem_reg[arg_n] = p;
747
746
m_op_size += 5 ;
748
747
}
749
748
else if ((p & 0xf0 ) == 0x80 ) // M = R(n)+
750
749
{
751
- tmp_args. push_back ( p & 0x0f ) ;
750
+ m_pcm_queue[arg_n] = p & 0x0f ;
752
751
m_mem_reg[arg_n] = p;
753
752
m_op_size += 1 ;
754
753
}
755
754
else if ((p & 0xf0 ) == 0x50 ) // R
756
755
{
757
- tmp_args. push_back ( p & 0x0f ) ;
756
+ m_pcm_queue[arg_n] = p & 0x0f ;
758
757
m_mem_reg[arg_n] = p;
759
758
m_op_size += 1 ;
760
759
}
@@ -768,25 +767,19 @@ void kl1839vm1_device::vax_decode_pc()
768
767
769
768
default :
770
769
LOGVAX (" (%x): unknown operand mode %02d in OP=%02x (n=%d)\n " , PC, u8 (mode), op, arg_n + 1 );
771
- tmp_args.clear ();
772
770
m_op_size = 0 ;
773
771
break ;
774
772
}
775
773
776
774
++arg_n;
777
775
} while ((arg_n < 6 ) && (args[arg_n] != vax_disassembler::mode::none));
778
776
779
- m_pcm_queue. clear () ;
777
+ m_pcm_queue_size = 0 ;
780
778
if (m_op_size > 0 ) // above completed without failure
781
779
{
782
- while (!tmp_args.empty ())
783
- {
784
- m_pcm_queue.push_back (tmp_args.back ());
785
- tmp_args.pop_back ();
786
- }
787
-
780
+ m_pcm_queue_size = (arg_n == 1 && m_mem_reg[0 ] == u8 (~0 )) ? 0 : arg_n; // none args case
788
781
u8 args_type = 0 ;
789
- if (!m_pcm_queue. empty () )
782
+ if (m_pcm_queue_size > 0 )
790
783
{
791
784
for (u8 i = 0 ; i < arg_n; ++i)
792
785
{
@@ -896,14 +889,13 @@ void kl1839vm1_device::vax_decode_pc()
896
889
897
890
u32 kl1839vm1_device::vax_pcm_pull (bool is_bo)
898
891
{
899
- if (m_pcm_queue. empty () )
892
+ if (m_pcm_queue_size == 0 )
900
893
{
901
894
LOGVAX (" Pooling empty decoder queue\n " );
902
895
}
903
896
else
904
897
{
905
- PCM = m_pcm_queue.back ();
906
- m_pcm_queue.pop_back ();
898
+ PCM = m_pcm_queue[0 ];
907
899
908
900
bool is_mem = (m_mem_reg[0 ] & 0xf0 ) == 0x80 ;
909
901
if (is_bo && !is_mem)
@@ -916,7 +908,10 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
916
908
PCM = R (PCM);
917
909
R (r) = PCM + 1 ;
918
910
}
911
+
912
+ std::copy (std::begin (m_pcm_queue) + 1 , std::end (m_pcm_queue), std::begin (m_pcm_queue));
919
913
std::copy (std::begin (m_mem_reg) + 1 , std::end (m_mem_reg), std::begin (m_mem_reg));
914
+ m_pcm_queue_size--;
920
915
}
921
916
922
917
return PCM;
@@ -926,7 +921,6 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
926
921
void kl1839vm1_device::device_start ()
927
922
{
928
923
m_vax_dasm = std::make_unique<vax_disassembler>();
929
- m_pcm_queue.resize (6 );
930
924
931
925
space (AS_OPCODES).cache (m_microcode);
932
926
space (AS_DATA).specific (m_sysram);
@@ -944,7 +938,8 @@ void kl1839vm1_device::device_start()
944
938
save_pointer (NAME (m_consts), 0x10 );
945
939
save_pointer (NAME (m_reg), 0x20 );
946
940
save_item (NAME (m_op_size));
947
- save_item (NAME (m_pcm_queue));
941
+ save_item (NAME (m_pcm_queue_size));
942
+ save_pointer (NAME (m_pcm_queue), 6 );
948
943
save_pointer (NAME (m_mem_reg), 6 );
949
944
950
945
// Register debugger state
@@ -1059,7 +1054,7 @@ void kl1839vm1_device::device_reset()
1059
1054
m_vma_tmp.d = 0 ;
1060
1055
RV = 0 ;
1061
1056
SCH = 0 ;
1062
- m_pcm_queue. clear () ;
1057
+ m_pcm_queue_size = 0 ;
1063
1058
m_op_size = 0 ;
1064
1059
}
1065
1060
0 commit comments