summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/amiga_copper.h
blob: 15fe5c3cd00edb08cd62fc046ba046f36da23fb0 (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
// license:BSD-3-Clause
// copyright-holders:Aaron Giles, Angelo Salese
/***************************************************************************

    Amiga Copper

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

#ifndef MAME_MACHINE_AMIGA_COPPER_H
#define MAME_MACHINE_AMIGA_COPPER_H

#pragma once

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

class amiga_copper_device : public device_t
{
public:
	// construction/destruction
	amiga_copper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// config
	template<class T> void set_host_cpu_tag(T &&tag) { m_host_cpu.set_tag(std::forward<T>(tag)); }
	auto mem_read_cb() { return m_chipmem_r.bind(); }
	void set_ecs_mode(bool ecs_mode) { m_cdang_min_reg = ecs_mode ? 0x00 : 0x20; }

	// I/O operations
	void regs_map(address_map &map);
	void dmacon_set(u16 data);
	void copcon_w(u16 data);

	// getters/setters
	void vblank_sync();
	int execute_next(int xpos, int ypos, bool is_blitter_busy);

protected:
	// device-level overrides
	//virtual void device_validity_check(validity_checker &valid) const override;
	//virtual void device_add_mconfig(machine_config &config) override;
	virtual void device_start() override;
	virtual void device_reset() override;

private:
	required_device <cpu_device> m_host_cpu;
	address_space *m_host_space = nullptr;
	// callbacks
	devcb_read16 m_chipmem_r;

	bool m_dma_master_enable, m_dma_copen;
	u16 m_cdang_setting, m_cdang_min_reg;
	u32 m_lc[2], m_pc;

	template <u8 ch> void copxlch_w(u16 data);
	template <u8 ch> void copxlcl_w(u16 data);
	template <u8 ch> void copjmpx_w(u16 data);
	template <u8 ch> u16 copjmpx_r();
public:
	void copins_w(u16 data);
private:
	void set_pc(u8 ch, bool is_sync);

	// internal state
	bool m_state_waiting;
	bool m_state_waitblit;
	u16 m_waitval;
	u16 m_waitmask;
	u16 m_pending_offset;
	u16 m_pending_data;
//  int m_wait_offset;

	// waitstate delays for copper
	// basically anything that doesn't belong to Angus has a penalty for Copper
	static constexpr u16 delay[256] =
	{
		1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,    /* 0x000 - 0x03e */
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                        /* 0x040 - 0x05e */
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                        /* 0x060 - 0x07e */
		0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,                        /* 0x080 - 0x09e */
		1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,    /* 0x0a0 - 0x0de */
		/* BPLxPTH/BPLxPTL */
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                        /* 0x0e0 - 0x0fe */
		/* BPLCON0-3,BPLMOD1-2 */
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                        /* 0x100 - 0x11e */
		/* SPRxPTH/SPRxPTL */
		1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,                        /* 0x120 - 0x13e */
		/* SPRxPOS/SPRxCTL/SPRxDATA/SPRxDATB */
		1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,    /* 0x140 - 0x17e */
		/* COLORxx */
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    /* 0x180 - 0x1be */
		/* RESERVED */
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* 0x1c0 - 0x1fe */
	};

};


// device type definition
DECLARE_DEVICE_TYPE(AMIGA_COPPER, amiga_copper_device)

#endif // MAME_MACHINE_AMIGA_COPPER_H