]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/aux/vga/palette.c
abaco: cleanup, handle image/x-icon, don't use backspace as a hotkey, and remove...
[plan9front.git] / sys / src / cmd / aux / vga / palette.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4
5 #include "pci.h"
6 #include "vga.h"
7
8 static ulong
9 xnto32(uchar x, int n)
10 {
11         int s;
12         ulong y;
13
14         x &= (1<<n)-1;
15         y = 0;
16         for(s = 32 - n; s > 0; s -= n)
17                 y |= x<<s;
18         if(s < 0)
19                 y |= x>>(-s);
20         return y;
21 }
22
23 static void
24 setcolour(uchar p[3], ulong r, ulong g, ulong b)
25 {
26         p[Red] = r>>(32-6);
27         p[Green] = g>>(32-6);
28         p[Blue] = b>>(32-6);
29 }
30
31 /*
32  * Vga colour palette.
33  */
34 static void
35 snarf(Vga* vga, Ctlr* ctlr)
36 {
37         int i;
38
39         vga->pixmask = vgai(Pixmask);
40         vga->pstatus = vgai(Pstatus);
41         vgao(PaddrR, 0x00);
42         for(i = 0; i < Pcolours; i++){
43                 vga->palette[i][Red] = vgai(Pdata);
44                 vga->palette[i][Green] = vgai(Pdata);
45                 vga->palette[i][Blue] = vgai(Pdata);
46         }
47
48         ctlr->flag |= Fsnarf;
49 }
50
51 static void
52 init(Vga* vga, Ctlr* ctlr)
53 {
54         int i;
55         uchar *p;
56         ulong x;
57
58         memset(vga->palette, 0, sizeof(vga->palette));
59         vga->pixmask = 0xFF;
60         if(vga->mode->z == 8){
61                 for(i = 0; i < Pcolours; i++){
62                         p = vga->palette[i^0xFF];
63                         setcolour(p, xnto32(i>>5, 3), xnto32(i>>2, 3), xnto32(i, 2));
64                 }
65                 p =  vga->palette[0x55^0xFF];
66                 setcolour(p, xnto32(0x15, 6), xnto32(0x15, 6), xnto32(0x15, 6));
67                 p =  vga->palette[0xAA^0xFF];
68                 setcolour(p, xnto32(0x2A, 6), xnto32(0x2A, 6), xnto32(0x2A, 6));
69                 p =  vga->palette[0xFF^0xFF];
70                 setcolour(p, xnto32(0x3F, 6), xnto32(0x3F, 6), xnto32(0x3F, 6));
71         }
72         else for(i = 0; i < 16; i++){
73                 x = xnto32((i*63)/15, 6);
74                 setcolour(vga->palette[i^0xFF], x, x, x);
75         }
76
77         ctlr->flag |= Finit;
78 }
79
80 static void
81 load(Vga* vga, Ctlr* ctlr)
82 {
83         int i;
84
85         vgao(Pixmask, vga->pixmask);
86         vgao(PaddrW, 0x00);
87         for(i = 0; i < Pcolours; i++){
88                 vgao(Pdata, vga->palette[i][Red]);
89                 vgao(Pdata, vga->palette[i][Green]);
90                 vgao(Pdata, vga->palette[i][Blue]);
91         }
92
93         ctlr->flag |= Fload;
94 }
95
96 static void
97 dump(Vga* vga, Ctlr* ctlr)
98 {
99         int i;
100
101         printitem(ctlr->name, "palette");
102         for(i = 0; i < Pcolours; i++){
103                 if(i && (i%6) == 0)
104                         Bprint(&stdout, "\n%-20s", "");
105                 Bprint(&stdout, " %2.2X/%2.2X/%2.2X", vga->palette[i][Red],
106                         vga->palette[i][Green], vga->palette[i][Blue]);
107         }
108         Bprint(&stdout, "\n");
109 }
110
111 Ctlr palette = {
112         "palette",                      /* name */
113         snarf,                          /* snarf */
114         0,                              /* options */
115         init,                           /* init */
116         load,                           /* load */
117         dump,                           /* dump */
118 };