Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
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
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
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
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
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
};