Skip to content

Commit ed3043d

Browse files
committed
[feat] MODE0 MULTICOLOR
1 parent 9587d61 commit ed3043d

4 files changed

Lines changed: 101 additions & 51 deletions

File tree

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"name": "Launch",
1111
"cwd": "${workspaceFolder}",
1212
"program": "${workspaceFolder}/build/emu",
13-
"args": ["-z", "../examples/build/src/mode0.xex"],
13+
"args": ["-z", "../examples/build/src/text_modes.xex"],
1414
"preLaunchTask": "CMake: build"
1515
},
1616
{

src/chips/cgia.c

Lines changed: 97 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -295,31 +295,57 @@ uint32_t* cgia_encode_mode_0(
295295
uint8_t* character_generator,
296296
uint32_t char_shift,
297297
uint8_t shared_colors[8],
298+
bool multi,
298299
uint8_t bpp,
299300
bool doubled,
300301
bool mapped) {
301302
while (columns) {
302303
const uintptr_t chr_addr = interp_pop_lane_result(interp0, 0);
303304
uint8_t chr = *((uint8_t*)chr_addr);
304305

305-
uint8_t color_idx = chr >> (8 - bpp) & 0b00001110;
306-
chr = chr & ((1 << (9 - bpp)) - 1);
306+
if (multi) {
307+
// support only one additional bit per pixel
308+
bpp = (bpp - 2) & 0x1;
307309

308-
uint8_t bits = character_generator[chr << char_shift];
309-
for (int shift = 7; shift >= 0; shift--) {
310-
if (mapped) {
311-
uint8_t idx = color_idx | ((bits >> shift) & 0b1);
312-
uint8_t color = shared_colors[idx & 0b00000111];
313-
if (idx > 7) {
314-
// toggle bit 2 for half-bright - move forward or backward by 4 colors
315-
color ^= 0b00000100;
310+
uint8_t color_idx = chr >> (6 - bpp) & 0b00000100;
311+
chr = chr & ((1 << (8 - bpp)) - 1);
312+
313+
uint8_t bits = character_generator[chr << char_shift];
314+
315+
for (int shift = 6; shift >= 0; shift -= 2) {
316+
if (mapped) {
317+
uint8_t idx = color_idx | ((bits >> shift) & 0b11);
318+
uint8_t color = shared_colors[idx & 0b00000111];
319+
*rgbbuf++ = cgia_rgb_palette[color];
320+
if (doubled) *rgbbuf++ = cgia_rgb_palette[color];
321+
}
322+
else {
323+
rgbbuf++; // transparent pixel
324+
if (doubled) rgbbuf++;
316325
}
317-
*rgbbuf++ = cgia_rgb_palette[color];
318-
if (doubled) *rgbbuf++ = cgia_rgb_palette[color];
319326
}
320-
else {
321-
rgbbuf++; // transparent pixel
322-
if (doubled) rgbbuf++;
327+
}
328+
else {
329+
uint8_t color_idx = chr >> (8 - bpp) & 0b00001110;
330+
chr = chr & ((1 << (9 - bpp)) - 1);
331+
332+
uint8_t bits = character_generator[chr << char_shift];
333+
334+
for (int shift = 7; shift >= 0; shift--) {
335+
if (mapped) {
336+
uint8_t idx = color_idx | ((bits >> shift) & 0b1);
337+
uint8_t color = shared_colors[idx & 0b00000111];
338+
if (idx > 7) {
339+
// toggle bit 2 for half-bright - move forward or backward by 4 colors
340+
color ^= 0b00000100;
341+
}
342+
*rgbbuf++ = cgia_rgb_palette[color];
343+
if (doubled) *rgbbuf++ = cgia_rgb_palette[color];
344+
}
345+
else {
346+
rgbbuf++; // transparent pixel
347+
if (doubled) rgbbuf++;
348+
}
323349
}
324350
}
325351
--columns;
@@ -328,53 +354,77 @@ uint32_t* cgia_encode_mode_0(
328354
return rgbbuf;
329355
}
330356

331-
CGIA_ENCODE_MODE_0(_1bpp, , _shared) {
332-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 1, false, false);
357+
CGIA_ENCODE_MODE_0(, _1bpp, , _shared) {
358+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 1, false, false);
359+
}
360+
CGIA_ENCODE_MODE_0(, _1bpp, , _mapped) {
361+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 1, false, true);
362+
}
363+
CGIA_ENCODE_MODE_0(, _1bpp, _doubled, _shared) {
364+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 1, true, false);
365+
}
366+
CGIA_ENCODE_MODE_0(, _1bpp, _doubled, _mapped) {
367+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 1, true, true);
368+
}
369+
CGIA_ENCODE_MODE_0(, _2bpp, , _shared) {
370+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 2, false, false);
371+
}
372+
CGIA_ENCODE_MODE_0(_multi, _2bpp, , _shared) {
373+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, true, 2, false, false);
374+
}
375+
CGIA_ENCODE_MODE_0(, _2bpp, , _mapped) {
376+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 2, false, true);
377+
}
378+
CGIA_ENCODE_MODE_0(_multi, _2bpp, , _mapped) {
379+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, true, 2, false, true);
380+
}
381+
CGIA_ENCODE_MODE_0(, _2bpp, _doubled, _shared) {
382+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 2, true, false);
333383
}
334-
CGIA_ENCODE_MODE_0(_1bpp, , _mapped) {
335-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 1, false, true);
384+
CGIA_ENCODE_MODE_0(_multi, _2bpp, _doubled, _shared) {
385+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, true, 2, true, false);
336386
}
337-
CGIA_ENCODE_MODE_0(_1bpp, _doubled, _shared) {
338-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 1, true, false);
387+
CGIA_ENCODE_MODE_0(, _2bpp, _doubled, _mapped) {
388+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 2, true, true);
339389
}
340-
CGIA_ENCODE_MODE_0(_1bpp, _doubled, _mapped) {
341-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 1, true, true);
390+
CGIA_ENCODE_MODE_0(_multi, _2bpp, _doubled, _mapped) {
391+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, true, 2, true, true);
342392
}
343-
CGIA_ENCODE_MODE_0(_2bpp, , _shared) {
344-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 2, false, false);
393+
CGIA_ENCODE_MODE_0(, _3bpp, , _shared) {
394+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 3, false, false);
345395
}
346-
CGIA_ENCODE_MODE_0(_2bpp, , _mapped) {
347-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 2, false, true);
396+
CGIA_ENCODE_MODE_0(_multi, _3bpp, , _shared) {
397+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, true, 3, false, false);
348398
}
349-
CGIA_ENCODE_MODE_0(_2bpp, _doubled, _shared) {
350-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 2, true, false);
399+
CGIA_ENCODE_MODE_0(, _3bpp, , _mapped) {
400+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 3, false, true);
351401
}
352-
CGIA_ENCODE_MODE_0(_2bpp, _doubled, _mapped) {
353-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 2, true, true);
402+
CGIA_ENCODE_MODE_0(_multi, _3bpp, , _mapped) {
403+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, true, 3, false, true);
354404
}
355-
CGIA_ENCODE_MODE_0(_3bpp, , _shared) {
356-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 3, false, false);
405+
CGIA_ENCODE_MODE_0(, _3bpp, _doubled, _shared) {
406+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 3, true, false);
357407
}
358-
CGIA_ENCODE_MODE_0(_3bpp, , _mapped) {
359-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 3, false, true);
408+
CGIA_ENCODE_MODE_0(_multi, _3bpp, _doubled, _shared) {
409+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, true, 3, true, false);
360410
}
361-
CGIA_ENCODE_MODE_0(_3bpp, _doubled, _shared) {
362-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 3, true, false);
411+
CGIA_ENCODE_MODE_0(, _3bpp, _doubled, _mapped) {
412+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 3, true, true);
363413
}
364-
CGIA_ENCODE_MODE_0(_3bpp, _doubled, _mapped) {
365-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 3, true, true);
414+
CGIA_ENCODE_MODE_0(_multi, _3bpp, _doubled, _mapped) {
415+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, true, 3, true, true);
366416
}
367-
CGIA_ENCODE_MODE_0(_4bpp, , _shared) {
368-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 4, false, false);
417+
CGIA_ENCODE_MODE_0(, _4bpp, , _shared) {
418+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 4, false, false);
369419
}
370-
CGIA_ENCODE_MODE_0(_4bpp, , _mapped) {
371-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 4, false, true);
420+
CGIA_ENCODE_MODE_0(, _4bpp, , _mapped) {
421+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 4, false, true);
372422
}
373-
CGIA_ENCODE_MODE_0(_4bpp, _doubled, _shared) {
374-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 4, true, false);
423+
CGIA_ENCODE_MODE_0(, _4bpp, _doubled, _shared) {
424+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 4, true, false);
375425
}
376-
CGIA_ENCODE_MODE_0(_4bpp, _doubled, _mapped) {
377-
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, 4, true, true);
426+
CGIA_ENCODE_MODE_0(, _4bpp, _doubled, _mapped) {
427+
return cgia_encode_mode_0(rgbbuf, columns, character_generator, char_shift, shared_colors, false, 4, true, true);
378428
}
379429

380430
uint32_t* cgia_encode_mode_1(

src/ui/ui_cgia.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,15 @@ static void _ui_cgia_draw_bg_plane(const ui_cgia_t* win, size_t p) {
214214
for (int c = 0; c < 2; ++c) {
215215
ImGui::SameLine();
216216
ImGui::PushID(c);
217-
_ui_cgia_draw_color(win, "", chip->plane[p].bckgnd.shared_color[c]);
217+
_ui_cgia_draw_color(win, "", chip->plane[p].bckgnd.color[c]);
218218
ImGui::PopID();
219219
}
220220
ImGui::SameLine();
221221
ImGui::Text("|");
222222
for (int c = 2; c < 8; ++c) {
223223
ImGui::SameLine();
224224
ImGui::PushID(c);
225-
_ui_cgia_draw_color(win, "", chip->plane[p].ham.base_color[c]);
225+
_ui_cgia_draw_color(win, "", chip->plane[p].ham.color[c]);
226226
ImGui::PopID();
227227
}
228228
ImGui::Text("scroll_x: %03d", chip->plane[p].bckgnd.scroll_x);

0 commit comments

Comments
 (0)