summaryrefslogtreecommitdiffstatshomepage
path: root/src/tools/unidasm.cpp
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2016-11-20 08:49:30 -0500
committer Nathan Woods <npwoods@mess.org>2016-11-20 08:49:30 -0500
commita29891d2e5b750e47a1237929c42fc2afdd8f094 (patch)
treea601af0a86b6076311a7af4494a7b66bb8d24667 /src/tools/unidasm.cpp
parent5eefcfdb684b94cbe41d41a7dcfd8b712bf86c6a (diff)
Changed disassembler infrastructure to not use char buffers internally
Diffstat (limited to 'src/tools/unidasm.cpp')
-rw-r--r--src/tools/unidasm.cpp42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index 686a81943cd..2c6e58a0f74 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -217,14 +217,14 @@ CPU_DISASSEMBLE( z8 );
CPU_DISASSEMBLE( z80 );
CPU_DISASSEMBLE( z8000 );
-CPU_DISASSEMBLE( sparcv7 ) { static sparc_disassembler dasm(nullptr, 7); return dasm.dasm(buffer, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
-CPU_DISASSEMBLE( sparcv8 ) { static sparc_disassembler dasm(nullptr, 8); return dasm.dasm(buffer, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
-CPU_DISASSEMBLE( sparcv9 ) { static sparc_disassembler dasm(nullptr, 9); return dasm.dasm(buffer, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
-CPU_DISASSEMBLE( sparcv9vis1 ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_1); return dasm.dasm(buffer, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
-CPU_DISASSEMBLE( sparcv9vis2 ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_2); return dasm.dasm(buffer, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
-CPU_DISASSEMBLE( sparcv9vis2p ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_2p); return dasm.dasm(buffer, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
-CPU_DISASSEMBLE( sparcv9vis3 ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_3); return dasm.dasm(buffer, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
-CPU_DISASSEMBLE( sparcv9vis3b ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_3b); return dasm.dasm(buffer, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
+CPU_DISASSEMBLE( sparcv7 ) { static sparc_disassembler dasm(nullptr, 7); return dasm.dasm(stream, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
+CPU_DISASSEMBLE( sparcv8 ) { static sparc_disassembler dasm(nullptr, 8); return dasm.dasm(stream, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
+CPU_DISASSEMBLE( sparcv9 ) { static sparc_disassembler dasm(nullptr, 9); return dasm.dasm(stream, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
+CPU_DISASSEMBLE( sparcv9vis1 ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_1); return dasm.dasm(stream, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
+CPU_DISASSEMBLE( sparcv9vis2 ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_2); return dasm.dasm(stream, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
+CPU_DISASSEMBLE( sparcv9vis2p ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_2p); return dasm.dasm(stream, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
+CPU_DISASSEMBLE( sparcv9vis3 ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_3); return dasm.dasm(stream, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
+CPU_DISASSEMBLE( sparcv9vis3b ) { static sparc_disassembler dasm(nullptr, 9, sparc_disassembler::vis_3b); return dasm.dasm(stream, pc, big_endianize_int32(*reinterpret_cast<const uint32_t *>(oprom))); }
static const dasm_table_entry dasm_table[] =
@@ -545,7 +545,6 @@ int main(int argc, char *argv[])
options opts;
int numbytes;
void *data;
- char *p;
int result = 0;
// parse options first
@@ -578,15 +577,18 @@ int main(int argc, char *argv[])
if ((length > opts.count) && (opts.count != 0))
length = opts.count;
curpc = opts.basepc;
+
+ std::stringstream stream;
for (curbyte = 0; curbyte < length; curbyte += numbytes)
{
uint8_t *oprom = (uint8_t *)data + opts.skip + curbyte;
- char buffer[1024];
uint32_t pcdelta;
int numchunks;
// disassemble
- pcdelta = (*opts.dasm->func)(nullptr, buffer, curpc, oprom, oprom, opts.mode) & DASMFLAG_LENGTHMASK;
+ stream.str("");
+ pcdelta = (*opts.dasm->func)(nullptr, stream, curpc, oprom, oprom, opts.mode) & DASMFLAG_LENGTHMASK;
+ std::string buffer = stream.str();
if (opts.dasm->pcshift < 0)
numbytes = pcdelta << -opts.dasm->pcshift;
@@ -596,13 +598,19 @@ int main(int argc, char *argv[])
// force upper or lower
if (opts.lower)
{
- for (p = buffer; *p != 0; p++)
- *p = tolower((uint8_t)*p);
+ std::transform(
+ std::begin(buffer),
+ std::end(buffer),
+ std::begin(buffer),
+ [](char c) { return tolower(c); });
}
else if (opts.upper)
{
- for (p = buffer; *p != 0; p++)
- *p = toupper((uint8_t)*p);
+ std::transform(
+ std::begin(buffer),
+ std::end(buffer),
+ std::begin(buffer),
+ [](char c) { return toupper(c); });
}
// round to the nearest display chunk
@@ -635,7 +643,7 @@ int main(int argc, char *argv[])
}
// output the disassembly
- printf("%s\n", buffer);
+ printf("%s\n", buffer.c_str());
// output additional raw bytes
if (!opts.norawbytes && numchunks > maxchunks)
@@ -661,7 +669,7 @@ int main(int argc, char *argv[])
else
{
// output the disassembly and address
- printf("\t%-40s ; %08X", buffer, curpc);
+ printf("\t%-40s ; %08X", buffer.c_str(), curpc);
// output the raw bytes
if (!opts.norawbytes)