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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
// license:BSD-3-Clause
// copyright-holders:hap, Jonathan Gevaryahu
/*
Sharp SM5xx MCU family disassembler
*/
#ifndef MAME_CPU_SM510_SM510D_H
#define MAME_CPU_SM510_SM510D_H
#pragma once
class sm510_common_disassembler : public util::disasm_interface
{
public:
sm510_common_disassembler();
virtual ~sm510_common_disassembler() = default;
virtual u32 opcode_alignment() const override { return 1; }
virtual u32 interface_flags() const override { return NONLINEAR_PC | PAGED2LEVEL; }
virtual u32 page_address_bits() const override { return 6; }
virtual u32 page2_address_bits() const override { return 4; }
virtual offs_t pc_linear_to_real(offs_t pc) const override { return (pc & ~0x3f) | m_l2r6[pc & 0x3f]; }
virtual offs_t pc_real_to_linear(offs_t pc) const override { return (pc & ~0x3f) | m_r2l6[pc & 0x3f]; }
protected:
enum e_mnemonics
{
// SM510 common
mILL /* 0! */, mEXT,
mLB, mLBL, mSBM, mEXBLA, mINCB, mDECB,
mATPL, mRTN0, mRTN1, mTL, mTML, mTM, mT,
mEXC, mBDC, mEXCI, mEXCD, mLDA, mLAX, mPTW, mWR, mWS,
mKTA, mATBP, mATX, mATL, mATFC, mATR,
mADD, mADD11, mADX, mCOMA, mROT, mRC, mSC,
mTB, mTC, mTAM, mTMI, mTA0, mTABL, mTIS, mTAL, mTF1, mTF4,
mRM, mSM,
mPRE, mSME, mRME, mTMEL,
mSKIP, mCEND, mIDIV, mDR, mDTA, mCLKLO, mCLKHI,
// SM500 common
mCOMCB, mRTN, mRTNS, mSSR, mTR, mTRS, mRBM,
mADDC, mPDTW, mTW, mDTW,
mATS, mEXKSA, mEXKFA,
mRMF, mSMF, mCOMCN,
mTA, mTM2, mTG,
// SM530 common
mSABM, mSABL, mEXBL,
mTG2, mTBA,
mKETA, mATF, mSDS, mRDS,
mINIS,
// SM590 aliases
mNOP, mCCTRL, mINBL, mDEBL, mXBLA, mADCS, mTR7,
// SM590 uniques
mTAX, mLBLX, mMTR, mSTR, mINBM, mDEBM, mRTA, mBLTA, mEXAX, mTBA2, mADS, mADC, mLBMX, mTLS
};
static const char *const s_mnemonics[];
static const u8 s_bits[];
static const u32 s_flags[];
u8 m_l2r6[0x40];
u8 m_r2l6[0x40];
u8 m_l2r7[0x80];
u8 m_r2l7[0x80];
offs_t increment_pc(offs_t pc, u8 pclen);
offs_t common_disasm(const u8 *lut_mnemonic, const u8 *lut_extended, std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms);
};
class sm510_disassembler : public sm510_common_disassembler
{
public:
sm510_disassembler() = default;
virtual ~sm510_disassembler() = default;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
private:
static const u8 sm510_mnemonic[0x100];
};
class sm511_disassembler : public sm510_common_disassembler
{
public:
sm511_disassembler() = default;
virtual ~sm511_disassembler() = default;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
private:
static const u8 sm511_mnemonic[0x100];
static const u8 sm511_extended[0x10];
};
class sm500_disassembler : public sm510_common_disassembler
{
public:
sm500_disassembler() = default;
virtual ~sm500_disassembler() = default;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
private:
static const u8 sm500_mnemonic[0x100];
static const u8 sm500_extended[0x10];
};
class sm5a_disassembler : public sm510_common_disassembler
{
public:
sm5a_disassembler() = default;
virtual ~sm5a_disassembler() = default;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
private:
static const u8 sm5a_mnemonic[0x100];
static const u8 sm5a_extended[0x10];
};
class sm530_disassembler : public sm510_common_disassembler
{
public:
sm530_disassembler() = default;
virtual ~sm530_disassembler() = default;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
virtual u32 interface_flags() const override { return NONLINEAR_PC | PAGED; }
private:
static const u8 sm530_mnemonic[0x100];
};
class sm590_disassembler : public sm510_common_disassembler
{
public:
sm590_disassembler() = default;
virtual ~sm590_disassembler() = default;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
virtual u32 page_address_bits() const override { return 7; }
virtual u32 page2_address_bits() const override { return 2; }
virtual offs_t pc_linear_to_real(offs_t pc) const override { return (pc & ~0x7f) | m_l2r7[pc & 0x7f]; }
virtual offs_t pc_real_to_linear(offs_t pc) const override { return (pc & ~0x7f) | m_r2l7[pc & 0x7f]; }
private:
static const u8 sm590_mnemonic[0x100];
};
#endif
|