summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/vga/palette.c
blob: a972b189676005900337a6ee9e17f29df7f158c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <u.h>
#include <libc.h>
#include <bio.h>

#include "pci.h"
#include "vga.h"

static ulong
xnto32(uchar x, int n)
{
	int s;
	ulong y;

	x &= (1<<n)-1;
	y = 0;
	for(s = 32 - n; s > 0; s -= n)
		y |= x<<s;
	if(s < 0)
		y |= x>>(-s);
	return y;
}

static void
setcolour(uchar p[3], ulong r, ulong g, ulong b)
{
	p[Red] = r>>(32-6);
	p[Green] = g>>(32-6);
	p[Blue] = b>>(32-6);
}

/*
 * Vga colour palette.
 */
static void
snarf(Vga* vga, Ctlr* ctlr)
{
	int i;

	vga->pixmask = vgai(Pixmask);
	vga->pstatus = vgai(Pstatus);
	vgao(PaddrR, 0x00);
	for(i = 0; i < Pcolours; i++){
		vga->palette[i][Red] = vgai(Pdata);
		vga->palette[i][Green] = vgai(Pdata);
		vga->palette[i][Blue] = vgai(Pdata);
	}

	ctlr->flag |= Fsnarf;
}

static void
init(Vga* vga, Ctlr* ctlr)
{
	int i;
	uchar *p;
	ulong x;

	memset(vga->palette, 0, sizeof(vga->palette));
	vga->pixmask = 0xFF;
	if(vga->mode->z == 8){
		for(i = 0; i < Pcolours; i++){
			p = vga->palette[i^0xFF];
			setcolour(p, xnto32(i>>5, 3), xnto32(i>>2, 3), xnto32(i, 2));
		}
		p =  vga->palette[0x55^0xFF];
		setcolour(p, xnto32(0x15, 6), xnto32(0x15, 6), xnto32(0x15, 6));
		p =  vga->palette[0xAA^0xFF];
		setcolour(p, xnto32(0x2A, 6), xnto32(0x2A, 6), xnto32(0x2A, 6));
		p =  vga->palette[0xFF^0xFF];
		setcolour(p, xnto32(0x3F, 6), xnto32(0x3F, 6), xnto32(0x3F, 6));
	}
	else for(i = 0; i < 16; i++){
		x = xnto32((i*63)/15, 6);
		setcolour(vga->palette[i^0xFF], x, x, x);
	}

	ctlr->flag |= Finit;
}

static void
load(Vga* vga, Ctlr* ctlr)
{
	int i;

	vgao(Pixmask, vga->pixmask);
	vgao(PaddrW, 0x00);
	for(i = 0; i < Pcolours; i++){
		vgao(Pdata, vga->palette[i][Red]);
		vgao(Pdata, vga->palette[i][Green]);
		vgao(Pdata, vga->palette[i][Blue]);
	}

	ctlr->flag |= Fload;
}

static void
dump(Vga* vga, Ctlr* ctlr)
{
	int i;

	printitem(ctlr->name, "palette");
	for(i = 0; i < Pcolours; i++){
		if(i && (i%6) == 0)
			Bprint(&stdout, "\n%-20s", "");
		Bprint(&stdout, " %2.2X/%2.2X/%2.2X", vga->palette[i][Red],
			vga->palette[i][Green], vga->palette[i][Blue]);
	}
	Bprint(&stdout, "\n");
}

Ctlr palette = {
	"palette",			/* name */
	snarf,				/* snarf */
	0,				/* options */
	init,				/* init */
	load,				/* load */
	dump,				/* dump */
};