summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/trident.h
blob: 3dc8f63947cad4007a831467f69070aa67aee477 (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
// license:BSD-3-Clause
// copyright-holders:Barry Rodewald
/*
 * trident.h
 *
 */

#ifndef MAME_BUS_ISA_TRIDENT_H
#define MAME_BUS_ISA_TRIDENT_H

#pragma once

#include "video/pc_vga.h"

// ======================> trident_vga_device

class trident_vga_device :  public svga_device
{
public:
	virtual uint8_t port_03c0_r(offs_t offset) override;
	virtual void port_03c0_w(offs_t offset, uint8_t data) override;
	virtual uint8_t port_03d0_r(offs_t offset) override;
	virtual void port_03d0_w(offs_t offset, uint8_t data) override;
	uint8_t port_83c6_r(offs_t offset);
	void port_83c6_w(offs_t offset, uint8_t data);
	uint8_t port_43c6_r(offs_t offset);
	void port_43c6_w(offs_t offset, uint8_t data);
	uint8_t vram_r(offs_t offset);
	void vram_w(offs_t offset, uint8_t data);
	virtual uint8_t mem_r(offs_t offset) override;
	virtual void mem_w(offs_t offset, uint8_t data) override;
	virtual uint16_t offset() override;

	uint8_t accel_r(offs_t offset);
	void accel_w(offs_t offset, uint8_t data);

	virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;

protected:
	// construction/destruction
	trident_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);

	virtual void device_start() override;
	virtual void device_reset() override;

	struct
	{
		uint8_t sr0c;
		uint8_t sr0d_old;
		uint8_t sr0d_new;
		uint8_t sr0e_old;
		uint8_t sr0e_new;
		uint8_t sr0f;
		uint8_t gc0e;
		uint8_t gc0f;
		uint8_t gc2f;
		uint8_t cr1e;
		uint8_t cr1f;
		uint8_t cr20;
		uint8_t cr21;
		uint8_t cr29;
		uint8_t cr2a;
		uint8_t cr39;
		uint8_t dac;
		uint8_t lutdac_reg[0x100];
		uint8_t lutdac_index;
		bool new_mode;
		bool port_3c3;
		uint8_t port_3db;
		uint8_t clock;
		uint8_t pixel_depth;
		uint8_t revision;
		bool dac_active;
		uint8_t dac_count;
		uint32_t linear_address;
		bool linear_active;
		bool mmio_active;
		uint16_t mem_clock;  // I/O 0x43c6
		uint16_t vid_clock;  // I/O 0x43c8
		uint16_t cursor_x;
		uint16_t cursor_y;
		uint16_t cursor_loc;
		uint8_t cursor_x_off;
		uint8_t cursor_y_off;
		uint32_t cursor_fg;  // colour
		uint32_t cursor_bg;  // colour
		uint8_t cursor_ctrl;

		// 2D acceleration
		uint16_t accel_opermode;
		uint8_t accel_command;
		uint8_t accel_fmix;
		uint32_t accel_drawflags;
		uint32_t accel_fgcolour;
		uint32_t accel_bgcolour;
		uint16_t accel_pattern_loc;
		int16_t accel_source_x;
		int16_t accel_source_y;
		int16_t accel_dest_x;
		int16_t accel_dest_y;
		int16_t accel_dim_x;
		int16_t accel_dim_y;
		uint32_t accel_style;
		uint32_t accel_ckey;
		int16_t accel_source_x_clip;
		int16_t accel_source_y_clip;
		int16_t accel_dest_x_clip;
		int16_t accel_dest_y_clip;
		uint32_t accel_fg_pattern_colour;
		uint32_t accel_bg_pattern_colour;
		uint8_t accel_pattern[0x80];
		bool accel_busy;
		bool accel_memwrite_active;  // true when writing to VRAM will push data to an ongoing command (SRCMONO/PATMONO)
		int16_t accel_mem_x;
		int16_t accel_mem_y;
		uint32_t accel_transfer;
	} tri;
	uint8_t m_version;
private:
	uint8_t trident_seq_reg_read(uint8_t index);
	void trident_seq_reg_write(uint8_t index, uint8_t data);
	void trident_define_video_mode();
	uint8_t trident_crtc_reg_read(uint8_t index);
	void trident_crtc_reg_write(uint8_t index, uint8_t data);
	uint8_t trident_gc_reg_read(uint8_t index);
	void trident_gc_reg_write(uint8_t index, uint8_t data);

	int calculate_clock();

	// old style MMIO (0xBFF00)
	void old_mmio_w(offs_t offset, uint8_t data);
	uint8_t old_mmio_r(offs_t offset);

	// 2D acceleration
	void accel_command();
	void accel_bitblt();
	void accel_line();
	void accel_data_write(uint32_t data);
	uint8_t READPIXEL8(int16_t x, int16_t y);
	uint16_t READPIXEL15(int16_t x, int16_t y);
	uint16_t READPIXEL16(int16_t x, int16_t y);
	uint32_t READPIXEL32(int16_t x, int16_t y);
	void WRITEPIXEL8(int16_t x, int16_t y, uint8_t data);
	void WRITEPIXEL15(int16_t x, int16_t y, uint16_t data);
	void WRITEPIXEL16(int16_t x, int16_t y, uint16_t data);
	void WRITEPIXEL32(int16_t x, int16_t y, uint32_t data);
	uint32_t READPIXEL(int16_t x,int16_t y);
	void WRITEPIXEL(int16_t x,int16_t y, uint32_t data);
	uint32_t handle_rop(uint32_t src, uint32_t dst);
};

class tgui9860_device : public trident_vga_device
{
public:
	tgui9860_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};

class tvga9000_device : public trident_vga_device
{
public:
	tvga9000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};

// device type definition
DECLARE_DEVICE_TYPE(TRIDENT_VGA,  tgui9860_device)
DECLARE_DEVICE_TYPE(TVGA9000_VGA, tvga9000_device)

#endif // MAME_BUS_ISA_TRIDENT_H