OSDN Git Service

checking concistancy and fade.exe remade!
[proj16/16.git] / 16 / 16 / SCRC / PALETTE.C
1 /*\r
2  * File: PALETTE.C\r
3  * Purpose: This file contains routines for manipulating the VGA palette.\r
4  */\r
5 #include <stdio.h>\r
6 #include <stdlib.h>\r
7 #include <conio.h>\r
8 #include "palette.h"\r
9 \r
10 static void fadePalette(byte fade, byte start, word iter, byte *palette);\r
11 static byte tmppal[PAL_SIZE];\r
12 \r
13 /* fade and flash */\r
14 void\r
15 fadeOn(word fade, byte *palette) {\r
16     fadePalette(-fade, 64, 64/fade+1, palette);\r
17 }\r
18 \r
19 \r
20 void\r
21 fadeOff(word fade, byte *palette) {\r
22     fadePalette(fade, 0, 64/fade+1, palette);\r
23 }\r
24 \r
25 \r
26 void\r
27 flashOn(word fade, byte *palette) {\r
28     fadePalette(fade, -64, 64/fade+1, palette);\r
29 }\r
30 \r
31 \r
32 void\r
33 flashOff(word fade, byte *palette) {\r
34     fadePalette(-fade, 0, 64/fade+1, palette);\r
35 }\r
36 \r
37 \r
38 static void\r
39 fadePalette(byte fade, byte start, word iter, byte *palette) {\r
40     word i;\r
41     byte dim = start;\r
42 \r
43     /* handle the case where we just update */\r
44     if(iter == 0) {\r
45         palUpdate(palette);\r
46         return;\r
47     }\r
48 \r
49     while(iter > 0) {  /* FadeLoop */\r
50         for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */\r
51             tmppal[i] = palette[i] - dim;\r
52             if(tmppal[i] > 127) {\r
53                 tmppal[i] = 0;\r
54             } else if(tmppal[i] > 63) {\r
55                 tmppal[i] = 63;\r
56             }\r
57         }\r
58         palUpdate(tmppal);\r
59         iter--;\r
60         dim += fade;\r
61     }\r
62 }\r
63 \r
64 \r
65 /* save and load */\r
66 void\r
67 palSave(byte *palette) {\r
68     int  i;\r
69 \r
70     outp(PEL_READ_REG, 0);      /* start at palette entry 0 */\r
71     for(i=0; i<PAL_SIZE; i++) {\r
72         palette[i] = inp(PEL_DATA_REG); /* read the palette data */\r
73     }\r
74 }\r
75 \r
76 \r
77 byte *\r
78 newPal() {\r
79     byte *ptr;\r
80     ptr = malloc(PAL_SIZE);\r
81 \r
82     /* handle errors */\r
83     if(!ptr) {\r
84         printf("Could not allocate palette.\n");\r
85         exit(-1);\r
86     }\r
87 \r
88     return ptr;\r
89 }\r
90 \r
91 \r
92 void\r
93 loadPaletteFile(byte *filename, byte **palette) {\r
94     FILE *file;\r
95     byte *ptr;\r
96 \r
97     /* free the palette if it exists */\r
98     if(*palette) {\r
99         free(*palette);\r
100     }\r
101 \r
102     /* allocate the new palette */\r
103     *palette = newPal();\r
104 \r
105     /* open the file */\r
106     file = fopen(filename, "rb");\r
107     if(!file) {\r
108         printf("Could not open palette file: %s\n", filename);\r
109         exit(-2);\r
110     }\r
111 \r
112     /* read the file */\r
113     ptr = *palette;\r
114     while(!feof(file)) {\r
115         *ptr++ = fgetc(file);\r
116     }\r
117 \r
118     fclose(file);\r
119 }\r
120 \r
121 \r
122 /* blanking */\r
123 void\r
124 palBlack() {\r
125     fadePalette(-1, 64, 1, tmppal);\r
126 }\r
127 \r
128 \r
129 void\r
130 palWhite() {\r
131     fadePalette(-1, -64, 1, tmppal);\r
132 }\r
133 \r
134 \r
135 /* utility */\r
136 void\r
137 palUpdate(byte *p) {\r
138     int i;\r
139     waitborder();\r
140     outp(PEL_WRITE_REG, 0);  /* start at the beginning of palette */\r
141     for(i=0; i<PAL_SIZE/2; i++) {\r
142         outp(PEL_DATA_REG, p[i]);\r
143     }\r
144     waitborder();           /* waits one retrace -- less flicker */\r
145     for(i=PAL_SIZE/2; i<PAL_SIZE; i++) {\r
146         outp(PEL_DATA_REG, p[i]);\r
147     }\r
148 }\r
149 \r
150 \r
151 void\r
152 waitborder() {\r
153     while(inp(INPUT_STATUS_1)  & 8)  {\r
154         /* spin */\r
155     }\r
156 \r
157     while(!(inp(INPUT_STATUS_1)  & 8))  {\r
158         /* spin */\r
159     }\r
160 }\r