summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/debug/dvdisasm.h
blob: 2eee80c32f89166e225cde0d9d500c71377c13d1 (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/*********************************************************************

    dvdisasm.h

    Disassembly debugger view.

***************************************************************************/

#ifndef __DVDISASM_H__
#define __DVDISASM_H__

#include "debugvw.h"


//**************************************************************************
//  CONSTANTS
//**************************************************************************

// selections for what goes into the right-hand column
enum disasm_right_column
{
	DASM_RIGHTCOL_NONE,
	DASM_RIGHTCOL_RAW,
	DASM_RIGHTCOL_ENCRYPTED,
	DASM_RIGHTCOL_COMMENTS
};



//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

// a disassembly view_source
class debug_view_disasm_source : public debug_view_source
{
	friend class debug_view_disasm;

	// construction/destruction
	debug_view_disasm_source(const char *name, device_t &device);

public:
	// getters
	device_t &device() const { return m_device; }
	address_space &space() const { return m_space; }

private:
	// internal state
	device_t &          m_device;               // underlying device
	device_disasm_interface *m_disasmintf;      // disassembly interface
	address_space &     m_space;                // address space to display
};


// debug view for disassembly
class debug_view_disasm : public debug_view
{
	friend resource_pool_object<debug_view_disasm>::~resource_pool_object();
	friend class debug_view_manager;

	// construction/destruction
	debug_view_disasm(running_machine &machine, debug_view_osd_update_func osdupdate, void *osdprivate);
	virtual ~debug_view_disasm();

public:
	// getters
	const char *expression() const { return m_expression.string(); }
	disasm_right_column right_column() const { return m_right_column; }
	UINT32 backward_steps() const { return m_backwards_steps; }
	UINT32 disasm_width() const { return m_dasm_width; }
	offs_t selected_address();

	// setters
	void set_expression(const char *expression);
	void set_right_column(disasm_right_column contents);
	void set_backward_steps(UINT32 steps);
	void set_disasm_width(UINT32 width);
	void set_selected_address(offs_t address);

protected:
	// view overrides
	virtual void view_update();
	virtual void view_notify(debug_view_notification type);
	virtual void view_char(int chval);
	virtual void view_click(const int button, const debug_view_xy& pos);

private:
	// internal helpers
	void enumerate_sources();
	offs_t find_pc_backwards(offs_t targetpc, int numinstrs);
	void generate_bytes(offs_t pcbyte, int numbytes, int minbytes, char *string, int maxchars, bool encrypted);
	bool recompute(offs_t pc, int startline, int lines);

	// internal state
	disasm_right_column m_right_column;         // right column contents
	UINT32              m_backwards_steps;      // number of backwards steps
	UINT32              m_dasm_width;           // width of the disassembly area
	UINT8 *             m_last_direct_raw;      // last direct raw value
	UINT8 *             m_last_direct_decrypted;// last direct decrypted value
	UINT32              m_last_change_count;    // last comment change count
	offs_t              m_last_pcbyte;          // last PC byte value
	int                 m_divider1, m_divider2; // left and right divider columns
	int                 m_divider3;             // comment divider column
	debug_view_expression m_expression;         // expression-related information
	dynamic_array<offs_t> m_byteaddress;        // addresses of the instructions
	dynamic_array<char> m_dasm;                 // disassembled instructions

	// constants
	static const int DEFAULT_DASM_LINES = 1000;
	static const int DEFAULT_DASM_WIDTH = 50;
	static const int DASM_MAX_BYTES = 16;
};


#endif