aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-02-10 17:07:11 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-02-10 17:07:11 -0500
commitac2cc17431c7481063557dc30fa70b807a93fb51 (patch)
tree2dfd401f4272b954f192126bd4105010c7303d5e
parentebd61461fc3f94785b6d7555c4f118b0f1e1cc99 (diff)
downloadkappa-ac2cc17431c7481063557dc30fa70b807a93fb51.zip
kappa-ac2cc17431c7481063557dc30fa70b807a93fb51.tar.gz
kappa-ac2cc17431c7481063557dc30fa70b807a93fb51.tar.bz2
kappa-ac2cc17431c7481063557dc30fa70b807a93fb51.tar.xz
optimize
-rw-r--r--drivers/gfx-as.S18
-rw-r--r--drivers/gfx.c14
-rw-r--r--drivers/ps2.c2
-rw-r--r--libc/include/stdlib.h2
4 files changed, 21 insertions, 15 deletions
diff --git a/drivers/gfx-as.S b/drivers/gfx-as.S
index 51c1db8..ed1c91b 100644
--- a/drivers/gfx-as.S
+++ b/drivers/gfx-as.S
@@ -1,25 +1,23 @@
.global gfx_clear
.extern fb_width
.extern fb_height
+ .extern fb_stride
.extern fb_bpp
.extern _gfx_bgcol
.extern framebuffer
# void gfx_clear(uint32_t color)
gfx_clear:
- movzwl fb_width, %ecx
- movzwl fb_height, %edx
movl framebuffer, %eax
- pushl %ebx
- movl _gfx_bgcol, %ebx
- imull %ecx, %edx
- movzbl fb_bpp, %ecx
+ movzwl fb_stride, %ecx
+ movzwl fb_height, %edx
imull %ecx, %edx
addl %eax, %edx
- cmpl %edx, %eax
- jnb .L2
+ pushl %ebx
+ movzwl fb_bpp, %ebx
+ movl _gfx_bgcol, %ecx
.L1:
- movl %ebx, (%eax)
- addl %ecx, %eax
+ movl %ecx, (%eax)
+ addl %ebx, %eax
cmpl %eax, %edx
ja .L1
.L2:
diff --git a/drivers/gfx.c b/drivers/gfx.c
index f2b2cac..435c2e0 100644
--- a/drivers/gfx.c
+++ b/drivers/gfx.c
@@ -77,12 +77,14 @@ void gfx_drawchar(int x, int y, int c)
uint8_t *line_addr = framebuffer + (x * fb_bpp) + (y * fb_stride);
const uint32_t fg = _gfx_fgcol;
const uint16_t stride = fb_stride;
+ const uint8_t stop_y = MIN(FONT_HEIGHT, fb_height - y);
+ const uint8_t stop_x = MIN(FONT_WIDTH, fb_width - x);
if(c < 0 || c > 132)
return;
- for(int i = 0; i < FONT_HEIGHT; ++i)
+ for(int i = 0; i < stop_y; ++i)
{
uint8_t mask_table[8] = {128, 64, 32, 16, 8, 4, 2, 1};
- for(int j = 0; j < 8; ++j)
+ for(int j = 0; j < stop_x; ++j)
{
if(gfx_font[c][i] & mask_table[j])
((uint32_t*)line_addr)[j] = fg;
@@ -96,12 +98,14 @@ void gfx_drawchar_bg(int x, int y, int c)
uint8_t *line_addr = framebuffer + (x * fb_bpp) + (y * fb_stride);
const uint32_t fg = _gfx_fgcol;
const uint16_t stride = fb_stride;
+ const uint8_t stop_y = MIN(FONT_HEIGHT, fb_height - y);
+ const uint8_t stop_x = MIN(FONT_WIDTH, fb_width - x);
if(c < 0 || c > 132)
return;
- for(int i = 0; i < FONT_HEIGHT; ++i)
+ for(int i = 0; i < stop_y; ++i)
{
uint8_t mask_table[8] = {128, 64, 32, 16, 8, 4, 2, 1};
- for(int j = 0; j < 8; ++j)
+ for(int j = 0; j < stop_x; ++j)
{
if(gfx_font[c][i] & mask_table[j])
((uint32_t*)line_addr)[j] = fg;
@@ -235,7 +239,7 @@ bool gfx_init(struct vbe_info_t *vbe_mode_info)
{
framebuffer = (uint8_t*)vbe_mode_info->physbase;
fb_width = vbe_mode_info->Xres;
- fb_height = vbe_mode_info->Yres;
+ fb_height = vbe_mode_info->Yres - 100;
fb_bpp = vbe_mode_info->bpp / 8;
fb_stride = fb_bpp * fb_width;
if(fb_bpp != 4)
diff --git a/drivers/ps2.c b/drivers/ps2.c
index 742b7ad..f9a48a4 100644
--- a/drivers/ps2.c
+++ b/drivers/ps2.c
@@ -23,6 +23,7 @@ static void key_handler(struct regs_t regs)
{
(void) regs;
uint8_t scancode = inb(0x60);
+ (void) scancode;
/* TODO: handle scancode */
/*printf("key %x\n", scancode);*/
}
@@ -42,6 +43,7 @@ static void keyboard_init(void)
static void mouse_handler(struct regs_t regs)
{
+ (void) regs;
printf("mouse action!\n");
}
diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index 91f16f3..990d77a 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -5,6 +5,8 @@ char* itoa(int val, int base);
#define RAND_MAX ((1U << 31) - 1)
+#define MIN(x,y) ((x<y)?x:y)
+
unsigned int rand(void);
void srand(unsigned int);
int abs(int);