diff options
author | 2016-11-20 08:49:30 -0500 | |
---|---|---|
committer | 2016-11-20 08:49:30 -0500 | |
commit | a29891d2e5b750e47a1237929c42fc2afdd8f094 (patch) | |
tree | a601af0a86b6076311a7af4494a7b66bb8d24667 /src/tools/unidasm.cpp | |
parent | 5eefcfdb684b94cbe41d41a7dcfd8b712bf86c6a (diff) |
Changed disassembler infrastructure to not use char buffers internally
Diffstat (limited to 'src/tools/unidasm.cpp')
-rw-r--r-- | src/tools/unidasm.cpp | 42 |
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) |