initial hasty attempt at porting over my VBE code
[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 void *low_mem_buffer;
13
14 struct vbe_info *vbe_get_info(void)
15 {
16         struct vbe_info *info;
17         struct int86regs regs;
18
19         info = low_mem_buffer;
20
21         memcpy(info->sig, "VBE2", 4);
22
23         memset(&regs, 0, sizeof regs);
24         regs.es = (uint32_t)low_mem_buffer >> 4;
25         regs.eax = 0x4f00;
26         int86(0x10, &regs);
27
28         return info;
29 }
30
31 struct vbe_mode_info *vbe_get_mode_info(int mode)
32 {
33         struct vbe_mode_info *mi;
34         struct int86regs regs;
35
36         mi = low_mem_buffer;
37
38         memset(&regs, 0, sizeof regs);
39         regs.es = (uint32_t)low_mem_buffer >> 4;
40         regs.eax = 0x4f01;
41         regs.ecx = mode;
42         int86(0x10, &regs);
43
44         if(regs.eax & 0xff00) {
45                 return 0;
46         }
47
48         return mi;
49 }
50
51 int vbe_set_mode(int mode)
52 {
53         struct int86regs regs;
54
55         memset(&regs, 0, sizeof regs);
56         regs.eax = 0x4f02;
57         regs.ebx = mode;
58         int86(0x10, &regs);
59
60         if(regs.eax == 0x100) {
61                 return -1;
62         }
63         return 0;
64 }
65
66 void print_mode_info(struct vbe_mode_info *mi)
67 {
68         static unsigned int maskbits[] = {0, 1, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
69
70         printf("resolution: %dx%d\n", mi->xres, mi->yres);
71         printf("color depth: %d\n", mi->bpp);
72         printf("mode attributes: %x\n", mi->mode_attr);
73         printf("bytes per scanline: %d\n", mi->scanline_bytes);
74         printf("number of planes: %d\n", (int)mi->num_planes);
75         printf("number of banks: %d\n", (int)mi->num_banks);
76         printf("mem model: %d\n", (int)mi->mem_model);
77         printf("red bits: %d (mask: %x)\n", (int)mi->rmask_size, maskbits[mi->rmask_size] << mi->rpos);
78         printf("green bits: %d (mask: %x)\n", (int)mi->gmask_size, maskbits[mi->gmask_size] << mi->gpos);
79         printf("blue bits: %d (mask: %x)\n", (int)mi->bmask_size, maskbits[mi->bmask_size] << mi->bpos);
80         printf("framebuffer address: %x\n", (unsigned int)mi->fb_addr);
81 }