jwg@duke.UUCP (Jeffrey William Gillette) (06/22/86)
[] One of the nicest features of the Enhanced Graphics Adapter is the ability to change the colors displayed. The 16 pallette registers can be loaded with arbitrary values from a selection of 64 colors. I have not seen a program to redefine the pallette registers, so I am posting the one I wrote. It is written for the Microsoft C Compiler (v. 3.0), but should work with minor modifications on others. 'Pallette' displays the default EGA pallette register settings. One moves between registers with the left and right arrow keys. The pallette values are stepped up or down with the up and down arrow keys. Escape terminates the program. Note that the next program which does a mode reset will reset the pallette registers also. Jeffrey William Gillette The Divinity School Duke University uucp: duke!phys!lisa bitnet: DYBBUK at TUCCVM -------------------------- PALLETTE.C ------------------------- /* PALLETTE.C Jeffrey William Gillette Duke University Pallette displays the default settings for the pallette registers used by the Enhanced Graphics Adapter. It then allows one to change these settings by using the left and right arrow keys to move between registers, and the up and down arrow keys to step up or down the pallette attribute. Esc quits Pallette. This program is in the public domain, and may be copied and used freely. */ #include <stdio.h> #include <dos.h> /* Placement of pallette ruler on screen */ #define ROW 11 #define COL 1 #define VIDSEG 0xb8000000 /* ANSI escape codes */ #define SETCURSOR "\033[%d;%dH" #define CLEARSCREEN "\033[2J" #define CURSOR '\030' /* Default pallette register values (from EGA BIOS) */ int value[16] = { 0, 1, 2, 3, 4, 5, 0x14, 7, 0x38, 0x39, 0x3a, 0x3b, 0x3c,0x3d, 0x3e, 0x3f } ; /* Pallette ruler line (chars & attributes */ char ruler[] = { ' ', 0,' ', 0,'0', 0,' ', 0, ' ', 1,' ', 1,'1', 1,' ', 1, ' ', 2,' ', 2,'2', 2,' ', 2, ' ', 3,' ', 3,'3', 3,' ', 3, ' ', 4,' ', 4,'4', 4,' ', 4, ' ', 5,' ', 5,'5', 5,' ', 5, ' ', 6,' ', 6,'6', 6,' ', 6, ' ', 7,' ', 7,'7', 7,' ', 7, ' ', 8,' ', 8,'8', 8,' ', 8, ' ', 9,' ', 9,'9', 9,' ', 9, ' ', 10,'1',10,'0', 10,' ', 10, ' ', 11,'1',11,'1', 11,' ', 11, ' ', 12,'1',12,'2', 12,' ', 12, ' ', 13,'1',13,'3', 13,' ', 13, ' ', 14,'1',14,'4', 14,' ', 14, ' ', 15,'1',15,'5', 15,' ', 15 } ; main() { int i; int regster = 0; unsigned char c; printf(CLEARSCREEN); putruler(); for (i = 0; i < 16; i++) /* Initialize registers */ putval(i); for (;;) { putval(regster); put_cursor(regster,CURSOR); /* Turn cursor on */ if ((c = getch()) == 27) break; put_cursor(regster,' '); /* Turn cursor off */ if (!c) switch (c = getch() ) { case 0x4b: /* Left arrow - regster */ regster = (regster +15) % 16; break; case 0x4d: /* Right arrow - regster */ regster = (regster +1) % 16; break; case 0x48: /* Up arrow - value */ value[regster] = (value[regster] + 1) % 64; break; case 0x50: /* Down arrow - value */ value[regster] = (value[regster] + 63) % 64; break; } } printf("\n\n"); exit(0); } /* Modify the value of a pallette register */ putval(reg) int reg; /* # of pallette register to modify */ { union REGS ireg; /* Set pallette register - via EGA BIOS call */ ireg.x.ax = 0x1000; /* Function 10h */ ireg.h.bl = reg; /* register # */ ireg.h.bh = value[reg]; /* irgb value */ int86(0x10,&ireg,&ireg); /* Update screen with new value */ printf(SETCURSOR, ROW + 3, COL + (reg * 4) + 2); printf("%2d",value[reg]); } put_cursor(reg,code) int reg,code; { printf(SETCURSOR, ROW + 2, COL + (reg * 4) + 3); putchar(code); } /* Write ruler line to screen - do it directly */ putruler() { char far *scrnbuf; char *p; int i; scrnbuf = (char far *)VIDSEG + (ROW * 160) + (COL * 2); /* Move pallette ruler to screen */ for (p = ruler,i = 0; i < 16 * 8; i++) *scrnbuf++ = *p++; } -- Jeffrey William Gillette uucp: mcnc!duke!phys!lisa The Divinity School bitnet: DYBBUK @ TUCCVM Duke University