diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/vga/palette.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/vga/palette.c')
-rwxr-xr-x | sys/src/cmd/aux/vga/palette.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/vga/palette.c b/sys/src/cmd/aux/vga/palette.c new file mode 100755 index 000000000..a972b1896 --- /dev/null +++ b/sys/src/cmd/aux/vga/palette.c @@ -0,0 +1,118 @@ +#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 */ +}; |