unidasm: Add disassembler for M32C architecture

This commit is contained in:
AJR 2020-12-07 15:41:45 -05:00
parent cc954c2ade
commit 04b59f8323
4 changed files with 1303 additions and 0 deletions

View File

@ -1464,6 +1464,15 @@ if (CPUS["MELPS4"]~=null or _OPTIONS["with-tools"]) then
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/melps4/melps4d.h")
end
--------------------------------------------------
-- Mitsubishi M32C, disassembler only
--------------------------------------------------
if (_OPTIONS["with-tools"]) then
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/m32c/m32cdasm.cpp")
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/m32c/m32cdasm.h")
end
--------------------------------------------------
-- Mitsubishi M37702 and M37710 (based on 65C816)
--@src/devices/cpu/m37710/m37710.h,CPUS["M37710"] = true

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,57 @@
// license:BSD-3-Clause
// copyright-holders:AJR
#ifndef MAME_CPU_M32C_M32CDASM_H
#define MAME_CPU_M32C_M32CDASM_H
#pragma once
class m32c_disassembler : public util::disasm_interface
{
public:
// construction/destruction
m32c_disassembler();
protected:
// disassembler overrides
virtual u32 opcode_alignment() const override;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
private:
// static tables
static const char *const s_aregs[4];
static const char *const s_sregs_16bit[8];
static const char *const s_sregs_24bit[8];
static const char *const s_sregs_dma[8];
static const char *const s_cnds[16];
static const char *const s_dadd_ops[6];
static const char *const s_bit_ops[8];
static const char *const s_long_ops[4];
static const char *const s_long_shift_ops[5];
static const char *const s_imm1111_ops[8];
static const char *const s_str_ops[4];
static const char *const s_sstr_ops[4];
static const char *const s_btst_ops[8];
static const u8 s_short_code[4];
// formatting helpers
void format_imm8(std::ostream &stream, u8 imm) const;
void format_imm16(std::ostream &stream, u16 imm) const;
void format_imm24(std::ostream &stream, u32 imm) const;
void format_imm32(std::ostream &stream, u32 imm) const;
void format_label(std::ostream &stream, u32 label) const;
void format_imm_signed(std::ostream &stream, s32 imm) const;
void format_relative(std::ostream &stream, const char *reg, s32 disp) const;
// internal helpers
void dasm_abs16(std::ostream &stream, offs_t &pc, const data_buffer &opcodes) const;
void dasm_abs24(std::ostream &stream, offs_t &pc, const data_buffer &opcodes) const;
void dasm_operand(std::ostream &stream, offs_t &pc, const data_buffer &opcodes, u8 code, u8 size, bool indirect) const;
void dasm_immediate_mode(std::ostream &stream, offs_t &pc, const data_buffer &opcodes, u8 code, u8 size, bool indirect, int count, bool signd) const;
void dasm_00000001(std::ostream &stream, offs_t &pc, const data_buffer &opcodes, bool indirect_src, bool indirect_dest) const;
void dasm_general(std::ostream &stream, offs_t &pc, offs_t &flags, const data_buffer &opcodes, u8 op1, bool indirect_src, bool indirect_dest) const;
void dasm_1101(std::ostream &stream, offs_t &pc, const data_buffer &opcodes, u8 op1, bool indirect_src, bool indirect_dest) const;
void dasm_111x(std::ostream &stream, offs_t &pc, const data_buffer &opcodes, u8 op1, bool indirect_dest) const;
};
#endif // MAME_CPU_M32C_M32CDASM_H

View File

@ -78,6 +78,7 @@ using util::BIT;
#include "cpu/lc8670/lc8670dsm.h"
#include "cpu/lh5801/5801dasm.h"
#include "cpu/lr35902/lr35902d.h"
#include "cpu/m32c/m32cdasm.h"
#include "cpu/m37710/m7700ds.h"
#include "cpu/m6502/m4510d.h"
#include "cpu/m6502/m6502d.h"
@ -451,6 +452,7 @@ static const dasm_table_entry dasm_table[] =
{ "lh5801", le, 0, []() -> util::disasm_interface * { return new lh5801_disassembler; } },
{ "lr35902", le, 0, []() -> util::disasm_interface * { return new lr35902_disassembler; } },
{ "m146805", be, 0, []() -> util::disasm_interface * { return new m146805_disassembler; } },
{ "m32c", le, 0, []() -> util::disasm_interface * { return new m32c_disassembler; } },
{ "m37710", le, 0, []() -> util::disasm_interface * { return new m7700_disassembler(&m7700_unidasm); } },
{ "m4510", le, 0, []() -> util::disasm_interface * { return new m4510_disassembler; } },
{ "m58846", le, -1, []() -> util::disasm_interface * { return new melps4_disassembler; } },