diff options
Diffstat (limited to 'src/drivers/framebuffer.cc')
| -rw-r--r-- | src/drivers/framebuffer.cc | 70 |
1 files changed, 21 insertions, 49 deletions
diff --git a/src/drivers/framebuffer.cc b/src/drivers/framebuffer.cc index 2fbe153..2ac47db 100644 --- a/src/drivers/framebuffer.cc +++ b/src/drivers/framebuffer.cc @@ -1,58 +1,30 @@ #include "framebuffer.hpp" +#include "core/paging.hpp" +#include "libs/string.hpp" -#define MAX_COL 80 -#define MAX_LINE 25 +FB_CFG fb_cfg; -VIDEO_STATE VS={ - (u8 *)0xB8000, - 0, - 0, - BLACK, - GRAY, -}; -void putchar(char c){ - // Handle newline here - if(c=='\n'){ - VS.col=0; - VS.line+=1; - if(VS.line>=MAX_LINE){ - VS.line=MAX_LINE-1; - scrollup(); - } - return; - } - - // Print char - VS.mem[VS.col*2+MAX_COL*VS.line*2]=c; - VS.mem[VS.col*2+MAX_COL*VS.line*2+1]=VS.fg|VS.bg<<4; - - // Refresh location - VS.col+=1; - if(VS.col>= MAX_COL){ - VS.col=0; - VS.line+=1; - if(VS.line>=MAX_LINE){ - VS.line=MAX_LINE-1; - scrollup(); - } - } +void framebuffer_init(FB_CFG config){ + fb_cfg=config; } -void clear(){ - for(u8 i=0;i<MAX_LINE;i++){ - scrollup(); - } +void framebuffer_draw(FB_PIXEL p){ + u8 *pixel=(u8*)(fb_cfg.location+p.x*(fb_cfg.depth/8)+p.y*fb_cfg.pitch); + PAGING_MAP(pixel); + pixel[0]=p.r; + pixel[1]=p.g; + pixel[2]=p.b; + if(fb_cfg.depth==32) + pixel[3]=p.a; } -void scrollup(){ - // Move VS.line up - for(u8 i=1;i<=MAX_LINE;i++){ - for(u8 j=0;j<=MAX_COL;j++) - VS.mem[j*2+MAX_COL*(i-1)*2]=VS.mem[j*2+MAX_COL*i*2]; - } - // Clear last VS.line - for(u8 i=0;i<=MAX_COL;i++){ - VS.mem[i*2+MAX_COL*(MAX_LINE-1)*2]='\0'; - } +void framebuffer_scrollup(u32 npixel){ + u64 start=fb_cfg.location+npixel*fb_cfg.pitch; + u64 amount=fb_cfg.pitch*(fb_cfg.height-npixel); + memcpy((void*)start,(void*)fb_cfg.location,amount); } + +void framebuffer_clear(){ + memset((void*)fb_cfg.location, 0, fb_cfg.pitch*fb_cfg.height); +}
\ No newline at end of file |
