mirror of
https://github.com/holub/mame
synced 2025-04-18 22:49:58 +03:00
no vector
This commit is contained in:
parent
7bd9ea4812
commit
2c3455a4d5
@ -291,7 +291,7 @@ void kl1839vm1_device::ma(u32 op)
|
|||||||
|
|
||||||
u32 kob_data = kop1 ? R(x) : K(am);
|
u32 kob_data = kop1 ? R(x) : K(am);
|
||||||
|
|
||||||
if (!m_pcm_queue.empty())
|
if (m_pcm_queue_size > 0)
|
||||||
{
|
{
|
||||||
if (py)
|
if (py)
|
||||||
am = vax_pcm_pull();
|
am = vax_pcm_pull();
|
||||||
@ -345,7 +345,7 @@ void kl1839vm1_device::mb(u32 op)
|
|||||||
|
|
||||||
u32 kob_data = kop2 ? R(x) : R(y);
|
u32 kob_data = kop2 ? R(x) : R(y);
|
||||||
|
|
||||||
if (!m_pcm_queue.empty())
|
if (m_pcm_queue_size > 0)
|
||||||
{
|
{
|
||||||
if (py)
|
if (py)
|
||||||
y = vax_pcm_pull();
|
y = vax_pcm_pull();
|
||||||
@ -383,7 +383,7 @@ void kl1839vm1_device::mc(u32 op)
|
|||||||
const bool py = BIT(op, 2);
|
const bool py = BIT(op, 2);
|
||||||
const bool px = BIT(op, 1);
|
const bool px = BIT(op, 1);
|
||||||
|
|
||||||
if (!m_pcm_queue.empty())
|
if (m_pcm_queue_size > 0)
|
||||||
{
|
{
|
||||||
if (py)
|
if (py)
|
||||||
y = vax_pcm_pull();
|
y = vax_pcm_pull();
|
||||||
@ -661,7 +661,7 @@ void kl1839vm1_device::decode_op(u32 op)
|
|||||||
|
|
||||||
void kl1839vm1_device::vax_decode_pc()
|
void kl1839vm1_device::vax_decode_pc()
|
||||||
{
|
{
|
||||||
if (!m_pcm_queue.empty())
|
if (m_pcm_queue_size > 0)
|
||||||
{
|
{
|
||||||
LOGVAX("Unused decoded data\n");
|
LOGVAX("Unused decoded data\n");
|
||||||
}
|
}
|
||||||
@ -671,7 +671,6 @@ void kl1839vm1_device::vax_decode_pc()
|
|||||||
m_op_size = 1;
|
m_op_size = 1;
|
||||||
AMC = op << 4;
|
AMC = op << 4;
|
||||||
|
|
||||||
std::vector<u32> tmp_args;
|
|
||||||
const vax_disassembler::mode* args = vax_disassembler::get_operands(op);
|
const vax_disassembler::mode* args = vax_disassembler::get_operands(op);
|
||||||
u8 arg_n = 0;
|
u8 arg_n = 0;
|
||||||
do
|
do
|
||||||
@ -686,7 +685,7 @@ void kl1839vm1_device::vax_decode_pc()
|
|||||||
|
|
||||||
// byte
|
// byte
|
||||||
case vax_disassembler::mode::bb:
|
case vax_disassembler::mode::bb:
|
||||||
tmp_args.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_mem_reg[arg_n] = 0x8f;
|
||||||
m_op_size += 1;
|
m_op_size += 1;
|
||||||
break;
|
break;
|
||||||
@ -700,19 +699,19 @@ void kl1839vm1_device::vax_decode_pc()
|
|||||||
u8 p = m_ram.read_byte(PC + m_op_size);
|
u8 p = m_ram.read_byte(PC + m_op_size);
|
||||||
if (p == 0x8f) // M
|
if (p == 0x8f) // M
|
||||||
{
|
{
|
||||||
tmp_args.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_mem_reg[arg_n] = p;
|
||||||
m_op_size += 2;
|
m_op_size += 2;
|
||||||
}
|
}
|
||||||
else if ((p & 0xf0) == 0x80) // M = R(n)+
|
else if ((p & 0xf0) == 0x80) // M = R(n)+
|
||||||
{
|
{
|
||||||
tmp_args.push_back(p & 0x0f);
|
m_pcm_queue[arg_n] = p & 0x0f;
|
||||||
m_mem_reg[arg_n] = p;
|
m_mem_reg[arg_n] = p;
|
||||||
m_op_size += 1;
|
m_op_size += 1;
|
||||||
}
|
}
|
||||||
else if ((p & 0xf0) == 0x50) // R
|
else if ((p & 0xf0) == 0x50) // R
|
||||||
{
|
{
|
||||||
tmp_args.push_back(p & 0x0f);
|
m_pcm_queue[arg_n] = p & 0x0f;
|
||||||
m_mem_reg[arg_n] = p;
|
m_mem_reg[arg_n] = p;
|
||||||
m_op_size += 1;
|
m_op_size += 1;
|
||||||
}
|
}
|
||||||
@ -726,7 +725,7 @@ void kl1839vm1_device::vax_decode_pc()
|
|||||||
|
|
||||||
// word
|
// word
|
||||||
case vax_disassembler::mode::bw:
|
case vax_disassembler::mode::bw:
|
||||||
tmp_args.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_mem_reg[arg_n] = 0x8f;
|
||||||
m_op_size += 2;
|
m_op_size += 2;
|
||||||
break;
|
break;
|
||||||
@ -742,19 +741,19 @@ void kl1839vm1_device::vax_decode_pc()
|
|||||||
u8 p = m_ram.read_byte(PC + m_op_size);
|
u8 p = m_ram.read_byte(PC + m_op_size);
|
||||||
if (p == 0x8f) // M
|
if (p == 0x8f) // M
|
||||||
{
|
{
|
||||||
tmp_args.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_mem_reg[arg_n] = p;
|
||||||
m_op_size += 5;
|
m_op_size += 5;
|
||||||
}
|
}
|
||||||
else if ((p & 0xf0) == 0x80) // M = R(n)+
|
else if ((p & 0xf0) == 0x80) // M = R(n)+
|
||||||
{
|
{
|
||||||
tmp_args.push_back(p & 0x0f);
|
m_pcm_queue[arg_n] = p & 0x0f;
|
||||||
m_mem_reg[arg_n] = p;
|
m_mem_reg[arg_n] = p;
|
||||||
m_op_size += 1;
|
m_op_size += 1;
|
||||||
}
|
}
|
||||||
else if ((p & 0xf0) == 0x50) // R
|
else if ((p & 0xf0) == 0x50) // R
|
||||||
{
|
{
|
||||||
tmp_args.push_back(p & 0x0f);
|
m_pcm_queue[arg_n] = p & 0x0f;
|
||||||
m_mem_reg[arg_n] = p;
|
m_mem_reg[arg_n] = p;
|
||||||
m_op_size += 1;
|
m_op_size += 1;
|
||||||
}
|
}
|
||||||
@ -768,7 +767,6 @@ void kl1839vm1_device::vax_decode_pc()
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
LOGVAX("(%x): unknown operand mode %02d in OP=%02x (n=%d)\n", PC, u8(mode), op, arg_n + 1);
|
LOGVAX("(%x): unknown operand mode %02d in OP=%02x (n=%d)\n", PC, u8(mode), op, arg_n + 1);
|
||||||
tmp_args.clear();
|
|
||||||
m_op_size = 0;
|
m_op_size = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -776,17 +774,12 @@ void kl1839vm1_device::vax_decode_pc()
|
|||||||
++arg_n;
|
++arg_n;
|
||||||
} while ((arg_n < 6) && (args[arg_n] != vax_disassembler::mode::none));
|
} while ((arg_n < 6) && (args[arg_n] != vax_disassembler::mode::none));
|
||||||
|
|
||||||
m_pcm_queue.clear();
|
m_pcm_queue_size = 0;
|
||||||
if (m_op_size > 0) // above completed without failure
|
if (m_op_size > 0) // above completed without failure
|
||||||
{
|
{
|
||||||
while (!tmp_args.empty())
|
m_pcm_queue_size = (arg_n == 1 && m_mem_reg[0] == u8(~0)) ? 0 : arg_n; // none args case
|
||||||
{
|
|
||||||
m_pcm_queue.push_back(tmp_args.back());
|
|
||||||
tmp_args.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 args_type = 0;
|
u8 args_type = 0;
|
||||||
if (!m_pcm_queue.empty())
|
if (m_pcm_queue_size > 0)
|
||||||
{
|
{
|
||||||
for (u8 i = 0; i < arg_n; ++i)
|
for (u8 i = 0; i < arg_n; ++i)
|
||||||
{
|
{
|
||||||
@ -896,14 +889,13 @@ void kl1839vm1_device::vax_decode_pc()
|
|||||||
|
|
||||||
u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
|
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");
|
LOGVAX("Pooling empty decoder queue\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PCM = m_pcm_queue.back();
|
PCM = m_pcm_queue[0];
|
||||||
m_pcm_queue.pop_back();
|
|
||||||
|
|
||||||
bool is_mem = (m_mem_reg[0] & 0xf0) == 0x80;
|
bool is_mem = (m_mem_reg[0] & 0xf0) == 0x80;
|
||||||
if (is_bo && !is_mem)
|
if (is_bo && !is_mem)
|
||||||
@ -916,7 +908,10 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
|
|||||||
PCM = R(PCM);
|
PCM = R(PCM);
|
||||||
R(r) = PCM + 1;
|
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));
|
std::copy(std::begin(m_mem_reg) + 1, std::end(m_mem_reg), std::begin(m_mem_reg));
|
||||||
|
m_pcm_queue_size--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return PCM;
|
return PCM;
|
||||||
@ -926,7 +921,6 @@ u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)
|
|||||||
void kl1839vm1_device::device_start()
|
void kl1839vm1_device::device_start()
|
||||||
{
|
{
|
||||||
m_vax_dasm = std::make_unique<vax_disassembler>();
|
m_vax_dasm = std::make_unique<vax_disassembler>();
|
||||||
m_pcm_queue.resize(6);
|
|
||||||
|
|
||||||
space(AS_OPCODES).cache(m_microcode);
|
space(AS_OPCODES).cache(m_microcode);
|
||||||
space(AS_DATA).specific(m_sysram);
|
space(AS_DATA).specific(m_sysram);
|
||||||
@ -944,7 +938,8 @@ void kl1839vm1_device::device_start()
|
|||||||
save_pointer(NAME(m_consts), 0x10);
|
save_pointer(NAME(m_consts), 0x10);
|
||||||
save_pointer(NAME(m_reg), 0x20);
|
save_pointer(NAME(m_reg), 0x20);
|
||||||
save_item(NAME(m_op_size));
|
save_item(NAME(m_op_size));
|
||||||
save_item(NAME(m_pcm_queue));
|
save_item(NAME(m_pcm_queue_size));
|
||||||
|
save_pointer(NAME(m_pcm_queue), 6);
|
||||||
save_pointer(NAME(m_mem_reg), 6);
|
save_pointer(NAME(m_mem_reg), 6);
|
||||||
|
|
||||||
// Register debugger state
|
// Register debugger state
|
||||||
@ -1059,7 +1054,7 @@ void kl1839vm1_device::device_reset()
|
|||||||
m_vma_tmp.d = 0;
|
m_vma_tmp.d = 0;
|
||||||
RV = 0;
|
RV = 0;
|
||||||
SCH = 0;
|
SCH = 0;
|
||||||
m_pcm_queue.clear();
|
m_pcm_queue_size = 0;
|
||||||
m_op_size = 0;
|
m_op_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +111,8 @@ private:
|
|||||||
int m_icount;
|
int m_icount;
|
||||||
u32 m_op_size;
|
u32 m_op_size;
|
||||||
|
|
||||||
std::vector<u32> m_pcm_queue;
|
u8 m_pcm_queue_size;
|
||||||
|
u32 m_pcm_queue[6];
|
||||||
u8 m_mem_reg[6];
|
u8 m_mem_reg[6];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user