fixed VBE bugs
[bootcensus] / src / vbe.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <inttypes.h>
4 #include "vbe.h"
5 #include "asmops.h"
6 #include "int86.h"
7
8 #define SEG_ADDR(s)     ((uint32_t)(s) << 4)
9
10 #define MODE_LFB        (1 << 14)
11
12 extern unsigned char low_mem_buffer[];
13
14 struct vbe_info *vbe_get_info(void)
15 {
16         struct vbe_info *info;
17         struct int86regs regs;
18
19         printf("vbe_get_info... ");
20
21         info = (struct vbe_info*)low_mem_buffer;
22
23         memcpy(info->sig, "VBE2", 4);
24
25         memset(&regs, 0, sizeof regs);
26         regs.es = (uint32_t)info >> 4;
27         regs.eax = 0x4f00;
28         int86(0x10, &regs);
29
30         printf("status: %d\n", (regs.eax >> 8) & 0xff);
31
32         if((regs.eax & 0xffff) != 0x4f) {
33                 return 0;
34         }
35
36         return info;
37 }
38
39 struct vbe_mode_info *vbe_get_mode_info(int mode)
40 {
41         struct vbe_mode_info *mi;
42         struct int86regs regs;
43
44         mi = (struct vbe_mode_info*)(low_mem_buffer + 512);
45
46         memset(&regs, 0, sizeof regs);
47         regs.es = (uint32_t)mi >> 4;
48         regs.eax = 0x4f01;
49         regs.ecx = mode;
50         int86(0x10, &regs);
51
52         if((regs.eax & 0xffff) != 0x4f) {
53                 return 0;
54         }
55
56         return mi;
57 }
58
59 int vbe_set_mode(int mode)
60 {
61         struct int86regs regs;
62
63         memset(&regs, 0, sizeof regs);
64         regs.eax = 0x4f02;
65         regs.ebx = mode;
66         int86(0x10, &regs);
67
68         if(regs.eax == 0x100) {
69                 return -1;
70         }
71         return 0;
72 }
73
74 void print_mode_info(struct vbe_mode_info *mi)
75 {
76         static unsigned int maskbits[] = {0, 1, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
77
78         printf("resolution: %dx%d\n", mi->xres, mi->yres);
79         printf("color depth: %d\n", mi->bpp);
80         printf("mode attributes: %x\n", mi->mode_attr);
81         printf("bytes per scanline: %d\n", mi->scanline_bytes);
82         printf("number of planes: %d\n", (int)mi->num_planes);
83         printf("number of banks: %d\n", (int)mi->num_banks);
84         printf("mem model: %d\n", (int)mi->mem_model);
85         printf("red bits: %d (mask: %x)\n", (int)mi->rmask_size, maskbits[mi->rmask_size] << mi->rpos);
86         printf("green bits: %d (mask: %x)\n", (int)mi->gmask_size, maskbits[mi->gmask_size] << mi->gpos);
87         printf("blue bits: %d (mask: %x)\n", (int)mi->bmask_size, maskbits[mi->bmask_size] << mi->bpos);
88         printf("framebuffer address: %x\n", (unsigned int)mi->fb_addr);
89 }