1 // license:BSD-3-Clause
2 // copyright-holders:Vas Crabb
3 /*****************************************************************************
4  *
5  *   4004dasm.cpp
6  *
7  *   Intel MCS-40 CPU Disassembly
8  *
9  *****************************************************************************/
10 
11 #ifndef MAME_CPU_MCS40_MCS40DASM_H
12 #define MAME_CPU_MCS40_MCS40DASM_H
13 
14 #pragma once
15 
16 class mcs40_disassembler : public util::disasm_interface
17 {
18 public:
19 	enum class level
20 	{
21 		I4004,
22 		I4040
23 	};
24 
25 	mcs40_disassembler(level lvl, unsigned pcmask);
26 	virtual ~mcs40_disassembler() = default;
27 
28 	virtual u32 opcode_alignment() const override;
29 	virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
30 
interface_flags()31 	virtual u32 interface_flags() const override { return PAGED; }
page_address_bits()32 	virtual u32 page_address_bits() const override { return 12; }
33 
34 private:
35 	enum class format
36 	{
37 		ILL,
38 		SIMPLE,
39 		IMM4,
40 		REG,
41 		REGPAGE,
42 		PAIR,
43 		PAIRIMM,
44 		ABS,
45 		PAGE,
46 		COND,
47 		EXT
48 	};
49 
50 	struct op
51 	{
52 		format m_format;
53 		level m_level;
54 		char const *m_name;
55 		op const *m_ext;
56 	};
57 
58 	static op const f_opx_0[16];
59 	static op const f_opx_2[16];
60 	static op const f_opx_3[16];
61 	static op const f_opx_io[16];
62 	static op const f_opx_f[16];
63 	static op const f_ops[16];
64 	static char const *const f_cond[16];
65 
66 	level m_lvl;
67 	unsigned m_pcmask;
68 };
69 
70 class i4004_disassembler : public mcs40_disassembler
71 {
72 public:
73 	i4004_disassembler();
74 	virtual ~i4004_disassembler() = default;
75 };
76 
77 class i4040_disassembler : public mcs40_disassembler
78 {
79 public:
80 	i4040_disassembler();
81 	virtual ~i4040_disassembler() = default;
82 };
83 
84 #endif
85