static const unsigned char dither_table[64] = {
0x00, 0x30, 0x0C, 0x3C, 0x03, 0x33, 0x0F, 0x3F,
0x20, 0x10, 0x2C, 0x1C, 0x23, 0x13, 0x2F, 0x1F,
0x08, 0x38, 0x04, 0x34, 0x0B, 0x3B, 0x07, 0x37,
0x28, 0x18, 0x24, 0x14, 0x2B, 0x1B, 0x27, 0x17,
0x02, 0x32, 0x0E, 0x3E, 0x01, 0x31, 0x0D, 0x3D,
0x22, 0x12, 0x2E, 0x1E, 0x21, 0x11, 0x2D, 0x1D,
0x0A, 0x3A, 0x06, 0x36, 0x09, 0x39, 0x05, 0x35,
0x2A, 0x1A, 0x26, 0x16, 0x29, 0x19, 0x25, 0x15
};
void plot(unsigned int x, unsigned int y, unsigned char c)
{
if (x >= (scr_width * 32) || y >= (scr_height * 36))
return;
x = x >> 2;
y = (scr_height * 9 - 1) - (y >> 2);
c = ((c + dither_table[((y & 7) << 3) | (x & 7)]) >> 6) & 3;
{
unsigned char m = 0x88 >> (x & 3);
unsigned char b = (!(c & 1) ? 0x00 : 0xF0) | (!(c & 2) ? 0x00 : 0x0F);
unsigned char p3saved = port_page_3;
unsigned int addr = line_addr_table[y] + (x >> 2);
port_page_3 = 0xFC | (unsigned char) (addr >> 14);
addr |= 0xC000U;
*((unsigned char *) addr) = (*((unsigned char *) addr) & ~m) | (b & m);
port_page_3 = p3saved;
}
}