-/*\r
- * File: PALETTE.C\r
- * Purpose: This file contains routines for manipulating the VGA palette.\r
- */\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <conio.h>\r
-#include "palette.h"\r
-\r
-static void fadePalette(byte fade, byte start, word iter, byte *palette);\r
-static byte tmppal[PAL_SIZE];\r
-\r
-/* fade and flash */\r
-void\r
-fadeOn(word fade, byte *palette) {\r
- fadePalette(-fade, 64, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-fadeOff(word fade, byte *palette) {\r
- fadePalette(fade, 0, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-flashOn(word fade, byte *palette) {\r
- fadePalette(fade, -64, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-flashOff(word fade, byte *palette) {\r
- fadePalette(-fade, 0, 64/fade+1, palette);\r
-}\r
-\r
-\r
-static void\r
-fadePalette(byte fade, byte start, word iter, byte *palette) {\r
- word i;\r
- byte dim = start;\r
-\r
- /* handle the case where we just update */\r
- if(iter == 0) {\r
- palUpdate(palette);\r
- return;\r
- }\r
-\r
- while(iter > 0) { /* FadeLoop */\r
- for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */\r
- tmppal[i] = palette[i] - dim;\r
- if(tmppal[i] > 127) {\r
- tmppal[i] = 0;\r
- } else if(tmppal[i] > 63) {\r
- tmppal[i] = 63;\r
- }\r
- }\r
- palUpdate(tmppal);\r
- iter--;\r
- dim += fade;\r
- }\r
-}\r
-\r
-\r
-/* save and load */\r
-void\r
-palSave(byte *palette) {\r
- int i;\r
-\r
- outp(PEL_READ_REG, 0); /* start at palette entry 0 */\r
- for(i=0; i<PAL_SIZE; i++) {\r
- palette[i] = inp(PEL_DATA_REG); /* read the palette data */\r
- }\r
-}\r
-\r
-\r
-byte *\r
-newPal() {\r
- byte *ptr;\r
- ptr = malloc(PAL_SIZE);\r
-\r
- /* handle errors */\r
- if(!ptr) {\r
- printf("Could not allocate palette.\n");\r
- exit(-1);\r
- }\r
-\r
- return ptr;\r
-}\r
-\r
-\r
-void\r
-loadPaletteFile(byte *filename, byte **palette) {\r
- FILE *file;\r
- byte *ptr;\r
-\r
- /* free the palette if it exists */\r
- if(*palette) {\r
- free(*palette);\r
- }\r
-\r
- /* allocate the new palette */\r
- *palette = newPal();\r
-\r
- /* open the file */\r
- file = fopen(filename, "rb");\r
- if(!file) {\r
- printf("Could not open palette file: %s\n", filename);\r
- exit(-2);\r
- }\r
-\r
- /* read the file */\r
- ptr = *palette;\r
- while(!feof(file)) {\r
- *ptr++ = fgetc(file);\r
- }\r
-\r
- fclose(file);\r
-}\r
-\r
-\r
-/* blanking */\r
-void\r
-palBlack() {\r
- fadePalette(-1, 64, 1, tmppal);\r
-}\r
-\r
-\r
-void\r
-palWhite() {\r
- fadePalette(-1, -64, 1, tmppal);\r
-}\r
-\r
-\r
-/* utility */\r
-void\r
-palUpdate(byte *p) {\r
- int i;\r
- waitborder();\r
- outp(PEL_WRITE_REG, 0); /* start at the beginning of palette */\r
- for(i=0; i<PAL_SIZE/2; i++) {\r
- outp(PEL_DATA_REG, p[i]);\r
- }\r
- waitborder(); /* waits one retrace -- less flicker */\r
- for(i=PAL_SIZE/2; i<PAL_SIZE; i++) {\r
- outp(PEL_DATA_REG, p[i]);\r
- }\r
-}\r
-\r
-\r
-void\r
-waitborder() {\r
- while(inp(INPUT_STATUS_1) & 8) {\r
- /* spin */\r
- }\r
-\r
- while(!(inp(INPUT_STATUS_1) & 8)) {\r
- /* spin */\r
- }\r
-}\r