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