1 // license:BSD-3-Clause
2 // copyright-holders:Barry Rodewald
3 /*
4 
5     Cirrus Logic GD542x/3x video chipsets
6 
7 */
8 #ifndef MAME_VIDEO_CLGD542X_H
9 #define MAME_VIDEO_CLGD542X_H
10 
11 #pragma once
12 
13 #include "video/pc_vga.h"
14 
15 class cirrus_gd5428_device :  public svga_device
16 {
17 public:
18 	// construction/destruction
19 	cirrus_gd5428_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
20 
21 	virtual uint8_t port_03c0_r(offs_t offset) override;
22 	virtual void port_03c0_w(offs_t offset, uint8_t data) override;
23 	virtual uint8_t port_03b0_r(offs_t offset) override;
24 	virtual void port_03b0_w(offs_t offset, uint8_t data) override;
25 	virtual uint8_t port_03d0_r(offs_t offset) override;
26 	virtual void port_03d0_w(offs_t offset, uint8_t data) override;
27 	virtual uint8_t mem_r(offs_t offset) override;
28 	virtual void mem_w(offs_t offset, uint8_t data) override;
29 
30 	virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
31 
32 protected:
33 	cirrus_gd5428_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
34 
35 	// device-level overrides
36 	virtual void device_start() override;
37 	virtual void device_reset() override;
38 	virtual uint16_t offset() override;
39 
40 	uint8_t m_chip_id;
41 
42 	uint8_t gc_mode_ext;
43 	uint8_t gc_bank_0;
44 	uint8_t gc_bank_1;
45 	bool gc_locked;
46 	uint8_t m_lock_reg;
47 	uint8_t m_gr10;  // high byte of background colour (in 15/16bpp)
48 	uint8_t m_gr11;  // high byte of foreground colour (in 15/16bpp)
49 
50 	uint8_t m_cr19;
51 	uint8_t m_cr1a;
52 	uint8_t m_cr1b;
53 
54 	// hardware cursor
55 	uint16_t m_cursor_x;
56 	uint16_t m_cursor_y;
57 	uint16_t m_cursor_addr;
58 	uint8_t m_cursor_attr;
59 	bool m_ext_palette_enabled;
60 	struct { uint8_t red, green, blue; } m_ext_palette[16];  // extra palette, colour 0 is cursor background, colour 15 is cursor foreground, colour 2 is overscan border colour
61 
62 	// BitBLT engine
63 	uint8_t m_blt_status;
64 	uint8_t m_blt_rop;
65 	uint8_t m_blt_mode;
66 	uint32_t m_blt_source;
67 	uint32_t m_blt_dest;
68 	uint16_t m_blt_source_pitch;
69 	uint16_t m_blt_dest_pitch;
70 	uint16_t m_blt_height;
71 	uint16_t m_blt_width;
72 	uint32_t m_blt_source_current;
73 	uint32_t m_blt_dest_current;
74 	uint16_t m_blt_trans_colour;
75 	uint16_t m_blt_trans_colour_mask;
76 
77 	bool m_blt_system_transfer;  // blit from system memory
78 	uint8_t m_blt_system_count;
79 	uint32_t m_blt_system_buffer;
80 	uint16_t m_blt_pixel_count;
81 	uint16_t m_blt_scan_count;
82 
83 	uint8_t m_scratchpad1;
84 	uint8_t m_scratchpad2;
85 	uint8_t m_scratchpad3;
86 	uint8_t m_vclk_num[4];
87 	uint8_t m_vclk_denom[4];
88 
89 	inline uint8_t cirrus_vga_latch_write(int offs, uint8_t data);
90 
91 	void pcvideo_cirrus_gd5428(machine_config &config);
92 	void pcvideo_cirrus_gd5430(machine_config &config);
93 
94 private:
95 	void cirrus_define_video_mode();
96 	uint8_t cirrus_seq_reg_read(uint8_t index);
97 	void cirrus_seq_reg_write(uint8_t index, uint8_t data);
98 	uint8_t cirrus_gc_reg_read(uint8_t index);
99 	void cirrus_gc_reg_write(uint8_t index, uint8_t data);
100 	uint8_t cirrus_crtc_reg_read(uint8_t index);
101 	void cirrus_crtc_reg_write(uint8_t index, uint8_t data);
102 
103 	void start_bitblt();
104 	void start_reverse_bitblt();
105 	void start_system_bitblt();
106 	void blit_dword();
107 	void blit_byte();  // used for colour expanded system-to-vram bitblts
108 	void copy_pixel(uint8_t src, uint8_t dst);
109 };
110 
111 class cirrus_gd5430_device :  public cirrus_gd5428_device
112 {
113 public:
114 	cirrus_gd5430_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
115 
116 protected:
117 	virtual void device_start() override;
118 };
119 
120 class cirrus_gd5446_device :  public cirrus_gd5428_device
121 {
122 public:
123 	cirrus_gd5446_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
124 
125 protected:
126 	virtual void device_start() override;
127 };
128 
129 
130 // device type definition
131 DECLARE_DEVICE_TYPE(CIRRUS_GD5428, cirrus_gd5428_device)
132 DECLARE_DEVICE_TYPE(CIRRUS_GD5430, cirrus_gd5430_device)
133 DECLARE_DEVICE_TYPE(CIRRUS_GD5446, cirrus_gd5446_device)
134 
135 #endif // MAME_VIDEO_CLGD542X_H
136