1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
// license:BSD-3-Clause
// copyright-holders:David Haywood
#ifndef MAME_CPU_XA_XADASM_H
#define MAME_CPU_XA_XADASM_H
#pragma once
#define XA_DASM_PARAMS u8 op, std::ostream& stream, offs_t pc, const data_buffer& opcodes, const data_buffer& params
#define XA_CALL_PARAMS op, stream, pc, opcodes, params
class xa_dasm : public util::disasm_interface
{
public:
xa_dasm()
{
add_names(default_names);
};
virtual ~xa_dasm() = default;
private:
struct mem_info {
int addr;
const char *name;
};
static const mem_info default_names[];
void add_names(const mem_info *info);
std::string get_data_address(u16 arg) const;
virtual u32 opcode_alignment() const override;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
typedef int (xa_dasm::*op_func) (XA_DASM_PARAMS);
static const op_func s_instruction[256];
const char* m_regnames16[16] = { "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal" };
const char* m_regnames8[16] = { "R0L", "R0H", "R1L", "R1H", "R2L", "R2H", "R3L", "R3H", "R4L", "R4H", "R5L", "R5H", "R6L", "R6H", "R7L", "R7H"};
const char* m_aluops[16] = { "ADD", "ADDC", "SUB", "SUBB", "CMP", "AND", "OR", "XOR", "MOV", "illegal ALU 0x09", "illegal ALU 0x0a", "illegal ALU 0x0b", "illegal ALU 0x0c", "illegal ALU 0x0d", "illegal ALU 0x0e", "illegal ALU 0x0f"};
const char* m_branches[15] = { "BCC", "BCS", "BNE", "BEQ", "BNV", "BOV", "BPL", "BMI", "BG", "BL", "BGE", "BLT", "BGT", "BLE", "BR" };
const char* m_addsmovs[2] = { "ADDS", "MOVS" };
const char* m_pushpull[4] = { "PUSH", "PUSHU", "POP", "POPU" };
const char* m_shifts[3] = { "ASL", "ASR", "LSR" };
const char* m_dwparamsizes[4] = { ".b", "invalid", ".w", ".dw" };
std::string get_bittext(int bit);
std::string get_directtext(int bit);
std::string show_expanded_data4(u16 data4, int size);
int handle_alu_type0(XA_DASM_PARAMS, int alu_op);
int handle_alu_type1(XA_DASM_PARAMS, u8 op2);
int handle_pushpop_rlist(XA_DASM_PARAMS, int type);
int handle_adds_movs(XA_DASM_PARAMS, int which);
int handle_shift(XA_DASM_PARAMS, int shift_type);
int d_illegal(XA_DASM_PARAMS);
int d_nop(XA_DASM_PARAMS);
int d_bitgroup(XA_DASM_PARAMS);
int d_add(XA_DASM_PARAMS);
int d_push_rlist(XA_DASM_PARAMS);
int d_addc(XA_DASM_PARAMS);
int d_pushu_rlist(XA_DASM_PARAMS);
int d_sub(XA_DASM_PARAMS);
int d_pop_rlist(XA_DASM_PARAMS);
int d_subb(XA_DASM_PARAMS);
int d_popu_rlist(XA_DASM_PARAMS);
int d_lea_offset8(XA_DASM_PARAMS);
int d_lea_offset16(XA_DASM_PARAMS);
int d_cmp(XA_DASM_PARAMS);
int d_xch_type1(XA_DASM_PARAMS);
int d_and(XA_DASM_PARAMS);
int d_xch_type2(XA_DASM_PARAMS);
int d_or(XA_DASM_PARAMS);
int d_xor(XA_DASM_PARAMS);
int d_movc_rd_rsinc(XA_DASM_PARAMS);
int d_mov(XA_DASM_PARAMS);
int d_pushpop_djnz_subgroup(XA_DASM_PARAMS);
int d_g9_subgroup(XA_DASM_PARAMS);
int d_alu(XA_DASM_PARAMS);
int d_jb_mov_subgroup(XA_DASM_PARAMS);
int d_movdir(XA_DASM_PARAMS);
int d_adds(XA_DASM_PARAMS);
int d_movx_subgroup(XA_DASM_PARAMS);
int d_rr(XA_DASM_PARAMS);
int d_movs(XA_DASM_PARAMS);
int d_rrc(XA_DASM_PARAMS);
int d_lsr_fc(XA_DASM_PARAMS);
int d_asl_c(XA_DASM_PARAMS);
int d_asr_c(XA_DASM_PARAMS);
int d_norm(XA_DASM_PARAMS);
int d_lsr_fj(XA_DASM_PARAMS);
int d_asl_j(XA_DASM_PARAMS);
int d_asr_j(XA_DASM_PARAMS);
int d_rl(XA_DASM_PARAMS);
int d_rlc(XA_DASM_PARAMS);
int d_djnz_cjne(XA_DASM_PARAMS);
int d_mulu_b(XA_DASM_PARAMS);
int d_divu_b(XA_DASM_PARAMS);
int d_mulu_w(XA_DASM_PARAMS);
int d_divu_w(XA_DASM_PARAMS);
int d_mul_w(XA_DASM_PARAMS);
int d_div_w(XA_DASM_PARAMS);
int d_div_data8(XA_DASM_PARAMS);
int d_div_d16(XA_DASM_PARAMS);
int d_divu_d(XA_DASM_PARAMS);
int d_div_d(XA_DASM_PARAMS);
int d_cjne_d8(XA_DASM_PARAMS);
int d_cjne_d16(XA_DASM_PARAMS);
int d_jz_rel8(XA_DASM_PARAMS);
int d_jnz_rel8(XA_DASM_PARAMS);
int d_branch(XA_DASM_PARAMS);
int d_bkpt(XA_DASM_PARAMS);
std::unordered_map<offs_t, const char *> m_names;
};
#endif // MAME_CPU_XA_XADASM_H
|