ref: 56e71d5260182e2ac32e09767b7c9440048a1d2f
dir: /sys/src/cmd/aux/vga/palette.c/
#include <u.h> #include <libc.h> #include <bio.h> #include "pci.h" #include "vga.h" static ulong xnto32(uchar x, int n) { int s; ulong y; x &= (1<<n)-1; y = 0; for(s = 32 - n; s > 0; s -= n) y |= x<<s; if(s < 0) y |= x>>(-s); return y; } static void setcolour(uchar p[3], ulong r, ulong g, ulong b) { p[Red] = r>>(32-6); p[Green] = g>>(32-6); p[Blue] = b>>(32-6); } /* * Vga colour palette. */ static void snarf(Vga* vga, Ctlr* ctlr) { int i; vga->pixmask = vgai(Pixmask); vga->pstatus = vgai(Pstatus); vgao(PaddrR, 0x00); for(i = 0; i < Pcolours; i++){ vga->palette[i][Red] = vgai(Pdata); vga->palette[i][Green] = vgai(Pdata); vga->palette[i][Blue] = vgai(Pdata); } ctlr->flag |= Fsnarf; } static void init(Vga* vga, Ctlr* ctlr) { int i; uchar *p; ulong x; memset(vga->palette, 0, sizeof(vga->palette)); vga->pixmask = 0xFF; if(vga->mode->z == 8){ for(i = 0; i < Pcolours; i++){ p = vga->palette[i^0xFF]; setcolour(p, xnto32(i>>5, 3), xnto32(i>>2, 3), xnto32(i, 2)); } p = vga->palette[0x55^0xFF]; setcolour(p, xnto32(0x15, 6), xnto32(0x15, 6), xnto32(0x15, 6)); p = vga->palette[0xAA^0xFF]; setcolour(p, xnto32(0x2A, 6), xnto32(0x2A, 6), xnto32(0x2A, 6)); p = vga->palette[0xFF^0xFF]; setcolour(p, xnto32(0x3F, 6), xnto32(0x3F, 6), xnto32(0x3F, 6)); } else for(i = 0; i < 16; i++){ x = xnto32((i*63)/15, 6); setcolour(vga->palette[i^0xFF], x, x, x); } ctlr->flag |= Finit; } static void load(Vga* vga, Ctlr* ctlr) { int i; vgao(Pixmask, vga->pixmask); vgao(PaddrW, 0x00); for(i = 0; i < Pcolours; i++){ vgao(Pdata, vga->palette[i][Red]); vgao(Pdata, vga->palette[i][Green]); vgao(Pdata, vga->palette[i][Blue]); } ctlr->flag |= Fload; } static void dump(Vga* vga, Ctlr* ctlr) { int i; printitem(ctlr->name, "palette"); for(i = 0; i < Pcolours; i++){ if(i && (i%6) == 0) Bprint(&stdout, "\n%-20s", ""); Bprint(&stdout, " %2.2X/%2.2X/%2.2X", vga->palette[i][Red], vga->palette[i][Green], vga->palette[i][Blue]); } Bprint(&stdout, "\n"); } Ctlr palette = { "palette", /* name */ snarf, /* snarf */ 0, /* options */ init, /* init */ load, /* load */ dump, /* dump */ };