xref: /plan9/sys/src/cmd/aux/vga/palette.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier 
5*9a747e4fSDavid du Colombier #include "pci.h"
6219b2ee8SDavid du Colombier #include "vga.h"
7219b2ee8SDavid du Colombier 
8219b2ee8SDavid du Colombier static ulong
xnto32(uchar x,int n)9219b2ee8SDavid du Colombier xnto32(uchar x, int n)
10219b2ee8SDavid du Colombier {
11219b2ee8SDavid du Colombier 	int s;
12219b2ee8SDavid du Colombier 	ulong y;
13219b2ee8SDavid du Colombier 
14219b2ee8SDavid du Colombier 	x &= (1<<n)-1;
15219b2ee8SDavid du Colombier 	y = 0;
16219b2ee8SDavid du Colombier 	for(s = 32 - n; s > 0; s -= n)
17219b2ee8SDavid du Colombier 		y |= x<<s;
18219b2ee8SDavid du Colombier 	if(s < 0)
19219b2ee8SDavid du Colombier 		y |= x>>(-s);
20219b2ee8SDavid du Colombier 	return y;
21219b2ee8SDavid du Colombier }
22219b2ee8SDavid du Colombier 
23219b2ee8SDavid du Colombier static void
setcolour(uchar p[3],ulong r,ulong g,ulong b)24219b2ee8SDavid du Colombier setcolour(uchar p[3], ulong r, ulong g, ulong b)
25219b2ee8SDavid du Colombier {
26219b2ee8SDavid du Colombier 	p[Red] = r>>(32-6);
27219b2ee8SDavid du Colombier 	p[Green] = g>>(32-6);
28219b2ee8SDavid du Colombier 	p[Blue] = b>>(32-6);
29219b2ee8SDavid du Colombier }
30219b2ee8SDavid du Colombier 
31219b2ee8SDavid du Colombier /*
32219b2ee8SDavid du Colombier  * Vga colour palette.
33219b2ee8SDavid du Colombier  */
34219b2ee8SDavid du Colombier static void
snarf(Vga * vga,Ctlr * ctlr)35219b2ee8SDavid du Colombier snarf(Vga* vga, Ctlr* ctlr)
36219b2ee8SDavid du Colombier {
37219b2ee8SDavid du Colombier 	int i;
38219b2ee8SDavid du Colombier 
39219b2ee8SDavid du Colombier 	vga->pixmask = vgai(Pixmask);
40219b2ee8SDavid du Colombier 	vga->pstatus = vgai(Pstatus);
41219b2ee8SDavid du Colombier 	vgao(PaddrR, 0x00);
42219b2ee8SDavid du Colombier 	for(i = 0; i < Pcolours; i++){
43219b2ee8SDavid du Colombier 		vga->palette[i][Red] = vgai(Pdata);
44219b2ee8SDavid du Colombier 		vga->palette[i][Green] = vgai(Pdata);
45219b2ee8SDavid du Colombier 		vga->palette[i][Blue] = vgai(Pdata);
46219b2ee8SDavid du Colombier 	}
47219b2ee8SDavid du Colombier 
48219b2ee8SDavid du Colombier 	ctlr->flag |= Fsnarf;
49219b2ee8SDavid du Colombier }
50219b2ee8SDavid du Colombier 
51219b2ee8SDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)52219b2ee8SDavid du Colombier init(Vga* vga, Ctlr* ctlr)
53219b2ee8SDavid du Colombier {
54219b2ee8SDavid du Colombier 	int i;
55219b2ee8SDavid du Colombier 	uchar *p;
56219b2ee8SDavid du Colombier 	ulong x;
57219b2ee8SDavid du Colombier 
58219b2ee8SDavid du Colombier 	memset(vga->palette, 0, sizeof(vga->palette));
59219b2ee8SDavid du Colombier 	vga->pixmask = 0xFF;
60219b2ee8SDavid du Colombier 	if(vga->mode->z == 8){
61219b2ee8SDavid du Colombier 		for(i = 0; i < Pcolours; i++){
62219b2ee8SDavid du Colombier 			p = vga->palette[i^0xFF];
63219b2ee8SDavid du Colombier 			setcolour(p, xnto32(i>>5, 3), xnto32(i>>2, 3), xnto32(i, 2));
64219b2ee8SDavid du Colombier 		}
65219b2ee8SDavid du Colombier 		p =  vga->palette[0x55^0xFF];
66219b2ee8SDavid du Colombier 		setcolour(p, xnto32(0x15, 6), xnto32(0x15, 6), xnto32(0x15, 6));
67219b2ee8SDavid du Colombier 		p =  vga->palette[0xAA^0xFF];
68219b2ee8SDavid du Colombier 		setcolour(p, xnto32(0x2A, 6), xnto32(0x2A, 6), xnto32(0x2A, 6));
69219b2ee8SDavid du Colombier 		p =  vga->palette[0xFF^0xFF];
70219b2ee8SDavid du Colombier 		setcolour(p, xnto32(0x3F, 6), xnto32(0x3F, 6), xnto32(0x3F, 6));
71219b2ee8SDavid du Colombier 	}
72219b2ee8SDavid du Colombier 	else for(i = 0; i < 16; i++){
73219b2ee8SDavid du Colombier 		x = xnto32((i*63)/15, 6);
74219b2ee8SDavid du Colombier 		setcolour(vga->palette[i^0xFF], x, x, x);
75219b2ee8SDavid du Colombier 	}
76219b2ee8SDavid du Colombier 
77219b2ee8SDavid du Colombier 	ctlr->flag |= Finit;
78219b2ee8SDavid du Colombier }
79219b2ee8SDavid du Colombier 
80219b2ee8SDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)81219b2ee8SDavid du Colombier load(Vga* vga, Ctlr* ctlr)
82219b2ee8SDavid du Colombier {
83219b2ee8SDavid du Colombier 	int i;
84219b2ee8SDavid du Colombier 
85219b2ee8SDavid du Colombier 	vgao(Pixmask, vga->pixmask);
86219b2ee8SDavid du Colombier 	vgao(PaddrW, 0x00);
87219b2ee8SDavid du Colombier 	for(i = 0; i < Pcolours; i++){
88219b2ee8SDavid du Colombier 		vgao(Pdata, vga->palette[i][Red]);
89219b2ee8SDavid du Colombier 		vgao(Pdata, vga->palette[i][Green]);
90219b2ee8SDavid du Colombier 		vgao(Pdata, vga->palette[i][Blue]);
91219b2ee8SDavid du Colombier 	}
92219b2ee8SDavid du Colombier 
93219b2ee8SDavid du Colombier 	ctlr->flag |= Fload;
94219b2ee8SDavid du Colombier }
95219b2ee8SDavid du Colombier 
96219b2ee8SDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)97219b2ee8SDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
98219b2ee8SDavid du Colombier {
99219b2ee8SDavid du Colombier 	int i;
100219b2ee8SDavid du Colombier 
101219b2ee8SDavid du Colombier 	printitem(ctlr->name, "palette");
102219b2ee8SDavid du Colombier 	for(i = 0; i < Pcolours; i++){
103219b2ee8SDavid du Colombier 		if(i && (i%6) == 0)
1047dd7cddfSDavid du Colombier 			Bprint(&stdout, "\n%-20s", "");
1057dd7cddfSDavid du Colombier 		Bprint(&stdout, " %2.2X/%2.2X/%2.2X", vga->palette[i][Red],
106219b2ee8SDavid du Colombier 			vga->palette[i][Green], vga->palette[i][Blue]);
107219b2ee8SDavid du Colombier 	}
1087dd7cddfSDavid du Colombier 	Bprint(&stdout, "\n");
109219b2ee8SDavid du Colombier }
110219b2ee8SDavid du Colombier 
111219b2ee8SDavid du Colombier Ctlr palette = {
112219b2ee8SDavid du Colombier 	"palette",			/* name */
113219b2ee8SDavid du Colombier 	snarf,				/* snarf */
114219b2ee8SDavid du Colombier 	0,				/* options */
115219b2ee8SDavid du Colombier 	init,				/* init */
116219b2ee8SDavid du Colombier 	load,				/* load */
117219b2ee8SDavid du Colombier 	dump,				/* dump */
118219b2ee8SDavid du Colombier };
119