comparison vdp.c @ 2199:6f66356af4e2

Fix Game Gear color issues (thanks Sik!)
author Michael Pavone <pavone@retrodev.com>
date Mon, 22 Aug 2022 20:05:36 -0700
parents 01ff005b08f6
children 2f8984ff5c85
comparison
equal deleted inserted replaced
2198:0dcb9e4dee7f 2199:6f66356af4e2
164 context->type = type; 164 context->type = type;
165 165
166 if (!color_map_init_done) { 166 if (!color_map_init_done) {
167 uint8_t b,g,r; 167 uint8_t b,g,r;
168 for (uint16_t color = 0; color < (1 << 12); color++) { 168 for (uint16_t color = 0; color < (1 << 12); color++) {
169 if (color & FBUF_SHADOW) { 169 if (type == VDP_GAMEGEAR) {
170 b = (color >> 8 & 0xF) * 0x11;
171 g = (color >> 4 & 0xF) * 0x11;
172 r = (color & 0xF) * 0x11;
173 }else if (color & FBUF_SHADOW) {
170 b = levels[(color >> 9) & 0x7]; 174 b = levels[(color >> 9) & 0x7];
171 g = levels[(color >> 5) & 0x7]; 175 g = levels[(color >> 5) & 0x7];
172 r = levels[(color >> 1) & 0x7]; 176 r = levels[(color >> 1) & 0x7];
173 } else if(color & FBUF_HILIGHT) { 177 } else if(color & FBUF_HILIGHT) {
174 b = levels[((color >> 9) & 0x7) + 7]; 178 b = levels[((color >> 9) & 0x7) + 7];
175 g = levels[((color >> 5) & 0x7) + 7]; 179 g = levels[((color >> 5) & 0x7) + 7];
176 r = levels[((color >> 1) & 0x7) + 7]; 180 r = levels[((color >> 1) & 0x7) + 7];
177 } else if(color & FBUF_MODE4) { 181 } else if(color & FBUF_MODE4) {
178 if (type == VDP_GAMEGEAR) { 182 //TODO: Mode 4 has a separate DAC tap so this isn't quite correct
179 b = (color >> 8 & 0xF) * 0x11; 183 b = levels[(color >> 4 & 0xC) | (color >> 6 & 0x2)];
180 g = (color >> 4 & 0xF) * 0x11; 184 g = levels[(color >> 2 & 0x8) | (color >> 1 & 0x4) | (color >> 4 & 0x2)];
181 r = (color & 0xF) * 0x11; 185 r = levels[(color << 1 & 0xC) | (color >> 1 & 0x2)];
182 } else {
183 //TODO: Mode 4 has a separate DAC tap so this isn't quite correct
184 b = levels[(color >> 4 & 0xC) | (color >> 6 & 0x2)];
185 g = levels[(color >> 2 & 0x8) | (color >> 1 & 0x4) | (color >> 4 & 0x2)];
186 r = levels[(color << 1 & 0xC) | (color >> 1 & 0x2)];
187 }
188 } else { 186 } else {
189 b = levels[(color >> 8) & 0xE]; 187 b = levels[(color >> 8) & 0xE];
190 g = levels[(color >> 4) & 0xE]; 188 g = levels[(color >> 4) & 0xE];
191 r = levels[color & 0xE]; 189 r = levels[color & 0xE];
192 } 190 }
812 { 810 {
813 context->colors[index] = color_map[value & CRAM_BITS]; 811 context->colors[index] = color_map[value & CRAM_BITS];
814 context->colors[index + SHADOW_OFFSET] = color_map[(value & CRAM_BITS) | FBUF_SHADOW]; 812 context->colors[index + SHADOW_OFFSET] = color_map[(value & CRAM_BITS) | FBUF_SHADOW];
815 context->colors[index + HIGHLIGHT_OFFSET] = color_map[(value & CRAM_BITS) | FBUF_HILIGHT]; 813 context->colors[index + HIGHLIGHT_OFFSET] = color_map[(value & CRAM_BITS) | FBUF_HILIGHT];
816 if (context->type == VDP_GAMEGEAR) { 814 if (context->type == VDP_GAMEGEAR) {
817 context->colors[index + MODE4_OFFSET] = color_map[(value & 0xFFF) | FBUF_MODE4]; 815 context->colors[index + MODE4_OFFSET] = color_map[value & 0xFFF];
818 } else { 816 } else {
819 context->colors[index + MODE4_OFFSET] = color_map[(value & CRAM_BITS) | FBUF_MODE4]; 817 context->colors[index + MODE4_OFFSET] = color_map[(value & CRAM_BITS) | FBUF_MODE4];
820 } 818 }
821 } 819 }
822 820