From 5bfb8d9e97c18838b89f624025a341a3274618db Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sun, 18 Jun 2023 06:25:19 +0300 Subject: [PATCH 1/3] Implementing unsigned itoa (uint to str) --- src/xtoa.c | 24 ++++++++++++++++++++++++ src/xtoa.h | 1 + 2 files changed, 25 insertions(+) diff --git a/src/xtoa.c b/src/xtoa.c index 3cf1990..aaf7b69 100644 --- a/src/xtoa.c +++ b/src/xtoa.c @@ -24,6 +24,30 @@ char* itoa(int value, int base) { } return result; } +char* uitoa(unsigned int value, int base) { + char* result; + + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } + + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; + + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); + + + *ptr-- = '\0'; + while(ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; +} char* ltoa(long value, int base) { char* result; diff --git a/src/xtoa.h b/src/xtoa.h index 80445fa..710c774 100644 --- a/src/xtoa.h +++ b/src/xtoa.h @@ -2,6 +2,7 @@ #define HEADER_XTOA char* itoa(int value, int base); +char* uitoa(unsigned int value, int base); char* ltoa(long value, int base); char* ultoa(unsigned long value, int base); From fadccef0dff4843fc3f47caaf04d8982a0ec8b52 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sun, 18 Jun 2023 07:47:52 +0300 Subject: [PATCH 2/3] Putting pixels to screen --- src/framebuffer.c | 23 ++++++++++ src/framebuffer.h | 7 +++ src/kernel.c | 106 ++++++++++++++++------------------------------ 3 files changed, 67 insertions(+), 69 deletions(-) create mode 100644 src/framebuffer.c create mode 100644 src/framebuffer.h diff --git a/src/framebuffer.c b/src/framebuffer.c new file mode 100644 index 0000000..806d624 --- /dev/null +++ b/src/framebuffer.c @@ -0,0 +1,23 @@ +#include "framebuffer.h" + +static unsigned long fb_address; +static unsigned long fb_pitch; +static unsigned short fb_width, fb_height; +static unsigned char fb_bpp, fb_bytespp; +static unsigned char fb_rpos, fb_bpos, fb_gpos; + +void initfb(unsigned long addr, unsigned short w, unsigned short h, unsigned char bpp, unsigned long pitch, unsigned char rpos, unsigned char gpos, unsigned char bpos) { + fb_address = addr; + fb_pitch = pitch; + fb_width = w; + fb_height = h; + fb_bpp = bpp; + fb_bytespp = bpp/8; + fb_rpos = rpos; + fb_gpos = gpos; + fb_bpos = bpos; +} + +void putpixel(unsigned short x, unsigned short y, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + *((unsigned long *)(fb_address + y*fb_pitch + x*fb_bytespp)) = r< 0) { - vga_write_line_color("Serial initialization failed", VGA_COLOR_BLACK, - VGA_COLOR_ORANGE); - } else { - vga_write_line("\nInitialized serial."); - serial_write_string("\n=== KoalemOS ===\n"); - } - vga_write("Checking multiboot loader: "); + int serial_initialized = serial_init(); + serial_write_string("\n=== KoalemOS ===\n"); // Check multiboot header if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) { - vga_write_color("INVALID MAGIC", VGA_COLOR_BLACK, VGA_COLOR_RED); return; } - if (mbootinfo->flags & MULTIBOOT_INFO_BOOT_LOADER_NAME) - vga_write((char *)mbootinfo->boot_loader_name); - else - vga_write_color("Unknown", VGA_COLOR_BLACK, VGA_COLOR_ORANGE); - vga_write("\nMultiboot flags: "); - vga_write(itoa(mbootinfo->flags, 2)); + serial_write_string("\nMultiboot flags: "); + serial_write_string(itoa(mbootinfo->flags, 2)); serial_write_string("\nMultiboot flags: "); serial_write_string(itoa(mbootinfo->flags, 2)); // Check videomode if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) { - vga_write("\nVBE Mode: 0x"); - vga_write(itoa(mbootinfo->vbe_mode, 16)); - serial_write_string("\nVBE Mode: 0x"); - serial_write_string(itoa(mbootinfo->vbe_mode, 16)); + serial_write_string("\nVBE Mode: 0x"); + serial_write_string(itoa(mbootinfo->vbe_mode, 16)); } - if (mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO) { - vga_write("\nFramebuffer: "); - serial_write_string("\nFramebuffer: "); - vga_write("address: 0x"); - serial_write_string("\n Address: 0x"); - vga_write(ultoa(mbootinfo->framebuffer_addr, 16)); - serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16)); - serial_write_string("\n Dimensions: "); - serial_write_string(itoa(mbootinfo->framebuffer_width, 10)); - serial_write_string("X"); - serial_write_string(itoa(mbootinfo->framebuffer_height, 10)); - serial_write_string("x"); - serial_write_string(itoa(mbootinfo->framebuffer_bpp, 10)); - serial_write_string("\n Pitch: "); - serial_write_string(itoa(mbootinfo->framebuffer_pitch, 10)); - serial_write_string("\n RPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_red_field_position, 10)); - serial_write_string("\n GPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_green_field_position, 10)); - serial_write_string("\n BPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_blue_field_position, 10)); + if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) { + serial_write_string("\nVideo info not available"); + return; + } - unsigned long *vmem; - int i; - for (i = 0; i < mbootinfo->framebuffer_height; i++) { - vmem = mbootinfo->framebuffer_addr + i*mbootinfo->framebuffer_pitch + i*(mbootinfo->framebuffer_bpp/8); - *vmem = 0xff<framebuffer_red_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_red_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_red_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_red_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_green_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_green_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_green_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_green_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_blue_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_blue_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_blue_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; - *vmem = 0xff<framebuffer_blue_field_position;((char *)vmem)+=mbootinfo->framebuffer_bpp/8; + serial_write_string("\nFramebuffer: "); + serial_write_string("\n Address: 0x"); + serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16)); + + serial_write_string("\n Dimensions: "); + serial_write_string(itoa(mbootinfo->framebuffer_width, 10)); + serial_write_string("X"); + serial_write_string(itoa(mbootinfo->framebuffer_height, 10)); + serial_write_string("x"); + serial_write_string(itoa(mbootinfo->framebuffer_bpp, 10)); + serial_write_string("\n Pitch: "); + serial_write_string(itoa(mbootinfo->framebuffer_pitch, 10)); + serial_write_string("\n RPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_red_field_position, 10)); + serial_write_string("\n GPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_green_field_position, 10)); + serial_write_string("\n BPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_blue_field_position, 10)); + + initfb(mbootinfo->framebuffer_addr, mbootinfo->framebuffer_width, mbootinfo->framebuffer_height, mbootinfo->framebuffer_bpp, mbootinfo->framebuffer_pitch, mbootinfo->framebuffer_red_field_position, mbootinfo->framebuffer_green_field_position, mbootinfo->framebuffer_blue_field_position); + + int x, y; + for (y=0; yframebuffer_height;y++) { + for (x=0; xframebuffer_width;x++) { + putpixel(x, y, 0, 255*x/mbootinfo->framebuffer_width, 255*y/mbootinfo->framebuffer_height, 0xff); } - - - } else { - vga_write_color("\nVideo info not available", VGA_COLOR_BLACK, VGA_COLOR_RED); - serial_write_string("\nVideo info not available"); - return; } - vga_write_line("\nExecution finished, halting..."); + serial_write_string("\nExecution finished, halting..."); } From 086eba4ea4a3ad5d14b6b73457a5b1b140ae3092 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sun, 18 Jun 2023 07:49:43 +0300 Subject: [PATCH 3/3] Don't try to put pixel off-screen --- src/framebuffer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/framebuffer.c b/src/framebuffer.c index 806d624..29f6b9d 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -19,5 +19,6 @@ void initfb(unsigned long addr, unsigned short w, unsigned short h, unsigned cha } void putpixel(unsigned short x, unsigned short y, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + if (x>fb_width || y> fb_height) return; *((unsigned long *)(fb_address + y*fb_pitch + x*fb_bytespp)) = r<