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