From fadccef0dff4843fc3f47caaf04d8982a0ec8b52 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sun, 18 Jun 2023 07:47:52 +0300 Subject: [PATCH] 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..."); }