summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/arm7/arm7dasm.h
blob: 1e0d27ca754e3bb8d3e9c34743a8707057100be9 (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
// license:BSD-3-Clause
// copyright-holders:Steve Ellenoff,R. Belmont,Ryan Holtz
/*****************************************************************************
 *
 *   arm7dasm.c
 *   Portable ARM7TDMI Core Emulator - Disassembler
 *
 *   Copyright Steve Ellenoff, all rights reserved.
 *
 *  This work is based on:
 *  #1) 'Atmel Corporation ARM7TDMI (Thumb) Datasheet - January 1999'
 *  #2) Arm 2/3/6 emulator By Bryan McPhail (bmcphail@tendril.co.uk) and Phil Stroffolino (MAME CORE 0.76)
 *
 *****************************************************************************/

#ifndef MAME_CPU_ARM7_ARM7DASM_H
#define MAME_CPU_ARM7_ARM7DASM_H

#pragma once

class arm7_disassembler : public util::disasm_interface
{
public:
	class config {
	public:
		virtual ~config() = default;
		virtual bool get_t_flag() const = 0;
	};

	arm7_disassembler(config *conf);

	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:
	config *m_config;

	void WritePadding(std::ostream &stream, std::streampos start_position);
	void DasmCoProc_RT(std::ostream &stream, u32 opcode, const char *pConditionCode, std::streampos start_position);
	void DasmCoProc_DT(std::ostream &stream, u32 opcode, const char *pConditionCode, std::streampos start_position);
	void DasmCoProc_DO(std::ostream &stream, u32 opcode, const char *pConditionCode, std::streampos start_position);
	static u32 ExtractImmediateOperand( u32 opcode );
	void WriteShiftCount( std::ostream &stream, u32 opcode );
	void WriteDataProcessingOperand( std::ostream &stream, u32 opcode, bool printOp0, bool printOp1 );
	void WriteRegisterOperand1( std::ostream &stream, u32 opcode );
	void WriteBranchAddress( std::ostream &stream, u32 pc, u32 opcode, bool h_bit );
	u32 arm7_disasm( std::ostream &stream, u32 pc, u32 opcode );
	u32 thumb_disasm(std::ostream &stream, u32 pc, u16 opcode);
};


#endif