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
|
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
/*****************************************************************************
*
* 4004dasm.cpp
*
* Intel MCS-40 CPU Disassembly
*
*****************************************************************************/
#ifndef MAME_CPU_MCS40_MCS40DASM_H
#define MAME_CPU_MCS40_MCS40DASM_H
#pragma once
class mcs40_disassembler : public util::disasm_interface
{
public:
enum class level
{
I4004,
I4040
};
mcs40_disassembler(level lvl, unsigned pcmask);
virtual ~mcs40_disassembler() = default;
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;
virtual u32 interface_flags() const override { return PAGED; }
virtual u32 page_address_bits() const override { return 12; }
private:
enum class format
{
ILL,
SIMPLE,
IMM4,
REG,
REGPAGE,
PAIR,
PAIRIMM,
ABS,
PAGE,
COND,
EXT
};
struct op
{
format m_format;
level m_level;
char const *m_name;
op const *m_ext;
};
static op const f_opx_0[16];
static op const f_opx_2[16];
static op const f_opx_3[16];
static op const f_opx_io[16];
static op const f_opx_f[16];
static op const f_ops[16];
static char const *const f_cond[16];
level m_lvl;
unsigned m_pcmask;
};
class i4004_disassembler : public mcs40_disassembler
{
public:
i4004_disassembler();
virtual ~i4004_disassembler() = default;
};
class i4040_disassembler : public mcs40_disassembler
{
public:
i4040_disassembler();
virtual ~i4040_disassembler() = default;
};
#endif
|