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
xnto32(uchar x,int n)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
setcolour(uchar p[3],ulong r,ulong g,ulong b)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
snarf(Vga * vga,Ctlr * ctlr)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
init(Vga * vga,Ctlr * ctlr)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
load(Vga * vga,Ctlr * ctlr)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
dump(Vga * vga,Ctlr * ctlr)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 };
119