9 * S3 Vision964 GUI Accelerator.
12 snarf(Vga* vga, Ctlr* ctlr)
14 s3generic.snarf(vga, ctlr);
15 vga->crt[0x22] = vgaxi(Crtx, 0x22);
16 vga->crt[0x24] = vgaxi(Crtx, 0x24);
17 vga->crt[0x26] = vgaxi(Crtx, 0x26);
21 options(Vga*, Ctlr* ctlr)
23 ctlr->flag |= Hlinear|Henhanced|Foptions;
27 init(Vga* vga, Ctlr* ctlr)
31 int sid, dbl, bpp, divide;
35 error("depth %d not supported\n", vga->mode->z);
38 if(vga->ramdac && (vga->ramdac->flag & Uclk2)){
39 resyncinit(vga, ctlr, Uenhanced, 0);
40 vga->crt[0x00] = ((mode->ht/2)>>3)-5;
41 vga->crt[0x01] = ((mode->x/2)>>3)-1;
42 vga->crt[0x02] = ((mode->shb/2)>>3)-1;
45 vga->crt[0x03] = 0x80|(x & 0x1F);
46 vga->crt[0x04] = (mode->shs/2)>>3;
47 vga->crt[0x05] = ((mode->ehs/2)>>3) & 0x1F;
49 vga->crt[0x05] |= 0x80;
50 vga->crt[0x13] = mode->x/8;
53 resyncinit(vga, ctlr, Uenhanced, 0);
54 s3generic.init(vga, ctlr);
56 if((ctlr->flag & Uenhanced) == 0)
57 vga->crt[0x33] &= ~0x20;
59 vga->crt[0x3B] = (vga->crt[0]+vga->crt[4]+1)/2;
60 if(vga->crt[0x3B] & 0x100)
61 vga->crt[0x5D] |= 0x40;
62 vga->crt[0x55] = 0x00;
64 vga->crt[0x40] &= ~0x10;
65 vga->crt[0x53] &= ~0x20;
66 vga->crt[0x58] &= ~0x48;
67 if(dbattr(vga->attr, "sam512") == 0)
68 vga->crt[0x58] |= 0x40; /* set 256 word SAM, always works */
69 vga->crt[0x65] = 0x00;
70 vga->crt[0x66] &= ~0x07;
71 vga->crt[0x6D] = 0x00;
72 if(ctlr->flag & Uenhanced){
73 if(vga->ramdac && (vga->ramdac->flag & Hsid32))
77 if(vga->ramdac && (vga->ramdac->flag & Uclk2))
85 divide = sid/(dbl*bpp);
88 vga->crt[0x66] |= 0x01;
91 vga->crt[0x66] |= 0x02;
94 vga->crt[0x66] |= 0x03;
97 vga->crt[0x66] |= 0x04;
100 vga->crt[0x66] |= 0x05;
104 vga->crt[0x40] |= 0x10;
105 vga->crt[0x65] |= 0x02;
106 if(vga->ramdac && (vga->ramdac->flag & Hsid32))
107 vga->crt[0x66] |= 0x10;
110 * Some heuristics (what part of aux/vga isn't?)
111 * to prevent some of the right border appearing
112 * on the left edge of the screen.
114 if(dbattr(vga->attr, "vclkphs"))
115 vga->crt[0x67] |= 0x01;
116 if(val = dbattr(vga->attr, "delaybl"))
117 vga->crt[0x6D] |= strtoul(val, 0, 0) & 0x07;
118 else if(mode->x > 1024)
119 vga->crt[0x6D] |= 0x01;
121 vga->crt[0x6D] |= 0x03;
123 if(val = dbattr(vga->attr, "delaysc"))
124 vga->crt[0x6D] |= (strtoul(val, 0, 0) & 0x07)<<4;
129 load(Vga* vga, Ctlr* ctlr)
133 s3generic.load(vga, ctlr);
134 vgaxo(Crtx, 0x65, vga->crt[0x65]);
135 vgaxo(Crtx, 0x66, vga->crt[0x66]);
136 vgaxo(Crtx, 0x6D, vga->crt[0x6D]);
139 if(ctlr->flag & Uenhanced)
141 outportw(0x4AE8, advfunc);
145 dump(Vga* vga, Ctlr* ctlr)
147 s3generic.dump(vga, ctlr);
148 printitem(ctlr->name, "Crt22");
149 printreg(vga->crt[0x22]);
150 printitem(ctlr->name, "Crt24");
151 printreg(vga->crt[0x24]);
152 printitem(ctlr->name, "Crt26");
153 printreg(vga->crt[0x26]);
157 "vision964", /* name */
159 options, /* options */