//http://wiki.osdev.org/GUI #include #include "kernel.h" #include "lib/logger/log.h" // logger facilities #include "lib/int/stdint.h" #define FOOLOS_MODULE_NAME "vesa" #define FOOLSOS_SHOW_VESAMODES 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; volatile uint32_t physbase; // your LFB (Linear Framebuffer) address ;) uint32_t reserved1; uint16_t reserved2; }vbemodeinfo; typedef struct foolfont_struct { uint8_t line[10]; //every single fool font consists of 10 lines a 8 bit }foolfont; static foolfont *deffont; static vbemodeinfo *VbeModeInfoBlock; static int console_x; static int console_y; static int console_lines; static int console_cols; static uint8_t* buffer; static uint8_t* physbase; void vesa_set_physbase(uint32_t addr) { VbeModeInfoBlock->physbase=addr; } uint32_t vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont) { //the only functionallu important init lines! (rest is log) VbeModeInfoBlock=mode; deffont=rawfont; console_x=0; console_y=0; int line_height=12; int col_width=10; console_lines=mode->Yres/line_height; console_cols=mode->Xres/col_width; // vesa info log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"setup complete. vbe version: 0x%x / video mode ptr: 0x%x 0x%x", info->VbeVersion, info->VideoModePtr[1], info->VideoModePtr[0]); // vesa info on selected mode: log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"colors r:%d 0x%x g:%d 0x%x b:%d 0x%x", mode->red_position,mode->red_mask, mode->green_position,mode->green_mask, mode->blue_position,mode->blue_mask); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"res: %d * %d / banks: %d / attr: 0x%x / bpp: %d / physbase: 0x%x", mode->Xres, mode->Yres, mode->banks, mode->attributes, mode->bpp,mode->physbase); // vesa modes // todo: take segment from vbeinfo! #ifdef FOOLSOS_SHOW_VESAMODES uint16_t *modeptr=info->VideoModePtr[0]; while(*modeptr!=0xffff&&*modeptr!=0) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"mode supported : 0x%x", (*modeptr)); scr_put_hex(*modeptr); modeptr++; } #endif return VbeModeInfoBlock->physbase; } 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); } void PutFont(char c, int x,int y, int color) { int fnt=0x126-0x20; if(c>=0x20&&c<=0x126)fnt=c-0x20; int posx, posy, sizex=8, sizey=10; for(posx=x;posxconsole_cols);//PutConsoleNL(); } } void PutConsoleNL() { console_x=0; console_y++; if(console_y>=console_lines-5)console_y=0; for(int i=0;iphysbase; buffer=pmmngr_alloc_blocks(blocks); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Init buffer of %d blocks at 0x%08X",blocks,buffer); VbeModeInfoBlock->physbase=buffer; log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test"); vesa_switch_buffers(); } void vesa_switch_buffers() { for(int i=0;i<800*600*2;i++)physbase[i]=buffer[i]; }