1 /* From VGAlib, changed for svgalib */
2 /* partially copyrighted (C) 1993 by Hartmut Schirmer */
3
4
5 #include <stdio.h>
6 #include <unistd.h> /* for usleep( long ) */
7 #include <string.h>
8 #include "vga.h"
9
10 static unsigned char line[2048 * 3];
11
testmode(int mode)12 static void testmode(int mode)
13 {
14 int xmax, ymax, i, x, y, yw, ys, c;
15 vga_modeinfo *modeinfo;
16
17 vga_setmode(mode);
18
19 modeinfo = vga_getmodeinfo(mode);
20
21 printf("Width: %d Height: %d Colors: %d\n",
22 modeinfo->width,
23 modeinfo->height,
24 modeinfo->colors);
25 printf("DisplayStartRange: %xh Maxpixels: %d Blit: %s\n",
26 modeinfo->startaddressrange,
27 modeinfo->maxpixels,
28 modeinfo->haveblit ? "YES" : "NO");
29
30 #ifdef TEST_MODEX
31 if (modeinfo->colors == 256)
32 printf("Switching to ModeX ... %s\n",
33 (vga_setmodeX()? "done" : "failed"));
34 #endif
35
36 vga_screenoff();
37
38 xmax = vga_getxdim() - 1;
39 ymax = vga_getydim() - 1;
40
41 vga_setcolor(vga_white());
42 vga_drawline(0, 0, xmax, 0);
43 vga_drawline(xmax, 0, xmax, ymax);
44 vga_drawline(xmax, ymax, 0, ymax);
45 vga_drawline(0, ymax, 0, 0);
46
47 for (i = 0; i <= 15; i++) {
48 vga_setegacolor(i);
49 vga_drawline(10 + i * 5, 10, 90 + i * 5, 90);
50 }
51 for (i = 0; i <= 15; i++) {
52 vga_setegacolor(i);
53 vga_drawline(90 + i * 5, 10, 10 + i * 5, 90);
54 }
55
56 vga_screenon();
57
58 ys = 100;
59 yw = (ymax - 100) / 4;
60 switch (vga_getcolors()) {
61 case 256:
62 for (i = 0; i < 60; ++i) {
63 c = (i * 64) / 60;
64 vga_setpalette(i + 16, c, c, c);
65 vga_setpalette(i + 16 + 60, c, 0, 0);
66 vga_setpalette(i + 16 + (2 * 60), 0, c, 0);
67 vga_setpalette(i + 16 + (3 * 60), 0, 0, c);
68 }
69 line[0] = line[xmax] = 15;
70 line[1] = line[xmax - 1] = 0;
71 for (x = 2; x < xmax - 1; ++x)
72 line[x] = (((x - 2) * 60) / (xmax - 3)) + 16;
73 for (y = ys; y < ys + yw; ++y) /* gray */
74 vga_drawscanline(y, line);
75 for (x = 2; x < xmax - 1; ++x)
76 line[x] += 60;
77 ys += yw;
78 for (y = ys; y < ys + yw; ++y) /* red */
79 vga_drawscanline(y, line);
80 for (x = 2; x < xmax - 1; ++x)
81 line[x] += 60;
82 ys += yw;
83 for (y = ys; y < ys + yw; ++y) /* green */
84 vga_drawscanline(y, line);
85 for (x = 2; x < xmax - 1; ++x)
86 line[x] += 60;
87 ys += yw;
88 for (y = ys; y < ys + yw; ++y) /* blue */
89 vga_drawscanline(y, line);
90 break;
91
92 case 1 << 15:
93 case 1 << 16:
94 case 1 << 24:
95 for (x = 2; x < xmax - 1; ++x) {
96 c = ((x - 2) * 256) / (xmax - 3);
97 y = ys;
98 vga_setrgbcolor(c, c, c);
99 vga_drawline(x, y, x, y + yw - 1);
100 y += yw;
101 vga_setrgbcolor(c, 0, 0);
102 vga_drawline(x, y, x, y + yw - 1);
103 y += yw;
104 vga_setrgbcolor(0, c, 0);
105 vga_drawline(x, y, x, y + yw - 1);
106 y += yw;
107 vga_setrgbcolor(0, 0, c);
108 vga_drawline(x, y, x, y + yw - 1);
109 }
110 for (x = 0; x < 64; x++) {
111 for (y = 0; y < 64; y++) {
112 vga_setrgbcolor(x * 4 + 3, y * 4 + 3, 0);
113 vga_drawpixel(xmax / 2 - 160 + x, y + ymax / 2 - 80);
114 vga_setrgbcolor(x * 4 + 3, 0, y * 4 + 3);
115 vga_drawpixel(xmax / 2 - 32 + x, y + ymax / 2 - 80);
116 vga_setrgbcolor(0, x * 4 + 3, y * 4 + 3);
117 vga_drawpixel(xmax / 2 + 160 - 64 + x, y + ymax / 2 - 80);
118
119 vga_setrgbcolor(x * 4 + 3, y * 4 + 3, 255);
120 vga_drawpixel(xmax / 2 - 160 + x, y + ymax / 2 + 16);
121 vga_setrgbcolor(x * 4 + 3, 255, y * 4 + 3);
122 vga_drawpixel(xmax / 2 - 32 + x, y + ymax / 2 + 16);
123 vga_setrgbcolor(255, x * 4 + 3, y * 4 + 3);
124 vga_drawpixel(xmax / 2 + 160 - 64 + x, y + ymax / 2 + 16);
125 }
126 }
127 break;
128 default:
129 if (vga_getcolors() == 16) {
130 for (i = 0; i < xmax - 1; i++)
131 line[i] = (i + 2) % 16;
132 line[0] = line[xmax] = 15;
133 line[1] = line[xmax - 1] = 0;
134 }
135 if (vga_getcolors() == 2) {
136 for (i = 0; i <= xmax; i++)
137 line[i] = 0x11;
138 line[0] = 0x91;
139 }
140 for (i = 100; i < ymax - 1; i++)
141 vga_drawscanline(i, line);
142 break;
143
144 }
145
146 if (getchar() == 'd')
147 vga_dumpregs();
148
149 vga_setmode(TEXT);
150 }
151
main(void)152 int main(void)
153 {
154 int mode;
155 int i, high;
156
157 vga_init(); /* Initialize. */
158
159 mode = -1;
160 #if 0 /* Prompt is more useful. */
161 mode = vga_getdefaultmode();
162 #endif
163
164 if (mode == -1) {
165 printf("Choose one of the following video modes: \n");
166
167 high = 0;
168 for (i = 1; i <= vga_lastmodenumber(); i++)
169 if (vga_hasmode(i)) {
170 vga_modeinfo *info;
171 char expl[100];
172 char *cols = NULL;
173
174 *expl = '\0';
175 info = vga_getmodeinfo(i);
176 switch (info->colors) {
177 case 2:
178 cols = "2";
179 strcpy(expl, "1 bitplane, monochrome");
180 break;
181 case 16:
182 cols = "16";
183 strcpy(expl, "4 bitplanes");
184 break;
185 case 256:
186 if (i == G320x200x256)
187 strcpy(expl, "packed-pixel");
188 else if (i == G320x240x256
189 || i == G320x400x256
190 || i == G360x480x256)
191 strcpy(expl, "Mode X");
192 else
193 strcpy(expl,
194 "packed-pixel, banked");
195 break;
196 case 1 << 15:
197 cols = "32K";
198 strcpy(expl, "5-5-5 RGB, blue at LSB, banked");
199 break;
200 case 1 << 16:
201 cols = "64K";
202 strcpy(expl, "5-6-5 RGB, blue at LSB, banked");
203 break;
204 case 1 << 24:
205 cols = "16M";
206 if (info->bytesperpixel == 3) {
207 if (info->flags & RGB_MISORDERED)
208 strcpy(expl, "8-8-8 BGR, red byte first, banked");
209 else
210 strcpy(expl, "8-8-8 RGB, blue byte first, banked");
211 } else if (info->flags & RGB_MISORDERED)
212 strcpy(expl, "8-8-8 RGBX, 32-bit pixels, X byte first, banked");
213 else
214 strcpy(expl, "8-8-8 XRGB, 32-bit pixels, blue byte first, banked");
215 break;
216 }
217 if (info->flags & IS_INTERLACED) {
218 if (*expl != '\0')
219 strcat(expl, ", ");
220 strcat(expl, "interlaced");
221 }
222 if (info->flags & IS_DYNAMICMODE) {
223 if (*expl != '\0')
224 strcat(expl, ", ");
225 strcat(expl, "dynamically loaded");
226 }
227 high = i;
228 printf("%5d: %dx%d, ",
229 i, info->width, info->height);
230 if (cols == NULL)
231 printf("%d", info->colors);
232 else
233 printf("%s", cols);
234 printf(" colors ");
235 if (*expl != '\0')
236 printf("(%s)", expl);
237 printf("\n");
238 }
239 printf("Enter mode number (1-%d): ", high);
240 scanf("%d", &mode);
241 getchar();
242 printf("\n");
243
244 if (mode < 1 || mode > GLASTMODE) {
245 printf("Error: Mode number out of range \n");
246 exit(-1);
247 }
248 }
249 if (vga_hasmode(mode))
250 testmode(mode);
251 else {
252 printf("Error: Video mode not supported by driver\n");
253 exit(-1);
254 }
255 }
256