// license:BSD-3-Clause // copyright-holders:Aaron Giles /*************************************************************************** dis32031.cpp Disassembler for the portable TMS320C3x emulator. Written by Aaron Giles ***************************************************************************/ #include "emu.h" #include "dis32031.h" /*************************************************************************** CODE CODE ***************************************************************************/ const char *const tms32031_disassembler::regname[32] = { "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "AR0", "AR1", "AR2", "AR3", "AR4", "AR5", "AR6", "AR7", "DP", "IR0", "IR1", "BK", "SP", "ST", "IE", "IF", "IOF", "RS", "RE", "RC", "??", "??", "??", "??" }; const char *const tms32031_disassembler::condition[32] = { "U", "LO", "LS", "HI", "HS", "EQ", "NE", "LT", "LE", "GT", "GE", "??", "NV", "V", "NUF", "UF", "NLV", "LV", "NLUF", "LUF", "ZUF", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??" }; // // for instructions 0x000-0x3f // G = (op >> 21) & 3; // G == 0 -> register -> 000ooooo o00ddddd 00000000 000sssss // G == 1 -> direct -> 000ooooo o01ddddd DDDDDDDD DDDDDDDD // G == 2 -> indirect -> 000ooooo o10ddddd mmmmmaaa DDDDDDDD // G == 3 -> immediate -> 000ooooo o11ddddd iiiiiiii iiiiiiii // // for instructions 0x040-0x7f // T = (op >> 21) & 3; (src1) (src2) // T == 0 -> reg reg -> 001ooooo o00ddddd 000sssss 000SSSSS // T == 1 -> ind reg -> 001ooooo o01ddddd mmmmmaaa 000SSSSS // T == 2 -> reg ind -> 001ooooo o10ddddd 000sssss MMMMMAAA // T == 3 -> ind ind -> 001ooooo o11ddddd mmmmmaaa MMMMMAAA // // for instructions 0x100-0x1ff // 10ooooPP dDsssSSS mmmmmaaa MMMMMAAA // 10ooooPP dDsssSSS 111rrrrr 111RRRRR // // conditional branches // xxxxxxBa aaDccccc 00000000 000sssss // xxxxxxBa aaDccccc iiiiiiii iiiiiiii // D=0(standard) or 1(delayed) // B=0(register) or 1(immediate) // // status register // 31-14 = 0 // 13 = GIE // 12 = CC // 11 = CE // 10 = CF // 9 = 0 // 8 = RM // 7 = OVM // 6 = LUF (latched FP underflow) // 5 = LV (latched overflow) // 4 = UF (FP underflow) // 3 = N // 2 = Z // 1 = V // 0 = C // // conditions: // 0 = U (unconditional) // 1 = LO (C) // 2 = LS (C | Z) // 3 = HI (~C & ~Z) // 4 = HS (~C) // 5 = EQ (Z) // 6 = NE (~Z) // 7 = LT (N) // 8 = LE (N | Z) // 9 = GT (~N & ~Z) // 10 = GE (~N) // 12 = NV (~V) // 13 = V (V) // 14 = NUF (~UF) // 15 = UF (UF) // 16 = NLV (~LV) // 17 = LV (LV) // 18 = NLUF (~LUF) // 19 = LUF (LUF) // 20 = ZUF (Z | UF) void tms32031_disassembler::append_indirect(uint8_t ma, int8_t disp, std::ostream &stream) { std::string dispstr; int mode = (ma >> 3) & 0x1f; int ar = ma & 7; if (disp < 0) dispstr = util::string_format("(-%X)", -disp & 0xffff); else if (disp > 0) dispstr = util::string_format("(%X)", disp); switch (mode) { case 0: util::stream_format(stream, "*+AR%d%s", ar, dispstr); break; case 1: util::stream_format(stream, "*-AR%d%s", ar, dispstr); break; case 2: util::stream_format(stream, "*++AR%d%s", ar, dispstr); break; case 3: util::stream_format(stream, "*--AR%d%s", ar, dispstr); break; case 4: util::stream_format(stream, "*AR%d++%s", ar, dispstr); break; case 5: util::stream_format(stream, "*AR%d--%s", ar, dispstr); break; case 6: util::stream_format(stream, "*AR%d++%s%%", ar, dispstr); break; case 7: util::stream_format(stream, "*AR%d--%s%%", ar, dispstr); break; case 8: util::stream_format(stream, "*+AR%d(IR0)", ar); break; case 9: util::stream_format(stream, "*-AR%d(IR0)", ar); break; case 10: util::stream_format(stream, "*++AR%d(IR0)", ar); break; case 11: util::stream_format(stream, "*--AR%d(IR0)", ar); break; case 12: util::stream_format(stream, "*AR%d++(IR0)", ar); break; case 13: util::stream_format(stream, "*AR%d--(IR0)", ar); break; case 14: util::stream_format(stream, "*AR%d++(IR0)%%", ar); break; case 15: util::stream_format(stream, "*AR%d--(IR0)%%", ar); break; case 16: util::stream_format(stream, "*+AR%d(IR1)", ar); break; case 17: util::stream_format(stream, "*-AR%d(IR1)", ar); break; case 18: util::stream_format(stream, "*++AR%d(IR1)", ar); break; case 19: util::stream_format(stream, "*--AR%d(IR1)", ar); break; case 20: util::stream_format(stream, "*AR%d++(IR1)", ar); break; case 21: util::stream_format(stream, "*AR%d--(IR1)", ar); break; case 22: util::stream_format(stream, "*AR%d++(IR1)%%", ar); break; case 23: util::stream_format(stream, "*AR%d--(IR1)%%", ar); break; case 24: util::stream_format(stream, "*AR%d", ar); break; case 25: util::stream_format(stream, "*AR%d++(IR0)B", ar); break; case 28: case 29: case 30: case 31: stream << regname[ma & 31]; break; default: util::stream_format(stream, "(unknown mode)"); break; } } std::string tms32031_disassembler::get_indirect(uint8_t ma, int8_t disp) { std::ostringstream stream; append_indirect(ma, disp, stream); return stream.str(); } void tms32031_disassembler::append_immediate(uint16_t data, int is_float, int is_unsigned, std::ostream &stream) { if (is_float) { int exp = ((int16_t)data >> 12) + 127; uint32_t expanded_data; float float_val; expanded_data = ((data & 0x0800) << 20) + ((exp << 23) & 0x7f800000); if (data == 0x8000) *(float *)&expanded_data = 0; else if (!(data & 0x0800)) expanded_data += ((data & 0x0fff) << 12); else expanded_data += ((-data & 0x0fff) << 12); float_val = *(float *)&expanded_data; util::stream_format(stream, "%8f", (double) float_val); } else if (!is_unsigned && (int16_t)data < 0) util::stream_format(stream, "-$%04X", -data & 0xffff); else util::stream_format(stream, "$%04X", data); } void tms32031_disassembler::disasm_general(const char *opstring, uint32_t op, int flags, std::ostream &stream) { util::stream_format(stream, "%-6s", opstring); if (flags & SWAPSRCDST) { stream << regname[(op >> 16) & 31] << ','; } /* switch off of G */ if (!(flags & NOSOURCE)) { switch ((op >> 21) & 3) { case 0: stream << regname[op & 31]; break; case 1: util::stream_format(stream, "($%04X)", op & 0xffff); break; case 2: append_indirect((op >> 8) & 0xff, op, stream); break; case 3: append_immediate(op & 0xffff, (flags & FLOAT), (flags & UNSIGNED), stream); break; } } /* add destination op */ if (!(flags & NODEST) && !(flags & SWAPSRCDST)) { if (!(flags & NOSOURCE)) stream << ','; stream << regname[(op >> 16) & 31]; } } void tms32031_disassembler::disasm_3op(const char *opstring, uint32_t op, int flags, std::ostream &stream) { util::stream_format(stream, "%-6s", opstring); /* switch off of T */ if (!(flags & NOSOURCE1)) { switch ((op >> 21) & 1) { case 0: stream << regname[(op >> 8) & 31]; break; case 1: append_indirect(op >> 8, 1, stream); break; } } /* switch off of T */ if (!(flags & NOSOURCE2)) { if (!(flags & NOSOURCE1)) stream << ','; switch ((op >> 22) & 1) { case 0: stream << regname[op & 31]; break; case 1: append_indirect(op, 1, stream); break; } } /* add destination op */ if (!(flags & NODEST)) { if (!(flags & (NOSOURCE1 | NOSOURCE2))) stream << ','; stream << regname[(op >> 16) & 31]; } } void tms32031_disassembler::disasm_conditional(const char *opstring, uint32_t op, int flags, std::ostream &stream) { char temp[10]; sprintf(temp, "%s%s", opstring, condition[(op >> 23) & 31]); disasm_general(temp, op, flags, stream); } void tms32031_disassembler::disasm_parallel_3op3op(const char *opstring1, const char *opstring2, uint32_t op, int flags, const uint8_t *srctable, std::ostream &stream) { const uint8_t *s = &srctable[((op >> 24) & 3) * 4]; int d1 = (op >> 23) & 1; int d2 = 2 + ((op >> 22) & 1); std::string src[5]; src[1
-- license:BSD-3-Clause
-- copyright-holders:MAMEdev Team
---------------------------------------------------------------------------
--
-- devices.lua
--
-- Rules for building device cores
--
---------------------------------------------------------------------------
function devicesProject(_target, _subtarget)
disasm_files = { }
disasm_dependency = { }
disasm_custombuildtask = { }
project ("optional")
uuid (os.uuid("optional-" .. _target .."_" .. _subtarget))
kind (LIBTYPE)
targetsubdir(_target .."_" .. _subtarget)
if (_OPTIONS["targetos"] ~= "asmjs") then
options {
"ArchiveSplit",
}
end
addprojectflags()
precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
MAME_DIR .. "src/emu",
MAME_DIR .. "src/devices",
MAME_DIR .. "src/mame", -- used for sound amiga
MAME_DIR .. "src/lib",
MAME_DIR .. "src/lib/util",
MAME_DIR .. "3rdparty",
GEN_DIR .. "emu",
GEN_DIR .. "emu/layout",
ext_includedir("asio"),
ext_includedir("expat"),
ext_includedir("flac"),
}
dofile(path.join("src", "cpu.lua"))
dofile(path.join("src", "sound.lua"))
dofile(path.join("src", "video.lua"))
dofile(path.join("src", "machine.lua"))
dofile(path.join("src", "bus.lua"))
pchsource(MAME_DIR .. "src/devices/machine/timer.cpp")
if #disasm_files > 0 then
project ("dasm")
uuid ("f2d28b0a-6da5-4f78-b629-d834aa00429d")
kind (LIBTYPE)
targetsubdir(_target .."_" .. _subtarget)
addprojectflags()
precompiledheaders()
includedirs {
MAME_DIR .. "src/osd",
MAME_DIR .. "src/emu",
MAME_DIR .. "src/devices",
MAME_DIR .. "src/lib",
MAME_DIR .. "src/lib/util",
MAME_DIR ..