1 // license:BSD-3-Clause
2 // copyright-holders:Patrick Mackinlay
3 #ifndef MAME_VIDEO_BT45X_H
4 #define MAME_VIDEO_BT45X_H
5 
6 #pragma once
7 
8 class bt45x_device_base : public device_t
9 {
10 public:
11 	enum address_mask : u8
12 	{
13 		REG_READ_MASK  = 0x04,
14 		REG_BLINK_MASK = 0x05,
15 		REG_COMMAND    = 0x06,
16 		REG_CONTROL    = 0x07
17 	};
18 	enum command_mask : u8
19 	{
20 		CR7 =  0x80, // multiplex select
21 		CR6 =  0x40, // ram enable
22 		CR54 = 0x30, // blink rate selection
23 		CR3 =  0x08, // OL1 blink enable
24 		CR2 =  0x04, // OL0 blink enable
25 		CR1 =  0x02, // OL1 display enable
26 		CR0 =  0x01, // OL0 display enable
27 	};
28 	enum control_mask : u8
29 	{
30 		D3  = 0x08, // low nibble
31 		D2  = 0x04, // blue channel enable
32 		D1  = 0x02, // green channel enable
33 		D0  = 0x01, // red channel enable
34 
35 		RGB = 0x07  // rgb mode enable
36 	};
37 	enum cr54_mask : u8
38 	{
39 		CR54_6464 = 0x30, // 64 on 64 off, 50/50
40 		CR54_3232 = 0x20, // 32 on 32 off, 50/50
41 		CR54_1616 = 0x10, // 16 on 16 off, 50/50
42 		CR54_1648 = 0x00  // 16 on 48 off, 25/75
43 	};
44 
45 	virtual void map(address_map &map);
46 
47 protected:
48 	bt45x_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const u32 palette_colors, const u32 overlay_colors);
49 
50 	virtual void device_start() override;
51 	virtual void device_reset() override;
52 
53 	u8 address_r();
54 	void address_w(u8 data);
55 	virtual u8 palette_r(address_space &space) = 0;
56 	virtual void palette_w(u8 data) = 0;
57 	u8 register_r(address_space &space);
58 	void register_w(u8 data);
59 	virtual u8 overlay_r(address_space &space) = 0;
60 	virtual void overlay_w(u8 data) = 0;
61 
62 	// helpers
63 	virtual void increment_address(const bool side_effects = false);
get_mask()64 	virtual u8 get_mask() const { return m_palette_colors - 1; }
65 
66 	// device state
67 	u8 m_address;
68 	u8 m_address_rgb;
69 	u8 m_read_mask;
70 	u8 m_blink_mask;
71 	u8 m_command;
72 	u8 m_control;
73 
74 	// internal state
75 	const u32 m_palette_colors;
76 	const u32 m_overlay_colors;
77 	u64 m_blink_start;
78 };
79 
80 class bt45x_rgb_device_base : public bt45x_device_base, public device_palette_interface
81 {
82 protected:
83 	bt45x_rgb_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const u32 palette_colors, const u32 overlay_colors);
84 
85 	virtual void device_start() override;
86 
palette_entries()87 	virtual u32 palette_entries() const override { return m_palette_colors + m_overlay_colors; }
88 
89 	virtual u8 palette_r(address_space &space) override;
90 	virtual void palette_w(u8 data) override;
91 	virtual u8 overlay_r(address_space &space) override;
92 	virtual void overlay_w(u8 data) override;
93 
94 	std::unique_ptr<std::array<u8, 3>[]> m_color_ram;
95 };
96 
97 class bt45x_mono_device_base : public bt45x_device_base
98 {
99 public:
100 	// helper instead of device_palette_interface
101 	u8 lookup(u8 pixel, u8 overlay = 0) const
102 	{
103 		if (overlay & 3)
104 			return m_color_ram[m_palette_colors + (overlay & (m_command & (CR1|CR0)))];
105 		else
106 			return (m_command & CR6) ? m_color_ram[pixel & m_read_mask] : m_color_ram[m_palette_colors + 0];
107 	}
108 
109 protected:
110 	bt45x_mono_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const u32 palette_colors, const u32 overlay_colors);
111 
112 	virtual void device_start() override;
113 
114 	virtual u8 palette_r(address_space &space) override;
115 	virtual void palette_w(u8 data) override;
116 	virtual u8 overlay_r(address_space &space) override;
117 	virtual void overlay_w(u8 data) override;
118 
119 	std::unique_ptr<u8[]> m_color_ram;
120 };
121 
122 class bt451_device : public bt45x_rgb_device_base
123 {
124 public:
125 	bt451_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
126 
127 protected:
128 	/*
129 	 * The Bt451 is different in having an 8 bit data bus, but 4 bit DACs. The
130 	 * lower 4 bits are masked off when reading or writing colour data.
131 	 */
get_mask()132 	virtual u8 get_mask() const override { return 0xf0; }
133 };
134 
135 class bt453_device : public bt45x_rgb_device_base
136 {
137 public:
138 	bt453_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
139 
140 	virtual void map(address_map &map) override;
141 };
142 
143 class bt454_device : public bt45x_rgb_device_base
144 {
145 public:
146 	bt454_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
147 
148 	virtual void map(address_map &map) override;
149 };
150 
151 class bt455_device : public bt45x_mono_device_base
152 {
153 public:
154 	bt455_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
155 
156 	virtual void map(address_map &map) override;
157 };
158 
159 class bt457_device : public bt45x_mono_device_base
160 {
161 public:
162 	bt457_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
163 
164 protected:
165 	virtual u8 palette_r(address_space &space) override;
166 	virtual void palette_w(u8 data) override;
167 	virtual u8 overlay_r(address_space &space) override;
168 	virtual void overlay_w(u8 data) override;
169 
170 	virtual void increment_address(const bool side_effects = false) override;
171 };
172 
173 class bt458_device : public bt45x_rgb_device_base
174 {
175 public:
176 	bt458_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
177 
178 protected:
179 	bt458_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
180 };
181 
182 class bt467_device : public bt458_device
183 {
184 public:
185 	bt467_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
186 };
187 
188 DECLARE_DEVICE_TYPE(BT451, bt451_device)
189 DECLARE_DEVICE_TYPE(BT453, bt453_device)
190 DECLARE_DEVICE_TYPE(BT454, bt454_device)
191 DECLARE_DEVICE_TYPE(BT455, bt455_device)
192 DECLARE_DEVICE_TYPE(BT457, bt457_device)
193 DECLARE_DEVICE_TYPE(BT458, bt458_device)
194 DECLARE_DEVICE_TYPE(BT467, bt467_device)
195 
196 #endif // MAME_VIDEO_BT45X_H
197