-e132xs: fix botched DRC merge, nw

This commit is contained in:
mooglyguy 2017-12-29 22:46:00 +01:00
parent 9cc0b85ec9
commit ce54579557
3 changed files with 81 additions and 2 deletions

View File

@ -810,6 +810,9 @@ if (CPUS["E1"]~=null) then
MAME_DIR .. "src/devices/cpu/e132xs/e132xs.h",
MAME_DIR .. "src/devices/cpu/e132xs/32xsdefs.h",
MAME_DIR .. "src/devices/cpu/e132xs/e132xsop.hxx",
MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.cpp",
MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc.cpp",
MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.hxx",
}
end

View File

@ -682,7 +682,7 @@ do
if (m_delay_slot) \
{ \
PC = m_delay_pc; \
m_delay_slot = 0; \
m_delay_slot = 0; \
} \
} while (0)
@ -1094,7 +1094,11 @@ void hyperstone_device::device_start()
void hyperstone_device::init(int scale_mask)
{
#if ENABLE_E132XS_DRC
m_enable_drc = allow_drc();
#else
m_enable_drc = false;
#endif
#if E132XS_LOG_DRC_REGS || E132XS_LOG_INTERPRETER_REGS
if (m_enable_drc)
@ -1103,6 +1107,7 @@ void hyperstone_device::init(int scale_mask)
m_trace_log = fopen("e1_interpreter.log", "wb");
#endif
memset(m_op_counts, 0, sizeof(uint32_t) * 256);
memset(m_global_regs, 0, sizeof(uint32_t) * 32);
memset(m_local_regs, 0, sizeof(uint32_t) * 64);
m_op = 0;
@ -1139,6 +1144,38 @@ void hyperstone_device::init(int scale_mask)
m_fl_lut[i] = (i ? i : 16);
}
uint32_t umlflags = 0;
m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, umlflags, 1, 32, 1);
// add UML symbols-
m_drcuml->symbol_add(&m_global_regs[0], sizeof(uint32_t), "pc");
m_drcuml->symbol_add(&m_global_regs[1], sizeof(uint32_t), "sr");
m_drcuml->symbol_add(&m_icount, sizeof(m_icount), "icount");
char buf[4];
for (int i=0; i < 32; i++)
{
sprintf(buf, "g%d", i);
m_drcuml->symbol_add(&m_global_regs[i], sizeof(uint32_t), buf);
}
for (int i=0; i < 64; i++)
{
sprintf(buf, "l%d", i);
m_drcuml->symbol_add(&m_local_regs[i], sizeof(uint32_t), buf);
}
m_drcuml->symbol_add(&m_drc_arg0, sizeof(uint32_t), "arg0");
m_drcuml->symbol_add(&m_drc_arg1, sizeof(uint32_t), "arg1");
m_drcuml->symbol_add(&m_drc_arg2, sizeof(uint32_t), "arg2");
m_drcuml->symbol_add(&m_drc_arg3, sizeof(uint32_t), "arg3");
/* initialize the front-end helper */
m_drcfe = std::make_unique<e132xs_frontend>(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE);
/* mark the cache dirty so it is updated on next execute */
m_cache_dirty = true;
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", m_global_regs[0]).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_global_regs[0]).noshow();
@ -1412,6 +1449,34 @@ void hyperstone_device::device_stop()
#if E132XS_LOG_DRC_REGS || E132XS_LOG_INTERPRETER_REGS
fclose(m_trace_log);
#endif
#if E132XS_COUNT_INSTRUCTIONS
uint32_t indices[256];
for (uint32_t i = 0; i < 256; i++)
indices[i] = i;
for (uint32_t i = 0; i < 256; i++)
{
for (uint32_t j = 0; j < 256; j++)
{
if (m_op_counts[j] < m_op_counts[i])
{
uint32_t temp = m_op_counts[i];
m_op_counts[i] = m_op_counts[j];
m_op_counts[j] = temp;
temp = indices[i];
indices[i] = indices[j];
indices[j] = temp;
}
}
}
for (uint32_t i = 0; i < 256; i++)
{
if (m_op_counts[i] != 0)
{
printf("%02x: %d\n", (uint8_t)indices[i], m_op_counts[i]);
}
}
#endif
}
@ -1578,6 +1643,12 @@ void hyperstone_device::hyperstone_do()
void hyperstone_device::execute_run()
{
if (m_enable_drc)
{
execute_run_drc();
return;
}
if (m_intblock < 0)
m_intblock = 0;
@ -1599,6 +1670,9 @@ void hyperstone_device::execute_run()
m_instruction_length = (1<<19);
#if E132XS_COUNT_INSTRUCTIONS
m_op_counts[m_op >> 8]++;
#endif
switch (m_op >> 8)
{
case 0x00: hyperstone_chk<GLOBAL, GLOBAL>(); break;
@ -1891,4 +1965,4 @@ DEFINE_DEVICE_TYPE(E132XSR, e132xsr_device, "e132xsr", "E1-32XSR")
DEFINE_DEVICE_TYPE(GMS30C2116, gms30c2116_device, "gms30c2116", "GMS30C2116")
DEFINE_DEVICE_TYPE(GMS30C2132, gms30c2132_device, "gms30c2132", "GMS30C2132")
DEFINE_DEVICE_TYPE(GMS30C2216, gms30c2216_device, "gms30c2216", "GMS30C2216")
DEFINE_DEVICE_TYPE(GMS30C2232, gms30c2232_device, "gms30c2232", "GMS30C2232")
DEFINE_DEVICE_TYPE(GMS30C2232, gms30c2232_device, "gms30c2232", "GMS30C2232")

View File

@ -54,6 +54,7 @@
#define E132XS_LOG_DRC_REGS (0)
#define E132XS_LOG_INTERPRETER_REGS (0)
#define E132XS_COUNT_INSTRUCTIONS (0)
//**************************************************************************
// TYPE DEFINITIONS
@ -292,6 +293,7 @@ protected:
static const uint32_t s_trap_entries[8];
static const int32_t s_immediate_values[16];
uint32_t m_op_counts[256];
uint32_t get_trap_addr(uint8_t trapno);
private: