xref: /plan9-contrib/sys/src/cmd/aux/vga/palette.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <u.h>
2 #include <libc.h>
3 
4 #include "vga.h"
5 
6 static ulong
7 xnto32(uchar x, int n)
8 {
9 	int s;
10 	ulong y;
11 
12 	x &= (1<<n)-1;
13 	y = 0;
14 	for(s = 32 - n; s > 0; s -= n)
15 		y |= x<<s;
16 	if(s < 0)
17 		y |= x>>(-s);
18 	return y;
19 }
20 
21 static void
22 setcolour(uchar p[3], ulong r, ulong g, ulong b)
23 {
24 	p[Red] = r>>(32-6);
25 	p[Green] = g>>(32-6);
26 	p[Blue] = b>>(32-6);
27 }
28 
29 /*
30  * Vga colour palette.
31  */
32 static void
33 snarf(Vga *vga, Ctlr *ctlr)
34 {
35 	int i;
36 
37 	verbose("%s->snarf\n", ctlr->name);
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 	verbose("%s->init\n", ctlr->name);
59 
60 	memset(vga->palette, 0, sizeof(vga->palette));
61 	vga->pixmask = 0xFF;
62 	if(vga->mode->z == 8){
63 		for(i = 0; i < Pcolours; i++){
64 			p = vga->palette[i^0xFF];
65 			setcolour(p, xnto32(i>>5, 3), xnto32(i>>2, 3), xnto32(i, 2));
66 		}
67 		p =  vga->palette[0x55^0xFF];
68 		setcolour(p, xnto32(0x15, 6), xnto32(0x15, 6), xnto32(0x15, 6));
69 		p =  vga->palette[0xAA^0xFF];
70 		setcolour(p, xnto32(0x2A, 6), xnto32(0x2A, 6), xnto32(0x2A, 6));
71 		p =  vga->palette[0xFF^0xFF];
72 		setcolour(p, xnto32(0x3F, 6), xnto32(0x3F, 6), xnto32(0x3F, 6));
73 	}
74 	else for(i = 0; i < 16; i++){
75 		x = xnto32((i*63)/15, 6);
76 		setcolour(vga->palette[i^0xFF], x, x, x);
77 	}
78 
79 	ctlr->flag |= Finit;
80 }
81 
82 static void
83 load(Vga *vga, Ctlr *ctlr)
84 {
85 	int i;
86 
87 	verbose("%s->load\n", ctlr->name);
88 
89 	vgao(Pixmask, vga->pixmask);
90 	vgao(PaddrW, 0x00);
91 	for(i = 0; i < Pcolours; i++){
92 		vgao(Pdata, vga->palette[i][Red]);
93 		vgao(Pdata, vga->palette[i][Green]);
94 		vgao(Pdata, vga->palette[i][Blue]);
95 	}
96 
97 	ctlr->flag |= Fload;
98 }
99 
100 static void
101 dump(Vga *vga, Ctlr *ctlr)
102 {
103 	int i;
104 
105 	printitem(ctlr->name, "palette");
106 	for(i = 0; i < Pcolours; i++){
107 		if(i && (i%6) == 0)
108 			print("\n%-20s", "");
109 		print(" %2.2X/%2.2X/%2.2X", vga->palette[i][Red],
110 			vga->palette[i][Green], vga->palette[i][Blue]);
111 	}
112 	print("\n");
113 }
114 
115 Ctlr palette = {
116 	"palette",			/* name */
117 	snarf,				/* snarf */
118 	0,				/* options */
119 	init,				/* init */
120 	load,				/* load */
121 	dump,				/* dump */
122 };
123