mirror of
https://github.com/holub/mame
synced 2025-05-28 08:33:05 +03:00
e132xs: Fixed SUBC flag calculation for DRC, and fixed instruction length flags. Fixes hang in DRC. [Ryan Holtz]
This commit is contained in:
parent
d026809d9c
commit
0e6bff870e
@ -129,9 +129,6 @@
|
||||
/* write word */
|
||||
#define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data)
|
||||
|
||||
|
||||
#define READ_OP(addr) m_pr16(addr)
|
||||
|
||||
// set C in adds/addsi/subs/sums
|
||||
#define SETCARRYS 0
|
||||
#define MISSIONCRAFT_FLAGS 1
|
||||
@ -176,6 +173,7 @@
|
||||
#define N_SHIFT 2
|
||||
#define V_SHIFT 3
|
||||
#define S_SHIFT 18
|
||||
#define ILC_SHIFT 19
|
||||
|
||||
/* SR flags */
|
||||
#define GET_C ( SR & C_MASK) // bit 0 //CARRY
|
||||
|
@ -418,19 +418,6 @@ uint32_t hyperstone_device::get_emu_code_addr(uint8_t num) /* num is OP */
|
||||
#if E132XS_LOG_INTERPRETER_REGS
|
||||
void hyperstone_device::dump_registers()
|
||||
{
|
||||
static uint64_t total_ops = 0;
|
||||
//static uint64_t total_11094 = 0;
|
||||
total_ops++;
|
||||
if (total_ops < 0ULL)
|
||||
{
|
||||
//if (m_core->global_regs[0] == 0x11094)
|
||||
//{
|
||||
// total_11094++;
|
||||
//}
|
||||
return;
|
||||
} else if (total_ops == 0ULL) {
|
||||
//printf("Total non-log hits of 0x11094: %d\n", (uint32_t)total_11094);
|
||||
}
|
||||
uint8_t packed[4];
|
||||
packed[0] = (uint8_t)m_core->intblock;
|
||||
packed[1] = (uint8_t)(m_core->icount >> 16);
|
||||
@ -710,21 +697,21 @@ uint32_t hyperstone_device::decode_immediate_s()
|
||||
case 1:
|
||||
{
|
||||
m_instruction_length = (3<<19);
|
||||
uint32_t extra_u = (READ_OP(PC) << 16) | READ_OP(PC + 2);
|
||||
uint32_t extra_u = (m_pr16(PC) << 16) | m_pr16(PC + 2);
|
||||
PC += 4;
|
||||
return extra_u;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
m_instruction_length = (2<<19);
|
||||
uint32_t extra_u = READ_OP(PC);
|
||||
uint32_t extra_u = m_pr16(PC);
|
||||
PC += 2;
|
||||
return extra_u;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
m_instruction_length = (2<<19);
|
||||
uint32_t extra_u = 0xffff0000 | READ_OP(PC);
|
||||
uint32_t extra_u = 0xffff0000 | m_pr16(PC);
|
||||
PC += 2;
|
||||
return extra_u;
|
||||
}
|
||||
@ -735,14 +722,13 @@ uint32_t hyperstone_device::decode_immediate_s()
|
||||
|
||||
uint32_t hyperstone_device::decode_const()
|
||||
{
|
||||
const uint16_t imm_1 = READ_OP(PC);
|
||||
const uint16_t imm_1 = m_pr16(PC);
|
||||
|
||||
PC += 2;
|
||||
m_instruction_length = (2<<19);
|
||||
|
||||
if (imm_1 & 0x8000)
|
||||
{
|
||||
const uint16_t imm_2 = READ_OP(PC);
|
||||
const uint16_t imm_2 = m_pr16(PC);
|
||||
|
||||
PC += 2;
|
||||
m_instruction_length = (3<<19);
|
||||
@ -756,6 +742,8 @@ uint32_t hyperstone_device::decode_const()
|
||||
}
|
||||
else
|
||||
{
|
||||
m_instruction_length = (2<<19);
|
||||
|
||||
uint32_t imm = imm_1 & 0x3fff;
|
||||
|
||||
if (imm_1 & 0x4000)
|
||||
@ -768,7 +756,7 @@ int32_t hyperstone_device::decode_pcrel()
|
||||
{
|
||||
if (OP & 0x80)
|
||||
{
|
||||
uint16_t next = READ_OP(PC);
|
||||
uint16_t next = m_pr16(PC);
|
||||
|
||||
PC += 2;
|
||||
m_instruction_length = (2<<19);
|
||||
@ -1099,6 +1087,8 @@ void hyperstone_device::device_start()
|
||||
|
||||
void hyperstone_device::init(int scale_mask)
|
||||
{
|
||||
m_instruction_length_valid = false;
|
||||
|
||||
m_core = (internal_hyperstone_state *)m_cache.alloc_near(sizeof(internal_hyperstone_state));
|
||||
memset(m_core, 0, sizeof(internal_hyperstone_state));
|
||||
|
||||
@ -1630,6 +1620,51 @@ void hyperstone_device::hyperstone_do()
|
||||
fatalerror("Executed hyperstone_do instruction. PC = %08X\n", PC-4);
|
||||
}
|
||||
|
||||
uint32_t hyperstone_device::imm_length(uint16_t op)
|
||||
{
|
||||
switch (op & 0x0f)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
return 1;
|
||||
case 1:
|
||||
return 3;
|
||||
case 2:
|
||||
case 3:
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t hyperstone_device::get_instruction_length(uint16_t op)
|
||||
{
|
||||
switch (op >> 8)
|
||||
{
|
||||
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
|
||||
case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
|
||||
case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
|
||||
case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
|
||||
case 0xee: case 0xef:
|
||||
m_instruction_length = ((m_pr16(PC+2) & 0x8000) ? 3 : 2) << ILC_SHIFT;
|
||||
break;
|
||||
case 0x61: case 0x63: case 0x65: case 0x67: case 0x69: case 0x6b: case 0x6d: case 0x6f:
|
||||
case 0x71: case 0x73: case 0x75: case 0x77: case 0x79: case 0x7b: case 0x7d: case 0x7f:
|
||||
m_instruction_length = imm_length(op) << ILC_SHIFT;
|
||||
break;
|
||||
case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
|
||||
case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc:
|
||||
m_instruction_length = ((op & 0x80) ? 2 : 1) << ILC_SHIFT;
|
||||
break;
|
||||
case 0xce:
|
||||
m_instruction_length = 2 << ILC_SHIFT;
|
||||
break;
|
||||
default:
|
||||
m_instruction_length = 1 << ILC_SHIFT;
|
||||
break;
|
||||
}
|
||||
m_instruction_length_valid = true;
|
||||
return m_instruction_length;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// execute_run - execute a timeslice's worth of
|
||||
// opcodes
|
||||
@ -1646,6 +1681,9 @@ void hyperstone_device::execute_run()
|
||||
if (m_core->intblock < 0)
|
||||
m_core->intblock = 0;
|
||||
|
||||
if (!m_instruction_length_valid)
|
||||
SET_ILC(get_instruction_length(m_pr16(PC)));
|
||||
|
||||
if (m_core->timer_int_pending)
|
||||
check_interrupts<IS_TIMER>();
|
||||
else
|
||||
@ -1659,10 +1697,10 @@ void hyperstone_device::execute_run()
|
||||
|
||||
debugger_instruction_hook(PC);
|
||||
|
||||
OP = READ_OP(PC);
|
||||
OP = m_pr16(PC);
|
||||
PC += 2;
|
||||
|
||||
m_instruction_length = (1<<19);
|
||||
m_instruction_length = 1 << ILC_SHIFT;
|
||||
|
||||
#if E132XS_COUNT_INSTRUCTIONS
|
||||
m_op_counts[m_op >> 8]++;
|
||||
|
@ -135,6 +135,8 @@ public:
|
||||
void e132_4k_iram_map(address_map &map);
|
||||
void e132_8k_iram_map(address_map &map);
|
||||
|
||||
static uint32_t imm_length(uint16_t op);
|
||||
|
||||
protected:
|
||||
// compilation boundaries -- how far back/forward does the analysis extend?
|
||||
enum : u32
|
||||
@ -312,7 +314,8 @@ protected:
|
||||
/* core state */
|
||||
internal_hyperstone_state *m_core;
|
||||
|
||||
int32_t m_instruction_length;
|
||||
int32_t m_instruction_length;
|
||||
bool m_instruction_length_valid;
|
||||
|
||||
emu_timer *m_timer;
|
||||
|
||||
@ -332,6 +335,7 @@ private:
|
||||
uint32_t get_global_register(uint8_t code);
|
||||
|
||||
uint32_t get_emu_code_addr(uint8_t num);
|
||||
int32_t get_instruction_length(uint16_t op);
|
||||
|
||||
TIMER_CALLBACK_MEMBER(timer_callback);
|
||||
|
||||
@ -479,7 +483,7 @@ private:
|
||||
void static_generate_interrupt_checks();
|
||||
void generate_interrupt_checks_no_timer(drcuml_block &block, uml::code_label &labelnum);
|
||||
void generate_interrupt_checks_with_timer(drcuml_block &block, uml::code_label &labelnum);
|
||||
void generate_branch(drcuml_block &block, uml::parameter targetpc, bool update_cycles = true);
|
||||
void generate_branch(drcuml_block &block, uml::parameter targetpc, const opcode_desc *desc, bool update_cycles = true);
|
||||
void generate_update_cycles(drcuml_block &block, bool check_interrupts = true);
|
||||
void generate_checksum_block(drcuml_block &block, compiler_state &compiler, const opcode_desc *seqhead, const opcode_desc *seqlast);
|
||||
void generate_sequence_instruction(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
|
||||
|
@ -865,8 +865,11 @@ void hyperstone_device::log_add_disasm_comment(drcuml_block &block, uint32_t pc,
|
||||
generate_branch
|
||||
------------------------------------------------------------------*/
|
||||
|
||||
void hyperstone_device::generate_branch(drcuml_block &block, uml::parameter targetpc, bool update_cycles)
|
||||
void hyperstone_device::generate_branch(drcuml_block &block, uml::parameter targetpc, const opcode_desc *desc, bool update_cycles)
|
||||
{
|
||||
if (desc)
|
||||
UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK);
|
||||
|
||||
if (update_cycles)
|
||||
generate_update_cycles(block);
|
||||
|
||||
@ -910,8 +913,6 @@ void hyperstone_device::generate_sequence_instruction(drcuml_block &block, compi
|
||||
UML_DEBUG(block, desc->pc);
|
||||
}
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (1<<19), 0, ILC_MASK);
|
||||
|
||||
if (!(desc->flags & OPFLAG_VIRTUAL_NOOP))
|
||||
{
|
||||
/* compile the instruction */
|
||||
@ -930,7 +931,6 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com
|
||||
{
|
||||
uint32_t op = (uint32_t)desc->opptr.w[0];
|
||||
|
||||
//UML_MOV(block, I0, op);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
|
||||
switch (op >> 8)
|
||||
@ -1193,6 +1193,8 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com
|
||||
case 0xff: generate_trap_op(block, compiler, desc); break;
|
||||
}
|
||||
|
||||
UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK);
|
||||
|
||||
int no_delay_taken = compiler.m_labelnum++;
|
||||
UML_TEST(block, mem(&m_core->delay_slot_taken), ~0);
|
||||
UML_JMPc(block, uml::COND_Z, no_delay_taken);
|
||||
@ -1209,6 +1211,5 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com
|
||||
UML_EXHc(block, uml::COND_E, *m_exception[EXCEPTION_TRACE], 0);
|
||||
|
||||
UML_LABEL(block, done);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -16,11 +16,11 @@ void hyperstone_device::generate_check_delay_pc(drcuml_block &block, compiler_st
|
||||
|
||||
void hyperstone_device::generate_decode_const(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
|
||||
{
|
||||
const uint16_t imm_1 = READ_OP(desc->pc + 2);
|
||||
const uint16_t imm_1 = m_pr16(desc->pc + 2);
|
||||
|
||||
if (imm_1 & 0x8000)
|
||||
{
|
||||
const uint16_t imm_2 = READ_OP(desc->pc + 4);
|
||||
const uint16_t imm_2 = m_pr16(desc->pc + 4);
|
||||
|
||||
uint32_t imm = imm_2;
|
||||
imm |= ((imm_1 & 0x3fff) << 16);
|
||||
@ -28,7 +28,6 @@ void hyperstone_device::generate_decode_const(drcuml_block &block, compiler_stat
|
||||
if (imm_1 & 0x4000)
|
||||
imm |= 0xc0000000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 4);
|
||||
UML_MOV(block, I1, imm);
|
||||
}
|
||||
@ -39,7 +38,6 @@ void hyperstone_device::generate_decode_const(drcuml_block &block, compiler_stat
|
||||
if (imm_1 & 0x4000)
|
||||
imm |= 0xffffc000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
UML_MOV(block, I1, imm);
|
||||
}
|
||||
@ -56,24 +54,21 @@ void hyperstone_device::generate_decode_immediate_s(drcuml_block &block, compile
|
||||
return;
|
||||
case 1:
|
||||
{
|
||||
uint32_t extra_u = (READ_OP(desc->pc + 2) << 16) | READ_OP(desc->pc + 4);
|
||||
UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK);
|
||||
uint32_t extra_u = (m_pr16(desc->pc + 2) << 16) | m_pr16(desc->pc + 4);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 4);
|
||||
UML_MOV(block, I1, extra_u);
|
||||
return;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
uint32_t extra_u = READ_OP(desc->pc + 2);
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
uint32_t extra_u = m_pr16(desc->pc + 2);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
UML_MOV(block, I1, extra_u);
|
||||
return;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
uint32_t extra_u = 0xffff0000 | READ_OP(desc->pc + 2);
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
uint32_t extra_u = 0xffff0000 | m_pr16(desc->pc + 2);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
UML_MOV(block, I1, extra_u);
|
||||
return;
|
||||
@ -88,11 +83,9 @@ void hyperstone_device::generate_ignore_immediate_s(drcuml_block &block, const o
|
||||
{
|
||||
uint16_t op = desc->opptr.w[0];
|
||||
|
||||
static const uint32_t lengths[16] = { 1<<19, 3<<19, 2<<19, 2<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19 };
|
||||
static const uint32_t offsets[16] = { 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
const uint8_t nybble = op & 0x0f;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, lengths[nybble], 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, offsets[nybble]);
|
||||
}
|
||||
|
||||
@ -103,7 +96,7 @@ void hyperstone_device::generate_decode_pcrel(drcuml_block &block, const opcode_
|
||||
int32_t offset;
|
||||
if (op & 0x80)
|
||||
{
|
||||
uint16_t next = READ_OP(desc->pc + 2);
|
||||
uint16_t next = m_pr16(desc->pc + 2);
|
||||
|
||||
offset = (op & 0x7f) << 16;
|
||||
offset |= (next & 0xfffe);
|
||||
@ -111,7 +104,6 @@ void hyperstone_device::generate_decode_pcrel(drcuml_block &block, const opcode_
|
||||
if (next & 1)
|
||||
offset |= 0xff800000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
}
|
||||
else
|
||||
@ -132,7 +124,6 @@ void hyperstone_device::generate_ignore_pcrel(drcuml_block &block, const opcode_
|
||||
if (op & 0x80)
|
||||
{
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
}
|
||||
}
|
||||
|
||||
@ -275,7 +266,7 @@ void hyperstone_device::generate_trap_exception_or_int(drcuml_block &block)
|
||||
UML_OR(block, DRC_SR, DRC_SR, (L_MASK | S_MASK));
|
||||
|
||||
UML_MOV(block, DRC_PC, I0);
|
||||
generate_branch(block, DRC_PC, true);
|
||||
generate_branch(block, DRC_PC, nullptr, true);
|
||||
}
|
||||
|
||||
void hyperstone_device::generate_int(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint32_t addr)
|
||||
@ -368,7 +359,7 @@ void hyperstone_device::generate_software(drcuml_block &block, compiler_state &c
|
||||
UML_ROLINS(block, I0, I4, 25, 0xfe000000); // SET_FP(reg)
|
||||
UML_AND(block, DRC_SR, I0, ~(M_MASK | T_MASK));
|
||||
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
|
||||
|
||||
@ -471,7 +462,6 @@ void hyperstone_device::generate_movd(drcuml_block &block, compiler_state &compi
|
||||
|
||||
UML_AND(block, DRC_SR, I3, 0xffe3ffff);
|
||||
UML_ROLINS(block, DRC_SR, I2, S_SHIFT, S_MASK);
|
||||
UML_ROLINS(block, DRC_SR, (1<<19), 0, ILC_MASK);
|
||||
|
||||
UML_TEST(block, mem(&m_core->intblock), ~0);
|
||||
UML_MOVc(block, uml::COND_Z, mem(&m_core->intblock), 1);
|
||||
@ -522,7 +512,7 @@ void hyperstone_device::generate_movd(drcuml_block &block, compiler_state &compi
|
||||
|
||||
UML_LABEL(block, done_ret);
|
||||
UML_MOV(block, mem(&SP), I0);
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
return;
|
||||
}
|
||||
else if (SRC_GLOBAL && (src_code == SR_REGISTER)) // Rd doesn't denote PC and Rs denotes SR
|
||||
@ -538,7 +528,7 @@ void hyperstone_device::generate_movd(drcuml_block &block, compiler_state &compi
|
||||
UML_MOV(block, I5, 0);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (dst_code == PC_REGISTER || dstf_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -593,7 +583,7 @@ void hyperstone_device::generate_movd(drcuml_block &block, compiler_state &compi
|
||||
UML_MOV(block, I5, I1);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (dst_code == PC_REGISTER || dstf_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -715,19 +705,17 @@ void hyperstone_device::generate_xm(drcuml_block &block, compiler_state &compile
|
||||
const uint32_t dst_code = (op & 0xf0) >> 4;
|
||||
const uint32_t src_code = op & 0xf;
|
||||
|
||||
const uint32_t next = READ_OP(desc->pc + 2);
|
||||
const uint32_t next = m_pr16(desc->pc + 2);
|
||||
const uint8_t sub_type = (next & 0x7000) >> 12;
|
||||
|
||||
uint32_t extra_u = next & 0xfff;
|
||||
if (next & 0x8000)
|
||||
{
|
||||
extra_u = ((extra_u & 0xfff) << 16) | READ_OP(desc->pc + 4);
|
||||
UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK);
|
||||
extra_u = ((extra_u & 0xfff) << 16) | m_pr16(desc->pc + 4);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
}
|
||||
|
||||
@ -840,7 +828,7 @@ void hyperstone_device::generate_mask(drcuml_block &block, compiler_state &compi
|
||||
UML_MOV(block, I5, I1);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (dst_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -915,7 +903,7 @@ void hyperstone_device::generate_sum(drcuml_block &block, compiler_state &compil
|
||||
UML_MOV(block, I4, dst_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (dst_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1091,7 +1079,7 @@ void hyperstone_device::generate_mov(drcuml_block &block, compiler_state &compil
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
UML_CMP(block, I3, 0);
|
||||
UML_JMPc(block, uml::COND_NE, done);
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1170,7 +1158,7 @@ void hyperstone_device::generate_add(drcuml_block &block, compiler_state &compil
|
||||
if (dst_code == PC_REGISTER)
|
||||
{
|
||||
UML_AND(block, DRC_SR, DRC_SR, ~M_MASK);
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1309,7 +1297,7 @@ void hyperstone_device::generate_subc(drcuml_block &block, compiler_state &compi
|
||||
UML_AND(block, I2, I2, I6); // old_z && dreg == 0
|
||||
UML_OR(block, I5, I5, I2);
|
||||
UML_ROLINS(block, I5, I1, 3, N_MASK);
|
||||
UML_ROLINS(block, DRC_SR, I5, 0, (V_MASK | Z_MASK | N_MASK));
|
||||
UML_ROLINS(block, DRC_SR, I5, 0, (C_MASK | V_MASK | Z_MASK | N_MASK));
|
||||
|
||||
if (DST_GLOBAL)
|
||||
{
|
||||
@ -1320,7 +1308,7 @@ void hyperstone_device::generate_subc(drcuml_block &block, compiler_state &compi
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
|
||||
if (dst_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1409,7 +1397,7 @@ void hyperstone_device::generate_sub(drcuml_block &block, compiler_state &compil
|
||||
if (dst_code == PC_REGISTER)
|
||||
{
|
||||
UML_AND(block, DRC_SR, DRC_SR, ~M_MASK);
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1491,7 +1479,7 @@ void hyperstone_device::generate_subs(drcuml_block &block, compiler_state &compi
|
||||
|
||||
if (dst_code == PC_REGISTER)
|
||||
{
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1509,6 +1497,7 @@ void hyperstone_device::generate_subs(drcuml_block &block, compiler_state &compi
|
||||
int no_exception = compiler.m_labelnum++;
|
||||
UML_TEST(block, DRC_SR, V_MASK);
|
||||
UML_JMPc(block, uml::COND_Z, no_exception);
|
||||
UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK);
|
||||
generate_trap_exception_or_int<IS_EXCEPTION>(block);
|
||||
UML_LABEL(block, no_exception);
|
||||
}
|
||||
@ -2113,7 +2102,7 @@ void hyperstone_device::generate_movi(drcuml_block &block, compiler_state &compi
|
||||
UML_TEST(block, op, 0xf0);
|
||||
UML_JMPc(block, uml::COND_NZ, done);
|
||||
UML_AND(block, DRC_SR, DRC_SR, ~M_MASK);
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
|
||||
UML_LABEL(block, done);
|
||||
}
|
||||
@ -2200,7 +2189,7 @@ void hyperstone_device::generate_addi(drcuml_block &block, compiler_state &compi
|
||||
if (dst_code == PC_REGISTER)
|
||||
{
|
||||
UML_AND(block, DRC_SR, DRC_SR, ~M_MASK);
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -2350,7 +2339,7 @@ void hyperstone_device::generate_andni(drcuml_block &block, compiler_state &comp
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (dst_code == PC_REGISTER)
|
||||
{
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -2413,7 +2402,7 @@ void hyperstone_device::generate_ori(drcuml_block &block, compiler_state &compil
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (dst_code == PC_REGISTER)
|
||||
{
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -2476,7 +2465,7 @@ void hyperstone_device::generate_xori(drcuml_block &block, compiler_state &compi
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (dst_code == PC_REGISTER)
|
||||
{
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -3259,13 +3248,13 @@ template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SR
|
||||
void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
|
||||
{
|
||||
const uint16_t op = desc->opptr.w[0];
|
||||
uint16_t next_1 = READ_OP(desc->pc + 2);
|
||||
uint16_t next_1 = m_pr16(desc->pc + 2);
|
||||
const uint16_t sub_type = (next_1 & 0x3000) >> 12;
|
||||
|
||||
uint32_t extra_s;
|
||||
if (next_1 & 0x8000)
|
||||
{
|
||||
const uint16_t next_2 = READ_OP(desc->pc + 4);
|
||||
const uint16_t next_2 = m_pr16(desc->pc + 4);
|
||||
|
||||
extra_s = next_2;
|
||||
extra_s |= ((next_1 & 0xfff) << 16);
|
||||
@ -3273,7 +3262,6 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
if (next_1 & 0x4000)
|
||||
extra_s |= 0xf0000000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 4);
|
||||
}
|
||||
else
|
||||
@ -3283,7 +3271,6 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
if (next_1 & 0x4000)
|
||||
extra_s |= 0xfffff000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
}
|
||||
|
||||
@ -3323,7 +3310,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
UML_MOV(block, I4, src_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (src_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3344,7 +3331,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
UML_MOV(block, I5, I1);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (src_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3371,7 +3358,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
|
||||
if (src_code == 0)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3407,7 +3394,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
UML_MOV(block, I4, src_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (src_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3426,7 +3413,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
UML_MOV(block, I4, src_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (src_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3462,7 +3449,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
UML_MOV(block, I4, src_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (src_code == 0)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3483,7 +3470,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp
|
||||
UML_MOV(block, I4, src_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (src_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3519,13 +3506,13 @@ template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SR
|
||||
void hyperstone_device::generate_ldxx2(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
|
||||
{
|
||||
const uint16_t op = desc->opptr.w[0];
|
||||
uint16_t next_1 = READ_OP(desc->pc + 2);
|
||||
uint16_t next_1 = m_pr16(desc->pc + 2);
|
||||
const uint16_t sub_type = (next_1 & 0x3000) >> 12;
|
||||
|
||||
uint32_t extra_s;
|
||||
if (next_1 & 0x8000)
|
||||
{
|
||||
const uint16_t next_2 = READ_OP(desc->pc + 4);
|
||||
const uint16_t next_2 = m_pr16(desc->pc + 4);
|
||||
|
||||
extra_s = next_2;
|
||||
extra_s |= ((next_1 & 0xfff) << 16);
|
||||
@ -3533,7 +3520,6 @@ void hyperstone_device::generate_ldxx2(drcuml_block &block, compiler_state &comp
|
||||
if (next_1 & 0x4000)
|
||||
extra_s |= 0xf0000000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 4);
|
||||
}
|
||||
else
|
||||
@ -3543,7 +3529,6 @@ void hyperstone_device::generate_ldxx2(drcuml_block &block, compiler_state &comp
|
||||
if (next_1 & 0x4000)
|
||||
extra_s |= 0xfffff000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
}
|
||||
|
||||
@ -3788,13 +3773,13 @@ void hyperstone_device::generate_stxx1(drcuml_block &block, compiler_state &comp
|
||||
{
|
||||
const uint16_t op = desc->opptr.w[0];
|
||||
|
||||
uint16_t next_1 = READ_OP(desc->pc + 2);
|
||||
uint16_t next_1 = m_pr16(desc->pc + 2);
|
||||
const uint16_t sub_type = (next_1 & 0x3000) >> 12;
|
||||
|
||||
uint32_t extra_s;
|
||||
if (next_1 & 0x8000)
|
||||
{
|
||||
const uint16_t next_2 = READ_OP(desc->pc + 4);
|
||||
const uint16_t next_2 = m_pr16(desc->pc + 4);
|
||||
|
||||
extra_s = next_2;
|
||||
extra_s |= ((next_1 & 0xfff) << 16);
|
||||
@ -3802,7 +3787,6 @@ void hyperstone_device::generate_stxx1(drcuml_block &block, compiler_state &comp
|
||||
if (next_1 & 0x4000)
|
||||
extra_s |= 0xf0000000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 4);
|
||||
}
|
||||
else
|
||||
@ -3812,7 +3796,6 @@ void hyperstone_device::generate_stxx1(drcuml_block &block, compiler_state &comp
|
||||
if (next_1 & 0x4000)
|
||||
extra_s |= 0xfffff000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
}
|
||||
|
||||
@ -3945,13 +3928,13 @@ void hyperstone_device::generate_stxx2(drcuml_block &block, compiler_state &comp
|
||||
{
|
||||
const uint16_t op = desc->opptr.w[0];
|
||||
|
||||
uint16_t next_1 = READ_OP(desc->pc + 2);
|
||||
uint16_t next_1 = m_pr16(desc->pc + 2);
|
||||
const uint16_t sub_type = (next_1 & 0x3000) >> 12;
|
||||
|
||||
uint32_t extra_s;
|
||||
if (next_1 & 0x8000)
|
||||
{
|
||||
const uint16_t next_2 = READ_OP(desc->pc + 4);
|
||||
const uint16_t next_2 = m_pr16(desc->pc + 4);
|
||||
|
||||
extra_s = next_2;
|
||||
extra_s |= ((next_1 & 0xfff) << 16);
|
||||
@ -3959,7 +3942,6 @@ void hyperstone_device::generate_stxx2(drcuml_block &block, compiler_state &comp
|
||||
if (next_1 & 0x4000)
|
||||
extra_s |= 0xf0000000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 4);
|
||||
}
|
||||
else
|
||||
@ -3969,7 +3951,6 @@ void hyperstone_device::generate_stxx2(drcuml_block &block, compiler_state &comp
|
||||
if (next_1 & 0x4000)
|
||||
extra_s |= 0xfffff000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
}
|
||||
|
||||
@ -4391,7 +4372,7 @@ void hyperstone_device::generate_ldwr(drcuml_block &block, compiler_state &compi
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (src_code == PC_REGISTER)
|
||||
{
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -4489,7 +4470,7 @@ void hyperstone_device::generate_ldwp(drcuml_block &block, compiler_state &compi
|
||||
UML_STORE(block, (void *)m_core->local_regs, I2, I3, SIZE_DWORD, SCALE_x4);
|
||||
|
||||
if (src_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4547,7 +4528,7 @@ void hyperstone_device::generate_lddp(drcuml_block &block, compiler_state &compi
|
||||
UML_STORE(block, (void *)m_core->local_regs, I2, I3, SIZE_DWORD, SCALE_x4);
|
||||
|
||||
if (src_code == PC_REGISTER || (src_code + 1) == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4794,7 +4775,7 @@ void hyperstone_device::generate_br(drcuml_block &block, compiler_state &compile
|
||||
UML_ADD(block, DRC_PC, DRC_PC, I1);
|
||||
UML_AND(block, DRC_SR, DRC_SR, ~M_MASK);
|
||||
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, desc);
|
||||
// TODO: correct cycle count
|
||||
}
|
||||
|
||||
@ -4898,15 +4879,16 @@ template <hyperstone_device::reg_bank SRC_GLOBAL>
|
||||
void hyperstone_device::generate_call(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
|
||||
{
|
||||
UML_MOV(block, I7, mem(&m_core->clock_cycles_1));
|
||||
UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK);
|
||||
|
||||
uint16_t op = desc->opptr.w[0];
|
||||
uint16_t imm_1 = READ_OP(desc->pc + 2);
|
||||
uint16_t imm_1 = m_pr16(desc->pc + 2);
|
||||
|
||||
int32_t extra_s = 0;
|
||||
|
||||
if (imm_1 & 0x8000)
|
||||
{
|
||||
uint16_t imm_2 = READ_OP(desc->pc + 4);
|
||||
uint16_t imm_2 = m_pr16(desc->pc + 4);
|
||||
|
||||
extra_s = imm_2;
|
||||
extra_s |= ((imm_1 & 0x3fff) << 16);
|
||||
@ -4914,7 +4896,6 @@ void hyperstone_device::generate_call(drcuml_block &block, compiler_state &compi
|
||||
if (imm_1 & 0x4000)
|
||||
extra_s |= 0xc0000000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 4);
|
||||
}
|
||||
else
|
||||
@ -4924,7 +4905,6 @@ void hyperstone_device::generate_call(drcuml_block &block, compiler_state &compi
|
||||
if (imm_1 & 0x4000)
|
||||
extra_s |= 0xffffc000;
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
}
|
||||
|
||||
@ -4973,7 +4953,7 @@ void hyperstone_device::generate_call(drcuml_block &block, compiler_state &compi
|
||||
|
||||
UML_MOV(block, mem(&m_core->intblock), 2);
|
||||
|
||||
generate_branch(block, desc->targetpc);
|
||||
generate_branch(block, desc->targetpc, nullptr);
|
||||
//TODO: add interrupt locks, errors, ....
|
||||
}
|
||||
|
||||
@ -4997,7 +4977,6 @@ void hyperstone_device::generate_trap_op(drcuml_block &block, compiler_state &co
|
||||
const uint8_t trapno = (op & 0xfc) >> 2;
|
||||
const uint8_t code = ((op & 0x300) >> 6) | (op & 0x03);
|
||||
|
||||
UML_ROLINS(block, DRC_SR, (1<<19), 0, ILC_MASK);
|
||||
UML_TEST(block, DRC_SR, conditions[code]);
|
||||
|
||||
int skip_trap = compiler.m_labelnum++;
|
||||
@ -5006,6 +4985,7 @@ void hyperstone_device::generate_trap_op(drcuml_block &block, compiler_state &co
|
||||
else
|
||||
UML_JMPc(block, uml::COND_NZ, skip_trap);
|
||||
|
||||
UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK);
|
||||
generate_get_trap_addr(block, compiler.m_labelnum, trapno);
|
||||
generate_trap_exception_or_int<IS_TRAP>(block);
|
||||
|
||||
@ -5018,8 +4998,7 @@ void hyperstone_device::generate_extend(drcuml_block &block, compiler_state &com
|
||||
|
||||
uint16_t op = desc->opptr.w[0];
|
||||
|
||||
uint16_t func = READ_OP(desc->pc + 2);
|
||||
UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK);
|
||||
uint16_t func = m_pr16(desc->pc + 2);
|
||||
UML_ADD(block, DRC_PC, DRC_PC, 2);
|
||||
|
||||
generate_check_delay_pc(block, compiler, desc);
|
||||
|
@ -28,22 +28,6 @@ e132xs_frontend::e132xs_frontend(hyperstone_device *e132xs, uint32_t window_star
|
||||
{
|
||||
}
|
||||
|
||||
inline uint32_t e132xs_frontend::imm_length(opcode_desc &desc, uint16_t op)
|
||||
{
|
||||
uint8_t nybble = op & 0x0f;
|
||||
switch (nybble)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
return 2;
|
||||
case 1:
|
||||
return 6;
|
||||
case 2:
|
||||
case 3:
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
inline uint16_t e132xs_frontend::read_word(opcode_desc &desc)
|
||||
{
|
||||
return m_cpu->m_pr16(desc.physpc);
|
||||
@ -686,7 +670,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
case 0x71: // cmpbi global,limm
|
||||
desc.regout[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= SR_CODE;
|
||||
desc.length = imm_length(desc, op);
|
||||
desc.length = hyperstone_device::imm_length(op) << 1;
|
||||
break;
|
||||
case 0x62: // cmpi local,simm
|
||||
case 0x72: // cmpbi local,simm
|
||||
@ -699,7 +683,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regout[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[0] |= SR_CODE;
|
||||
desc.length = imm_length(desc, op);
|
||||
desc.length = hyperstone_device::imm_length(op) << 1;
|
||||
break;
|
||||
case 0x64: // movi global,simm
|
||||
desc.regin[0] |= SR_CODE;
|
||||
@ -722,7 +706,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regout[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= 1 << (gdst_code + 16);
|
||||
desc.regout[0] |= SR_CODE;
|
||||
desc.length = imm_length(desc, op);
|
||||
desc.length = hyperstone_device::imm_length(op) << 1;
|
||||
desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION;
|
||||
if (gdst_code == PC_REGISTER)
|
||||
{
|
||||
@ -743,7 +727,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regout[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[0] |= SR_CODE;
|
||||
desc.length = imm_length(desc, op);
|
||||
desc.length = hyperstone_device::imm_length(op) << 1;
|
||||
break;
|
||||
case 0x68: // addi global,simm
|
||||
case 0x6c: // addsi global,simm
|
||||
@ -764,7 +748,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= SR_CODE;
|
||||
desc.length = imm_length(desc, op);
|
||||
desc.length = hyperstone_device::imm_length(op) << 1;
|
||||
if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi
|
||||
if (gdst_code == PC_REGISTER)
|
||||
{
|
||||
@ -786,7 +770,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[0] |= SR_CODE;
|
||||
desc.length = imm_length(desc, op);
|
||||
desc.length = hyperstone_device::imm_length(op) << 1;
|
||||
if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi
|
||||
break;
|
||||
case 0x74: // andni global,simm
|
||||
@ -809,7 +793,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= SR_CODE;
|
||||
desc.length = imm_length(desc, op);
|
||||
desc.length = hyperstone_device::imm_length(op) << 1;
|
||||
if (gdst_code == PC_REGISTER)
|
||||
{
|
||||
desc.targetpc = BRANCH_TARGET_DYNAMIC;
|
||||
@ -831,7 +815,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[0] |= SR_CODE;
|
||||
desc.length = imm_length(desc, op);
|
||||
desc.length = hyperstone_device::imm_length(op) << 1;
|
||||
break;
|
||||
case 0x80: case 0x81: // shrdi
|
||||
case 0x84: case 0x85: // sardi
|
||||
@ -1310,12 +1294,14 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.targetpc = BRANCH_TARGET_DYNAMIC;
|
||||
desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
|
||||
desc.delayslots = 1;
|
||||
desc.length = (op & 0x80) ? 4 : 2;
|
||||
break;
|
||||
case 0xec: // dbr - could be 4 bytes (pcrel)
|
||||
case 0xec: // dbr
|
||||
decode_pcrel(desc, op);
|
||||
desc.targetpc = BRANCH_TARGET_DYNAMIC;
|
||||
desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
|
||||
desc.delayslots = 1;
|
||||
desc.length = (op & 0x80) ? 4 : 2;
|
||||
break;
|
||||
case 0xed: // frame
|
||||
desc.regin[0] |= SR_CODE;
|
||||
@ -1331,6 +1317,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regout[ldstf_group] |= 1 << ldstf_code;
|
||||
desc.targetpc = BRANCH_TARGET_DYNAMIC;
|
||||
desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
|
||||
desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4;
|
||||
break;
|
||||
case 0xef: // call local
|
||||
desc.regin[0] |= SR_CODE;
|
||||
@ -1339,6 +1326,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regout[ldstf_group] |= 1 << ldstf_code;
|
||||
desc.targetpc = BRANCH_TARGET_DYNAMIC;
|
||||
desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
|
||||
desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4;
|
||||
break;
|
||||
case 0xf0: case 0xf1: case 0xf2: case 0xf3: // bv, bnv, be, bne
|
||||
case 0xf4: case 0xf5: case 0xf6: case 0xf7: // bc, bnc, bse, bht
|
||||
@ -1347,12 +1335,14 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.targetpc = BRANCH_TARGET_DYNAMIC;
|
||||
desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH;
|
||||
desc.length = (op & 0x80) ? 4 : 2;
|
||||
break;
|
||||
case 0xfc: // br
|
||||
{
|
||||
int32_t offset = decode_pcrel(desc, op);
|
||||
desc.targetpc = (desc.pc + desc.length) + offset;
|
||||
desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
|
||||
desc.length = (op & 0x80) ? 4 : 2;
|
||||
break;
|
||||
}
|
||||
case 0xfd: case 0xfe: case 0xff: // trap
|
||||
|
@ -19,7 +19,6 @@ protected:
|
||||
virtual bool describe(opcode_desc &desc, const opcode_desc *prev) override;
|
||||
|
||||
private:
|
||||
inline uint32_t imm_length(opcode_desc &desc, uint16_t op);
|
||||
inline uint16_t read_word(opcode_desc &desc);
|
||||
inline uint16_t read_imm1(opcode_desc &desc);
|
||||
inline uint16_t read_imm2(opcode_desc &desc);
|
||||
|
@ -164,7 +164,7 @@ void hyperstone_device::hyperstone_divsu()
|
||||
template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL>
|
||||
void hyperstone_device::hyperstone_xm()
|
||||
{
|
||||
const uint32_t next = READ_OP(PC);
|
||||
const uint32_t next = m_pr16(PC);
|
||||
PC += 2;
|
||||
|
||||
const uint8_t sub_type = (next & 0x7000) >> 12;
|
||||
@ -172,7 +172,7 @@ void hyperstone_device::hyperstone_xm()
|
||||
uint32_t extra_u = next & 0xfff;
|
||||
if (next & 0x8000)
|
||||
{
|
||||
extra_u = ((extra_u & 0xfff) << 16) | READ_OP(PC);
|
||||
extra_u = ((extra_u & 0xfff) << 16) | m_pr16(PC);
|
||||
PC += 2;
|
||||
m_instruction_length = (3<<19);
|
||||
}
|
||||
@ -1536,7 +1536,7 @@ void hyperstone_device::hyperstone_rol()
|
||||
template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL>
|
||||
void hyperstone_device::hyperstone_ldxx1()
|
||||
{
|
||||
uint16_t next_1 = READ_OP(PC);
|
||||
uint16_t next_1 = m_pr16(PC);
|
||||
PC += 2;
|
||||
|
||||
const uint16_t sub_type = (next_1 & 0x3000) >> 12;
|
||||
@ -1544,7 +1544,7 @@ void hyperstone_device::hyperstone_ldxx1()
|
||||
uint32_t extra_s;
|
||||
if (next_1 & 0x8000)
|
||||
{
|
||||
const uint16_t next_2 = READ_OP(PC);
|
||||
const uint16_t next_2 = m_pr16(PC);
|
||||
PC += 2;
|
||||
m_instruction_length = (3<<19);
|
||||
|
||||
@ -1655,7 +1655,7 @@ void hyperstone_device::hyperstone_ldxx1()
|
||||
template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL>
|
||||
void hyperstone_device::hyperstone_ldxx2()
|
||||
{
|
||||
uint16_t next_1 = READ_OP(PC);
|
||||
uint16_t next_1 = m_pr16(PC);
|
||||
PC += 2;
|
||||
|
||||
const uint16_t sub_type = (next_1 & 0x3000) >> 12;
|
||||
@ -1663,7 +1663,7 @@ void hyperstone_device::hyperstone_ldxx2()
|
||||
uint32_t extra_s;
|
||||
if (next_1 & 0x8000)
|
||||
{
|
||||
const uint16_t next_2 = READ_OP(PC);
|
||||
const uint16_t next_2 = m_pr16(PC);
|
||||
PC += 2;
|
||||
m_instruction_length = (3<<19);
|
||||
|
||||
@ -1800,7 +1800,7 @@ void hyperstone_device::hyperstone_ldxx2()
|
||||
template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL>
|
||||
void hyperstone_device::hyperstone_stxx1()
|
||||
{
|
||||
uint16_t next_1 = READ_OP(PC);
|
||||
uint16_t next_1 = m_pr16(PC);
|
||||
PC += 2;
|
||||
|
||||
const uint16_t sub_type = (next_1 & 0x3000) >> 12;
|
||||
@ -1808,7 +1808,7 @@ void hyperstone_device::hyperstone_stxx1()
|
||||
uint32_t extra_s;
|
||||
if (next_1 & 0x8000)
|
||||
{
|
||||
const uint16_t next_2 = READ_OP(PC);
|
||||
const uint16_t next_2 = m_pr16(PC);
|
||||
PC += 2;
|
||||
m_instruction_length = (3<<19);
|
||||
|
||||
@ -1890,7 +1890,7 @@ void hyperstone_device::hyperstone_stxx1()
|
||||
template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL>
|
||||
void hyperstone_device::hyperstone_stxx2()
|
||||
{
|
||||
uint16_t next_1 = READ_OP(PC);
|
||||
uint16_t next_1 = m_pr16(PC);
|
||||
PC += 2;
|
||||
|
||||
const uint16_t sub_type = (next_1 & 0x3000) >> 12;
|
||||
@ -1898,7 +1898,7 @@ void hyperstone_device::hyperstone_stxx2()
|
||||
uint32_t extra_s;
|
||||
if (next_1 & 0x8000)
|
||||
{
|
||||
const uint16_t next_2 = READ_OP(PC);
|
||||
const uint16_t next_2 = m_pr16(PC);
|
||||
PC += 2;
|
||||
m_instruction_length = (3<<19);
|
||||
|
||||
@ -2219,7 +2219,7 @@ void hyperstone_device::hyperstone_mul()
|
||||
void hyperstone_device::hyperstone_extend()
|
||||
{
|
||||
m_instruction_length = (2<<19);
|
||||
const uint32_t func = READ_OP(PC);
|
||||
const uint32_t func = m_pr16(PC);
|
||||
PC += 2;
|
||||
check_delay_PC();
|
||||
|
||||
@ -2612,14 +2612,14 @@ void hyperstone_device::hyperstone_frame()
|
||||
template <hyperstone_device::reg_bank SRC_GLOBAL>
|
||||
void hyperstone_device::hyperstone_call()
|
||||
{
|
||||
uint16_t imm_1 = READ_OP(PC);
|
||||
uint16_t imm_1 = m_pr16(PC);
|
||||
PC += 2;
|
||||
|
||||
int32_t extra_s = 0;
|
||||
|
||||
if (imm_1 & 0x8000)
|
||||
{
|
||||
uint16_t imm_2 = READ_OP(PC);
|
||||
uint16_t imm_2 = m_pr16(PC);
|
||||
|
||||
PC += 2;
|
||||
SET_ILC(3<<19);
|
||||
|
Loading…
Reference in New Issue
Block a user