1 // license:BSD-3-Clause
2 // copyright-holders:Juergen Buchmueller
3 /*****************************************************************************
4  *
5  *   Portable uPD7810/11, 7810H/11H, 78C10/C11/C14 disassembler
6  *
7  *   NS20030112: added 7807.
8  *
9  *****************************************************************************/
10 
11 #ifndef MAME_CPU_UPD7810_UPD7810DASM_H
12 #define MAME_CPU_UPD7810_UPD7810DASM_H
13 
14 #pragma once
15 
16 class upd7810_base_disassembler : public util::disasm_interface
17 {
18 public:
19 	struct dasm_s {
20 	public:
21 		dasm_s();
22 		dasm_s(uint8_t t, const char *a);
23 		dasm_s(const dasm_s (&a)[256]);
24 
25 		const char *name() const;
26 		const char *args() const;
27 
28 		bool is_prefix() const;
29 		bool is_call() const;
30 		bool is_return() const;
31 
32 		const dasm_s &prefix_get(uint8_t op) const;
33 
34 		uint8_t m_token;
35 		const void *m_args;
36 
37 		static const char *const token_names[];
38 	};
39 
40 	enum
41 	{
42 		prefix = 0,
43 		illegal,
44 		ACI,
45 		ADC,
46 		ADCW,
47 		ADCX,
48 		ADD,
49 		ADDNC,
50 		ADDNCW,
51 		ADDNCX,
52 		ADDW,
53 		ADDX,
54 		ADI,
55 		ADINC,
56 		ANA,
57 		ANAW,
58 		ANAX,
59 		AND,
60 		ANI,
61 		ANIW,
62 		BIT,
63 		BLOCK,
64 		CALB,
65 		CALF,
66 		CALL,
67 		CALT,
68 		CLC,
69 		CLR,    /* 7807 */
70 		CMC,    /* 7807 */
71 		DAA,
72 		DADC,
73 		DADD,
74 		DADDNC,
75 		DAN,
76 		DCR,
77 		DCRW,
78 		DCX,
79 		DEQ,
80 		DGT,
81 		DI,
82 		DIV,
83 		DLT,
84 		DMOV,
85 		DNE,
86 		DOFF,
87 		DON,
88 		DOR,
89 		DRLL,
90 		DRLR,
91 		DSBB,
92 		DSLL,
93 		DSLR,
94 		DSUB,
95 		DSUBNB,
96 		DXR,
97 		EADD,
98 		EI,
99 		EQA,
100 		EQAW,
101 		EQAX,
102 		EQI,
103 		EQIW,
104 		ESUB,
105 		EX,     /* 7801 */
106 		EXA,
107 		EXH,
108 		EXX,
109 		EXR,    /* 7807 */
110 		GTA,
111 		GTAW,
112 		GTAX,
113 		GTI,
114 		GTIW,
115 		HALT,
116 		IN,     /* 7801 */
117 		INR,
118 		INRW,
119 		INX,
120 		JB,
121 		JEA,
122 		JMP,
123 		JR,
124 		JRE,
125 		LBCD,
126 		LDAW,
127 		LDAX,
128 		LDEAX,
129 		LDED,
130 		LHLD,
131 		LSPD,
132 		LTA,
133 		LTAW,
134 		LTAX,
135 		LTI,
136 		LTIW,
137 		LXI,
138 		MOV,
139 		MUL,
140 		MVI,
141 		MVIW,
142 		MVIX,
143 		NEA,
144 		NEAW,
145 		NEAX,
146 		NEGA,
147 		NEI,
148 		NEIW,
149 		NOP,
150 		NOT,    /* 7807 */
151 		OFFA,
152 		OFFAW,
153 		OFFAX,
154 		OFFI,
155 		OFFIW,
156 		ONA,
157 		ONAW,
158 		ONAX,
159 		ONI,
160 		ONIW,
161 		OR, /* 7807 */
162 		ORA,
163 		ORAW,
164 		ORAX,
165 		ORI,
166 		ORIW,
167 		OUT,    /* 7801 */
168 		PER,    /* 7801 */
169 		PEX,    /* 7801 */
170 		POP,
171 		PUSH,
172 		RET,
173 		RETI,
174 		RETS,
175 		RLD,
176 		RLL,
177 		RLR,
178 		RRD,
179 		SBB,
180 		SBBW,
181 		SBBX,
182 		SBCD,
183 		SBI,
184 		SDED,
185 		SETB,   /* 7807 */
186 		SHLD,
187 		SIO,    /* 7801 */
188 		SK,
189 		SKIT,
190 		SKN,
191 		SKNIT,
192 		SLL,
193 		SLLC,
194 		SLR,
195 		SLRC,
196 		SOFTI,
197 		SSPD,
198 		STAW,
199 		STAX,
200 		STC,
201 		STEAX,
202 		STM,    /* 7801 */
203 		STOP,
204 		SUB,
205 		SUBNB,
206 		SUBNBW,
207 		SUBNBX,
208 		SUBW,
209 		SUBX,
210 		SUI,
211 		SUINB,
212 		TABLE,
213 		XOR,    /* 7807 */
214 		XRA,
215 		XRAW,
216 		XRAX,
217 		XRI
218 	};
219 
220 	upd7810_base_disassembler(const dasm_s *table, bool is_7810);
221 	virtual u32 opcode_alignment() const override;
222 	virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
223 
224 	static const char *const regname[32];
225 	static const dasm_s d60[256];
226 	static const dasm_s d70[256];
227 	static const dasm_s d74[256];
228 
229 	bool m_is_7810;
230 	const dasm_s *m_dasmXX;
231 };
232 
233 class upd7810_disassembler : public upd7810_base_disassembler
234 {
235 public:
236 	static const dasm_s XX_7810[256];
237 	static const dasm_s d48_7810[256];
238 	static const dasm_s d4C_7810[256];
239 	static const dasm_s d4D_7810[256];
240 	static const dasm_s d64_7810[256];
241 
242 	upd7810_disassembler();
243 	virtual ~upd7810_disassembler() = default;
244 };
245 
246 class upd7807_disassembler : public upd7810_base_disassembler
247 {
248 public:
249 	static const dasm_s XX_7807[256];
250 	static const dasm_s d48_7807[256];
251 	static const dasm_s d4C_7807[256];
252 	static const dasm_s d4D_7807[256];
253 	static const dasm_s d64_7807[256];
254 
255 	upd7807_disassembler();
256 	virtual ~upd7807_disassembler() = default;
257 };
258 
259 class upd7801_disassembler : public upd7810_base_disassembler
260 {
261 public:
262 	static const dasm_s XX_7801[256];
263 	static const dasm_s d48_7801[256];
264 	static const dasm_s d4C_7801[256];
265 	static const dasm_s d4D_7801[256];
266 	static const dasm_s d60_7801[256];
267 	static const dasm_s d64_7801[256];
268 	static const dasm_s d70_7801[256];
269 	static const dasm_s d74_7801[256];
270 
271 	upd7801_disassembler();
272 	virtual ~upd7801_disassembler() = default;
273 };
274 
275 class upd78c05_disassembler : public upd7810_base_disassembler
276 {
277 public:
278 	static const dasm_s XX_78c05[256];
279 	static const dasm_s d48_78c05[256];
280 	static const dasm_s d4C_78c05[256];
281 	static const dasm_s d4D_78c05[256];
282 	static const dasm_s d60_78c05[256];
283 	static const dasm_s d64_78c05[256];
284 	static const dasm_s d70_78c05[256];
285 	static const dasm_s d74_78c05[256];
286 
287 	upd78c05_disassembler();
288 	virtual ~upd78c05_disassembler() = default;
289 };
290 
291 #endif
292