diff --git a/src/fb.c b/src/fb.c new file mode 100644 index 0000000..374c28d --- /dev/null +++ b/src/fb.c @@ -0,0 +1,30 @@ +#include "fb.h" + +static uint32_t * fb; +static uint32_t fb_width; +static uint32_t fb_height; +static uint32_t fb_pitch; + +void fb_init(uint32_t * addr, uint32_t width, uint32_t height, uint32_t pitch) +{ + fb = addr; + fb_width = width; + fb_height = height; + fb_pitch = pitch; + for (uint32_t row = 0u; row < fb_height; row++) + { + for (uint32_t col = 0u; col < fb_width; col++) + { + uint32_t er = (col * fb_height) / fb_width; + int32_t dr = (int32_t)row - (int32_t)er; + if (dr < 0) + { + dr = -dr; + } + uint8_t r = 255u - ((uint32_t)dr * 256u / fb_height); + uint8_t g = col * 256u / fb_width; + uint8_t b = row * 256u / fb_height; + fb[fb_pitch * row / 4u + col] = (r << 16u) | (g << 8u) | b; + } + } +} diff --git a/src/fb.h b/src/fb.h new file mode 100644 index 0000000..40882cb --- /dev/null +++ b/src/fb.h @@ -0,0 +1,8 @@ +#ifndef FB_H +#define FB_H + +#include + +void fb_init(uint32_t * addr, uint32_t width, uint32_t height, uint32_t pitch); + +#endif diff --git a/src/kernel_main.c b/src/kernel_main.c index d176a27..1f33847 100644 --- a/src/kernel_main.c +++ b/src/kernel_main.c @@ -1,9 +1,5 @@ #include - -uint32_t * fb; -uint32_t pitch; -uint32_t width; -uint32_t height; +#include "fb.h" static uint32_t * process_mbinfo_tag(uint32_t * mbinfo) { @@ -15,10 +11,7 @@ static uint32_t * process_mbinfo_tag(uint32_t * mbinfo) return 0u; case 8u: - fb = (uint32_t *)mbinfo[2]; - pitch = mbinfo[4]; - width = mbinfo[5]; - height = mbinfo[6]; + fb_init((uint32_t *)mbinfo[2], mbinfo[5], mbinfo[6], mbinfo[4]); break; } return (uint32_t *)(((uint32_t)mbinfo + size + 7u) & 0xFFFFFFF8u); @@ -37,20 +30,4 @@ static void process_mbinfo(uint32_t * mbinfo) void kernel_main(uint32_t * mbinfo) { process_mbinfo(mbinfo); - for (uint32_t row = 0u; row < height; row++) - { - for (uint32_t col = 0u; col < width; col++) - { - uint32_t er = (col * height) / width; - int32_t dr = (int32_t)row - (int32_t)er; - if (dr < 0) - { - dr = -dr; - } - uint8_t r = 255u - ((uint32_t)dr * 256u / height); - uint8_t g = col * 256u / width; - uint8_t b = row * 256u / height; - fb[pitch * row / 4u + col] = (r << 16u) | (g << 8u) | b; - } - } }