xref: /freebsd/lib/libvgl/simple.c (revision 5acf51ea02ea31f47358e87bacdaaaa6c9ed7dc4)
19a57b7d2SSøren Schmidt /*-
29a57b7d2SSøren Schmidt  * Copyright (c) 1991-1997 S�ren Schmidt
39a57b7d2SSøren Schmidt  * All rights reserved.
49a57b7d2SSøren Schmidt  *
59a57b7d2SSøren Schmidt  * Redistribution and use in source and binary forms, with or without
69a57b7d2SSøren Schmidt  * modification, are permitted provided that the following conditions
79a57b7d2SSøren Schmidt  * are met:
89a57b7d2SSøren Schmidt  * 1. Redistributions of source code must retain the above copyright
99a57b7d2SSøren Schmidt  *    notice, this list of conditions and the following disclaimer
109a57b7d2SSøren Schmidt  *    in this position and unchanged.
119a57b7d2SSøren Schmidt  * 2. Redistributions in binary form must reproduce the above copyright
129a57b7d2SSøren Schmidt  *    notice, this list of conditions and the following disclaimer in the
139a57b7d2SSøren Schmidt  *    documentation and/or other materials provided with the distribution.
149a57b7d2SSøren Schmidt  * 3. The name of the author may not be used to endorse or promote products
159a57b7d2SSøren Schmidt  *    derived from this software withough specific prior written permission
169a57b7d2SSøren Schmidt  *
179a57b7d2SSøren Schmidt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
189a57b7d2SSøren Schmidt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
199a57b7d2SSøren Schmidt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
209a57b7d2SSøren Schmidt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
219a57b7d2SSøren Schmidt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
229a57b7d2SSøren Schmidt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a57b7d2SSøren Schmidt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a57b7d2SSøren Schmidt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a57b7d2SSøren Schmidt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
269a57b7d2SSøren Schmidt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a57b7d2SSøren Schmidt  *
287f3dea24SPeter Wemm  * $FreeBSD$
299a57b7d2SSøren Schmidt  */
309a57b7d2SSøren Schmidt 
319a57b7d2SSøren Schmidt #include <signal.h>
329a57b7d2SSøren Schmidt #include <machine/console.h>
339a57b7d2SSøren Schmidt #include "vgl.h"
349a57b7d2SSøren Schmidt 
359a57b7d2SSøren Schmidt static byte VGLSavePaletteRed[256];
369a57b7d2SSøren Schmidt static byte VGLSavePaletteGreen[256];
379a57b7d2SSøren Schmidt static byte VGLSavePaletteBlue[256];
389a57b7d2SSøren Schmidt 
399a57b7d2SSøren Schmidt #define ABS(a)		(((a)<0) ? -(a) : (a))
409a57b7d2SSøren Schmidt #define SGN(a)		(((a)<0) ? -1 : 1)
415acf51eaSKazutaka YOKOTA #define min(x, y)	(((x) < (y)) ? (x) : (y))
425acf51eaSKazutaka YOKOTA #define max(x, y)	(((x) > (y)) ? (x) : (y))
439a57b7d2SSøren Schmidt 
449a57b7d2SSøren Schmidt void
459a57b7d2SSøren Schmidt VGLSetXY(VGLBitmap *object, int x, int y, byte color)
469a57b7d2SSøren Schmidt {
475acf51eaSKazutaka YOKOTA   int offset;
485acf51eaSKazutaka YOKOTA 
499a57b7d2SSøren Schmidt   VGLCheckSwitch();
505acf51eaSKazutaka YOKOTA   if (x>=0 && x<object->VXsize && y>=0 && y<object->VYsize) {
519a57b7d2SSøren Schmidt     if (!VGLMouseFreeze(x, y, 1, 1, color)) {
529a57b7d2SSøren Schmidt       switch (object->Type) {
539a57b7d2SSøren Schmidt       case MEMBUF:
549a57b7d2SSøren Schmidt       case VIDBUF8:
555acf51eaSKazutaka YOKOTA         object->Bitmap[y*object->VXsize+x]=(color);
565acf51eaSKazutaka YOKOTA         break;
575acf51eaSKazutaka YOKOTA       case VIDBUF8S:
585acf51eaSKazutaka YOKOTA 	object->Bitmap[VGLSetSegment(y*object->VXsize+x)]=(color);
599a57b7d2SSøren Schmidt 	break;
609a57b7d2SSøren Schmidt       case VIDBUF8X:
619a57b7d2SSøren Schmidt         outb(0x3c4, 0x02);
629a57b7d2SSøren Schmidt         outb(0x3c5, 0x01 << (x&0x3));
635acf51eaSKazutaka YOKOTA 	object->Bitmap[(unsigned)(VGLAdpInfo.va_line_width*y)+(x/4)] = (color);
649a57b7d2SSøren Schmidt 	break;
655acf51eaSKazutaka YOKOTA       case VIDBUF4S:
665acf51eaSKazutaka YOKOTA 	offset = VGLSetSegment(y*VGLAdpInfo.va_line_width + x/8);
675acf51eaSKazutaka YOKOTA 	goto set_planar;
689a57b7d2SSøren Schmidt       case VIDBUF4:
695acf51eaSKazutaka YOKOTA 	offset = y*VGLAdpInfo.va_line_width + x/8;
705acf51eaSKazutaka YOKOTA set_planar:
715acf51eaSKazutaka YOKOTA         outb(0x3c4, 0x02); outb(0x3c5, 0x0f);
725acf51eaSKazutaka YOKOTA         outb(0x3ce, 0x00); outb(0x3cf, color & 0x0f);	/* set/reset */
735acf51eaSKazutaka YOKOTA         outb(0x3ce, 0x01); outb(0x3cf, 0x0f);		/* set/reset enable */
745acf51eaSKazutaka YOKOTA         outb(0x3ce, 0x08); outb(0x3cf, 0x80 >> (x%8));	/* bit mask */
755acf51eaSKazutaka YOKOTA 	object->Bitmap[offset] |= color;
769a57b7d2SSøren Schmidt       }
779a57b7d2SSøren Schmidt     }
789a57b7d2SSøren Schmidt     VGLMouseUnFreeze();
799a57b7d2SSøren Schmidt   }
809a57b7d2SSøren Schmidt }
819a57b7d2SSøren Schmidt 
829a57b7d2SSøren Schmidt byte
839a57b7d2SSøren Schmidt VGLGetXY(VGLBitmap *object, int x, int y)
849a57b7d2SSøren Schmidt {
855acf51eaSKazutaka YOKOTA   int offset;
865acf51eaSKazutaka YOKOTA #if 0
875acf51eaSKazutaka YOKOTA   int i;
885acf51eaSKazutaka YOKOTA   byte color;
895acf51eaSKazutaka YOKOTA   byte mask;
905acf51eaSKazutaka YOKOTA #endif
915acf51eaSKazutaka YOKOTA 
929a57b7d2SSøren Schmidt   VGLCheckSwitch();
935acf51eaSKazutaka YOKOTA   if (x<0 || x>=object->VXsize || y<0 || y>=object->VYsize)
945acf51eaSKazutaka YOKOTA     return 0;
959a57b7d2SSøren Schmidt   switch (object->Type) {
969a57b7d2SSøren Schmidt     case MEMBUF:
979a57b7d2SSøren Schmidt     case VIDBUF8:
985acf51eaSKazutaka YOKOTA       return object->Bitmap[((y*object->VXsize)+x)];
995acf51eaSKazutaka YOKOTA     case VIDBUF8S:
1005acf51eaSKazutaka YOKOTA       return object->Bitmap[VGLSetSegment(y*object->VXsize+x)];
1019a57b7d2SSøren Schmidt     case VIDBUF8X:
1029a57b7d2SSøren Schmidt       outb(0x3ce, 0x04); outb(0x3cf, x & 0x3);
1035acf51eaSKazutaka YOKOTA       return object->Bitmap[(unsigned)(VGLAdpInfo.va_line_width*y)+(x/4)];
1045acf51eaSKazutaka YOKOTA     case VIDBUF4S:
1055acf51eaSKazutaka YOKOTA       offset = VGLSetSegment(y*VGLAdpInfo.va_line_width + x/8);
1065acf51eaSKazutaka YOKOTA       goto get_planar;
1079a57b7d2SSøren Schmidt     case VIDBUF4:
1085acf51eaSKazutaka YOKOTA       offset = y*VGLAdpInfo.va_line_width + x/8;
1095acf51eaSKazutaka YOKOTA get_planar:
1105acf51eaSKazutaka YOKOTA #if 1
1115acf51eaSKazutaka YOKOTA       return (object->Bitmap[offset]&(0x80>>(x%8))) ? 1 : 0;	/* XXX */
1125acf51eaSKazutaka YOKOTA #else
1135acf51eaSKazutaka YOKOTA       color = 0;
1145acf51eaSKazutaka YOKOTA       mask = 0x80 >> (x%8);
1155acf51eaSKazutaka YOKOTA       for (i = 0; i < VGLModeInfo.vi_planes; i++) {
1165acf51eaSKazutaka YOKOTA 	outb(0x3ce, 0x04); outb(0x3cf, i);
1175acf51eaSKazutaka YOKOTA 	color |= (object->Bitmap[offset] & mask) ? (1 << i) : 0;
1185acf51eaSKazutaka YOKOTA       }
1195acf51eaSKazutaka YOKOTA       return color;
1205acf51eaSKazutaka YOKOTA #endif
1219a57b7d2SSøren Schmidt   }
1229a57b7d2SSøren Schmidt   return 0;
1239a57b7d2SSøren Schmidt }
1249a57b7d2SSøren Schmidt 
1259a57b7d2SSøren Schmidt void
1269a57b7d2SSøren Schmidt VGLLine(VGLBitmap *object, int x1, int y1, int x2, int y2, byte color)
1279a57b7d2SSøren Schmidt {
1289a57b7d2SSøren Schmidt   int d, x, y, ax, ay, sx, sy, dx, dy;
1299a57b7d2SSøren Schmidt 
1309a57b7d2SSøren Schmidt   dx = x2-x1; ax = ABS(dx)<<1; sx = SGN(dx); x = x1;
1319a57b7d2SSøren Schmidt   dy = y2-y1; ay = ABS(dy)<<1; sy = SGN(dy); y = y1;
1329a57b7d2SSøren Schmidt 
1339a57b7d2SSøren Schmidt   if (ax>ay) {					/* x dominant */
1349a57b7d2SSøren Schmidt     d = ay-(ax>>1);
1359a57b7d2SSøren Schmidt     for (;;) {
1369a57b7d2SSøren Schmidt       VGLSetXY(object, x, y, color);
1379a57b7d2SSøren Schmidt       if (x==x2)
1389a57b7d2SSøren Schmidt 	break;
1399a57b7d2SSøren Schmidt       if (d>=0) {
1409a57b7d2SSøren Schmidt 	y += sy; d -= ax;
1419a57b7d2SSøren Schmidt       }
1429a57b7d2SSøren Schmidt       x += sx; d += ay;
1439a57b7d2SSøren Schmidt     }
1449a57b7d2SSøren Schmidt   }
1459a57b7d2SSøren Schmidt   else {					/* y dominant */
1469a57b7d2SSøren Schmidt     d = ax-(ay>>1);
1479a57b7d2SSøren Schmidt     for (;;) {
1489a57b7d2SSøren Schmidt       VGLSetXY(object, x, y, color);
1499a57b7d2SSøren Schmidt       if (y==y2)
1509a57b7d2SSøren Schmidt 	break;
1519a57b7d2SSøren Schmidt       if (d>=0) {
1529a57b7d2SSøren Schmidt 	x += sx; d -= ay;
1539a57b7d2SSøren Schmidt       }
1549a57b7d2SSøren Schmidt       y += sy; d += ax;
1559a57b7d2SSøren Schmidt     }
1569a57b7d2SSøren Schmidt   }
1579a57b7d2SSøren Schmidt }
1589a57b7d2SSøren Schmidt 
1599a57b7d2SSøren Schmidt void
1609a57b7d2SSøren Schmidt VGLBox(VGLBitmap *object, int x1, int y1, int x2, int y2, byte color)
1619a57b7d2SSøren Schmidt {
1629a57b7d2SSøren Schmidt   VGLLine(object, x1, y1, x2, y1, color);
1639a57b7d2SSøren Schmidt   VGLLine(object, x2, y1, x2, y2, color);
1649a57b7d2SSøren Schmidt   VGLLine(object, x2, y2, x1, y2, color);
1659a57b7d2SSøren Schmidt   VGLLine(object, x1, y2, x1, y1, color);
1669a57b7d2SSøren Schmidt }
1679a57b7d2SSøren Schmidt 
1689a57b7d2SSøren Schmidt void
1699a57b7d2SSøren Schmidt VGLFilledBox(VGLBitmap *object, int x1, int y1, int x2, int y2, byte color)
1709a57b7d2SSøren Schmidt {
1719a57b7d2SSøren Schmidt   int y;
1729a57b7d2SSøren Schmidt 
1739a57b7d2SSøren Schmidt   for (y=y1; y<=y2; y++) VGLLine(object, x1, y, x2, y, color);
1749a57b7d2SSøren Schmidt }
1759a57b7d2SSøren Schmidt 
1769a57b7d2SSøren Schmidt void
1779a57b7d2SSøren Schmidt inline set4pixels(VGLBitmap *object, int x, int y, int xc, int yc, byte color)
1789a57b7d2SSøren Schmidt {
1799a57b7d2SSøren Schmidt   if (x!=0) {
1809a57b7d2SSøren Schmidt     VGLSetXY(object, xc+x, yc+y, color);
1819a57b7d2SSøren Schmidt     VGLSetXY(object, xc-x, yc+y, color);
1829a57b7d2SSøren Schmidt     if (y!=0) {
1839a57b7d2SSøren Schmidt       VGLSetXY(object, xc+x, yc-y, color);
1849a57b7d2SSøren Schmidt       VGLSetXY(object, xc-x, yc-y, color);
1859a57b7d2SSøren Schmidt     }
1869a57b7d2SSøren Schmidt   }
1879a57b7d2SSøren Schmidt   else {
1889a57b7d2SSøren Schmidt     VGLSetXY(object, xc, yc+y, color);
1899a57b7d2SSøren Schmidt     if (y!=0)
1909a57b7d2SSøren Schmidt       VGLSetXY(object, xc, yc-y, color);
1919a57b7d2SSøren Schmidt   }
1929a57b7d2SSøren Schmidt }
1939a57b7d2SSøren Schmidt 
1949a57b7d2SSøren Schmidt void
1959a57b7d2SSøren Schmidt VGLEllipse(VGLBitmap *object, int xc, int yc, int a, int b, byte color)
1969a57b7d2SSøren Schmidt {
1979a57b7d2SSøren Schmidt   int x = 0, y = b, asq = a*a, asq2 = a*a*2, bsq = b*b;
1989a57b7d2SSøren Schmidt   int bsq2 = b*b*2, d = bsq-asq*b+asq/4, dx = 0, dy = asq2*b;
1999a57b7d2SSøren Schmidt 
2009a57b7d2SSøren Schmidt   while (dx<dy) {
2019a57b7d2SSøren Schmidt     set4pixels(object, x, y, xc, yc, color);
2029a57b7d2SSøren Schmidt     if (d>0) {
2039a57b7d2SSøren Schmidt       y--; dy-=asq2; d-=dy;
2049a57b7d2SSøren Schmidt     }
2059a57b7d2SSøren Schmidt     x++; dx+=bsq2; d+=bsq+dx;
2069a57b7d2SSøren Schmidt   }
2079a57b7d2SSøren Schmidt   d+=(3*(asq-bsq)/2-(dx+dy))/2;
2089a57b7d2SSøren Schmidt   while (y>=0) {
2099a57b7d2SSøren Schmidt     set4pixels(object, x, y, xc, yc, color);
2109a57b7d2SSøren Schmidt     if (d<0) {
2119a57b7d2SSøren Schmidt       x++; dx+=bsq2; d+=dx;
2129a57b7d2SSøren Schmidt     }
2139a57b7d2SSøren Schmidt     y--; dy-=asq2; d+=asq-dy;
2149a57b7d2SSøren Schmidt   }
2159a57b7d2SSøren Schmidt }
2169a57b7d2SSøren Schmidt 
2179a57b7d2SSøren Schmidt void
2189a57b7d2SSøren Schmidt inline set2lines(VGLBitmap *object, int x, int y, int xc, int yc, byte color)
2199a57b7d2SSøren Schmidt {
2209a57b7d2SSøren Schmidt   if (x!=0) {
2219a57b7d2SSøren Schmidt     VGLLine(object, xc+x, yc+y, xc-x, yc+y, color);
2229a57b7d2SSøren Schmidt     if (y!=0)
2239a57b7d2SSøren Schmidt       VGLLine(object, xc+x, yc-y, xc-x, yc-y, color);
2249a57b7d2SSøren Schmidt   }
2259a57b7d2SSøren Schmidt   else {
2269a57b7d2SSøren Schmidt     VGLLine(object, xc, yc+y, xc, yc-y, color);
2279a57b7d2SSøren Schmidt   }
2289a57b7d2SSøren Schmidt }
2299a57b7d2SSøren Schmidt 
2309a57b7d2SSøren Schmidt void
2319a57b7d2SSøren Schmidt VGLFilledEllipse(VGLBitmap *object, int xc, int yc, int a, int b, byte color)
2329a57b7d2SSøren Schmidt {
2339a57b7d2SSøren Schmidt   int x = 0, y = b, asq = a*a, asq2 = a*a*2, bsq = b*b;
2349a57b7d2SSøren Schmidt   int bsq2 = b*b*2, d = bsq-asq*b+asq/4, dx = 0, dy = asq2*b;
2359a57b7d2SSøren Schmidt 
2369a57b7d2SSøren Schmidt   while (dx<dy) {
2379a57b7d2SSøren Schmidt     set2lines(object, x, y, xc, yc, color);
2389a57b7d2SSøren Schmidt     if (d>0) {
2399a57b7d2SSøren Schmidt       y--; dy-=asq2; d-=dy;
2409a57b7d2SSøren Schmidt     }
2419a57b7d2SSøren Schmidt     x++; dx+=bsq2; d+=bsq+dx;
2429a57b7d2SSøren Schmidt   }
2439a57b7d2SSøren Schmidt   d+=(3*(asq-bsq)/2-(dx+dy))/2;
2449a57b7d2SSøren Schmidt   while (y>=0) {
2459a57b7d2SSøren Schmidt     set2lines(object, x, y, xc, yc, color);
2469a57b7d2SSøren Schmidt     if (d<0) {
2479a57b7d2SSøren Schmidt       x++; dx+=bsq2; d+=dx;
2489a57b7d2SSøren Schmidt     }
2499a57b7d2SSøren Schmidt     y--; dy-=asq2; d+=asq-dy;
2509a57b7d2SSøren Schmidt   }
2519a57b7d2SSøren Schmidt }
2529a57b7d2SSøren Schmidt 
2539a57b7d2SSøren Schmidt void
2549a57b7d2SSøren Schmidt VGLClear(VGLBitmap *object, byte color)
2559a57b7d2SSøren Schmidt {
2565acf51eaSKazutaka YOKOTA   int offset;
2575acf51eaSKazutaka YOKOTA   int len;
2585acf51eaSKazutaka YOKOTA 
2599a57b7d2SSøren Schmidt   VGLCheckSwitch();
2609a57b7d2SSøren Schmidt   VGLMouseFreeze(0, 0, object->Xsize, object->Ysize, color);
2619a57b7d2SSøren Schmidt   switch (object->Type) {
2629a57b7d2SSøren Schmidt   case MEMBUF:
2639a57b7d2SSøren Schmidt   case VIDBUF8:
2645acf51eaSKazutaka YOKOTA     memset(object->Bitmap, color, object->VXsize*object->VYsize);
2659a57b7d2SSøren Schmidt     break;
2665acf51eaSKazutaka YOKOTA 
2675acf51eaSKazutaka YOKOTA   case VIDBUF8S:
2685acf51eaSKazutaka YOKOTA     for (offset = 0; offset < object->VXsize*object->VYsize; ) {
2695acf51eaSKazutaka YOKOTA       VGLSetSegment(offset);
2705acf51eaSKazutaka YOKOTA       len = min(object->VXsize*object->VYsize - offset,
2715acf51eaSKazutaka YOKOTA 		VGLAdpInfo.va_window_size);
2725acf51eaSKazutaka YOKOTA       memset(object->Bitmap, color, len);
2735acf51eaSKazutaka YOKOTA       offset += len;
2745acf51eaSKazutaka YOKOTA     }
2755acf51eaSKazutaka YOKOTA     break;
2765acf51eaSKazutaka YOKOTA 
2779a57b7d2SSøren Schmidt   case VIDBUF8X:
2789a57b7d2SSøren Schmidt     /* XXX works only for Xsize % 4 = 0 */
2795acf51eaSKazutaka YOKOTA     outb(0x3c6, 0xff);
2809a57b7d2SSøren Schmidt     outb(0x3c4, 0x02); outb(0x3c5, 0x0f);
2815acf51eaSKazutaka YOKOTA     memset(object->Bitmap, color, VGLAdpInfo.va_line_width*object->VYsize);
2829a57b7d2SSøren Schmidt     break;
2839a57b7d2SSøren Schmidt 
2849a57b7d2SSøren Schmidt   case VIDBUF4:
2855acf51eaSKazutaka YOKOTA   case VIDBUF4S:
2869a57b7d2SSøren Schmidt     /* XXX works only for Xsize % 8 = 0 */
2875acf51eaSKazutaka YOKOTA     outb(0x3c4, 0x02); outb(0x3c5, 0x0f);
2885acf51eaSKazutaka YOKOTA     outb(0x3ce, 0x05); outb(0x3cf, 0x02);		/* mode 2 */
2895acf51eaSKazutaka YOKOTA     outb(0x3ce, 0x01); outb(0x3cf, 0x00);		/* set/reset enable */
2905acf51eaSKazutaka YOKOTA     outb(0x3ce, 0x08); outb(0x3cf, 0xff);		/* bit mask */
2915acf51eaSKazutaka YOKOTA     for (offset = 0; offset < VGLAdpInfo.va_line_width*object->VYsize; ) {
2925acf51eaSKazutaka YOKOTA       VGLSetSegment(offset);
2935acf51eaSKazutaka YOKOTA       len = min(object->VXsize*object->VYsize - offset,
2945acf51eaSKazutaka YOKOTA 		VGLAdpInfo.va_window_size);
2955acf51eaSKazutaka YOKOTA       memset(object->Bitmap, color, len);
2965acf51eaSKazutaka YOKOTA       offset += len;
2975acf51eaSKazutaka YOKOTA     }
2985acf51eaSKazutaka YOKOTA     outb(0x3ce, 0x05); outb(0x3cf, 0x00);
2999a57b7d2SSøren Schmidt     break;
3009a57b7d2SSøren Schmidt   }
3019a57b7d2SSøren Schmidt   VGLMouseUnFreeze();
3029a57b7d2SSøren Schmidt }
3039a57b7d2SSøren Schmidt 
3049a57b7d2SSøren Schmidt void
3059a57b7d2SSøren Schmidt VGLRestorePalette()
3069a57b7d2SSøren Schmidt {
3079a57b7d2SSøren Schmidt   int i;
3089a57b7d2SSøren Schmidt 
3099a57b7d2SSøren Schmidt   outb(0x3C6, 0xFF);
3109a57b7d2SSøren Schmidt   inb(0x3DA);
3119a57b7d2SSøren Schmidt   outb(0x3C8, 0x00);
3129a57b7d2SSøren Schmidt   for (i=0; i<256; i++) {
3139a57b7d2SSøren Schmidt     outb(0x3C9, VGLSavePaletteRed[i]);
3149a57b7d2SSøren Schmidt     inb(0x84);
3159a57b7d2SSøren Schmidt     outb(0x3C9, VGLSavePaletteGreen[i]);
3169a57b7d2SSøren Schmidt     inb(0x84);
3179a57b7d2SSøren Schmidt     outb(0x3C9, VGLSavePaletteBlue[i]);
3189a57b7d2SSøren Schmidt     inb(0x84);
3199a57b7d2SSøren Schmidt   }
3209a57b7d2SSøren Schmidt   inb(0x3DA);
3219a57b7d2SSøren Schmidt   outb(0x3C0, 0x20);
3229a57b7d2SSøren Schmidt }
3239a57b7d2SSøren Schmidt 
3249a57b7d2SSøren Schmidt void
3259a57b7d2SSøren Schmidt VGLSavePalette()
3269a57b7d2SSøren Schmidt {
3279a57b7d2SSøren Schmidt   int i;
3289a57b7d2SSøren Schmidt 
3299a57b7d2SSøren Schmidt   outb(0x3C6, 0xFF);
3309a57b7d2SSøren Schmidt   inb(0x3DA);
3319a57b7d2SSøren Schmidt   outb(0x3C7, 0x00);
3329a57b7d2SSøren Schmidt   for (i=0; i<256; i++) {
3339a57b7d2SSøren Schmidt     VGLSavePaletteRed[i] = inb(0x3C9);
3349a57b7d2SSøren Schmidt     inb(0x84);
3359a57b7d2SSøren Schmidt     VGLSavePaletteGreen[i] = inb(0x3C9);
3369a57b7d2SSøren Schmidt     inb(0x84);
3379a57b7d2SSøren Schmidt     VGLSavePaletteBlue[i] = inb(0x3C9);
3389a57b7d2SSøren Schmidt     inb(0x84);
3399a57b7d2SSøren Schmidt   }
3409a57b7d2SSøren Schmidt   inb(0x3DA);
3419a57b7d2SSøren Schmidt   outb(0x3C0, 0x20);
3429a57b7d2SSøren Schmidt }
3439a57b7d2SSøren Schmidt 
3449a57b7d2SSøren Schmidt void
3459a57b7d2SSøren Schmidt VGLSetPalette(byte *red, byte *green, byte *blue)
3469a57b7d2SSøren Schmidt {
3479a57b7d2SSøren Schmidt   int i;
3489a57b7d2SSøren Schmidt 
3499a57b7d2SSøren Schmidt   for (i=0; i<256; i++) {
3509a57b7d2SSøren Schmidt     VGLSavePaletteRed[i] = red[i];
3519a57b7d2SSøren Schmidt     VGLSavePaletteGreen[i] = green[i];
3529a57b7d2SSøren Schmidt     VGLSavePaletteBlue[i] = blue[i];
3539a57b7d2SSøren Schmidt   }
3549a57b7d2SSøren Schmidt   VGLCheckSwitch();
3559a57b7d2SSøren Schmidt   outb(0x3C6, 0xFF);
3569a57b7d2SSøren Schmidt   inb(0x3DA);
3579a57b7d2SSøren Schmidt   outb(0x3C8, 0x00);
3589a57b7d2SSøren Schmidt   for (i=0; i<256; i++) {
3599a57b7d2SSøren Schmidt     outb(0x3C9, VGLSavePaletteRed[i]);
3609a57b7d2SSøren Schmidt     inb(0x84);
3619a57b7d2SSøren Schmidt     outb(0x3C9, VGLSavePaletteGreen[i]);
3629a57b7d2SSøren Schmidt     inb(0x84);
3639a57b7d2SSøren Schmidt     outb(0x3C9, VGLSavePaletteBlue[i]);
3649a57b7d2SSøren Schmidt     inb(0x84);
3659a57b7d2SSøren Schmidt   }
3669a57b7d2SSøren Schmidt   inb(0x3DA);
3679a57b7d2SSøren Schmidt   outb(0x3C0, 0x20);
3689a57b7d2SSøren Schmidt }
3699a57b7d2SSøren Schmidt 
3709a57b7d2SSøren Schmidt void
3719a57b7d2SSøren Schmidt VGLSetPaletteIndex(byte color, byte red, byte green, byte blue)
3729a57b7d2SSøren Schmidt {
3739a57b7d2SSøren Schmidt   VGLSavePaletteRed[color] = red;
3749a57b7d2SSøren Schmidt   VGLSavePaletteGreen[color] = green;
3759a57b7d2SSøren Schmidt   VGLSavePaletteBlue[color] = blue;
3769a57b7d2SSøren Schmidt   VGLCheckSwitch();
3779a57b7d2SSøren Schmidt   outb(0x3C6, 0xFF);
3789a57b7d2SSøren Schmidt   inb(0x3DA);
3799a57b7d2SSøren Schmidt   outb(0x3C8, color);
3809a57b7d2SSøren Schmidt   outb(0x3C9, red); outb(0x3C9, green); outb(0x3C9, blue);
3819a57b7d2SSøren Schmidt   inb(0x3DA);
3829a57b7d2SSøren Schmidt   outb(0x3C0, 0x20);
3839a57b7d2SSøren Schmidt }
3849a57b7d2SSøren Schmidt 
3859a57b7d2SSøren Schmidt void
3869a57b7d2SSøren Schmidt VGLSetBorder(byte color)
3879a57b7d2SSøren Schmidt {
3889a57b7d2SSøren Schmidt   VGLCheckSwitch();
3899a57b7d2SSøren Schmidt   inb(0x3DA);
3909a57b7d2SSøren Schmidt   outb(0x3C0,0x11); outb(0x3C0, color);
3919a57b7d2SSøren Schmidt   inb(0x3DA);
3929a57b7d2SSøren Schmidt   outb(0x3C0, 0x20);
3939a57b7d2SSøren Schmidt }
3949a57b7d2SSøren Schmidt 
3959a57b7d2SSøren Schmidt void
3969a57b7d2SSøren Schmidt VGLBlankDisplay(int blank)
3979a57b7d2SSøren Schmidt {
3989a57b7d2SSøren Schmidt   byte val;
3999a57b7d2SSøren Schmidt 
4009a57b7d2SSøren Schmidt   VGLCheckSwitch();
4019a57b7d2SSøren Schmidt   outb(0x3C4, 0x01); val = inb(0x3C5); outb(0x3C4, 0x01);
4029a57b7d2SSøren Schmidt   outb(0x3C5, ((blank) ? (val |= 0x20) : (val &= 0xDF)));
4039a57b7d2SSøren Schmidt }
404