Page 2 of 2

Re: CGA

Posted: Fri Feb 22, 2013 7:41 am
by wilbert
J. Baker wrote:Also, I don't need this code for anything. This is just a "challenge" really. Well, that and I do like 4bit graphics, Dos, ect. ;)
Code challenges are good :)
I noticed you have to output the PNG image as 8 bit or 24 bit. If you output 4 bit, it messes up the palette even if only 16 CGA colors are used.

Here's my previous code altered a bit to now not to use so much black

Code: Select all

Procedure CGA(color)
  !mov ecx, [p.v_color]
  !and ecx, 0xc0e0e0
  !mov eax, ecx
  !shr ecx, 16
  !shr eax, 5
  !or cl, al
  !shr eax, 5
  !or cl, al
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    !mov eax, [cga_table256bgr + ecx * 4]
  CompilerElse
    !lea rdx, [cga_table256bgr]
    !mov eax, [rdx + rcx * 4]
  CompilerEndIf
  ProcedureReturn
  !cga_table256bgr:
  !dd 0x000000,0x555555,0x0000AA,0x0000AA,0x0000AA,0x0000AA,0x0000AA,0x0000AA
  !dd 0x555555,0x555555,0x555555,0x0000AA,0x0000AA,0x0000AA,0x0000AA,0x0000AA
  !dd 0x00AA00,0x555555,0x555555,0x0055AA,0x0055AA,0x0055AA,0x0055AA,0x0055AA
  !dd 0x00AA00,0x00AA00,0x555555,0x0055AA,0x0055AA,0x0055AA,0x0055AA,0x0055AA
  !dd 0x00AA00,0x00AA00,0x00AA00,0x0055AA,0x0055AA,0x0055AA,0x0055AA,0x0055AA
  !dd 0x00AA00,0x00AA00,0x00AA00,0x00AA00,0x0055AA,0x0055AA,0x0055AA,0x55FFFF
  !dd 0x00AA00,0x00AA00,0x00AA00,0x55FF55,0x55FF55,0x55FFFF,0x55FFFF,0x55FFFF
  !dd 0x00AA00,0x00AA00,0x55FF55,0x55FF55,0x55FF55,0x55FFFF,0x55FFFF,0x55FFFF
  !dd 0xAA0000,0xAA0000,0x555555,0x555555,0x0000AA,0x0000AA,0x5555FF,0x5555FF
  !dd 0xAA0000,0x555555,0x555555,0x555555,0x555555,0x5555FF,0x5555FF,0x5555FF
  !dd 0x555555,0x555555,0x555555,0x555555,0x555555,0x5555FF,0x5555FF,0x5555FF
  !dd 0x555555,0x555555,0x555555,0x555555,0x555555,0x5555FF,0x5555FF,0x5555FF
  !dd 0x00AA00,0x555555,0x555555,0x555555,0x555555,0xAAAAAA,0x5555FF,0x5555FF
  !dd 0x00AA00,0x55FF55,0x55FF55,0x55FF55,0xAAAAAA,0xAAAAAA,0x55FFFF,0x55FFFF
  !dd 0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FFFF,0x55FFFF,0x55FFFF
  !dd 0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FFFF,0x55FFFF,0x55FFFF
  !dd 0xAA0000,0xAA0000,0xAA0000,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA
  !dd 0xAA0000,0xAA0000,0xAA0000,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA
  !dd 0xAA0000,0xAA0000,0x555555,0x555555,0xAA00AA,0xAA00AA,0xAA00AA,0x5555FF
  !dd 0xAAAA00,0xAAAA00,0x555555,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0x5555FF
  !dd 0xAAAA00,0xAAAA00,0xAAAA00,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA
  !dd 0xAAAA00,0xAAAA00,0xAAAA00,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA
  !dd 0xAAAA00,0xAAAA00,0xAAAA00,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0x55FFFF
  !dd 0xAAAA00,0xAAAA00,0x55FF55,0x55FF55,0xAAAAAA,0xAAAAAA,0x55FFFF,0x55FFFF
  !dd 0xAA0000,0xAA0000,0xFF5555,0xFF5555,0xAA00AA,0xAA00AA,0xFF55FF,0xFF55FF
  !dd 0xAA0000,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF55FF,0xFF55FF,0xFF55FF
  !dd 0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF55FF,0xFF55FF,0xFF55FF
  !dd 0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF55FF,0xFF55FF,0xFF55FF
  !dd 0xAAAA00,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xAAAAAA,0xFF55FF,0xFF55FF
  !dd 0xAAAA00,0xFFFF55,0xFFFF55,0xFFFF55,0xAAAAAA,0xAAAAAA,0xFFFFFF,0xFFFFFF
  !dd 0xFFFF55,0xFFFF55,0xFFFF55,0xFFFF55,0xFFFF55,0xFFFFFF,0xFFFFFF,0xFFFFFF
  !dd 0xFFFF55,0xFFFF55,0xFFFF55,0xFFFF55,0xFFFF55,0xFFFFFF,0xFFFFFF,0xFFFFFF
EndProcedure
Without a table it would take more time but it would be more flexible.
For each pixel you compute
Sqr((R1-R0)*(R1-R0) + (G1-G0)*(G1-G0)+(B1-B0)*(B1-B0))
for every palette color and take the color that returns the lowest result.

Re: CGA

Posted: Fri Feb 22, 2013 8:23 am
by J. Baker
Yeah, I noticed that too but didn't know it was because of the 4bit export. That's kind of odd.

New code is looking better. ;)