OSDN Git Service

cleaned up and made fade.exe work correctly!
[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 fadeOffHalf(word fade, byte *palette) {\r
28         fadePaletteHalf(fade, 0, 64/fade+1, palette);\r
29 }\r
30 \r
31 \r
32 void\r
33 flashOn(word fade, byte *palette) {\r
34     fadePalette(fade, -64, 64/fade+1, palette);\r
35 }\r
36 \r
37 \r
38 void\r
39 flashOff(word fade, byte *palette) {\r
40     fadePalette(-fade, 0, 64/fade+1, palette);\r
41 }\r
42 \r
43 \r
44 static void\r
45 fadePalette(byte fade, byte start, word iter, byte *palette) {\r
46     word i;\r
47     byte dim = start;\r
48 \r
49     /* handle the case where we just update */\r
50     if(iter == 0) {\r
51         palUpdate(palette);\r
52         return;\r
53     }\r
54 \r
55     while(iter > 0) {  /* FadeLoop */\r
56         for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */\r
57             tmppal[i] = palette[i] - dim;\r
58             if(tmppal[i] > 127) {\r
59                 tmppal[i] = 0;\r
60             } else if(tmppal[i] > 63) {\r
61                 tmppal[i] = 63;\r
62             }\r
63         }\r
64         palUpdate(tmppal);\r
65         iter--;\r
66         dim += fade;\r
67     }\r
68 }\r
69 \r
70 static void\r
71 fadePaletteHalf(byte fade, byte start, word iter, byte *palette) {\r
72     word i;\r
73     byte dim = start;\r
74 \r
75     /* handle the case where we just update */\r
76     if(iter == 0) {\r
77         palUpdate(palette);\r
78         return;\r
79     }\r
80 \r
81     while(iter > iter/2) {  /* FadeLoop */\r
82         for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */\r
83             tmppal[i] = palette[i] - dim;\r
84             if(tmppal[i] > 127) {\r
85                 tmppal[i] = 0;\r
86             } else if(tmppal[i] > 63) {\r
87                 tmppal[i] = 63;\r
88             }\r
89         }\r
90         palUpdate(tmppal);\r
91         iter--;\r
92         dim += fade;\r
93     }\r
94 }\r
95 \r
96 /* save and load */\r
97 void\r
98 palSave(byte *palette) {\r
99     int  i;\r
100 \r
101     outp(PEL_READ_REG, 0);      /* start at palette entry 0 */\r
102     for(i=0; i<PAL_SIZE; i++) {\r
103         palette[i] = inp(PEL_DATA_REG); /* read the palette data */\r
104     }\r
105 }\r
106 \r
107 \r
108 byte *\r
109 newPal() {\r
110     byte *ptr;\r
111     ptr = malloc(PAL_SIZE);\r
112 \r
113     /* handle errors */\r
114     if(!ptr) {\r
115         printf("Could not allocate palette.\n");\r
116         exit(-1);\r
117     }\r
118 \r
119     return ptr;\r
120 }\r
121 \r
122 \r
123 void\r
124 loadPaletteFile(byte *filename, byte **palette) {\r
125     FILE *file;\r
126     byte *ptr;\r
127 \r
128     /* free the palette if it exists */\r
129     if(*palette) {\r
130         free(*palette);\r
131     }\r
132 \r
133     /* allocate the new palette */\r
134     *palette = newPal();\r
135 \r
136     /* open the file */\r
137     file = fopen(filename, "rb");\r
138     if(!file) {\r
139         printf("Could not open palette file: %s\n", filename);\r
140         exit(-2);\r
141     }\r
142 \r
143     /* read the file */\r
144     ptr = *palette;\r
145     while(!feof(file)) {\r
146         *ptr++ = fgetc(file);\r
147     }\r
148 \r
149     fclose(file);\r
150 }\r
151 \r
152 \r
153 /* blanking */\r
154 void\r
155 palBlack() {\r
156     fadePalette(-1, 64, 1, tmppal);\r
157 }\r
158 \r
159 \r
160 void\r
161 palWhite() {\r
162     fadePalette(-1, -64, 1, tmppal);\r
163 }\r
164 \r
165 \r
166 /* utility */\r
167 void\r
168 palUpdate(byte *p) {\r
169     int i;\r
170     waitborder();\r
171     outp(PEL_WRITE_REG, 0);  /* start at the beginning of palette */\r
172     for(i=0; i<PAL_SIZE/2; i++) {\r
173         outp(PEL_DATA_REG, p[i]);\r
174     }\r
175     waitborder();           /* waits one retrace -- less flicker */\r
176     for(i=PAL_SIZE/2; i<PAL_SIZE; i++) {\r
177         outp(PEL_DATA_REG, p[i]);\r
178     }\r
179 }\r
180 \r
181 \r
182 void\r
183 waitborder() {\r
184     while(inp(INPUT_STATUS_1)  & 8)  {\r
185         /* spin */\r
186     }\r
187 \r
188     while(!(inp(INPUT_STATUS_1)  & 8))  {\r
189         /* spin */\r
190     }\r
191 }\r