summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/atari/ataristb.h
blob: e78209777b7f7cb8ce10c36dfac60f2e7bcd15b3 (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
// license:BSD-3-Clause
// copyright-holders:Curt Coder, Olivier Galibert
#ifndef MAME_MACHINE_ATARISTB_H
#define MAME_MACHINE_ATARISTB_H

#pragma once

class st_blitter_device : public device_t
{
	static constexpr uint8_t SKEW_NFSR   = 0x40;
	static constexpr uint8_t SKEW_FXSR   = 0x80;

	static constexpr uint8_t CTRL_SMUDGE = 0x20;
	static constexpr uint8_t CTRL_HOG    = 0x40;
	static constexpr uint8_t CTRL_BUSY   = 0x80;

public:
	st_blitter_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);

	template <typename T> void set_space(T &&tag, int spacenum) { m_space.set_tag(tag, spacenum); }
	auto int_callback() { return m_int_callback.bind(); }

	uint16_t halftone_r(offs_t offset);
	uint16_t src_inc_x_r();
	uint16_t src_inc_y_r();
	uint16_t src_r(offs_t offset);
	uint16_t end_mask_r(offs_t offset);
	uint16_t dst_inc_x_r();
	uint16_t dst_inc_y_r();
	uint16_t dst_r(offs_t offset);
	uint16_t count_x_r();
	uint16_t count_y_r();
	uint16_t op_r(offs_t offset, uint16_t mem_mask = ~0);
	uint16_t ctrl_r(offs_t offset, uint16_t mem_mask = ~0);

	void halftone_w(offs_t offset, uint16_t data);
	void src_inc_x_w(uint16_t data);
	void src_inc_y_w(uint16_t data);
	void src_w(offs_t offset, uint16_t data);
	void end_mask_w(offs_t offset, uint16_t data);
	void dst_inc_x_w(uint16_t data);
	void dst_inc_y_w(uint16_t data);
	void dst_w(offs_t offset, uint16_t data);
	void count_x_w(uint16_t data);
	void count_y_w(uint16_t data);
	void op_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
	void ctrl_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);

protected:
	virtual void device_resolve_objects() override;
	virtual void device_start() override;
	virtual void device_reset() override;

private:
	void blitter_source();
	uint16_t blitter_hop();
	void blitter_op(uint16_t s, uint32_t dstaddr, uint16_t mask);
	TIMER_CALLBACK_MEMBER(blitter_tick);

	required_address_space m_space;
	devcb_write_line m_int_callback;

	// timers
	emu_timer *m_blitter_timer;

	// blitter state
	uint16_t m_halftone[16]{};
	int16_t m_src_inc_x = 0;
	int16_t m_src_inc_y = 0;
	int16_t m_dst_inc_x = 0;
	int16_t m_dst_inc_y = 0;
	uint32_t m_src = 0U;
	uint32_t m_dst = 0U;
	uint16_t m_endmask1 = 0U;
	uint16_t m_endmask2 = 0U;
	uint16_t m_endmask3 = 0U;
	uint16_t m_xcount = 0U;
	uint16_t m_ycount = 0U;
	uint16_t m_xcountl = 0U;
	uint8_t m_hop = 0U;
	uint8_t m_op = 0U;
	uint8_t m_ctrl = 0U;
	uint8_t m_skew = 0U;
	uint32_t m_srcbuf = 0U;
};

// device type declaration
DECLARE_DEVICE_TYPE(ST_BLITTER, st_blitter_device)

#endif // MAME_MACHINE_ATARISTB_H