1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
//http://wiki.osdev.org/GUI
#include "kernel.h"
typedef struct vbeinfo_struct{
char VbeSignature[4]; // == "VESA"
uint16_t VbeVersion; // == 0x0300 for VBE 3.0
uint16_t OemStringPtr[2]; // isa vbeFarPtr
uint8_t Capabilities[4];
uint16_t VideoModePtr[2]; // isa vbeFarPtr
uint16_t TotalMemory; // as # of 64KB blocks
}vbeinfo;
typedef struct ModeInfoBlock {
uint16_t attributes;
uint8_t winA,winB;
uint16_t granularity;
uint16_t winsize;
uint16_t segmentA, segmentB;
uint16_t realFctPtr[2];
// VBE_FAR(realFctPtr);
uint16_t pitch; // bytes per scanline
uint16_t Xres, Yres;
uint8_t Wchar, Ychar, planes, bpp, banks;
uint8_t memory_model, bank_size, image_pages;
uint8_t reserved0;
uint8_t red_mask, red_position;
uint8_t green_mask, green_position;
uint8_t blue_mask, blue_position;
uint8_t rsv_mask, rsv_position;
uint8_t directcolor_attributes;
uint32_t physbase; // your LFB (Linear Framebuffer) address ;)
uint32_t reserved1;
uint16_t reserved2;
}vbemodeinfo;
static vbemodeinfo *VbeModeInfoBlock;
void vesa_init(vbeinfo *info,vbemodeinfo *mode)
{
int i=0;
// while(info[i].VbeSignature[0]=='V')
// {
scr_put_string("vesa: init vbe version: ");
scr_put_hex(info[i].VbeVersion);
scr_put_string(" / videomode ptr: ");
scr_put_hex(info[i].VideoModePtr[0]);
scr_put_hex(info[i].VideoModePtr[1]);
scr_put_string_nl("");
// i++;
// }
//
int *modeptr=info[i].VideoModePtr[0]; // 0x8322; // do not hardcode !!! take from vbeinfo!
while(*modeptr!=0xffff&&*modeptr!=0)
{
scr_put_string("vesa: mode supported: ");
scr_put_hex(*modeptr);
scr_put_string_nl("");
modeptr++;
}
scr_put_string("vesa: selected mode res: ");
scr_put_hex(mode->Xres);
scr_put_string(" x ");
scr_put_hex(mode->Yres);
scr_put_string_nl("");
scr_put_string("vesa: selected mode banks: ");
scr_put_hex(mode->banks);
scr_put_string_nl("");
scr_put_string("vesa: attribs: ");
scr_put_hex(mode->attributes);
scr_put_string_nl("");
scr_put_string("vesa: physbase: ");
scr_put_hex32(mode->physbase);
scr_put_string_nl("");
scr_put_string("vesa: bpp: ");
scr_put_hex(mode->bpp);
scr_put_string_nl("");
/*
uint8_t *videomem=mode->physbase;
for(i=0;i<0xffffff;i++)
{
videomem[i]=i;
}
*/
VbeModeInfoBlock=mode;
}
void PutPixel(int x,int y, int color){
//do not write memory outside the screen buffer, check parameters against the VBE mode info
if (x<0 || x>VbeModeInfoBlock->Xres|| y<0 || y>VbeModeInfoBlock->Yres) return;
//
if (x) x = (x*(VbeModeInfoBlock->bpp>>3)); // get bytes (divide by 8)
if (y) y = (y*VbeModeInfoBlock->pitch);
uint8_t *cTemp=VbeModeInfoBlock->physbase;
cTemp[x+y] = (uint8_t)(color & 0xff);
cTemp[x+y+1] = (uint8_t)((color>>8) & 0xff);
cTemp[x+y+2] = (uint8_t)((color>>16) & 0xff);
}
|