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