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