diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-10 21:03:13 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-10 21:03:13 +0200 |
commit | 1132aca4f0b22562856c01eb0e81360c82cbee0f (patch) | |
tree | 1d3f71a218ee842506e4bd3d59f0812c18ca2760 | |
parent | d1f1be9c57b6c7d9e5d826d82b08428590126e15 (diff) | |
download | plan9front-1132aca4f0b22562856c01eb0e81360c82cbee0f.tar.xz |
vgaclgd542x: support >8bit colors
-rw-r--r-- | sys/src/cmd/aux/vga/clgd542x.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/sys/src/cmd/aux/vga/clgd542x.c b/sys/src/cmd/aux/vga/clgd542x.c index 3e5c60e21..3e12beb2f 100644 --- a/sys/src/cmd/aux/vga/clgd542x.c +++ b/sys/src/cmd/aux/vga/clgd542x.c @@ -225,9 +225,6 @@ init(Vga* vga, Ctlr* ctlr) error("%s: pclk %lud too high (> %lud)\n", ctlr->name, vga->f[0], gd542x->vclk); - if(mode->z > 8) - error("%s: depth %d not supported\n", ctlr->name, mode->z); - /* * VCLK3 */ @@ -236,9 +233,27 @@ init(Vga* vga, Ctlr* ctlr) vga->sequencer[0x0E] = vga->n[0]; vga->sequencer[0x1E] = (vga->d[0]<<1)|vga->p[0]; - vga->sequencer[0x07] = 0x00; - if(mode->z == 8) - vga->sequencer[0x07] |= 0x01; + switch(mode->z){ + case 32: + vga->sequencer[0x07] = 0x09; + vga->crt[0x28] = 0xc5; + break; + case 24: + vga->sequencer[0x07] = 0x05; + vga->crt[0x28] = 0xc5; + break; + case 16: + vga->sequencer[0x07] = 0x07; + vga->crt[0x28] = 0xc1; + break; + case 8: + vga->sequencer[0x07] = 0x01; + vga->crt[0x28] = 0x00; + break; + default: + vga->sequencer[0x07] = 0x00; + vga->crt[0x28] = 0x00; + } if(vga->f[0] >= 42000000) vga->sequencer[0x0F] |= 0x20; @@ -277,6 +292,8 @@ init(Vga* vga, Ctlr* ctlr) static void load(Vga* vga, Ctlr* ctlr) { + int i; + vgaxo(Seqx, 0x0E, vga->sequencer[0x0E]); vgaxo(Seqx, 0x1E, vga->sequencer[0x1E]); if(ctlr->flag & Ulinear) @@ -285,6 +302,14 @@ load(Vga* vga, Ctlr* ctlr) vgaxo(Seqx, 0x0F, vga->sequencer[0x0F]); vgaxo(Seqx, 0x16, vga->sequencer[0x16]); + /* + * Hack for Hidden DAC Register. Do 4 dummy reads + * of Pixmask first. + */ + for(i = 0; i < 4; i++) + vgai(Pixmask); + vgao(Pixmask, vga->crt[0x28]); + if(vga->mode->interlace == 'v') vgaxo(Crtx, 0x19, vga->crt[0x19]); vgaxo(Crtx, 0x1A, vga->crt[0x1A]); |