@@ -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
380430uint32_t * cgia_encode_mode_1 (
0 commit comments