summaryrefslogtreecommitdiff
path: root/kernel/vesa.c
blob: 93a42f375fc53d006119b3606af1046616361ddc (plain)
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);
 }