Subversion Repositories planix.SVN

Rev

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

#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 */
};