I tried a lookup table but I doubt if it is faster (might as well be slower).
I also don't know if I got the table exactly right.
Code: Select all
Procedure CGA(color)
!mov eax, [p.v_color]
!and eax, 0xe0e0e0; convert b8g8r8 > r3g3b3
!mov edx, eax
!shr edx, 21
!movzx ecx, ah
!ror ecx, 2
!or edx, ecx
!movzx ecx, al
!rol ecx, 1
!or edx, ecx
; lookup in table r8g8b8[r3g3b3]
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
!lea eax, [cga_table512rgb]
!mov eax, [eax + edx * 4]
CompilerElse
!lea rax, [cga_table512rgb]
!mov eax, [rax + rdx * 4]
CompilerEndIf
!bswap eax; convert r8g8b8 > b8g8r8
!shr eax, 8
ProcedureReturn
!cga_table512rgb:
!dd 0x000000,0x000000,0x000000,0x0000AA,0x0000AA,0x0000AA,0x0000AA,0x0000AA
!dd 0x000000,0x000000,0x000000,0x0000AA,0x0000AA,0x0000AA,0x0000AA,0x0000AA
!dd 0x000000,0x000000,0x555555,0x555555,0x0000AA,0x0000AA,0x0000AA,0x5555FF
!dd 0x00AA00,0x00AA00,0x555555,0x00AAAA,0x00AAAA,0x00AAAA,0x00AAAA,0x5555FF
!dd 0x00AA00,0x00AA00,0x00AA00,0x00AAAA,0x00AAAA,0x00AAAA,0x00AAAA,0x00AAAA
!dd 0x00AA00,0x00AA00,0x00AA00,0x00AAAA,0x00AAAA,0x00AAAA,0x00AAAA,0x00AAAA
!dd 0x00AA00,0x00AA00,0x00AA00,0x00AAAA,0x00AAAA,0x00AAAA,0x00AAAA,0x55FFFF
!dd 0x00AA00,0x00AA00,0x55FF55,0x55FF55,0x00AAAA,0x00AAAA,0x55FFFF,0x55FFFF
!dd 0x000000,0x000000,0x000000,0x0000AA,0x0000AA,0x0000AA,0x0000AA,0x0000AA
!dd 0x000000,0x000000,0x555555,0x555555,0x0000AA,0x0000AA,0x0000AA,0x5555FF
!dd 0x000000,0x555555,0x555555,0x555555,0x555555,0x0000AA,0x5555FF,0x5555FF
!dd 0x00AA00,0x555555,0x555555,0x555555,0x00AAAA,0x00AAAA,0x5555FF,0x5555FF
!dd 0x00AA00,0x00AA00,0x555555,0x00AAAA,0x00AAAA,0x00AAAA,0x00AAAA,0x5555FF
!dd 0x00AA00,0x00AA00,0x00AA00,0x00AAAA,0x00AAAA,0x00AAAA,0x00AAAA,0x55FFFF
!dd 0x00AA00,0x00AA00,0x55FF55,0x55FF55,0x00AAAA,0x00AAAA,0x55FFFF,0x55FFFF
!dd 0x00AA00,0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FFFF,0x55FFFF,0x55FFFF
!dd 0x000000,0x000000,0x555555,0x555555,0x0000AA,0x0000AA,0x0000AA,0x5555FF
!dd 0x000000,0x555555,0x555555,0x555555,0x555555,0x0000AA,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,0x00AAAA,0x00AAAA,0x5555FF,0x5555FF
!dd 0x00AA00,0x00AA00,0x55FF55,0x55FF55,0x00AAAA,0x00AAAA,0x55FFFF,0x55FFFF
!dd 0x00AA00,0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FFFF,0x55FFFF,0x55FFFF
!dd 0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FFFF,0x55FFFF,0x55FFFF
!dd 0xAA0000,0xAA0000,0x555555,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA,0x5555FF
!dd 0xAA0000,0x555555,0x555555,0x555555,0xAA00AA,0xAA00AA,0x5555FF,0x5555FF
!dd 0xAA5500,0x555555,0x555555,0x555555,0x555555,0x5555FF,0x5555FF,0x5555FF
!dd 0xAA5500,0x555555,0x555555,0x555555,0x555555,0x5555FF,0x5555FF,0x5555FF
!dd 0xAA5500,0x555555,0x555555,0x555555,0xAAAAAA,0xAAAAAA,0x5555FF,0x5555FF
!dd 0x00AA00,0x55FF55,0x55FF55,0x55FF55,0xAAAAAA,0xAAAAAA,0xAAAAAA,0x55FFFF
!dd 0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FF55,0xAAAAAA,0x55FFFF,0x55FFFF
!dd 0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FFFF,0x55FFFF,0x55FFFF
!dd 0xAA0000,0xAA0000,0xAA0000,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA
!dd 0xAA0000,0xAA0000,0x555555,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA,0x5555FF
!dd 0xAA5500,0xAA5500,0x555555,0x555555,0xAA00AA,0xAA00AA,0x5555FF,0x5555FF
!dd 0xAA5500,0xAA5500,0x555555,0x555555,0xAAAAAA,0xAAAAAA,0x5555FF,0x5555FF
!dd 0xAA5500,0xAA5500,0x555555,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0x5555FF
!dd 0xAA5500,0xAA5500,0x55FF55,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA
!dd 0x55FF55,0x55FF55,0x55FF55,0x55FF55,0xAAAAAA,0xAAAAAA,0xAAAAAA,0x55FFFF
!dd 0x55FF55,0x55FF55,0x55FF55,0x55FF55,0x55FF55,0xAAAAAA,0x55FFFF,0x55FFFF
!dd 0xAA0000,0xAA0000,0xAA0000,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA
!dd 0xAA0000,0xAA0000,0xAA0000,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA,0xFF55FF
!dd 0xAA5500,0xAA5500,0xAA5500,0xFF5555,0xAA00AA,0xAA00AA,0xFF55FF,0xFF55FF
!dd 0xAA5500,0xAA5500,0xAA5500,0xFF5555,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xFF55FF
!dd 0xAA5500,0xAA5500,0xAA5500,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA
!dd 0xAA5500,0xAA5500,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA
!dd 0xFFFF55,0xFFFF55,0xFFFF55,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xFFFFFF
!dd 0xFFFF55,0xFFFF55,0xFFFF55,0xFFFF55,0xAAAAAA,0xAAAAAA,0xFFFFFF,0xFFFFFF
!dd 0xAA0000,0xAA0000,0xAA0000,0xAA00AA,0xAA00AA,0xAA00AA,0xAA00AA,0xFF55FF
!dd 0xAA0000,0xAA0000,0xFF5555,0xFF5555,0xAA00AA,0xAA00AA,0xFF55FF,0xFF55FF
!dd 0xAA5500,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF55FF,0xFF55FF,0xFF55FF
!dd 0xAA5500,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xAAAAAA,0xFF55FF,0xFF55FF
!dd 0xAA5500,0xFF5555,0xFF5555,0xFF5555,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xFF55FF
!dd 0xAA5500,0xFFFF55,0xFFFF55,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xAAAAAA,0xFFFFFF
!dd 0xFFFF55,0xFFFF55,0xFFFF55,0xFFFF55,0xAAAAAA,0xAAAAAA,0xFFFFFF,0xFFFFFF
!dd 0xFFFF55,0xFFFF55,0xFFFF55,0xFFFF55,0xFFFF55,0xFFFFFF,0xFFFFFF,0xFFFFFF
!dd 0xAA0000,0xAA0000,0xFF5555,0xFF5555,0xAA00AA,0xAA00AA,0xFF55FF,0xFF55FF
!dd 0xAA0000,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF55FF,0xFF55FF,0xFF55FF
!dd 0xAA5500,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF55FF,0xFF55FF,0xFF55FF
!dd 0xAA5500,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xFF55FF,0xFF55FF,0xFF55FF
!dd 0xAA5500,0xFF5555,0xFF5555,0xFF5555,0xFF5555,0xAAAAAA,0xFF55FF,0xFF55FF
!dd 0xFFFF55,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