summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6805/6805dasm.h
blob: 95a03afb61cba4094995ab41144103024431cf93 (plain) (blame)
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
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert, Aaron Giles, Vas Crabb

// 6805 disassembler interface

#ifndef MAME_CPU_M6805_6805DASM_H
#define MAME_CPU_M6805_6805DASM_H

#pragma once

class m6805_base_disassembler : public util::disasm_interface
{
public:
	enum class lvl {
		HMOS,
		CMOS,
		HC
	};

	m6805_base_disassembler(lvl level, std::pair<u16, char const *> const symbols[], std::size_t symbol_count);

	m6805_base_disassembler(lvl level) : m6805_base_disassembler(level, nullptr, 0) {}

	virtual ~m6805_base_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 &params) override;

private:
	enum class md {
		INH,    // inherent
		BTR,    // bit test and relative
		BIT,    // bit set/clear
		REL,    // relative
		IMM,    // immediate
		DIR,    // direct address
		EXT,    // extended address
		IDX,    // indexed
		IX1,    // indexed + byte offset
		IX2     // indexed + word offset
	};

	enum class op_names {
		adca,   adda,   anda,   asl,    asla,   aslx,   asr,    asra,
		asrx,   bcc,    bclr,   bcs,    beq,    bhcc,   bhcs,   bhi,
		bih,    bil,    bit,    bls,    bmc,    bmi,    bms,    bne,
		bpl,    bra,    brclr,  brn,    brset,  bset,   bsr,    clc,
		cli,    clr,    clra,   clrx,   cmpa,   com,    coma,   comx,
		cpx,    dec,    deca,   decx,   eora,   ill,    inc,    inca,
		incx,   jmp,    jsr,    lda,    ldx,    lsr,    lsra,   lsrx,
		mul,    neg,    nega,   negx,   nop,    ora,    rol,    rola,
		rolx,   ror,    rora,   rorx,   rsp,    rti,    rts,    sbca,
		sec,    sei,    sta,    stop,   stx,    suba,   swi,    tax,
		tst,    tsta,   tstx,   txa,    wait
	};

	struct info {
		op_names op;
		char const *name;
		md mode;
		lvl level;
	};

	static const info disasm[0x100];

	lvl m_level;
	std::pair<u16, char const *> const *m_symbols;
	std::size_t m_symbol_count;

	template <typename T> std::string address(T offset) const;
};

class m6805_disassembler : public m6805_base_disassembler
{
public:
	m6805_disassembler();
	m6805_disassembler(std::pair<u16, char const *> const symbols[], std::size_t symbol_count);
	template<size_t N> m6805_disassembler(std::pair<u16, char const *> const (&symbols)[N]) : m6805_disassembler(symbols, N) {}

	virtual ~m6805_disassembler() = default;
};

class m146805_disassembler : public m6805_base_disassembler
{
public:
	m146805_disassembler();
	virtual ~m146805_disassembler() = default;
};

class m68hc05_disassembler : public m6805_base_disassembler
{
public:
	m68hc05_disassembler();
	m68hc05_disassembler(std::pair<u16, char const *> const symbols[], std::size_t symbol_count);
	template<size_t N> m68hc05_disassembler(std::pair<u16, char const *> const (&symbols)[N]) : m68hc05_disassembler(symbols, N) {}
	virtual ~m68hc05_disassembler() = default;
};


#endif