fixed VBE bugs
[bootcensus] / src / test / vbetest.c
1 #include <stdio.h>
2 #include <string.h>
3 #include "video.h"
4 #include "asmops.h"
5 #include "keyb.h"
6 #include "contty.h"
7
8 static uint16_t *framebuf;
9
10 int vbetest(void)
11 {
12         int i, j, nmodes;
13         struct video_mode vi;
14         uint16_t *fbptr;
15
16         nmodes = video_mode_count();
17         printf("%d video modes found:\n", nmodes);
18         for(i=0; i<nmodes; i++) {
19                 if(video_mode_info(i, &vi) == -1) {
20                         continue;
21                 }
22                 printf(" %04x: %dx%d %d bpp", vi.mode, vi.width, vi.height, vi.bpp);
23                 if(vi.bpp > 8) {
24                         printf(" (%d%d%d)\n", vi.rbits, vi.gbits, vi.bbits);
25                 } else {
26                         putchar('\n');
27                 }
28         }
29
30         if(!(framebuf = set_video_mode(find_video_mode(640, 480, 16)))) {
31                 return -1;
32         }
33         get_color_bits(&vi.rbits, &vi.gbits, &vi.bbits);
34         get_color_shift(&vi.rshift, &vi.gshift, &vi.bshift);
35         get_color_mask(&vi.rmask, &vi.gmask, &vi.bmask);
36
37         fbptr = framebuf;
38         for(i=0; i<480; i++) {
39                 for(j=0; j<640; j++) {
40                         int xor = i^j;
41                         uint16_t r = xor & 0xff;
42                         uint16_t g = (xor << 1) & 0xff;
43                         uint16_t b = (xor << 2) & 0xff;
44
45                         r >>= 8 - vi.rbits;
46                         g >>= 8 - vi.gbits;
47                         b >>= 8 - vi.bbits;
48
49                         *fbptr++ = ((r << vi.rshift) & vi.rmask) | ((g << vi.gshift) & vi.gmask) |
50                                 ((b << vi.bshift) & vi.bmask);
51                 }
52         }
53
54         while(kb_getkey() != -1);
55         while(kb_getkey() == -1) {
56                 halt_cpu();
57         }
58
59         set_vga_mode(3);
60         con_clear();
61         return 0;
62 }