xref: /plan9/sys/src/cmd/aux/vga/palette.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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