summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tms32051/dis32051.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/tms32051/dis32051.cpp')
-rw-r--r--src/devices/cpu/tms32051/dis32051.cpp176
1 files changed, 82 insertions, 94 deletions
diff --git a/src/devices/cpu/tms32051/dis32051.cpp b/src/devices/cpu/tms32051/dis32051.cpp
index b963781beeb..d634ebd37c4 100644
--- a/src/devices/cpu/tms32051/dis32051.cpp
+++ b/src/devices/cpu/tms32051/dis32051.cpp
@@ -1,10 +1,11 @@
// license:BSD-3-Clause
// copyright-holders:Ville Linde
-#include "emu.h"
+#include "emu.h"
+#include "dis32051.h"
-static const char *const zl_condition_codes[] =
+const char *const tms32051_disassembler::zl_condition_codes[] =
{
// bit 3, 2 (ZL), bit 1, 0 (MASK)
"", // Z=0, L=0, ZM=0, ZL=0
@@ -25,7 +26,7 @@ static const char *const zl_condition_codes[] =
"leq", // Z=1, L=1, ZM=1, ZL=1
};
-static const char *const cv_condition_codes[16] =
+const char *const tms32051_disassembler::cv_condition_codes[16] =
{
"", // V=0, C=0, VM=0, CM=0
"nc", // V=0, C=0, VM=0, CM=1
@@ -45,7 +46,7 @@ static const char *const cv_condition_codes[16] =
"c ov", // V=1, C=1, VM=1, CM=1
};
-static const char *const tp_condition_codes[4] =
+const char *const tms32051_disassembler::tp_condition_codes[4] =
{
"bio",
"tc",
@@ -53,24 +54,13 @@ static const char *const tp_condition_codes[4] =
""
};
-
-static offs_t npc;
-static const uint8_t *rombase;
-static offs_t pcbase;
-
-static std::ostream *output;
-
-static uint16_t FETCH(void)
+uint16_t tms32051_disassembler::FETCH(offs_t &npc, const data_buffer &opcodes)
{
- uint16_t result = rombase[(npc - pcbase) * 2 + 0] | (rombase[(npc - pcbase) * 2 + 1] << 8);
- npc++;
- return result;
+ return opcodes.r16(npc++);
}
-static char *GET_ADDRESS(int addr_mode, int address)
+std::string tms32051_disassembler::GET_ADDRESS(int addr_mode, int address)
{
- static char buffer[100];
-
if (addr_mode) // Indirect addressing
{
int nar = address & 0x7;
@@ -78,48 +68,43 @@ static char *GET_ADDRESS(int addr_mode, int address)
switch ((address >> 3) & 0xf)
{
- case 0x0: sprintf(buffer, "*"); break;
- case 0x1: sprintf(buffer, "*, ar%d", nar); break;
- case 0x2: sprintf(buffer, "*-"); break;
- case 0x3: sprintf(buffer, "*-, ar%d", nar); break;
- case 0x4: sprintf(buffer, "*+"); break;
- case 0x5: sprintf(buffer, "*+, ar%d", nar); break;
- case 0x8: sprintf(buffer, "*br0-"); break;
- case 0x9: sprintf(buffer, "*br0-, ar%d", nar); break;
- case 0xa: sprintf(buffer, "*0-"); break;
- case 0xb: sprintf(buffer, "*0-, ar%d", nar); break;
- case 0xc: sprintf(buffer, "*0+"); break;
- case 0xd: sprintf(buffer, "*0+, ar%d", nar); break;
- case 0xe: sprintf(buffer, "*br0+"); break;
- case 0xf: sprintf(buffer, "*br0+, ar%d", nar); break;
-
- default: sprintf(buffer, "??? (indirect)"); break;
+ case 0x0: return util::string_format("*");
+ case 0x1: return util::string_format("*, ar%d", nar);
+ case 0x2: return util::string_format("*-");
+ case 0x3: return util::string_format("*-, ar%d", nar);
+ case 0x4: return util::string_format("*+");
+ case 0x5: return util::string_format("*+, ar%d", nar);
+ case 0x8: return util::string_format("*br0-");
+ case 0x9: return util::string_format("*br0-, ar%d", nar);
+ case 0xa: return util::string_format("*0-");
+ case 0xb: return util::string_format("*0-, ar%d", nar);
+ case 0xc: return util::string_format("*0+");
+ case 0xd: return util::string_format("*0+, ar%d", nar);
+ case 0xe: return util::string_format("*br0+");
+ case 0xf: return util::string_format("*br0+, ar%d", nar);
+
+ default: return util::string_format("??? (indirect)");
}
}
else // Direct addressing
{
- sprintf(buffer, "#%02X", address);
+ return util::string_format("#%02X", address);
}
- return buffer;
}
-static char *GET_SHIFT(int shift)
+std::string tms32051_disassembler::GET_SHIFT(int shift)
{
- static char buffer[100];
-
if (shift > 0)
{
- sprintf(buffer, ", %d", shift);
+ return util::string_format(", %d", shift);
}
else
{
- memset(buffer, 0, sizeof(buffer));
+ return "";
}
-
- return buffer;
}
-static void print_condition_codes(bool pp, int zl, int cv, int tp)
+void tms32051_disassembler::print_condition_codes(bool pp, int zl, int cv, int tp)
{
if (*(zl_condition_codes[zl]) != 0)
{
@@ -143,7 +128,7 @@ static void print_condition_codes(bool pp, int zl, int cv, int tp)
}
}
-static void dasm_group_be(uint16_t opcode)
+void tms32051_disassembler::dasm_group_be(uint16_t opcode, offs_t &npc, const data_buffer &opcodes)
{
int subop = opcode & 0xff;
@@ -217,19 +202,19 @@ static void dasm_group_be(uint16_t opcode)
case 0x7c: case 0x7d: case 0x7e: case 0x7f:
util::stream_format(*output, "intr %d", opcode & 0x1f); break;
- case 0x80: util::stream_format(*output, "mpy #%04X", FETCH()); break;
- case 0x81: util::stream_format(*output, "and #%04X", FETCH() << 16); break;
- case 0x82: util::stream_format(*output, "or #%04X", FETCH() << 16); break;
- case 0x83: util::stream_format(*output, "xor #%04X", FETCH() << 16); break;
- case 0xc4: util::stream_format(*output, "rpt #%04X", FETCH()); break;
- case 0xc5: util::stream_format(*output, "rptz #%04X", FETCH()); break;
- case 0xc6: util::stream_format(*output, "rptb #%04X", FETCH()); break;
+ case 0x80: util::stream_format(*output, "mpy #%04X", FETCH(npc, opcodes)); break;
+ case 0x81: util::stream_format(*output, "and #%04X", FETCH(npc, opcodes) << 16); break;
+ case 0x82: util::stream_format(*output, "or #%04X", FETCH(npc, opcodes) << 16); break;
+ case 0x83: util::stream_format(*output, "xor #%04X", FETCH(npc, opcodes) << 16); break;
+ case 0xc4: util::stream_format(*output, "rpt #%04X", FETCH(npc, opcodes)); break;
+ case 0xc5: util::stream_format(*output, "rptz #%04X", FETCH(npc, opcodes)); break;
+ case 0xc6: util::stream_format(*output, "rptb #%04X", FETCH(npc, opcodes)); break;
default: util::stream_format(*output, "??? (group be)"); break;
}
}
-static void dasm_group_bf(uint16_t opcode)
+void tms32051_disassembler::dasm_group_bf(uint16_t opcode, offs_t &npc, const data_buffer &opcodes)
{
int subop = (opcode >> 4) & 0xf;
int shift = opcode & 0xf;
@@ -240,7 +225,7 @@ static void dasm_group_bf(uint16_t opcode)
{
if (opcode & 0x8)
{
- util::stream_format(*output, "lar ar%d, #%04X", opcode & 0x7, FETCH());
+ util::stream_format(*output, "lar ar%d, #%04X", opcode & 0x7, FETCH(npc, opcodes));
}
else
{
@@ -261,31 +246,34 @@ static void dasm_group_bf(uint16_t opcode)
break;
}
- case 0x8: util::stream_format(*output, "lacc #%04X", FETCH() << shift); break;
- case 0x9: util::stream_format(*output, "add #%04X", FETCH() << shift); break;
- case 0xa: util::stream_format(*output, "sub #%04X", FETCH() << shift); break;
- case 0xb: util::stream_format(*output, "and #%04X", FETCH() << shift); break;
- case 0xc: util::stream_format(*output, "or #%04X", FETCH() << shift); break;
- case 0xd: util::stream_format(*output, "xor #%04X", FETCH() << shift); break;
+ case 0x8: util::stream_format(*output, "lacc #%04X", FETCH(npc, opcodes) << shift); break;
+ case 0x9: util::stream_format(*output, "add #%04X", FETCH(npc, opcodes) << shift); break;
+ case 0xa: util::stream_format(*output, "sub #%04X", FETCH(npc, opcodes) << shift); break;
+ case 0xb: util::stream_format(*output, "and #%04X", FETCH(npc, opcodes) << shift); break;
+ case 0xc: util::stream_format(*output, "or #%04X", FETCH(npc, opcodes) << shift); break;
+ case 0xd: util::stream_format(*output, "xor #%04X", FETCH(npc, opcodes) << shift); break;
case 0xe: util::stream_format(*output, "bsar %d", shift+1); break;
default: util::stream_format(*output, "??? (group bf)"); break;
}
}
-CPU_DISASSEMBLE(tms32051)
+u32 tms32051_disassembler::opcode_alignment() const
+{
+ return 1;
+}
+
+offs_t tms32051_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
uint32_t flags = 0;
uint16_t opcode;
int baseop;
int address, addr_mode;
- pcbase = pc;
- rombase = oprom;
- npc = pc;
+ offs_t npc = pc;
output = &stream;
- opcode = FETCH();
+ opcode = FETCH(npc, opcodes);
baseop = (opcode >> 8) & 0xff;
addr_mode = (opcode >> 7) & 0x1;
@@ -300,10 +288,10 @@ CPU_DISASSEMBLE(tms32051)
break;
}
case 0x08: util::stream_format(*output, "lamm %s", GET_ADDRESS(addr_mode, address)); break;
- case 0x09: util::stream_format(*output, "smmr %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
+ case 0x09: util::stream_format(*output, "smmr %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
case 0x0a: util::stream_format(*output, "subc %s", GET_ADDRESS(addr_mode, address)); break;
case 0x0b: util::stream_format(*output, "rpt %s", GET_ADDRESS(addr_mode, address)); break;
- case 0x0c: util::stream_format(*output, "out %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
+ case 0x0c: util::stream_format(*output, "out %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
case 0x0d: util::stream_format(*output, "ldp %s", GET_ADDRESS(addr_mode, address)); break;
case 0x0e: util::stream_format(*output, "lst 0, %s", GET_ADDRESS(addr_mode, address)); break;
case 0x0f: util::stream_format(*output, "lst 1, %s", GET_ADDRESS(addr_mode, address)); break;
@@ -355,10 +343,10 @@ CPU_DISASSEMBLE(tms32051)
case 0x59: util::stream_format(*output, "opl %s", GET_ADDRESS(addr_mode, address)); break;
case 0x5a: util::stream_format(*output, "apl %s", GET_ADDRESS(addr_mode, address)); break;
case 0x5b: util::stream_format(*output, "cpl %s", GET_ADDRESS(addr_mode, address)); break;
- case 0x5c: util::stream_format(*output, "xpl %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
- case 0x5d: util::stream_format(*output, "opl %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
- case 0x5e: util::stream_format(*output, "apl %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
- case 0x5f: util::stream_format(*output, "cpl %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
+ case 0x5c: util::stream_format(*output, "xpl %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
+ case 0x5d: util::stream_format(*output, "opl %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
+ case 0x5e: util::stream_format(*output, "apl %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
+ case 0x5f: util::stream_format(*output, "cpl %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
case 0x60: util::stream_format(*output, "addc %s", GET_ADDRESS(addr_mode, address)); break;
case 0x61: util::stream_format(*output, "add %s << 16", GET_ADDRESS(addr_mode, address)); break;
@@ -386,13 +374,13 @@ CPU_DISASSEMBLE(tms32051)
case 0x76: util::stream_format(*output, "pshd %s", GET_ADDRESS(addr_mode, address)); break;
case 0x77: util::stream_format(*output, "dmov %s", GET_ADDRESS(addr_mode, address)); break;
case 0x78: util::stream_format(*output, "adrk #%02X", opcode & 0xff); break;
- case 0x79: util::stream_format(*output, "b %04X, %s", FETCH(), GET_ADDRESS(1, address)); break;
- case 0x7a: util::stream_format(*output, "call %04X, %s", FETCH(), GET_ADDRESS(1, address)); flags = DASMFLAG_STEP_OVER; break;
- case 0x7b: util::stream_format(*output, "banz %04X, %s", FETCH(), GET_ADDRESS(1, address)); break;
+ case 0x79: util::stream_format(*output, "b %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); break;
+ case 0x7a: util::stream_format(*output, "call %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); flags = STEP_OVER; break;
+ case 0x7b: util::stream_format(*output, "banz %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); break;
case 0x7c: util::stream_format(*output, "sbrk #%02X", opcode & 0xff); break;
- case 0x7d: util::stream_format(*output, "bd %04X, %s", FETCH(), GET_ADDRESS(1, address)); break;
- case 0x7e: util::stream_format(*output, "calld %04X, %s", FETCH(), GET_ADDRESS(1, address)); flags = DASMFLAG_STEP_OVER; break;
- case 0x7f: util::stream_format(*output, "banzd %04X, %s", FETCH(), GET_ADDRESS(1, address)); break;
+ case 0x7d: util::stream_format(*output, "bd %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); break;
+ case 0x7e: util::stream_format(*output, "calld %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); flags = STEP_OVER; break;
+ case 0x7f: util::stream_format(*output, "banzd %04X, %s", FETCH(npc, opcodes), GET_ADDRESS(1, address)); break;
case 0x80: case 0x81: case 0x82: case 0x83:
case 0x84: case 0x85: case 0x86: case 0x87:
@@ -401,7 +389,7 @@ CPU_DISASSEMBLE(tms32051)
break;
}
case 0x88: util::stream_format(*output, "samm %s", GET_ADDRESS(addr_mode, address)); break;
- case 0x89: util::stream_format(*output, "lmmr %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
+ case 0x89: util::stream_format(*output, "lmmr %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
case 0x8a: util::stream_format(*output, "popd %s", GET_ADDRESS(addr_mode, address)); break;
case 0x8b:
{
@@ -433,21 +421,21 @@ CPU_DISASSEMBLE(tms32051)
break;
}
- case 0xa0: util::stream_format(*output, "norm %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
- case 0xa2: util::stream_format(*output, "mac %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
+ case 0xa0: util::stream_format(*output, "norm %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
+ case 0xa2: util::stream_format(*output, "mac %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
case 0xa3: util::stream_format(*output, "macd %s", GET_ADDRESS(addr_mode, address)); break;
case 0xa4: util::stream_format(*output, "blpd %s", GET_ADDRESS(addr_mode, address)); break;
- case 0xa5: util::stream_format(*output, "blpd %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
+ case 0xa5: util::stream_format(*output, "blpd %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
case 0xa6: util::stream_format(*output, "tblr %s", GET_ADDRESS(addr_mode, address)); break;
case 0xa7: util::stream_format(*output, "tblw %s", GET_ADDRESS(addr_mode, address)); break;
- case 0xa8: util::stream_format(*output, "bldd %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
- case 0xa9: util::stream_format(*output, "bldd %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
+ case 0xa8: util::stream_format(*output, "bldd %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
+ case 0xa9: util::stream_format(*output, "bldd %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
case 0xaa: util::stream_format(*output, "mads %s", GET_ADDRESS(addr_mode, address)); break;
case 0xab: util::stream_format(*output, "madd %s", GET_ADDRESS(addr_mode, address)); break;
case 0xac: util::stream_format(*output, "bldd %s", GET_ADDRESS(addr_mode, address)); break;
case 0xad: util::stream_format(*output, "bldd %s", GET_ADDRESS(addr_mode, address)); break;
- case 0xae: util::stream_format(*output, "splk %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
- case 0xaf: util::stream_format(*output, "in %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH()); break;
+ case 0xae: util::stream_format(*output, "splk %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
+ case 0xaf: util::stream_format(*output, "in %s, #%04X", GET_ADDRESS(addr_mode, address), FETCH(npc, opcodes)); break;
case 0xb0: case 0xb1: case 0xb2: case 0xb3:
case 0xb4: case 0xb5: case 0xb6: case 0xb7:
@@ -466,8 +454,8 @@ CPU_DISASSEMBLE(tms32051)
util::stream_format(*output, "ldp #%03X", opcode & 0x1ff);
break;
}
- case 0xbe: dasm_group_be(opcode); break;
- case 0xbf: dasm_group_bf(opcode); break;
+ case 0xbe: dasm_group_be(opcode, npc, opcodes); break;
+ case 0xbf: dasm_group_bf(opcode, npc, opcodes); break;
case 0xe0: case 0xe1: case 0xe2: case 0xe3:
{
@@ -477,7 +465,7 @@ CPU_DISASSEMBLE(tms32051)
int cv = ((zlcv << 2) & 0xc) | (zlcvmask & 0x3);
int tp = (opcode >> 8) & 0x3;
- util::stream_format(*output, "bcnd %04X", FETCH());
+ util::stream_format(*output, "bcnd %04X", FETCH(npc, opcodes));
print_condition_codes(true, zl, cv, tp);
break;
}
@@ -505,7 +493,7 @@ CPU_DISASSEMBLE(tms32051)
int cv = ((zlcv << 2) & 0xc) | (zlcvmask & 0x3);
int tp = (opcode >> 8) & 0x3;
- util::stream_format(*output, "cc %04X", FETCH());
+ util::stream_format(*output, "cc %04X", FETCH(npc, opcodes));
print_condition_codes(true, zl, cv, tp);
break;
}
@@ -527,7 +515,7 @@ CPU_DISASSEMBLE(tms32051)
util::stream_format(*output, "retc ");
print_condition_codes(false, zl, cv, tp);
}
- flags = DASMFLAG_STEP_OUT;
+ flags = STEP_OUT;
break;
}
@@ -539,7 +527,7 @@ CPU_DISASSEMBLE(tms32051)
int cv = ((zlcv << 2) & 0xc) | (zlcvmask & 0x3);
int tp = (opcode >> 8) & 0x3;
- util::stream_format(*output, "bcndd %04X", FETCH());
+ util::stream_format(*output, "bcndd %04X", FETCH(npc, opcodes));
print_condition_codes(true, zl, cv, tp);
break;
}
@@ -552,7 +540,7 @@ CPU_DISASSEMBLE(tms32051)
int cv = ((zlcv << 2) & 0xc) | (zlcvmask & 0x3);
int tp = (opcode >> 8) & 0x3;
- util::stream_format(*output, "ccd %04X", FETCH());
+ util::stream_format(*output, "ccd %04X", FETCH(npc, opcodes));
print_condition_codes(true, zl, cv, tp);
break;
}
@@ -574,12 +562,12 @@ CPU_DISASSEMBLE(tms32051)
util::stream_format(*output, "retcd ");
print_condition_codes(false, zl, cv, tp);
}
- flags = DASMFLAG_STEP_OUT;
+ flags = STEP_OUT;
break;
}
default: util::stream_format(*output, "??? ($%04X)", opcode); break;
}
- return (npc-pc) | flags | DASMFLAG_SUPPORTED;
+ return (npc-pc) | flags | SUPPORTED;
}