summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/arcompact/arcompact_execute.cpp
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2017-07-05 11:44:49 +0200
committer Olivier Galibert <galibert@pobox.com>2017-11-26 17:41:27 +0100
commit6caef2579a1490f05d28bcede731cbdd45fc5c65 (patch)
tree8055384e183be3cb27e7d0894ac53dc96c09e6fa /src/devices/cpu/arcompact/arcompact_execute.cpp
parent34b222062c89adbeed822f56be6130421777e11f (diff)
dvdisasm: Overhaul [O. Galibert]
Disassemblers are now independant classes. Not only the code is cleaner, but unidasm has access to all the cpu cores again. The interface to the disassembly method has changed from byte buffers to objects that give a result to read methods. This also adds support for lfsr and/or paged PCs.
Diffstat (limited to 'src/devices/cpu/arcompact/arcompact_execute.cpp')
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute.cpp98
1 files changed, 52 insertions, 46 deletions
diff --git a/src/devices/cpu/arcompact/arcompact_execute.cpp b/src/devices/cpu/arcompact/arcompact_execute.cpp
index 53d3ce742cb..fc4dcca37a6 100644
--- a/src/devices/cpu/arcompact/arcompact_execute.cpp
+++ b/src/devices/cpu/arcompact/arcompact_execute.cpp
@@ -4,7 +4,13 @@
#include "emu.h"
#include "debugger.h"
#include "arcompact.h"
-#include "arcompact_common.h"
+#include "arcompactdasm.h"
+
+#define REG_BLINK (0x1f) // r31
+#define REG_SP (0x1c) // r28
+#define REG_ILINK1 (0x1d) // r29
+#define REG_ILINK2 (0x1e) // r30
+#define REG_LP_COUNT (0x3c) // r60
#define ARCOMPACT_LOGGING 1
@@ -128,35 +134,35 @@ int arcompact_device::check_condition(uint8_t condition)
case 0x00: return 1; // AL
case 0x01: return CONDITION_EQ;
case 0x02: return !CONDITION_EQ; // NE
- case 0x03: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
+ case 0x03: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
case 0x04: return CONDITION_MI; // MI (N)
case 0x05: return CONDITION_CS; // CS (Carry Set / Lower than)
- case 0x06: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x07: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x08: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x09: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x0a: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x0b: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x0c: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x0d: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x0e: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x0f: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x10: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x11: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x12: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x13: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x14: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x15: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x16: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x17: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x18: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x19: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x1a: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x1b: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x1c: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x1d: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x1e: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
- case 0x1f: fatalerror("unhandled condition check %s", conditions[condition]); return -1;
+ case 0x06: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x07: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x08: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x09: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x0a: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x0b: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x0c: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x0d: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x0e: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x0f: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x10: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x11: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x12: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x13: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x14: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x15: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x16: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x17: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x18: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x19: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x1a: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x1b: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x1c: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x1d: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x1e: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
+ case 0x1f: fatalerror("unhandled condition check %s", arcompact_disassembler::conditions[condition]); return -1;
}
return -1;
@@ -1844,58 +1850,58 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_helper(OPS_32, const char
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_01(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x01], /*"ADC"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x01], /*"ADC"*/ 0,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_03(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x03], /*"SBC"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x03], /*"SBC"*/ 0,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_08(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x08], /*"MAX"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x08], /*"MAX"*/ 0,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_09(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x09], /*"MIN"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x09], /*"MIN"*/ 0,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_0b(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x0b], /*"TST"*/ 1,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x0b], /*"TST"*/ 1,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_0c(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x0c], /*"CMP"*/ 1,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x0c], /*"CMP"*/ 1,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_0d(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x0d], /*"RCMP"*/ 1,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x0d], /*"RCMP"*/ 1,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_10(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x10], /*"BCLR"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x10], /*"BCLR"*/ 0,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_11(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x11], /*"BTST"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x11], /*"BTST"*/ 0,0);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_12(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x12], /*"BXOR"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x12], /*"BXOR"*/ 0,0);
}
@@ -1905,22 +1911,22 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_12(OPS_32)
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_1a(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x1a], /*"MPY"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x1a], /*"MPY"*/ 0,0);
} // *
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_1b(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x1b], /*"MPYH"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x1b], /*"MPYH"*/ 0,0);
} // *
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_1c(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x1c], /*"MPYHU"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x1c], /*"MPYHU"*/ 0,0);
} // *
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_1d(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x1d], /*"MPYU"*/ 0,0);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x1d], /*"MPYU"*/ 0,0);
} // *
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_20_p00(OPS_32)
@@ -2202,12 +2208,12 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_21_p11_m1(OPS_32)
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_22(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x22], /*"JL"*/ 1,1);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x22], /*"JL"*/ 1,1);
}
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_23(OPS_32)
{
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x23], /*"JL.D"*/ 1,1);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x23], /*"JL.D"*/ 1,1);
}
@@ -2238,7 +2244,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_28(OPS_32) // LPcc (loop
{ // 0010 0RRR 1110 1000 0RRR uuuu uu1Q QQQQ
COMMON32_GET_u6
COMMON32_GET_CONDITION
- //arcompact_fatal("Lp conditional %s not supported %d", conditions[condition], u);
+ //arcompact_fatal("Lp conditional %s not supported %d", arcompact_disassembler::conditions[condition], u);
// if the loop condition fails then just jump to after the end of the loop, don't set any registers
if (!check_condition(condition))
@@ -2264,7 +2270,7 @@ ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_28(OPS_32) // LPcc (loop
ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_29(OPS_32)
{
// leapster bios uses formats for FLAG that are not defined, bug I guess work anyway (P modes 0 / 1)
- return arcompact_handle04_helper(PARAMS, opcodes_04[0x29], /*"FLAG"*/ 1,1);
+ return arcompact_handle04_helper(PARAMS, arcompact_disassembler::opcodes_04[0x29], /*"FLAG"*/ 1,1);
}