1 // license:BSD-3-Clause
2 // copyright-holders:Sven Schnelle
3 
4 #include "emu.h"
5 #include "nereid.h"
6 
7 #define VERBOSE 0
8 #include "logmacro.h"
9 
10 DEFINE_DEVICE_TYPE(NEREID, nereid_device, "nereid", "HP Nereid ASIC")
11 
nereid_device(const machine_config & mconfig,device_type type,const char * tag,device_t * owner,uint32_t clock)12 nereid_device::nereid_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
13 	device_t(mconfig, type, tag, owner, clock),
14 	device_palette_interface(mconfig, *this),
15 	m_red(0),
16 	m_green(0),
17 	m_blue(0),
18 	m_index(0),
19 	m_plane_mask(0)
20 {
21 }
22 
nereid_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)23 nereid_device::nereid_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
24 	nereid_device(mconfig, NEREID, tag, owner, clock)
25 {
26 }
27 
device_start()28 void nereid_device::device_start()
29 {
30 	save_item(NAME(m_red));
31 	save_item(NAME(m_green));
32 	save_item(NAME(m_blue));
33 	save_item(NAME(m_index));
34 	save_item(NAME(m_plane_mask));
35 	save_item(NAME(m_overlay_ctl));
36 	save_item(NAME(m_overlay_index));
37 	save_item(NAME(m_unknown_a0));
38 }
39 
device_reset()40 void nereid_device::device_reset()
41 {
42 	for (int i = 0; i < palette_entries(); i++)
43 		set_pen_color(i, rgb_t(0, 0, 0));
44 	m_index = 0;
45 	m_plane_mask = 0;
46 	m_overlay_ctl = 0;
47 	m_red = 0;
48 	m_green = 0;
49 	m_blue = 0;
50 	m_unknown_a0 = 0;
51 	m_overlay_index = 0;
52 }
53 
ctrl_r(offs_t offset,uint16_t mem_mask)54 uint16_t nereid_device::ctrl_r(offs_t offset, uint16_t mem_mask)
55 {
56 	LOG("NEREID ctrl_r: %02X\n", offset);
57 
58 	switch (offset & 0x7f) {
59 	case NEREID_BUSY:
60 		return 0;
61 
62 	case NEREID_RED_DATA:
63 		return 0xff00 | m_red;
64 
65 	case NEREID_GREEN_DATA:
66 		return 0xff00 | m_green;
67 
68 	case NEREID_BLUE_DATA:
69 		return 0xff00 | m_blue;
70 
71 	case NEREID_INDEX:
72 		return 0xff00 | ~m_index;
73 
74 	case NEREID_INDEX0:
75 		return 0xff00 | m_index;
76 
77 	case NEREID_OVERLAY_CTL:
78 		return 0xff00 | m_overlay_ctl;
79 
80 	case NEREID_WRITE_STROBE:
81 		return 0xff00;
82 
83 	case NEREID_PLANE_MASK:
84 		return 0xff00 | m_plane_mask;
85 
86 	case NEREID_UNKNOWN_A0:
87 		return 0xff00 | m_unknown_a0;
88 
89 	case NEREID_OVERLAY_INDEX:
90 		return 0xff00 | m_overlay_index;
91 
92 	case NEREID_REV:
93 		return 0xff01;
94 
95 	default:
96 		LOG("NEREID ctrl_r: unknown register %04X\n", offset);
97 		return 0xffff;//space.unmap();
98 	}
99 	return 0xffff;
100 }
101 
ctrl_w(offs_t offset,uint16_t data,uint16_t mem_mask)102 void nereid_device::ctrl_w(offs_t offset, uint16_t data, uint16_t mem_mask)
103 {
104 	LOG("NEREID: ctrl_w %02X = %02X\n", offset << 1, data);
105 	data &= 0xff;
106 	switch (offset & 0x7f) {
107 	case NEREID_RED_DATA:
108 		m_red = data;
109 		LOG("W NEREID_RED_DATA = %04X\n", m_red);
110 		break;
111 
112 	case NEREID_GREEN_DATA:
113 		m_green = data;
114 		LOG("W NEREID_GREEN_DATA = %04X\n", m_green);
115 		break;
116 
117 	case NEREID_BLUE_DATA:
118 		m_blue = data;
119 		LOG("W NEREID_BLUE_DATA = %04X\n", m_blue);
120 		break;
121 
122 	case NEREID_INDEX:
123 		m_index = ~data;
124 		LOG("W NEREID_INDEX = %04X\n", m_index);
125 		break;
126 
127 	case NEREID_INDEX0:
128 		m_index =data;
129 		LOG("W NEREID_INDEX0 = %04X\n", data);
130 		break;
131 
132 	case NEREID_WRITE_STROBE:
133 		if (m_overlay_index & 8) {
134 			const int index = (m_overlay_index >> 1) & 0x3;
135 			LOG("NEREID: set overlay color index %u: rgb_t(%u,%u,%u)\n",
136 					index, m_red, m_green, m_blue);
137 			set_pen_color(index | 0x100, rgb_t(m_red, m_green, m_blue));
138 		} else {
139 			LOG("NEREID: set video color index %u: rgb_t(%u,%u,%u)\n",
140 					m_index, m_red, m_green, m_blue);
141 			set_pen_color(m_index, rgb_t(m_red, m_green, m_blue));
142 		}
143 		break;
144 
145 	case NEREID_READ_STROBE:
146 	{
147 		rgb_t tmp = pen_color(m_index);
148 		m_red = tmp.r();
149 		m_green = tmp.g();
150 		m_blue = tmp.b();
151 		break;
152 	}
153 	case NEREID_PLANE_MASK:
154 		m_plane_mask = data;
155 		LOG("W NEREID_PLANE_MASK = %02x\n", m_plane_mask);
156 		break;
157 
158 	case NEREID_OVERLAY_CTL:
159 		m_overlay_ctl = data;
160 		LOG("W NEREID_OVERLAY_CTL = %02x\n", m_overlay_ctl);
161 		break;
162 
163 	case NEREID_UNKNOWN_A0:
164 		m_unknown_a0 = data;
165 		LOG("UW A0 = %04x\n", data);
166 		break;
167 
168 	case NEREID_OVERLAY_INDEX:
169 		m_overlay_index = data;
170 		LOG("W OVERLAY_INDEX = %04x\n", data);
171 		break;
172 
173 	default:
174 		LOG("nereid::ctrl_w: unknown %X = %04X (mask %04X)\n", offset << 1, data, mem_mask);
175 		break;
176 	}
177 }
178 
map_color(uint8_t input,uint8_t ovl)179 rgb_t nereid_device::map_color(uint8_t input, uint8_t ovl)
180 {
181 	ovl &= m_overlay_ctl;
182 
183 	if (ovl == 0) {
184 		return pen_color(input & m_plane_mask);
185 	} else {
186 		return pen_color((ovl & m_plane_mask) | 0x100);
187 	}
188 }
189