diff options
Diffstat (limited to 'src/tools/unidasm.cpp')
-rw-r--r-- | src/tools/unidasm.cpp | 159 |
1 files changed, 105 insertions, 54 deletions
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp index c7b125dc54f..808f5020d57 100644 --- a/src/tools/unidasm.cpp +++ b/src/tools/unidasm.cpp @@ -52,6 +52,7 @@ using util::BIT; #include "cpu/f8/f8dasm.h" #include "cpu/fr/frdasm.h" #include "cpu/g65816/g65816ds.h" +#include "cpu/gigatron/gigatrondasm.h" #include "cpu/h6280/6280dasm.h" #include "cpu/h8/h8d.h" #include "cpu/h8/h8hd.h" @@ -89,6 +90,7 @@ using util::BIT; #include "cpu/m68000/m68kdasm.h" #include "cpu/m6805/6805dasm.h" #include "cpu/m6809/6x09dasm.h" +#include "cpu/m88000/m88000d.h" #include "cpu/mb86233/mb86233d.h" #include "cpu/mb86235/mb86235d.h" #include "cpu/mb88xx/mb88dasm.h" @@ -108,6 +110,7 @@ using util::BIT; #include "cpu/nec/necdasm.h" #include "cpu/ns32000/ns32000dasm.h" #include "cpu/nuon/nuondasm.h" +#include "cpu/pace/pacedasm.h" #include "cpu/patinhofeio/patinho_feio_dasm.h" #include "cpu/pdp1/pdp1dasm.h" #include "cpu/pdp1/tx0dasm.h" @@ -119,6 +122,7 @@ using util::BIT; #include "cpu/psx/psxdasm.h" #include "cpu/rii/riidasm.h" #include "cpu/rsp/rsp_dasm.h" +#include "cpu/rx01/rx01dasm.h" #include "cpu/s2650/2650dasm.h" #include "cpu/saturn/saturnds.h" #include "cpu/sc61860/scdasm.h" @@ -158,6 +162,9 @@ using util::BIT; #include "cpu/upd7810/upd7810_dasm.h" #include "cpu/v60/v60d.h" #include "cpu/v810/v810dasm.h" +#include "cpu/vt50/vt50dasm.h" +#include "cpu/vt61/vt61dasm.h" +#include "cpu/we32000/we32100d.h" #include "cpu/z180/z180dasm.h" #include "cpu/z8/z8dasm.h" #include "cpu/z80/z80dasm.h" @@ -172,7 +179,7 @@ using util::BIT; #include <iostream> #include <stdexcept> -#include <ctype.h> +#include <cctype> using u8 = util::u8; using u16 = util::u16; @@ -365,6 +372,7 @@ static const dasm_table_entry dasm_table[] = { "f8", be, 0, []() -> util::disasm_interface * { return new f8_disassembler; } }, { "fr", be, 0, []() -> util::disasm_interface * { return new fr_disassembler; } }, { "g65816", le, 0, []() -> util::disasm_interface * { return new g65816_disassembler(&g65816_unidasm); } }, + { "gigatron", be, -1, []() -> util::disasm_interface * { return new gigatron_disassembler; } }, { "h6280", le, 0, []() -> util::disasm_interface * { return new h6280_disassembler; } }, { "h8", be, 0, []() -> util::disasm_interface * { return new h8_disassembler; } }, { "h8h", be, 0, []() -> util::disasm_interface * { return new h8h_disassembler; } }, @@ -433,6 +441,8 @@ static const dasm_table_entry dasm_table[] = { "mb86233", le, -2, []() -> util::disasm_interface * { return new mb86233_disassembler; } }, { "mb86235", le, -3, []() -> util::disasm_interface * { return new mb86235_disassembler; } }, { "mb88", le, 0, []() -> util::disasm_interface * { return new mb88_disassembler; } }, + { "mc88100", be, 0, []() -> util::disasm_interface * { return new mc88100_disassembler; } }, + { "mc88110", be, 0, []() -> util::disasm_interface * { return new mc88110_disassembler; } }, { "mcs48", le, 0, []() -> util::disasm_interface * { return new mcs48_disassembler(false, false); } }, { "minx", le, 0, []() -> util::disasm_interface * { return new minx_disassembler; } }, { "mips1be", be, 0, []() -> util::disasm_interface * { return new mips1_disassembler; } }, @@ -445,6 +455,7 @@ static const dasm_table_entry dasm_table[] = { "ns32000", le, 0, []() -> util::disasm_interface * { return new ns32000_disassembler; } }, { "nuon", be, 0, []() -> util::disasm_interface * { return new nuon_disassembler; } }, { "nsc8105", be, 0, []() -> util::disasm_interface * { return new m680x_disassembler(8105); } }, + { "pace", le, -1, []() -> util::disasm_interface * { return new pace_disassembler; } }, { "patinho_feio", le, 0, []() -> util::disasm_interface * { return new patinho_feio_disassembler; } }, { "pdp1", be, 0, []() -> util::disasm_interface * { return new pdp1_disassembler; } }, { "pdp8", be, 0, []() -> util::disasm_interface * { return new pdp8_disassembler; } }, @@ -456,7 +467,8 @@ static const dasm_table_entry dasm_table[] = { "r65c02", le, 0, []() -> util::disasm_interface * { return new r65c02_disassembler; } }, { "r65c19", le, 0, []() -> util::disasm_interface * { return new r65c19_disassembler; } }, { "rsp", le, 0, []() -> util::disasm_interface * { return new rsp_disassembler; } }, - { "s2650", le, 0, []() -> util::disasm_interface * { return new s2650_disassembler(&s2650_unidasm); } }, + { "rx01", le, 0, []() -> util::disasm_interface * { return new rx01_disassembler; } }, + { "s2650", be, 0, []() -> util::disasm_interface * { return new s2650_disassembler(&s2650_unidasm); } }, { "saturn", le, 0, []() -> util::disasm_interface * { return new saturn_disassembler(&saturn_unidasm); } }, { "sc61860", le, 0, []() -> util::disasm_interface * { return new sc61860_disassembler; } }, { "scmp", le, 0, []() -> util::disasm_interface * { return new scmp_disassembler; } }, @@ -523,6 +535,10 @@ static const dasm_table_entry dasm_table[] = { "upi41", le, 0, []() -> util::disasm_interface * { return new mcs48_disassembler(true, false); } }, { "v60", le, 0, []() -> util::disasm_interface * { return new v60_disassembler; } }, { "v810", le, 0, []() -> util::disasm_interface * { return new v810_disassembler; } }, + { "vt50", le, 0, []() -> util::disasm_interface * { return new vt50_disassembler; } }, + { "vt52", le, 0, []() -> util::disasm_interface * { return new vt52_disassembler; } }, + { "vt61", le, -1, []() -> util::disasm_interface * { return new vt61_disassembler; } }, + { "we32100", be, 0, []() -> util::disasm_interface * { return new we32100_disassembler; } }, { "x86_16", le, 0, []() -> util::disasm_interface * { i386_unidasm.mode = 16; return new i386_disassembler(&i386_unidasm); } }, { "x86_32", le, 0, []() -> util::disasm_interface * { i386_unidasm.mode = 32; return new i386_disassembler(&i386_unidasm); } }, { "x86_64", le, 0, []() -> util::disasm_interface * { i386_unidasm.mode = 64; return new i386_disassembler(&i386_unidasm); } }, @@ -591,18 +607,17 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const switch(entry->pcshift) { case -1: lr8 = [](offs_t pc) -> u8 { throw std::logic_error("debug_disasm_buffer::debug_data_buffer: r8 access on 16-bits granularity bus\n"); }; - lr16 = [this](offs_t pc) -> u16 { - const u16 *src = get_ptr<u16>(pc); - return src[0]; - }; - switch(entry->endian) { case le: + lr16 = [this](offs_t pc) -> u16 { + const u16 *src = get_ptr<u16>(pc); + return little_endianize_int16(src[0]); + }; lr32 = [this, page_mask](offs_t pc) -> u32 { offs_t lpc = disasm->pc_real_to_linear(pc); u32 r = 0; for(int j=0; j != 2; j++) { - r |= get<u16>(disasm->pc_linear_to_real(lpc)) << (j*16); + r |= little_endianize_int16(get<u16>(disasm->pc_linear_to_real(lpc))) << (j*16); lpc = (lpc & ~page_mask) | ((lpc + 1) & page_mask); } return r; @@ -611,7 +626,7 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const offs_t lpc = disasm->pc_real_to_linear(pc); u64 r = 0; for(int j=0; j != 4; j++) { - r |= u64(get<u16>(disasm->pc_linear_to_real(lpc))) << (j*16); + r |= u64(little_endianize_int16(get<u16>(disasm->pc_linear_to_real(lpc)))) << (j*16); lpc = (lpc & ~page_mask) | ((lpc + 1) & page_mask); } return r; @@ -619,11 +634,15 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const break; case be: + lr16 = [this](offs_t pc) -> u16 { + const u16 *src = get_ptr<u16>(pc); + return big_endianize_int16(src[0]); + }; lr32 = [this, page_mask](offs_t pc) -> u32 { offs_t lpc = disasm->pc_real_to_linear(pc); u32 r = 0; for(int j=0; j != 2; j++) { - r |= get<u16>(disasm->pc_linear_to_real(lpc)) << ((1-j)*16); + r |= big_endianize_int16(get<u16>(disasm->pc_linear_to_real(lpc))) << ((1-j)*16); lpc = (lpc & ~page_mask) | ((lpc + 1) & page_mask); } return r; @@ -632,7 +651,7 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const offs_t lpc = disasm->pc_real_to_linear(pc); u64 r = 0; for(int j=0; j != 4; j++) { - r |= u64(get<u16>(disasm->pc_linear_to_real(lpc))) << ((3-j)*16); + r |= u64(big_endianize_int16(get<u16>(disasm->pc_linear_to_real(lpc)))) << ((3-j)*16); lpc = (lpc & ~page_mask) | ((lpc + 1) & page_mask); } return r; @@ -785,46 +804,52 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const case -1: lr8 = [](offs_t pc) -> u8 { abort(); }; - lr16 = [this](offs_t pc) -> u16 { - const u16 *p = get_ptr<u16>(pc); - return p ? - p[0] - : 0x0000; - }; switch(entry->endian) { case le: + lr16 = [this](offs_t pc) -> u16 { + const u16 *p = get_ptr<u16>(pc); + return p ? + little_endianize_int16(p[0]) + : 0x0000; + }; lr32 = [this](offs_t pc) -> u32 { const u16 *p = get_ptr<u16>(pc); return p ? - p[0] | - (p[1] << 16) + little_endianize_int16(p[0]) | + (little_endianize_int16(p[1]) << 16) : 0x00000000; }; lr64 = [this](offs_t pc) -> u64 { const u16 *p = get_ptr<u16>(pc); return p ? - p[0] | - (p[1] << 16) | - (u64(p[2]) << 32) | - (u64(p[3]) << 48) + little_endianize_int16(p[0]) | + (little_endianize_int16(p[1]) << 16) | + (u64(little_endianize_int16(p[2])) << 32) | + (u64(little_endianize_int16(p[3])) << 48) : 0x0000000000000000; }; break; case be: + lr16 = [this](offs_t pc) -> u16 { + const u16 *p = get_ptr<u16>(pc); + return p ? + big_endianize_int16(p[0]) + : 0x0000; + }; lr32 = [this](offs_t pc) -> u32 { const u16 *p = get_ptr<u16>(pc); return p ? - (p[0] << 16)| - p[1] + (big_endianize_int16(p[0]) << 16)| + big_endianize_int16(p[1]) : 0x00000000; }; lr64 = [this](offs_t pc) -> u64 { const u16 *p = get_ptr<u16>(pc); return p ? - (u64(p[0]) << 48) | - (u64(p[1]) << 32) | - (p[2] << 16) | - p[3] + (u64(big_endianize_int16(p[0])) << 48) | + (u64(big_endianize_int16(p[1])) << 32) | + (big_endianize_int16(p[2]) << 16) | + big_endianize_int16(p[3]) : 0x0000000000000000; }; break; @@ -834,28 +859,34 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const case -2: lr8 = [](offs_t pc) -> u8 { abort(); }; lr16 = [](offs_t pc) -> u16 { abort(); }; - lr32 = [this](offs_t pc) -> u32 { - const u32 *p = get_ptr<u32>(pc); - return p ? - p[0] - : 0x00000000; - }; switch(entry->endian) { case le: + lr32 = [this](offs_t pc) -> u32 { + const u32 *p = get_ptr<u32>(pc); + return p ? + little_endianize_int32(p[0]) + : 0x00000000; + }; lr64 = [this](offs_t pc) -> u64 { const u32 *p = get_ptr<u32>(pc); return p ? - p[0] | - (u64(p[1]) << 32) + little_endianize_int32(p[0]) | + (u64(little_endianize_int32(p[1])) << 32) : 0x0000000000000000; }; break; case be: + lr32 = [this](offs_t pc) -> u32 { + const u32 *p = get_ptr<u32>(pc); + return p ? + big_endianize_int32(p[0]) + : 0x00000000; + }; lr64 = [this](offs_t pc) -> u64 { const u32 *p = get_ptr<u32>(pc); return p ? - (u64(p[0]) << 32) | - p[1] + (u64(big_endianize_int32(p[0])) << 32) | + big_endianize_int32(p[1]) : 0x0000000000000000; }; break; @@ -866,26 +897,38 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const lr8 = [](offs_t pc) -> u8 { abort(); }; lr16 = [](offs_t pc) -> u16 { abort(); }; lr32 = [](offs_t pc) -> u32 { abort(); }; - lr64 = [this](offs_t pc) -> u64 { - const u64 *p = get_ptr<u64>(pc); - return p ? - p[0] - : 0x0000000000000000; + switch(entry->endian) { + case le: + lr64 = [this](offs_t pc) -> u64 { + const u64 *p = get_ptr<u64>(pc); + return p ? + little_endianize_int64(p[0]) + : 0x0000000000000000; + }; + break; + case be: + lr64 = [this](offs_t pc) -> u64 { + const u64 *p = get_ptr<u64>(pc); + return p ? + big_endianize_int64(p[0]) + : 0x0000000000000000; + }; + break; }; break; case 3: lr8 = [](offs_t pc) -> u8 { abort(); }; - lr16 = [this](offs_t pc) -> u16 { - if(pc < base_pc) - return 0x0000; - offs_t delta = (pc - base_pc) >> 3; - if(delta >= size) - return 0x0000; - return reinterpret_cast<const u16 *>(&data[delta])[0]; - }; switch(entry->endian) { case le: + lr16 = [this](offs_t pc) -> u16 { + if(pc < base_pc) + return 0x0000; + offs_t delta = (pc - base_pc) >> 3; + if(delta >= size) + return 0x0000; + return little_endianize_int16(reinterpret_cast<const u16 *>(&data[delta])[0]); + }; lr32 = [this](offs_t pc) -> u32 { if(pc < base_pc) return 0x00000000; @@ -893,10 +936,18 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const if(delta >= size + 2) return 0x00000000; auto p = reinterpret_cast<const u16 *>(&data[delta]); - return p[0] | (u32(p[1]) << 16); + return little_endianize_int16(p[0]) | (u32(little_endianize_int16(p[1])) << 16); }; break; case be: + lr16 = [this](offs_t pc) -> u16 { + if(pc < base_pc) + return 0x0000; + offs_t delta = (pc - base_pc) >> 3; + if(delta >= size) + return 0x0000; + return big_endianize_int16(reinterpret_cast<const u16 *>(&data[delta])[0]); + }; lr32 = [this](offs_t pc) -> u32 { if(pc < base_pc) return 0x00000000; @@ -904,7 +955,7 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const if(delta >= size + 2) return 0x00000000; auto p = reinterpret_cast<const u16 *>(&data[delta]); - return (u32(p[0]) << 16) | p[1]; + return (u32(big_endianize_int16(p[0])) << 16) | big_endianize_int16(p[1]); }; break; } |