123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #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 */
- };
|