From e2572d50afb32735c59a7a098786037c987287f5 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Mon, 24 Jul 2023 04:20:54 +0300
Subject: [PATCH 01/45] FASMMMMMMM

---
 .gitignore        |   1 +
 Makefile          |  16 ++-
 README.md         |   5 +-
 src/framebuffer.c |  24 ----
 src/framebuffer.h |   7 --
 src/kernel.c      |  83 --------------
 src/multiboot.h   | 274 ----------------------------------------------
 src/serial.asm    |  94 ++++++++++++++++
 src/serial.c      |  49 ---------
 src/serial.h      |   7 --
 src/start32.asm   | 100 ++++++++++++-----
 src/vga.c         |  97 ----------------
 src/vga.h         |  24 ----
 src/xtoa.c        | 100 -----------------
 src/xtoa.h        |   9 --
 15 files changed, 175 insertions(+), 715 deletions(-)
 delete mode 100644 src/framebuffer.c
 delete mode 100644 src/framebuffer.h
 delete mode 100644 src/kernel.c
 delete mode 100644 src/multiboot.h
 create mode 100644 src/serial.asm
 delete mode 100644 src/serial.c
 delete mode 100644 src/serial.h
 delete mode 100644 src/vga.c
 delete mode 100644 src/vga.h
 delete mode 100644 src/xtoa.c
 delete mode 100644 src/xtoa.h

diff --git a/.gitignore b/.gitignore
index bc70311..770baf3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 *.elf
 *.o
 *.img
+*.bin
 mnt/
 build/
diff --git a/Makefile b/Makefile
index 098565f..1e50876 100644
--- a/Makefile
+++ b/Makefile
@@ -1,17 +1,15 @@
 all: build/kernel-i386.elf
 clean:
-	-@rm build/*.o build/*.elf 2> /dev/null || true
+	-@rm *.bin 2> /dev/null || true
 
-build/start32.o: build/ src/start32.asm
-	nasm -felf32 src/start32.asm -o build/start32.o
-build/kernel-i386.elf: build/start32.o
-	tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/*.c build/start32.o
-image: build/kernel-i386.elf mount
-	cp build/kernel-i386.elf mnt/
+start32.bin: src/start32.asm src/serial.asm
+	fasm src/start32.asm start32.bin
+image: start32.bin mount
+	cp start32.bin mnt/koalemos/
 	sync
 
-qemu-multiboot: build/kernel-i386.elf
-	qemu-system-i386 -kernel build/kernel-i386.elf -serial stdio
+qemu-multiboot: start32.bin
+	qemu-system-i386 -kernel start32.bin -serial stdio
 qemu-image: image
 	qemu-system-i386 koalemos.img -serial stdio
 
diff --git a/README.md b/README.md
index b6df57b..3b07e1e 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,4 @@ Multiboot compatible stupid useless OS-like project.
 ## Compatibility
 32bit x86 legacy BIOS system
 ## Building
-NASM and TinyCCompiler are used.
-TCC might need manual compilation for 32bit crosscompilation
-on 64bit systems.
-Just download the source and `make cross` or something.
+FASM is used as the assembler.
diff --git a/src/framebuffer.c b/src/framebuffer.c
deleted file mode 100644
index 29f6b9d..0000000
--- a/src/framebuffer.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#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) {
-	if (x>fb_width || y> fb_height) return;
-	*((unsigned long *)(fb_address + y*fb_pitch + x*fb_bytespp)) = r<<fb_rpos | g<<fb_gpos | b<<fb_bpos;
-}
diff --git a/src/framebuffer.h b/src/framebuffer.h
deleted file mode 100644
index 1993ac5..0000000
--- a/src/framebuffer.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _FRAMEBUFFER_H
-#define _FRAMEBUFFER_H 1
-
-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);
-void putpixel(unsigned short x, unsigned short y,  unsigned char r, unsigned char g, unsigned char b, unsigned char a);
-
-#endif
diff --git a/src/kernel.c b/src/kernel.c
deleted file mode 100644
index 60d6c3a..0000000
--- a/src/kernel.c
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "multiboot.h"
-#include "framebuffer.h"
-#include "serial.h"
-#include "xtoa.h"
-
-static inline void outb(unsigned short port, unsigned char val) {
-	asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
-}
-static inline unsigned char inb(unsigned short port) {
-	unsigned char ret;
-	asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
-	return ret;
-}
-
-void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) {
-
-	// Cursor disabling
-	outb(0x3D4, 0x0A);
-	outb(0x3D5, 0x20);
-
-	int serial_initialized = serial_init();
-	serial_write_string("\n=== KoalemOS ===\n");
-
-	// Check multiboot header
-	if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
-		return;
-	}
-
-	serial_write_string("\nMultiboot flags: ");
-	serial_write_string(itoa(mbootinfo->flags, 2));
-
-	// Check videomode
-	if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) {
-		serial_write_string("\nVBE Mode: 0x");
-		serial_write_string(itoa(mbootinfo->vbe_mode, 16));
-	}
-
-	if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) {
-		serial_write_string("\nVideo info not available");
-		return;
-	}
-
-	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));
-
-	serial_write_string("\nMemory: ");
-	serial_write_string("\n  lower: ");
-	serial_write_string(uitoa(mbootinfo->mem_lower, 10));
-	serial_write_string(" k");
-	serial_write_string("\n  upper: ");
-	serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10));
-	serial_write_string(" M");
-
-	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, i;
-	unsigned char c = 0;
-	for(;;) {
-		for(y=0; y < mbootinfo->framebuffer_height; y++) {
-			for(x=0; x < mbootinfo->framebuffer_width; x++) {
-				putpixel(x, y, c, c, c, 0xff);
-			}
-		}
-		c+=4;
-	}
-
-	serial_write_string("\nExecution finished, halting...");
-}
diff --git a/src/multiboot.h b/src/multiboot.h
deleted file mode 100644
index 269cf9b..0000000
--- a/src/multiboot.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/* multiboot.h - Multiboot header file. */
-/* Copyright (C) 1999,2003,2007,2008,2009,2010  Free Software Foundation, Inc.
- *
- *  Permission is hereby granted, free of charge, to any person obtaining a copy
- *  of this software and associated documentation files (the "Software"), to
- *  deal in the Software without restriction, including without limitation the
- *  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- *  sell copies of the Software, and to permit persons to whom the Software is
- *  furnished to do so, subject to the following conditions:
- *
- *  The above copyright notice and this permission notice shall be included in
- *  all copies or substantial portions of the Software.
- *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL ANY
- *  DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
- *  IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef MULTIBOOT_HEADER
-#define MULTIBOOT_HEADER 1
-
-/* How many bytes from the start of the file we search for the header. */
-#define MULTIBOOT_SEARCH                        8192
-#define MULTIBOOT_HEADER_ALIGN                  4
-
-/* The magic field should contain this. */
-#define MULTIBOOT_HEADER_MAGIC                  0x1BADB002
-
-/* This should be in %eax. */
-#define MULTIBOOT_BOOTLOADER_MAGIC              0x2BADB002
-
-/* Alignment of multiboot modules. */
-#define MULTIBOOT_MOD_ALIGN                     0x00001000
-
-/* Alignment of the multiboot info structure. */
-#define MULTIBOOT_INFO_ALIGN                    0x00000004
-
-/* Flags set in the ’flags’ member of the multiboot header. */
-
-/* Align all boot modules on i386 page (4KB) boundaries. */
-#define MULTIBOOT_PAGE_ALIGN                    0x00000001
-
-/* Must pass memory information to OS. */
-#define MULTIBOOT_MEMORY_INFO                   0x00000002
-
-/* Must pass video information to OS. */
-#define MULTIBOOT_VIDEO_MODE                    0x00000004
-
-/* This flag indicates the use of the address fields in the header. */
-#define MULTIBOOT_AOUT_KLUDGE                   0x00010000
-
-/* Flags to be set in the ’flags’ member of the multiboot info structure. */
-
-/* is there basic lower/upper memory information? */
-#define MULTIBOOT_INFO_MEMORY                   0x00000001
-/* is there a boot device set? */
-#define MULTIBOOT_INFO_BOOTDEV                  0x00000002
-/* is the command-line defined? */
-#define MULTIBOOT_INFO_CMDLINE                  0x00000004
-/* are there modules to do something with? */
-#define MULTIBOOT_INFO_MODS                     0x00000008
-
-/* These next two are mutually exclusive */
-
-/* is there a symbol table loaded? */
-#define MULTIBOOT_INFO_AOUT_SYMS                0x00000010
-/* is there an ELF section header table? */
-#define MULTIBOOT_INFO_ELF_SHDR                 0X00000020
-
-/* is there a full memory map? */
-#define MULTIBOOT_INFO_MEM_MAP                  0x00000040
-
-/* Is there drive info? */
-#define MULTIBOOT_INFO_DRIVE_INFO               0x00000080
-
-/* Is there a config table? */
-#define MULTIBOOT_INFO_CONFIG_TABLE             0x00000100
-
-/* Is there a boot loader name? */
-#define MULTIBOOT_INFO_BOOT_LOADER_NAME         0x00000200
-
-/* Is there a APM table? */
-#define MULTIBOOT_INFO_APM_TABLE                0x00000400
-
-/* Is there video information? */
-#define MULTIBOOT_INFO_VBE_INFO                 0x00000800
-#define MULTIBOOT_INFO_FRAMEBUFFER_INFO         0x00001000
-
-#ifndef ASM_FILE
-
-typedef unsigned char           multiboot_uint8_t;
-typedef unsigned short          multiboot_uint16_t;
-typedef unsigned int            multiboot_uint32_t;
-typedef unsigned long long      multiboot_uint64_t;
-
-struct multiboot_header
-{
-  /* Must be MULTIBOOT_MAGIC - see above. */
-  multiboot_uint32_t magic;
-
-  /* Feature flags. */
-  multiboot_uint32_t flags;
-
-  /* The above fields plus this one must equal 0 mod 2^32. */
-  multiboot_uint32_t checksum;
-
-  /* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */
-  multiboot_uint32_t header_addr;
-  multiboot_uint32_t load_addr;
-  multiboot_uint32_t load_end_addr;
-  multiboot_uint32_t bss_end_addr;
-  multiboot_uint32_t entry_addr;
-
-  /* These are only valid if MULTIBOOT_VIDEO_MODE is set. */
-  multiboot_uint32_t mode_type;
-  multiboot_uint32_t width;
-  multiboot_uint32_t height;
-  multiboot_uint32_t depth;
-};
-
-/* The symbol table for a.out. */
-struct multiboot_aout_symbol_table
-{
-  multiboot_uint32_t tabsize;
-  multiboot_uint32_t strsize;
-  multiboot_uint32_t addr;
-  multiboot_uint32_t reserved;
-};
-typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t;
-
-/* The section header table for ELF. */
-struct multiboot_elf_section_header_table
-{
-  multiboot_uint32_t num;
-  multiboot_uint32_t size;
-  multiboot_uint32_t addr;
-  multiboot_uint32_t shndx;
-};
-typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t;
-
-struct multiboot_info
-{
-  /* Multiboot info version number */
-  multiboot_uint32_t flags;
-
-  /* Available memory from BIOS */
-  multiboot_uint32_t mem_lower;
-  multiboot_uint32_t mem_upper;
-
-  /* "root" partition */
-  multiboot_uint32_t boot_device;
-
-  /* Kernel command line */
-  multiboot_uint32_t cmdline;
-
-  /* Boot-Module list */
-  multiboot_uint32_t mods_count;
-  multiboot_uint32_t mods_addr;
-
-  union
-  {
-    multiboot_aout_symbol_table_t aout_sym;
-    multiboot_elf_section_header_table_t elf_sec;
-  } u;
-
-  /* Memory Mapping buffer */
-  multiboot_uint32_t mmap_length;
-  multiboot_uint32_t mmap_addr;
-
-  /* Drive Info buffer */
-  multiboot_uint32_t drives_length;
-  multiboot_uint32_t drives_addr;
-
-  /* ROM configuration table */
-  multiboot_uint32_t config_table;
-
-  /* Boot Loader Name */
-  multiboot_uint32_t boot_loader_name;
-
-  /* APM table */
-  multiboot_uint32_t apm_table;
-
-  /* Video */
-  multiboot_uint32_t vbe_control_info;
-  multiboot_uint32_t vbe_mode_info;
-  multiboot_uint16_t vbe_mode;
-  multiboot_uint16_t vbe_interface_seg;
-  multiboot_uint16_t vbe_interface_off;
-  multiboot_uint16_t vbe_interface_len;
-
-  multiboot_uint64_t framebuffer_addr;
-  multiboot_uint32_t framebuffer_pitch;
-  multiboot_uint32_t framebuffer_width;
-  multiboot_uint32_t framebuffer_height;
-  multiboot_uint8_t framebuffer_bpp;
-#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
-#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB     1
-#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT     2
-  multiboot_uint8_t framebuffer_type;
-  union
-  {
-    struct
-    {
-      multiboot_uint32_t framebuffer_palette_addr;
-      multiboot_uint16_t framebuffer_palette_num_colors;
-    };
-    struct
-    {
-      multiboot_uint8_t framebuffer_red_field_position;
-      multiboot_uint8_t framebuffer_red_mask_size;
-      multiboot_uint8_t framebuffer_green_field_position;
-      multiboot_uint8_t framebuffer_green_mask_size;
-      multiboot_uint8_t framebuffer_blue_field_position;
-      multiboot_uint8_t framebuffer_blue_mask_size;
-    };
-  };
-};
-typedef struct multiboot_info multiboot_info_t;
-
-struct multiboot_color
-{
-  multiboot_uint8_t red;
-  multiboot_uint8_t green;
-  multiboot_uint8_t blue;
-};
-
-struct multiboot_mmap_entry
-{
-  multiboot_uint32_t size;
-  multiboot_uint64_t addr;
-  multiboot_uint64_t len;
-#define MULTIBOOT_MEMORY_AVAILABLE              1
-#define MULTIBOOT_MEMORY_RESERVED               2
-#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE       3
-#define MULTIBOOT_MEMORY_NVS                    4
-#define MULTIBOOT_MEMORY_BADRAM                 5
-  multiboot_uint32_t type;
-} __attribute__((packed));
-typedef struct multiboot_mmap_entry multiboot_memory_map_t;
-
-struct multiboot_mod_list
-{
-  /* the memory used goes from bytes ’mod_start’ to ’mod_end-1’ inclusive */
-  multiboot_uint32_t mod_start;
-  multiboot_uint32_t mod_end;
-
-  /* Module command line */
-  multiboot_uint32_t cmdline;
-
-  /* padding to take it to 16 bytes (must be zero) */
-  multiboot_uint32_t pad;
-};
-typedef struct multiboot_mod_list multiboot_module_t;
-
-/* APM BIOS info. */
-struct multiboot_apm_info
-{
-  multiboot_uint16_t version;
-  multiboot_uint16_t cseg;
-  multiboot_uint32_t offset;
-  multiboot_uint16_t cseg_16;
-  multiboot_uint16_t dseg;
-  multiboot_uint16_t flags;
-  multiboot_uint16_t cseg_len;
-  multiboot_uint16_t cseg_16_len;
-  multiboot_uint16_t dseg_len;
-};
-
-#endif /* ! ASM_FILE */
-
-#endif /* ! MULTIBOOT_HEADER */
diff --git a/src/serial.asm b/src/serial.asm
new file mode 100644
index 0000000..a7a1440
--- /dev/null
+++ b/src/serial.asm
@@ -0,0 +1,94 @@
+SERIAL_PORT equ 0x3f8
+
+serialinit:
+	pushad
+
+	;Disable ints
+	mov dx, SERIAL_PORT+1
+	mov al, 0x00
+	out dx, al
+
+	;Enable DLAB baud divisor and set 3 (38400 baud)
+	mov al, 0x80
+	mov dx, SERIAL_PORT+3
+	out dx, al
+	;Baud divisor lo byte
+	mov al, 0x03
+	mov dx, SERIAL_PORT
+	out dx, al
+	;Baud divisor hi byte
+	mov al, 0x00
+	mov dx, SERIAL_PORT+1
+	out dx, al
+
+	;8bits, no parity, one stop bit
+	mov al, 0x03
+	mov dx, SERIAL_PORT+3
+	out dx, al
+
+	;Enable+clear FIFO, 14-byte threshold
+	mov al, 0xc7
+	mov dx, SERIAL_PORT+2
+	out dx, al
+
+	;IRQs enabled, RTS/DSR set
+	mov al, 0x0b
+	mov dx, SERIAL_PORT+4
+	out dx, al
+
+	;Set loopback for test purposes
+	mov al, 0x1e
+	out dx, al
+
+	;; Check if serial is workie
+	mov al, 0xae
+	mov dx, SERIAL_PORT
+	out dx, al
+	in al, dx
+	cmp al, 0xae
+	jne serialiniterror
+
+
+	;; Set serial to normal operation
+	mov dx, SERIAL_PORT+4
+	mov al, 0x0f
+	out dx, al
+
+	popad
+	ret
+
+serialwrite:
+	pushad
+	cld
+	mov esi, stuff.bootmsg
+.loop:
+	mov dx, SERIAL_PORT+5
+.wait:
+	in al, dx
+	and al, 0x20
+	jz .wait
+	lodsb
+	or al, al
+	jz .done
+	mov dx, SERIAL_PORT
+	out dx, al
+	jmp .loop
+.done:
+	popad
+	ret
+
+serialiniterror:
+	mov esi, .msg
+	mov edi, 0xb8000
+	mov ah, 64
+	cld
+.loop:
+	lodsb
+	or al, al
+	jz .done
+	stosw
+	jmp .loop
+.done:
+	popad
+	ret
+.msg db "Serial init failed", 0
diff --git a/src/serial.c b/src/serial.c
deleted file mode 100644
index a9747cf..0000000
--- a/src/serial.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "serial.h"
-#define PORT 0x3f8 // COM1
-
-static inline void outb(unsigned short port, unsigned char val) {
-	asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
-}
-static inline unsigned char inb(unsigned short port) {
-	unsigned char ret;
-	asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
-	return ret;
-}
-
-int serial_init() {
-	outb(PORT + 1, 0x00); // Disable all interrupts
-	outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor)
-	outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud
-	outb(PORT + 1, 0x00); //                  (hi byte)
-	outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit
-	outb(PORT + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold
-	outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set
-	outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip
-	outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial
-		// returns same byte)
-
-		// Check if serial is faulty (i.e: not same byte as sent)
-		if (inb(PORT + 0) != 0xAE) {
-			return 1;
-		}
-
-		// If serial is not faulty set it in normal operation mode
-		// (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
-		outb(PORT + 4, 0x0F);
-		return 0;
-	}
-	static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; }
-
-	static void serial_write_char(char chr) {
-		while (serial_is_transmit_empty() == 0);
-		outb(PORT, chr);
-	}
-	
-	void serial_write_string(const char* text) {
-		int i = 0;
-		while(text[i]) {
-			serial_write_char(text[i]);
-			i++;
-		}
-
-	}
diff --git a/src/serial.h b/src/serial.h
deleted file mode 100644
index 48133b5..0000000
--- a/src/serial.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef HEADER_SERIAL
-#define HEADER_SERIAL
-
-int serial_init(void);
-void serial_write_string(const char* text);
-
-#endif
diff --git a/src/start32.asm b/src/start32.asm
index d4e7471..dbc14a0 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -1,47 +1,91 @@
+format binary
+use32
+org 0x100000
+
 MULTIBOOT_HEADER_MAGIC      equ 0x1BADB002
-MULTIBOOT_PAGE_ALIGN        equ 1 << 0
-MULTIBOOT_MEMORY_INFO       equ 1 << 1
-MULTIBOOT_VIDEO_REQUEST     equ 0 << 2
-MULTIBOOT_AOUT_KLUDGE       equ 0 << 16
-MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST
-MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST | MULTIBOOT_AOUT_KLUDGE
+MULTIBOOT_PAGE_ALIGN        equ (1 shl 0)
+MULTIBOOT_MEMORY_INFO       equ (1 shl 1)
+MULTIBOOT_VIDEO_REQUEST     equ (0 shl 2)
+MULTIBOOT_AOUT_KLUDGE       equ (1 shl 16)
+MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST
+MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST or MULTIBOOT_AOUT_KLUDGE
 MULTIBOOT_CHECKSUM          equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
 
-section .multiboot
-align 4
+multiboot:
 	dd MULTIBOOT_HEADER_MAGIC
 	dd MULTIBOOT_HEADER_FLAGS
 	dd MULTIBOOT_CHECKSUM
-	dd 0	; header address
-	dd 0	; load address
-	dd 0	; load end address
-	dd 0	; bss end address
-	dd 0	; entry address
+	dd multiboot	; header address
+	dd 0x100000	; load address
+	dd stack_bottom	; load end address
+	dd stack_top	; bss end address
+	dd start	; entry address
 	dd 0	; video mode_type (0:fb, 1:txt) (set flags[2]!)
 	dd 1024	; video width
 	dd 768	; video height
 	dd 32	; video depth
 
-section .bss
-align 16
-	stack_bottom:
-	resb 16384
-	stack_top:
-
-section .text
-	global  _start
-	extern   kmain
-
-_start:
+start:
 	; Setup stack
+	mov ebp, stack_bottom
 	mov esp, stack_top
 
-	; Call the main kernel function.
 	push ebx
 	push eax
-	call kmain
 
-.hang:
+	cmp eax, 0x2badb002
+	jne multibootnomagic
+
+	mov byte [0xb8000], '!'
+
+	mov esi, stuff.bootmsg
+	call serialinit
+	call printbootmsg
+	call serialwrite
+
+	jmp hang
+
+hang:
 	cli
 	hlt
-	jmp .hang
+	jmp hang
+
+multibootnomagic:
+	mov esi, .msg
+	mov edi, 0xb8000
+	mov ah, 64
+	cld
+.loop:
+	lodsb
+	or al, al
+	jz .done
+	stosw
+	jmp .loop
+.done:
+	jmp hang
+.msg db "No multiboot magic", 0
+
+printbootmsg:
+	pushad
+	mov edi, 0xb8000
+	cld
+.loop:
+	lodsb
+	or al, al
+	jz .done
+	stosb
+	inc edi
+	jmp .loop
+.done:
+	popad
+	ret
+
+include "src/serial.asm"
+
+stuff:
+	.bootmsg db "=== KoalemOS ===", 0
+
+
+stack_bottom:
+rb 16384
+stack_top:
diff --git a/src/vga.c b/src/vga.c
deleted file mode 100644
index bac204d..0000000
--- a/src/vga.c
+++ /dev/null
@@ -1,97 +0,0 @@
-#include "vga.h"
-#define VGA_WIDTH 80
-#define VGA_HEIGHT 25
-#define VGA_MEM_ADDR 0xb8000
-#define CURSOR_HOME (VGA_HEIGHT-1)*VGA_WIDTH
-#define CURSOR_CHR  177;
-
-unsigned int cursor_loc = CURSOR_HOME;
-unsigned char fgcolor;
-unsigned char bgcolor;
-unsigned short blank;
-
-static unsigned char vga_entry_color(enum vga_color fg, enum vga_color bg) {
-	return fg | bg << 4;
-}
-unsigned short vga_blank_entry() {
-	return vga_entry_color(fgcolor, bgcolor) << 8;
-}
-void draw_cursor(void) {
-	*((unsigned char *)VGA_MEM_ADDR + cursor_loc * 2) = CURSOR_CHR;
-	*((unsigned char *)VGA_MEM_ADDR+1 + cursor_loc * 2) = vga_entry_color(fgcolor, bgcolor);
-}
-
-void vga_set_color(enum vga_color fg, enum vga_color bg) {
-	fgcolor = fg;
-	bgcolor = bg;
-}
-void vga_init(enum vga_color fg, enum vga_color bg) {
-	vga_set_color(fg, bg);
-	blank = vga_blank_entry();
-	cls();
-}
-void cls(void) {
-	int i;
-	for (i=0; i<VGA_HEIGHT*VGA_WIDTH;i++) {
-		*((unsigned short *) VGA_MEM_ADDR+i) = blank;
-	}
-}
-void scroll(void) {
-	int y;
-	int x;
-	*((unsigned short *) VGA_MEM_ADDR+cursor_loc) = blank;
-	for (y=0;y<VGA_HEIGHT;y++) {
-		for (x = 0;x<VGA_WIDTH;x++) {
-			*((unsigned short *) VGA_MEM_ADDR+y*VGA_WIDTH+x) = *((unsigned short *) VGA_MEM_ADDR+(y+1)*VGA_WIDTH+x);
-		}
-	}
-	for (x=0;x<VGA_WIDTH;x++) {
-		*((unsigned short *) VGA_MEM_ADDR+CURSOR_HOME+x) = blank;
-	}
-	cursor_loc = CURSOR_HOME;
-	draw_cursor();
-}
-void putchar(unsigned char chr) {
-	if (chr == '\n') {
-		scroll();
-		return;
-	}
-	*((unsigned char *) VGA_MEM_ADDR+cursor_loc * 2) = chr;
-	*((unsigned char *) VGA_MEM_ADDR+1+cursor_loc * 2) = vga_entry_color(fgcolor, bgcolor);
-	cursor_loc++;
-	if (cursor_loc >= VGA_HEIGHT*VGA_WIDTH) {
-		scroll();
-	}
-	draw_cursor();
-}
-
-void vga_write(const char* text) {
-	int i = 0;
-	while(text[i]) {
-		putchar(text[i]);
-		i++;
-	}
-}
-void vga_write_color( const char* text, enum vga_color fg, enum vga_color bg) {
-	unsigned char prevfg = fgcolor;
-	unsigned char prevbg = bgcolor;
-	vga_set_color(fg, bg);
-	vga_write(text);
-	fgcolor = prevfg;
-	bgcolor = prevbg;
-}
-void vga_write_line(const char* text) {
-	if (cursor_loc != CURSOR_HOME) {
-		scroll();
-	}
-	vga_write(text);
-	scroll();
-}
-void vga_write_line_color(const char* text, enum vga_color fg, enum vga_color bg) {
-	unsigned char prevfg = fgcolor;
-	unsigned char prevbg = bgcolor;
-	vga_set_color(fg, bg);
-	vga_write_line(text);
-	fgcolor = prevfg;
-	bgcolor = prevbg;
-}
diff --git a/src/vga.h b/src/vga.h
deleted file mode 100644
index b2aa979..0000000
--- a/src/vga.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef HEADER_VGA
-#define HEADER_VGA
-
-enum vga_color {
-	VGA_COLOR_BLACK = 0,
-	VGA_COLOR_BLUE = 1,
-	VGA_COLOR_GREEN = 2,
-	VGA_COLOR_CYAN = 3,
-	VGA_COLOR_RED = 4,
-	VGA_COLOR_MAGENTA = 5,
-	VGA_COLOR_ORANGE = 6,
-	VGA_COLOR_GREY = 7,
-	VGA_COLOR_GRAY = 7,
-};
-
-void cls(void);
-void vga_init(enum vga_color fg, enum vga_color bg);
-
-void vga_write(const char* text);
-void vga_write_color( const char* text, enum vga_color fg, enum vga_color bg);
-void vga_write_line(const char* text);
-void vga_write_line_color( const char* text, enum vga_color fg, enum vga_color bg);
-
-#endif
diff --git a/src/xtoa.c b/src/xtoa.c
deleted file mode 100644
index 68c9520..0000000
--- a/src/xtoa.c
+++ /dev/null
@@ -1,100 +0,0 @@
-#include "xtoa.h"
-char* itoa(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 );
-	
-	// Apply negative sign
-	if (tmp_value < 0) *ptr++ = '-';
-	*ptr-- = '\0';
-	while(ptr1 < ptr) {
-		tmp_char = *ptr;
-		*ptr--= *ptr1;
-		*ptr1++ = tmp_char;
-	}
-	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;
-
-	// 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 );
-
-	// Apply negative sign
-	if (tmp_value < 0) *ptr++ = '-';
-	*ptr-- = '\0';
-	while(ptr1 < ptr) {
-		tmp_char = *ptr;
-		*ptr--= *ptr1;
-		*ptr1++ = tmp_char;
-	}
-	return result;
-}
-char* ultoa(unsigned long 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 );
-
-	// Apply negative sign
-	//if (tmp_value < 0) *ptr++ = '-';
-	*ptr-- = '\0';
-	while(ptr1 < ptr) {
-		tmp_char = *ptr;
-		*ptr--= *ptr1;
-		*ptr1++ = tmp_char;
-	}
-	return result;
-}
diff --git a/src/xtoa.h b/src/xtoa.h
deleted file mode 100644
index 710c774..0000000
--- a/src/xtoa.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef HEADER_XTOA
-#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);
-
-#endif

From 9fc1cd006421fa1f615c0e1a62012b8782adcb23 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Mon, 24 Jul 2023 05:17:57 +0300
Subject: [PATCH 02/45] Passing the strings to string prints through stack

---
 src/serial.asm  |  5 ++++-
 src/start32.asm | 11 ++++++++---
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/serial.asm b/src/serial.asm
index a7a1440..4f6585e 100644
--- a/src/serial.asm
+++ b/src/serial.asm
@@ -58,9 +58,11 @@ serialinit:
 	ret
 
 serialwrite:
+	push ebp
+	mov ebp, esp
 	pushad
 	cld
-	mov esi, stuff.bootmsg
+	mov esi, [ebp+8]
 .loop:
 	mov dx, SERIAL_PORT+5
 .wait:
@@ -75,6 +77,7 @@ serialwrite:
 	jmp .loop
 .done:
 	popad
+	pop ebp
 	ret
 
 serialiniterror:
diff --git a/src/start32.asm b/src/start32.asm
index dbc14a0..fc19dc0 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -38,10 +38,11 @@ start:
 
 	mov byte [0xb8000], '!'
 
-	mov esi, stuff.bootmsg
-	call serialinit
+	push stuff.bootmsg
 	call printbootmsg
+	call serialinit
 	call serialwrite
+	add esp, 4
 
 	jmp hang
 
@@ -66,7 +67,10 @@ multibootnomagic:
 .msg db "No multiboot magic", 0
 
 printbootmsg:
+	push ebp
+	mov ebp, esp
 	pushad
+	mov esi, [ebp+8]
 	mov edi, 0xb8000
 	cld
 .loop:
@@ -78,12 +82,13 @@ printbootmsg:
 	jmp .loop
 .done:
 	popad
+	pop ebp
 	ret
 
 include "src/serial.asm"
 
 stuff:
-	.bootmsg db "=== KoalemOS ===", 0
+	.bootmsg db "=== KoalemOS ===", 10, 0
 
 
 stack_bottom:

From ebf9982c0786af22f391b1e287718929c00adeaa Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Mon, 24 Jul 2023 17:08:48 +0300
Subject: [PATCH 03/45] Improved serial init handling. Optimized
 pushing/poping.

---
 src/serial.asm | 57 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 34 insertions(+), 23 deletions(-)

diff --git a/src/serial.asm b/src/serial.asm
index 4f6585e..39293ec 100644
--- a/src/serial.asm
+++ b/src/serial.asm
@@ -1,7 +1,8 @@
 SERIAL_PORT equ 0x3f8
+serialinitialized db 0
 
 serialinit:
-	pushad
+	push ax
 
 	;Disable ints
 	mov dx, SERIAL_PORT+1
@@ -46,21 +47,44 @@ serialinit:
 	out dx, al
 	in al, dx
 	cmp al, 0xae
-	jne serialiniterror
-
-
+	je .noerror
+.error:
+	push esi
+	push edi
+	push ax
+	mov esi, .errormsg
+	mov edi, 0xb8000
+	mov ah, 64
+	cld
+.errorloop:
+	lodsb
+	or al, al
+	jz .errordone
+	stosw
+	jmp .errorloop
+.errordone:
+	pop ax
+	pop edi
+	pop esi
+	jmp .end
+.noerror:
+	mov [serialinitialized], 1
 	;; Set serial to normal operation
 	mov dx, SERIAL_PORT+4
 	mov al, 0x0f
 	out dx, al
-
-	popad
+.end:
+	pop ax
 	ret
+.errormsg db "Serial init failed", 0
 
 serialwrite:
+	cmp [serialinitialized], 0
+	je .notinitialized
 	push ebp
 	mov ebp, esp
-	pushad
+	push esi
+	push ax
 	cld
 	mov esi, [ebp+8]
 .loop:
@@ -76,22 +100,9 @@ serialwrite:
 	out dx, al
 	jmp .loop
 .done:
-	popad
+	pop ax
+	pop esi
 	pop ebp
 	ret
-
-serialiniterror:
-	mov esi, .msg
-	mov edi, 0xb8000
-	mov ah, 64
-	cld
-.loop:
-	lodsb
-	or al, al
-	jz .done
-	stosw
-	jmp .loop
-.done:
-	popad
+.notinitialized:
 	ret
-.msg db "Serial init failed", 0

From e16da3adc87e34bab07763589cb601667b5b9679 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Mon, 24 Jul 2023 21:48:21 +0300
Subject: [PATCH 04/45] Multiboot parsing and uitoa impl

---
 Makefile          |   2 +-
 src/itoa.asm      |  98 ++++++++++++++++++++++++++++++++++++++
 src/mbootinfo.asm | 118 ++++++++++++++++++++++++++++++++++++++++++++++
 src/start32.asm   | 118 +++++++++++++++++++++++++++++-----------------
 4 files changed, 291 insertions(+), 45 deletions(-)
 create mode 100644 src/itoa.asm
 create mode 100644 src/mbootinfo.asm

diff --git a/Makefile b/Makefile
index 1e50876..33d69be 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ all: build/kernel-i386.elf
 clean:
 	-@rm *.bin 2> /dev/null || true
 
-start32.bin: src/start32.asm src/serial.asm
+start32.bin: src/*
 	fasm src/start32.asm start32.bin
 image: start32.bin mount
 	cp start32.bin mnt/koalemos/
diff --git a/src/itoa.asm b/src/itoa.asm
new file mode 100644
index 0000000..914b214
--- /dev/null
+++ b/src/itoa.asm
@@ -0,0 +1,98 @@
+;; Modified from: https://gist.github.com/SplittyDev/8e728627012e57ac0deac196660014fb
+
+;
+; Routine to convert a 32-bit integer to a string.
+; Registers are preserved.
+;
+; EAX: Source integer
+; EBX: Target address
+; ECX: Base
+;
+; Internal register layout:
+; start:
+; EAX: Source integer
+; ECX: Target address
+; EDX: Base
+; checknegative:
+; EAX: Source integer
+; EBX: Target address (original)
+; ECX: Target address (active)
+; divrem:
+; EAX: Source integer
+; ECX: Target address (active)
+; EDX: Base / Result
+; reverse:
+; EBX: Target address (original)
+; ECX: Target address (active)
+; EDX: Target address (temporary)
+;
+__uitoa:
+.start:
+	push ebp
+	mov ebp, esp
+
+	push eax
+	push ebx
+	push ecx
+	push edx
+
+	mov eax, [ebp+8]
+	mov ecx, [ebp+12]
+	mov ebx, [ebp+16]
+
+	mov edx, ecx
+	mov ecx, ebx
+;.checknegative:
+;    test eax, eax
+;    jns .divrem
+;    mov byte [ecx], 0x2D
+;    inc ecx
+;    mov ebx, ecx
+;    neg eax
+.divrem:
+	push edx
+	push ecx
+	mov ecx, edx
+	xor edx, edx
+	div ecx
+	mov byte dl, [__itoacvt + edx]
+	pop ecx
+	mov byte [ecx], dl
+	pop edx
+	inc ecx
+	cmp eax, 0x00
+	jne .divrem
+	mov byte [ecx], 0x00
+	dec ecx
+.reverse:
+	cmp ebx, ecx
+	jge .end
+	mov byte dl, [ebx]
+	mov byte al, [ecx]
+	mov byte [ebx], al
+	mov byte [ecx], dl
+	inc ebx
+	dec ecx
+	jmp .reverse
+.end:
+	pop edx
+	pop ecx
+	pop ebx
+	pop eax
+
+	pop ebp
+	ret
+
+;
+; Conversion table for __itoa.
+; Works for bases [2 ... 36].
+;
+__itoacvt:
+	db '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+
+;
+; Buffer to store the result of __itoa in.
+;
+align 64
+__itoabuf32:
+	rb 36
diff --git a/src/mbootinfo.asm b/src/mbootinfo.asm
new file mode 100644
index 0000000..a12504a
--- /dev/null
+++ b/src/mbootinfo.asm
@@ -0,0 +1,118 @@
+mbootgetinfo:
+	push ebp
+	mov ebp, esp
+	push ebx
+	push esi
+	push edi
+	cld
+
+	mov eax, [ebp+8]
+	cmp eax, 0x2badb002
+	jne mbootnomagic
+
+	mov ebx, [ebp+12]
+	mov eax, [ebx]
+	mov [mbootinfo.flags], eax
+
+	;; Get memoryinformation
+	test eax, 1b
+	jz mbootnomeminfo
+	mov eax, [ebx+4]
+	mov [mbootinfo.mem_lower], eax
+	mov eax, [ebx+8]
+	mov [mbootinfo.mem_upper], eax
+
+	;; Get videoinformation
+	test [mbootinfo.flags], (1 shl 02)
+	jz mbootnovideoinfo
+
+	mov esi, ebx
+	add esi, 88
+	mov eax, [esi]
+	mov [mbootinfo.fb_addr], eax
+	add esi, 8
+
+	mov eax, [esi]
+	mov [mbootinfo.fb_pitch], eax
+	add esi, 4
+
+	mov eax, [esi]
+	mov [mbootinfo.fb_width], eax
+	add esi, 4
+
+	mov eax, [esi]
+	mov [mbootinfo.fb_height], eax
+	add esi, 4
+
+	mov al, [esi]
+	cmp al, 32
+	je .bppokay
+	cmp al, 24
+	je .bppokay
+	jmp mbootunsupportedfbbpp
+.bppokay:
+	mov [mbootinfo.fb_bpp], al
+	inc esi
+
+	mov al, [esi]
+	cmp al, 1
+	jne mbootunsupportedfbtype
+	mov [mbootinfo.fb_type], al
+	inc esi
+
+	;; r/g/b positions and masks
+	mov ecx, 6
+	mov edi, mbootinfo.fb_rpos
+	rep movsb
+
+.done:
+	pop edi
+	pop esi
+	pop ebx
+	pop ebp
+	ret
+
+
+mbootnomagic:
+	push .msg
+	call serialwrite
+	jmp hang
+.msg db "No multiboot magic!", 10, 0
+mbootnomeminfo:
+	push .msg
+	call serialwrite
+	jmp hang
+.msg db "No memoryinfo!", 10, 0
+mbootnovideoinfo:
+	push .msg
+	call serialwrite
+	jmp hang
+.msg db "No videoryinfo!", 10, 0
+mbootunsupportedfbtype:
+	push .msg
+	call serialwrite
+	jmp hang
+.msg db "Unsupported framebuffer type: only direct RGB is supported!", 10, 0
+mbootunsupportedfbbpp:
+	push .msg
+	call serialwrite
+	jmp hang
+.msg db "Unsupported bitdepth: only 24 and 32 bpp supported!", 10, 0
+
+
+mbootinfo:
+	.flags dd 0
+	.mem_lower dd 0
+	.mem_upper dd 0
+	.fb_addr dd 0
+	.fb_pitch dd 0
+	.fb_width dd 0
+	.fb_height dd 0
+	.fb_bpp db 0
+	.fb_type db 0
+	.fb_rpos db 0
+	.fb_rmasksize db 0
+	.fb_gpos db 0
+	.fb_gmasksize db 0
+	.fb_bpos db 0
+	.fb_bmasksize db 0
diff --git a/src/start32.asm b/src/start32.asm
index fc19dc0..9eb28a9 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -5,7 +5,7 @@ org 0x100000
 MULTIBOOT_HEADER_MAGIC      equ 0x1BADB002
 MULTIBOOT_PAGE_ALIGN        equ (1 shl 0)
 MULTIBOOT_MEMORY_INFO       equ (1 shl 1)
-MULTIBOOT_VIDEO_REQUEST     equ (0 shl 2)
+MULTIBOOT_VIDEO_REQUEST     equ (1 shl 2)
 MULTIBOOT_AOUT_KLUDGE       equ (1 shl 16)
 MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST
 MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST or MULTIBOOT_AOUT_KLUDGE
@@ -27,68 +27,98 @@ multiboot:
 
 start:
 	; Setup stack
-	mov ebp, stack_bottom
+	mov ebp, stack_top
 	mov esp, stack_top
 
 	push ebx
 	push eax
 
-	cmp eax, 0x2badb002
-	jne multibootnomagic
-
-	mov byte [0xb8000], '!'
-
-	push stuff.bootmsg
-	call printbootmsg
 	call serialinit
+	push stuff.bootmsg
 	call serialwrite
 	add esp, 4
 
+	call mbootgetinfo
+	add esp, 2*4
+
+	mov eax, [mbootinfo.fb_addr]
+	mov dword [eax], 0xffffffff
+
+
+	push stuff.fbaddrmsgpfx
+	call serialwrite
+	add esp, 4
+
+	sub esp, 36	;Reserve stack for return
+	push dword esp	;Destination address
+	push dword 16	;Base
+	push dword [mbootinfo.fb_addr]	;source
+	call __uitoa
+	add esp, 3*4
+	push esp
+	call serialwrite
+	add esp, 4
+
+	push stuff.fbdimensionsmsgpfx
+	call serialwrite
+	add esp, 4
+	push dword esp	;destination address
+	push dword 10	;base
+	push dword [mbootinfo.fb_width]
+	call __uitoa
+	add esp, 3*4
+	push esp
+	call serialwrite
+	add esp, 4
+	push stuff.x
+	call serialwrite
+	add esp, 4
+
+	push dword esp	;destination address
+	push dword 10	;base
+	push dword [mbootinfo.fb_height]
+	call __uitoa
+	add esp, 3*4
+	push esp
+	call serialwrite
+	add esp, 4
+	push stuff.x
+	call serialwrite
+
+	add esp, 4
+	push dword esp	;destination address
+	push dword 10	;base
+	xor eax, eax
+	mov al, [mbootinfo.fb_bpp]
+	push dword eax
+	call __uitoa
+	add esp, 3*4
+	push esp
+	call serialwrite
+	add esp, 4
+
+	add esp, 36	;Clean reserved uitoa return string from stack
+
 	jmp hang
 
 hang:
+	push .msg
+	call serialwrite
 	cli
+.loop:
 	hlt
-	jmp hang
-
-multibootnomagic:
-	mov esi, .msg
-	mov edi, 0xb8000
-	mov ah, 64
-	cld
-.loop:
-	lodsb
-	or al, al
-	jz .done
-	stosw
 	jmp .loop
-.done:
-	jmp hang
-.msg db "No multiboot magic", 0
-
-printbootmsg:
-	push ebp
-	mov ebp, esp
-	pushad
-	mov esi, [ebp+8]
-	mov edi, 0xb8000
-	cld
-.loop:
-	lodsb
-	or al, al
-	jz .done
-	stosb
-	inc edi
-	jmp .loop
-.done:
-	popad
-	pop ebp
-	ret
+.msg db 10, "Halting...", 10, 0
 
 include "src/serial.asm"
+include "src/mbootinfo.asm"
+include "src/itoa.asm"
 
 stuff:
-	.bootmsg db "=== KoalemOS ===", 10, 0
+	.bootmsg db 10, "=== KoalemOS ===", 10, 0
+	.fbaddrmsgpfx db 10, "Framebuffer address: 0x", 0
+	.fbdimensionsmsgpfx db 10, "Framebuffer dimensions: ", 0
+	.x db "x", 0
 
 
 stack_bottom:

From d542ed42d6da5e6d61b141cbb547722185a830af Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 25 Jul 2023 01:02:13 +0300
Subject: [PATCH 05/45] Serial init error handling removed: no more VGA text
 memory to print to

---
 src/serial.asm | 24 ++----------------------
 1 file changed, 2 insertions(+), 22 deletions(-)

diff --git a/src/serial.asm b/src/serial.asm
index 39293ec..b4e3353 100644
--- a/src/serial.asm
+++ b/src/serial.asm
@@ -47,32 +47,12 @@ serialinit:
 	out dx, al
 	in al, dx
 	cmp al, 0xae
-	je .noerror
-.error:
-	push esi
-	push edi
-	push ax
-	mov esi, .errormsg
-	mov edi, 0xb8000
-	mov ah, 64
-	cld
-.errorloop:
-	lodsb
-	or al, al
-	jz .errordone
-	stosw
-	jmp .errorloop
-.errordone:
-	pop ax
-	pop edi
-	pop esi
-	jmp .end
-.noerror:
-	mov [serialinitialized], 1
+	jne .end
 	;; Set serial to normal operation
 	mov dx, SERIAL_PORT+4
 	mov al, 0x0f
 	out dx, al
+	mov [serialinitialized], 1
 .end:
 	pop ax
 	ret

From 148634efffd7082c97de4d39c80a77428d7acc20 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 25 Jul 2023 05:45:32 +0300
Subject: [PATCH 06/45] Pagingggggggg! (identity mapped low 4M)

---
 src/start32.asm | 44 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/src/start32.asm b/src/start32.asm
index 9eb28a9..302a6e9 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -17,7 +17,7 @@ multiboot:
 	dd MULTIBOOT_CHECKSUM
 	dd multiboot	; header address
 	dd 0x100000	; load address
-	dd stack_bottom	; load end address
+	dd bss	; load end address
 	dd stack_top	; bss end address
 	dd start	; entry address
 	dd 0	; video mode_type (0:fb, 1:txt) (set flags[2]!)
@@ -99,6 +99,39 @@ start:
 
 	add esp, 36	;Clean reserved uitoa return string from stack
 
+
+	;; Setup paging
+	;; Clear pagedir
+	cld
+	mov eax, 0x00000002	;Supervisor only, Write enabled, Not present
+	mov ecx, 1024
+	mov edi, pagedir
+	rep stosd
+
+	;; Clear pagetable1
+	mov edi, pagetable1
+	mov cx, 0
+.clearpt1loop:
+	mov eax, 0x00001000
+	mul ecx
+	or eax, 011b	;supervisor, rw, present
+	stosd
+	inc cx
+	cmp cx, 1024
+	jne .clearpt1loop
+
+	;; put table1 in dir
+	mov eax, pagetable1
+	or eax, 011b	;supervisor, rw, present
+	mov [pagedir], eax
+
+	;; Enable paging
+	mov eax, pagedir
+	mov cr3, eax
+	mov eax, cr0
+	or eax, 0x80000000
+	mov cr0, eax
+
 	jmp hang
 
 hang:
@@ -120,7 +153,14 @@ stuff:
 	.fbdimensionsmsgpfx db 10, "Framebuffer dimensions: ", 0
 	.x db "x", 0
 
-
+bss:
+align 4096
+pagedir:
+	rb 4096
+align 4096
+pagetable1:
+	rb 4096
+align 4096
 stack_bottom:
 rb 16384
 stack_top:

From 208d05b1398dddb2d7f18bc0f9ea78655f6dc2cf Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 1 Aug 2023 21:05:36 +0300
Subject: [PATCH 07/45] Forgat my os is supposed to be called rOSka

---
 Makefile        | 8 ++++----
 README.md       | 4 ++--
 src/start32.asm | 2 +-
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/Makefile b/Makefile
index 33d69be..4d1cb7d 100644
--- a/Makefile
+++ b/Makefile
@@ -5,17 +5,17 @@ clean:
 start32.bin: src/*
 	fasm src/start32.asm start32.bin
 image: start32.bin mount
-	cp start32.bin mnt/koalemos/
+	cp start32.bin mnt/roska/
 	sync
 
 qemu-multiboot: start32.bin
 	qemu-system-i386 -kernel start32.bin -serial stdio
 qemu-image: image
-	qemu-system-i386 koalemos.img -serial stdio
+	qemu-system-i386 roska.img -serial stdio
 
-mount: koalemos.img mnt/
+mount: roska.img mnt/
 	@if ! mountpoint -q "mnt/"; then \
-		sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) koalemos.img mnt/; \
+		sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \
 	fi;
 umount:
 	@sudo umount mnt
diff --git a/README.md b/README.md
index 3b07e1e..ed1db17 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-# KoalemOS
-Multiboot compatible stupid useless OS-like project.
+# rOSka
+Multiboot compatible stupid useless OS-like project that is literally trash.
 ## Compatibility
 32bit x86 legacy BIOS system
 ## Building
diff --git a/src/start32.asm b/src/start32.asm
index 302a6e9..a960eb0 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -148,7 +148,7 @@ include "src/mbootinfo.asm"
 include "src/itoa.asm"
 
 stuff:
-	.bootmsg db 10, "=== KoalemOS ===", 10, 0
+	.bootmsg db 10, "=== rOSka ===", 10, 0
 	.fbaddrmsgpfx db 10, "Framebuffer address: 0x", 0
 	.fbdimensionsmsgpfx db 10, "Framebuffer dimensions: ", 0
 	.x db "x", 0

From 1034574d1e988b541c4d408c1d6ea871b7a6b4f1 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 1 Aug 2023 21:23:14 +0300
Subject: [PATCH 08/45] Making the Multiboot structure a bit shorter to
 conserve line length

---
 src/start32.asm | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/start32.asm b/src/start32.asm
index a960eb0..767f3bf 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -2,19 +2,19 @@ format binary
 use32
 org 0x100000
 
-MULTIBOOT_HEADER_MAGIC      equ 0x1BADB002
-MULTIBOOT_PAGE_ALIGN        equ (1 shl 0)
-MULTIBOOT_MEMORY_INFO       equ (1 shl 1)
-MULTIBOOT_VIDEO_REQUEST     equ (1 shl 2)
-MULTIBOOT_AOUT_KLUDGE       equ (1 shl 16)
-MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST
-MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST or MULTIBOOT_AOUT_KLUDGE
-MULTIBOOT_CHECKSUM          equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
+MB_HEADER_MAGIC      equ 0x1BADB002
+MB_PAGE_ALIGN        equ (1 shl 0)
+MB_MEMORY_INFO       equ (1 shl 1)
+MB_VIDEO_REQUEST     equ (1 shl 2)
+MB_AOUT_KLUDGE       equ (1 shl 16)
+MB_HEADER_FLAGS      equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST
+MB_HEADER_FLAGS      equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST or MB_AOUT_KLUDGE
+MB_CHECKSUM          equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
 
 multiboot:
-	dd MULTIBOOT_HEADER_MAGIC
-	dd MULTIBOOT_HEADER_FLAGS
-	dd MULTIBOOT_CHECKSUM
+	dd MB_HEADER_MAGIC
+	dd MB_HEADER_FLAGS
+	dd MB_CHECKSUM
 	dd multiboot	; header address
 	dd 0x100000	; load address
 	dd bss	; load end address

From e9b363221ad4940bf96c053f58b20e2123c7a398 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Wed, 2 Aug 2023 13:49:16 +0300
Subject: [PATCH 09/45] Fixing makefile

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 4d1cb7d..7864526 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-all: build/kernel-i386.elf
+all: start32.bin
 clean:
 	-@rm *.bin 2> /dev/null || true
 

From 8709de57470c31ddd07f09c1d28b420aa684c28a Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Wed, 2 Aug 2023 14:19:46 +0300
Subject: [PATCH 10/45] Better separation on BSS if it grws or something

---
 src/start32.asm | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/start32.asm b/src/start32.asm
index 767f3bf..55f5261 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -17,8 +17,8 @@ multiboot:
 	dd MB_CHECKSUM
 	dd multiboot	; header address
 	dd 0x100000	; load address
-	dd bss	; load end address
-	dd stack_top	; bss end address
+	dd bss_start	; load end address
+	dd bss_end	; bss end address
 	dd start	; entry address
 	dd 0	; video mode_type (0:fb, 1:txt) (set flags[2]!)
 	dd 1024	; video width
@@ -153,7 +153,7 @@ stuff:
 	.fbdimensionsmsgpfx db 10, "Framebuffer dimensions: ", 0
 	.x db "x", 0
 
-bss:
+bss_start:
 align 4096
 pagedir:
 	rb 4096
@@ -164,3 +164,4 @@ align 4096
 stack_bottom:
 rb 16384
 stack_top:
+bss_end:

From 3c121e97f4f1eb85a41ab4059a53b31d49a0d129 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Wed, 2 Aug 2023 20:16:43 +0300
Subject: [PATCH 11/45] Framebuffer putpixel LEGGOOO! (disabled paging lol)

---
 src/framebuffer.asm | 74 +++++++++++++++++++++++++++++++++++++++++
 src/mbootinfo.asm   |  7 ++++
 src/start32.asm     | 81 ++++++++++++++++++++++-----------------------
 3 files changed, 121 insertions(+), 41 deletions(-)
 create mode 100644 src/framebuffer.asm

diff --git a/src/framebuffer.asm b/src/framebuffer.asm
new file mode 100644
index 0000000..ad97385
--- /dev/null
+++ b/src/framebuffer.asm
@@ -0,0 +1,74 @@
+;; x, y, r, g, b
+putpixel:
+	push ebp
+	mov ebp, esp
+
+	push eax
+	push ebx
+	push ecx
+	push edi
+
+
+
+	; Destination
+	std
+	mov edi, [mbootinfo.fb_addr]
+	mov eax, [mbootinfo.fb_pitch]
+	mul dword [ebp+12]   ;y
+	add edi, eax
+
+	mov eax, [ebp+8]   ;x
+	mul byte [mbootinfo.fb_bytespp]
+	dec eax
+	add edi, eax
+
+	movzx eax, [mbootinfo.fb_bytespp]
+	dec eax
+	add edi, eax
+
+	; Blue
+	mov ebx, [ebp + 24]
+	mov cl, [mbootinfo.fb_bpos]
+	shl ebx, cl
+	or eax, ebx
+	; Green
+	mov ebx, [ebp + 20]
+	mov cl, [mbootinfo.fb_gpos]
+	shl ebx, cl
+	or eax, ebx
+	; Red
+	mov ebx, [ebp + 16]
+	mov cl, [mbootinfo.fb_rpos]
+	shl ebx, cl
+	or eax, ebx
+
+	cmp [mbootinfo.fb_bpp], 24
+	je .24bpp
+	jne .32bpp
+.done:
+	pop edi
+	pop ecx
+	pop ebx
+	pop eax
+
+	pop ebp
+	ret
+.32bpp:
+	stosb
+	shr eax, 8
+	stosb
+	shr eax, 8
+	stosb
+	shr eax, 8
+	stosb
+	jmp .done
+.24bpp:
+	;shr eax, 8
+	stosb
+	shr eax, 8
+	stosb
+	shr eax, 8
+	stosb
+	jmp .done
+
+.msg db 10, ":D", 10, 0
diff --git a/src/mbootinfo.asm b/src/mbootinfo.asm
index a12504a..1a6f559 100644
--- a/src/mbootinfo.asm
+++ b/src/mbootinfo.asm
@@ -65,6 +65,12 @@ mbootgetinfo:
 	mov edi, mbootinfo.fb_rpos
 	rep movsb
 
+.bytesppcalc:
+	xor eax, eax
+	mov al, [mbootinfo.fb_bpp]
+	mov ebx, 8
+	div bl
+	mov [mbootinfo.fb_bytespp], al
 .done:
 	pop edi
 	pop esi
@@ -116,3 +122,4 @@ mbootinfo:
 	.fb_gmasksize db 0
 	.fb_bpos db 0
 	.fb_bmasksize db 0
+	.fb_bytespp db 0
diff --git a/src/start32.asm b/src/start32.asm
index 55f5261..5d48f85 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -11,6 +11,9 @@ MB_HEADER_FLAGS      equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST
 MB_HEADER_FLAGS      equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST or MB_AOUT_KLUDGE
 MB_CHECKSUM          equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
 
+VWIDTH  equ 1024
+VHEIGHT equ 768
+
 multiboot:
 	dd MB_HEADER_MAGIC
 	dd MB_HEADER_FLAGS
@@ -21,8 +24,8 @@ multiboot:
 	dd bss_end	; bss end address
 	dd start	; entry address
 	dd 0	; video mode_type (0:fb, 1:txt) (set flags[2]!)
-	dd 1024	; video width
-	dd 768	; video height
+	dd VWIDTH	; video width
+	dd VHEIGHT	; video height
 	dd 32	; video depth
 
 start:
@@ -41,10 +44,6 @@ start:
 	call mbootgetinfo
 	add esp, 2*4
 
-	mov eax, [mbootinfo.fb_addr]
-	mov dword [eax], 0xffffffff
-
-
 	push stuff.fbaddrmsgpfx
 	call serialwrite
 	add esp, 4
@@ -84,8 +83,8 @@ start:
 	add esp, 4
 	push stuff.x
 	call serialwrite
-
 	add esp, 4
+
 	push dword esp	;destination address
 	push dword 10	;base
 	xor eax, eax
@@ -100,37 +99,35 @@ start:
 	add esp, 36	;Clean reserved uitoa return string from stack
 
 
-	;; Setup paging
-	;; Clear pagedir
-	cld
-	mov eax, 0x00000002	;Supervisor only, Write enabled, Not present
-	mov ecx, 1024
-	mov edi, pagedir
-	rep stosd
 
-	;; Clear pagetable1
-	mov edi, pagetable1
-	mov cx, 0
-.clearpt1loop:
-	mov eax, 0x00001000
-	mul ecx
-	or eax, 011b	;supervisor, rw, present
-	stosd
-	inc cx
-	cmp cx, 1024
-	jne .clearpt1loop
+	mov ebx, 1
+	mov eax, 1
+
+	push  0x00	;B
+	push  0x00	;G
+	push  0xff	;R
+	push  ebx		;y
+	push  eax		;x
+	call putpixel
+	add esp, 20	;clean stack
+inc eax
+	push  0x00	;B
+	push  0x00	;G
+	push  0xff	;R
+	push  ebx		;y
+	push  eax		;x
+	call putpixel
+	add esp, 20	;clean stack
+inc ebx
+	push  0x00	;B
+	push  0x00	;G
+	push  0xff	;R
+	push  ebx		;y
+	push  eax		;x
+	call putpixel
+	add esp, 20	;clean stack
 
-	;; put table1 in dir
-	mov eax, pagetable1
-	or eax, 011b	;supervisor, rw, present
-	mov [pagedir], eax
 
-	;; Enable paging
-	mov eax, pagedir
-	mov cr3, eax
-	mov eax, cr0
-	or eax, 0x80000000
-	mov cr0, eax
 
 	jmp hang
 
@@ -146,6 +143,7 @@ hang:
 include "src/serial.asm"
 include "src/mbootinfo.asm"
 include "src/itoa.asm"
+include "src/framebuffer.asm"
 
 stuff:
 	.bootmsg db 10, "=== rOSka ===", 10, 0
@@ -153,13 +151,14 @@ stuff:
 	.fbdimensionsmsgpfx db 10, "Framebuffer dimensions: ", 0
 	.x db "x", 0
 
+align 4096
 bss_start:
-align 4096
-pagedir:
-	rb 4096
-align 4096
-pagetable1:
-	rb 4096
+;align 4096
+;pagedir:
+;	rb 4096
+;align 4096
+;pagetable1:
+;	rb 4096
 align 4096
 stack_bottom:
 rb 16384

From 1b9f7f8ee5455f2f6c5cafa0f0243c220093a82a Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Wed, 6 Sep 2023 19:58:40 +0300
Subject: [PATCH 12/45] Making a working (at last!) 24/32 bpp framebuffer but
 only grayscale. Cool logo included

---
 src/framebuffer.asm  | 54 +++++++++-----------------------------------
 src/roskalogoraw.asm | 32 ++++++++++++++++++++++++++
 src/start32.asm      | 51 +++++++++++++++++++----------------------
 3 files changed, 66 insertions(+), 71 deletions(-)
 create mode 100644 src/roskalogoraw.asm

diff --git a/src/framebuffer.asm b/src/framebuffer.asm
index ad97385..7d14615 100644
--- a/src/framebuffer.asm
+++ b/src/framebuffer.asm
@@ -1,4 +1,4 @@
-;; x, y, r, g, b
+;; x, y, brightness
 putpixel:
 	push ebp
 	mov ebp, esp
@@ -8,10 +8,9 @@ putpixel:
 	push ecx
 	push edi
 
-
+	cld
 
 	; Destination
-	std
 	mov edi, [mbootinfo.fb_addr]
 	mov eax, [mbootinfo.fb_pitch]
 	mul dword [ebp+12]   ;y
@@ -19,32 +18,20 @@ putpixel:
 
 	mov eax, [ebp+8]   ;x
 	mul byte [mbootinfo.fb_bytespp]
-	dec eax
 	add edi, eax
 
-	movzx eax, [mbootinfo.fb_bytespp]
-	dec eax
-	add edi, eax
 
-	; Blue
-	mov ebx, [ebp + 24]
-	mov cl, [mbootinfo.fb_bpos]
-	shl ebx, cl
-	or eax, ebx
-	; Green
-	mov ebx, [ebp + 20]
-	mov cl, [mbootinfo.fb_gpos]
-	shl ebx, cl
-	or eax, ebx
-	; Red
-	mov ebx, [ebp + 16]
-	mov cl, [mbootinfo.fb_rpos]
-	shl ebx, cl
-	or eax, ebx
+	; Brightness
+	mov eax, [ebp + 16]
+
+	; Poke videomemory
+	stosb
+	stosb
+	stosb
 
 	cmp [mbootinfo.fb_bpp], 24
-	je .24bpp
-	jne .32bpp
+	je .done
+	stosb
 .done:
 	pop edi
 	pop ecx
@@ -53,22 +40,3 @@ putpixel:
 
 	pop ebp
 	ret
-.32bpp:
-	stosb
-	shr eax, 8
-	stosb
-	shr eax, 8
-	stosb
-	shr eax, 8
-	stosb
-	jmp .done
-.24bpp:
-	;shr eax, 8
-	stosb
-	shr eax, 8
-	stosb
-	shr eax, 8
-	stosb
-	jmp .done
-
-.msg db 10, ":D", 10, 0
diff --git a/src/roskalogoraw.asm b/src/roskalogoraw.asm
new file mode 100644
index 0000000..a5afc84
--- /dev/null
+++ b/src/roskalogoraw.asm
@@ -0,0 +1,32 @@
+jmp roskalogofileskip
+roskalogo:
+	db 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
+	db 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+	db 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff
+	db 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
+	.w db 84
+	.h db 27
+roskalogofileskip:
diff --git a/src/start32.asm b/src/start32.asm
index 5d48f85..8577d67 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -26,7 +26,7 @@ multiboot:
 	dd 0	; video mode_type (0:fb, 1:txt) (set flags[2]!)
 	dd VWIDTH	; video width
 	dd VHEIGHT	; video height
-	dd 32	; video depth
+	dd 24	; video depth
 
 start:
 	; Setup stack
@@ -99,35 +99,29 @@ start:
 	add esp, 36	;Clean reserved uitoa return string from stack
 
 
-
-	mov ebx, 1
-	mov eax, 1
-
-	push  0x00	;B
-	push  0x00	;G
-	push  0xff	;R
-	push  ebx		;y
-	push  eax		;x
+rOSkalogodraw:
+	mov esi, roskalogo
+	mov eax, 0	;Brightness
+	mov ebx, 0	;y
+	mov ecx, 0	;x
+.loop:
+	lodsb
+	push eax
+	push ebx
+	push ecx
 	call putpixel
-	add esp, 20	;clean stack
-inc eax
-	push  0x00	;B
-	push  0x00	;G
-	push  0xff	;R
-	push  ebx		;y
-	push  eax		;x
-	call putpixel
-	add esp, 20	;clean stack
-inc ebx
-	push  0x00	;B
-	push  0x00	;G
-	push  0xff	;R
-	push  ebx		;y
-	push  eax		;x
-	call putpixel
-	add esp, 20	;clean stack
-
+	pop ecx
+	pop ebx
+	pop eax
 
+	inc ecx
+	cmp byte cl, [roskalogo.w]
+	jne .loop
+	mov ecx, 0
+	inc ebx
+	cmp byte bl, [roskalogo.h]
+	jne .loop
+.done:
 
 	jmp hang
 
@@ -144,6 +138,7 @@ include "src/serial.asm"
 include "src/mbootinfo.asm"
 include "src/itoa.asm"
 include "src/framebuffer.asm"
+include "src/roskalogoraw.asm"
 
 stuff:
 	.bootmsg db 10, "=== rOSka ===", 10, 0

From 55fb99f0e12ec0b4bcf11b66bb2849e48aaf7d90 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Wed, 6 Sep 2023 20:28:25 +0300
Subject: [PATCH 13/45] Not the whole screenbuffer width was accessible

---
 src/framebuffer.asm | 3 ++-
 src/start32.asm     | 9 +++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/framebuffer.asm b/src/framebuffer.asm
index 7d14615..d831dec 100644
--- a/src/framebuffer.asm
+++ b/src/framebuffer.asm
@@ -17,7 +17,8 @@ putpixel:
 	add edi, eax
 
 	mov eax, [ebp+8]   ;x
-	mul byte [mbootinfo.fb_bytespp]
+	movzx ebx, byte [mbootinfo.fb_bytespp]
+	mul ebx
 	add edi, eax
 
 
diff --git a/src/start32.asm b/src/start32.asm
index 8577d67..fc3ae85 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -98,6 +98,15 @@ start:
 
 	add esp, 36	;Clean reserved uitoa return string from stack
 
+	; Draw a test pixel to bottom right corner
+	mov eax, 0xff
+	mov ebx, 767
+	mov ecx, 1023
+	push 0xff
+	push 767
+	push 1023
+	call putpixel
+	add esp, 3*4
 
 rOSkalogodraw:
 	mov esi, roskalogo

From e9eaf218a1b4c76064953e2392708fb78171e7c7 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Thu, 7 Sep 2023 21:32:00 +0300
Subject: [PATCH 14/45] Updating the file nobody never reads

---
 README.md | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index ed1db17..a9cfbc9 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,10 @@
 # rOSka
 Multiboot compatible stupid useless OS-like project that is literally trash.
 ## Compatibility
-32bit x86 legacy BIOS system
+- 32bit x86 compatible CPU required
+- Booting is done with a MultiBoot compatible bootloader (for example Grub)
+- 1024x768 with 24 or 32 bpp linear framebuffer graphics
+- At some point tested with an old Pentium III (legacy BIOS) and a Ryzen 7 in
+  EFI mode. Currently aiming to support both systems.
 ## Building
 FASM is used as the assembler.

From f9c0bd3db6c8053ca474676c8929ed5f50cc2ddd Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 8 Sep 2023 12:02:02 +0300
Subject: [PATCH 15/45] Improved framebuffer compatibility and memory safeguard

---
 src/framebuffer.asm | 25 ++++++++++++++-----------
 src/mbootinfo.asm   |  6 ------
 src/start32.asm     | 11 ++++++-----
 3 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/src/framebuffer.asm b/src/framebuffer.asm
index d831dec..9c215a4 100644
--- a/src/framebuffer.asm
+++ b/src/framebuffer.asm
@@ -10,15 +10,23 @@ putpixel:
 
 	cld
 
+	; check pixel is in screen
+	mov ebx, [ebp+12]	;y
+	cmp ebx, [mbootinfo.fb_height]
+	jge .done
+	mov ecx, [ebp+8]	;x
+	cmp ecx, [mbootinfo.fb_width]
+	jge .done
+
 	; Destination
 	mov edi, [mbootinfo.fb_addr]
 	mov eax, [mbootinfo.fb_pitch]
-	mul dword [ebp+12]   ;y
+	mul dword ebx   ;y
 	add edi, eax
 
-	mov eax, [ebp+8]   ;x
-	movzx ebx, byte [mbootinfo.fb_bytespp]
-	mul ebx
+	mov eax, ecx   ;x
+	movzx ecx, byte [mbootinfo.fb_bytespp]
+	mul ecx
 	add edi, eax
 
 
@@ -26,13 +34,8 @@ putpixel:
 	mov eax, [ebp + 16]
 
 	; Poke videomemory
-	stosb
-	stosb
-	stosb
-
-	cmp [mbootinfo.fb_bpp], 24
-	je .done
-	stosb
+	cld
+	rep stosb
 .done:
 	pop edi
 	pop ecx
diff --git a/src/mbootinfo.asm b/src/mbootinfo.asm
index 1a6f559..2ff07e8 100644
--- a/src/mbootinfo.asm
+++ b/src/mbootinfo.asm
@@ -45,12 +45,6 @@ mbootgetinfo:
 	add esi, 4
 
 	mov al, [esi]
-	cmp al, 32
-	je .bppokay
-	cmp al, 24
-	je .bppokay
-	jmp mbootunsupportedfbbpp
-.bppokay:
 	mov [mbootinfo.fb_bpp], al
 	inc esi
 
diff --git a/src/start32.asm b/src/start32.asm
index fc3ae85..f8e5d36 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -11,8 +11,9 @@ MB_HEADER_FLAGS      equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST
 MB_HEADER_FLAGS      equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST or MB_AOUT_KLUDGE
 MB_CHECKSUM          equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
 
-VWIDTH  equ 1024
-VHEIGHT equ 768
+VWIDTH  equ 640
+VHEIGHT equ 480
+VDEPTH  equ 24
 
 multiboot:
 	dd MB_HEADER_MAGIC
@@ -26,7 +27,7 @@ multiboot:
 	dd 0	; video mode_type (0:fb, 1:txt) (set flags[2]!)
 	dd VWIDTH	; video width
 	dd VHEIGHT	; video height
-	dd 24	; video depth
+	dd VDEPTH	; video depth
 
 start:
 	; Setup stack
@@ -103,8 +104,8 @@ start:
 	mov ebx, 767
 	mov ecx, 1023
 	push 0xff
-	push 767
-	push 1023
+	push 479
+	push 639
 	call putpixel
 	add esp, 3*4
 

From 9ef19730e3cae2d5420cc38a3b21c64281887b85 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 8 Sep 2023 12:03:52 +0300
Subject: [PATCH 16/45] Forgot a stray CLD instruction lol

---
 src/framebuffer.asm | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/framebuffer.asm b/src/framebuffer.asm
index 9c215a4..5204798 100644
--- a/src/framebuffer.asm
+++ b/src/framebuffer.asm
@@ -8,8 +8,6 @@ putpixel:
 	push ecx
 	push edi
 
-	cld
-
 	; check pixel is in screen
 	mov ebx, [ebp+12]	;y
 	cmp ebx, [mbootinfo.fb_height]

From deadd739fbb36e73ed912b70de31c51ea6612305 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 8 Sep 2023 12:06:58 +0300
Subject: [PATCH 17/45] Another Readme update for new improved framebuffer

---
 README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index a9cfbc9..e6d1c25 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,8 @@ Multiboot compatible stupid useless OS-like project that is literally trash.
 ## Compatibility
 - 32bit x86 compatible CPU required
 - Booting is done with a MultiBoot compatible bootloader (for example Grub)
-- 1024x768 with 24 or 32 bpp linear framebuffer graphics
+- Linear framebuffer graphics with 8bits per channel (any 8bit divisible
+  bitdepth should work but is undefined behaviour, probably funny colours lol)
 - At some point tested with an old Pentium III (legacy BIOS) and a Ryzen 7 in
   EFI mode. Currently aiming to support both systems.
 ## Building

From 12e7efb8b53d38a00c76c6396dd3ce8c036ae086 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 19 Sep 2023 19:51:51 +0300
Subject: [PATCH 18/45] TCC-anothertry begins

---
 Makefile        | 16 +++++++---------
 README.md       |  7 ++++---
 src/kernel.c    |  7 ++++---
 src/serial.c    | 45 +++++++++++++++++++++++----------------------
 src/start32.asm | 47 -----------------------------------------------
 src/start32.s   | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 87 insertions(+), 84 deletions(-)
 delete mode 100644 src/start32.asm
 create mode 100644 src/start32.s

diff --git a/Makefile b/Makefile
index 098565f..28c65a3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,23 +1,21 @@
 all: build/kernel-i386.elf
 clean:
-	-@rm build/*.o build/*.elf 2> /dev/null || true
+	-@rm build/* 2> /dev/null || true
 
-build/start32.o: build/ src/start32.asm
-	nasm -felf32 src/start32.asm -o build/start32.o
-build/kernel-i386.elf: build/start32.o
-	tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/*.c build/start32.o
+build/kernel-i386.elf: src/*
+	tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/start32.s src/*.c
 image: build/kernel-i386.elf mount
-	cp build/kernel-i386.elf mnt/
+	cp build/kernel-i386.elf mnt/roska/start32.elf
 	sync
 
 qemu-multiboot: build/kernel-i386.elf
 	qemu-system-i386 -kernel build/kernel-i386.elf -serial stdio
 qemu-image: image
-	qemu-system-i386 koalemos.img -serial stdio
+	qemu-system-i386 roska.img -serial stdio
 
-mount: koalemos.img mnt/
+mount: roska.img mnt/
 	@if ! mountpoint -q "mnt/"; then \
-		sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) koalemos.img mnt/; \
+		sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \
 	fi;
 umount:
 	@sudo umount mnt
diff --git a/README.md b/README.md
index b6df57b..95b53e8 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,10 @@
-# KoalemOS
+# rOSka
 Multiboot compatible stupid useless OS-like project.
 ## Compatibility
-32bit x86 legacy BIOS system
+- x86 system with MultiBoot compatible bootloader.
+- Linear framebuffer graphics
 ## Building
-NASM and TinyCCompiler are used.
+TinyCCompiler is used, even for assembly lol.
 TCC might need manual compilation for 32bit crosscompilation
 on 64bit systems.
 Just download the source and `make cross` or something.
diff --git a/src/kernel.c b/src/kernel.c
index 60d6c3a..223d37f 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -1,3 +1,4 @@
+
 #include "multiboot.h"
 #include "framebuffer.h"
 #include "serial.h"
@@ -19,7 +20,7 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) {
 	outb(0x3D5, 0x20);
 
 	int serial_initialized = serial_init();
-	serial_write_string("\n=== KoalemOS ===\n");
+	serial_write_string("\n=== rOSka ===\n");
 
 	// Check multiboot header
 	if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
@@ -73,11 +74,11 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) {
 	for(;;) {
 		for(y=0; y < mbootinfo->framebuffer_height; y++) {
 			for(x=0; x < mbootinfo->framebuffer_width; x++) {
-				putpixel(x, y, c, c, c, 0xff);
+				putpixel(x, y, 0, c, c, 0xff);
 			}
 		}
 		c+=4;
 	}
 
-	serial_write_string("\nExecution finished, halting...");
+	serial_write_string("\nExecution finished, halting...\n");
 }
diff --git a/src/serial.c b/src/serial.c
index a9747cf..e4e8e27 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -20,30 +20,31 @@ int serial_init() {
 	outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set
 	outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip
 	outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial
-		// returns same byte)
+	// returns same byte)
 
-		// Check if serial is faulty (i.e: not same byte as sent)
-		if (inb(PORT + 0) != 0xAE) {
-			return 1;
-		}
-
-		// If serial is not faulty set it in normal operation mode
-		// (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
-		outb(PORT + 4, 0x0F);
-		return 0;
+	// Check if serial is faulty (i.e: not same byte as sent)
+	if (inb(PORT + 0) != 0xAE) {
+		return 1;
 	}
-	static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; }
 
-	static void serial_write_char(char chr) {
-		while (serial_is_transmit_empty() == 0);
-		outb(PORT, chr);
-	}
-	
-	void serial_write_string(const char* text) {
-		int i = 0;
-		while(text[i]) {
-			serial_write_char(text[i]);
-			i++;
-		}
+	// If serial is not faulty set it in normal operation mode
+	// (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
+	outb(PORT + 4, 0x0F);
+	return 0;
+}
 
+static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; }
+
+static void serial_write_char(char chr) {
+	while (serial_is_transmit_empty() == 0);
+	outb(PORT, chr);
+}
+
+void serial_write_string(const char* text) {
+	int i = 0;
+	while(text[i]) {
+		serial_write_char(text[i]);
+		i++;
 	}
+
+}
diff --git a/src/start32.asm b/src/start32.asm
deleted file mode 100644
index d4e7471..0000000
--- a/src/start32.asm
+++ /dev/null
@@ -1,47 +0,0 @@
-MULTIBOOT_HEADER_MAGIC      equ 0x1BADB002
-MULTIBOOT_PAGE_ALIGN        equ 1 << 0
-MULTIBOOT_MEMORY_INFO       equ 1 << 1
-MULTIBOOT_VIDEO_REQUEST     equ 0 << 2
-MULTIBOOT_AOUT_KLUDGE       equ 0 << 16
-MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST
-MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST | MULTIBOOT_AOUT_KLUDGE
-MULTIBOOT_CHECKSUM          equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
-
-section .multiboot
-align 4
-	dd MULTIBOOT_HEADER_MAGIC
-	dd MULTIBOOT_HEADER_FLAGS
-	dd MULTIBOOT_CHECKSUM
-	dd 0	; header address
-	dd 0	; load address
-	dd 0	; load end address
-	dd 0	; bss end address
-	dd 0	; entry address
-	dd 0	; video mode_type (0:fb, 1:txt) (set flags[2]!)
-	dd 1024	; video width
-	dd 768	; video height
-	dd 32	; video depth
-
-section .bss
-align 16
-	stack_bottom:
-	resb 16384
-	stack_top:
-
-section .text
-	global  _start
-	extern   kmain
-
-_start:
-	; Setup stack
-	mov esp, stack_top
-
-	; Call the main kernel function.
-	push ebx
-	push eax
-	call kmain
-
-.hang:
-	cli
-	hlt
-	jmp .hang
diff --git a/src/start32.s b/src/start32.s
new file mode 100644
index 0000000..da0207a
--- /dev/null
+++ b/src/start32.s
@@ -0,0 +1,49 @@
+.set MULTIBOOT_PAGE_ALIGN,	1 << 0
+.set MULTIBOOT_MEMORY_INFO,	1 << 1
+.set MULTIBOOT_VIDEO_REQUEST,	1 << 2
+.set MULTIBOOT_AOUT_KLUDGE,	0 << 16
+.set MULTIBOOT_HEADER_MAGIC,	0x1BADB002
+.set MULTIBOOT_HEADER_FLAGS, \
+	MULTIBOOT_PAGE_ALIGN |\
+	MULTIBOOT_MEMORY_INFO |\
+	MULTIBOOT_VIDEO_REQUEST |\
+	MULTIBOOT_AOUT_KLUDGE
+.set MULTIBOOT_CHECKSUM,	-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
+
+#.section ".multiboottbabeee"
+.align 4
+	.long MULTIBOOT_HEADER_MAGIC
+	.long MULTIBOOT_HEADER_FLAGS
+	.long MULTIBOOT_CHECKSUM
+	.long 0		# header address
+	.long 0		# load address
+	.long 0		# load end address
+	.long 0		# bss end address
+	.long 0		# entry address
+	.long 0		# video mode_type (0:fb, 1:txt) (set flags[2]!)
+	.long 1024	# video width
+	.long 768	# video height
+	.long 32	# video depth
+
+.bss
+.align 16
+	stack_bottom:
+	.skip 16384	# 16k
+	stack_top:
+
+.text
+.global  _start
+_start:
+	# Setup stack
+	mov $stack_top, %esp
+
+	# Call the main kernel function.
+	push %ebx
+	push %eax
+	call kmain
+
+
+	cli
+1:	hlt
+	jmp 1b
+#include "lol.s"

From 2a8169e8fa2b8c5935c8836a523e2913fad55e74 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 19 Sep 2023 19:56:31 +0300
Subject: [PATCH 19/45] Tiny makefile touchup to autocreate build directory

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 28c65a3..9617a39 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ all: build/kernel-i386.elf
 clean:
 	-@rm build/* 2> /dev/null || true
 
-build/kernel-i386.elf: src/*
+build/kernel-i386.elf: src/* build/
 	tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/start32.s src/*.c
 image: build/kernel-i386.elf mount
 	cp build/kernel-i386.elf mnt/roska/start32.elf

From 5ee43c6e9f22cc22257686f176fe91f85a174d5e Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Thu, 21 Sep 2023 20:01:24 +0300
Subject: [PATCH 20/45] Made the framebuffer support both 24 and 32 bpp

---
 src/framebuffer.c |  9 ++++++++-
 src/kernel.c      | 20 ++++++++++++++++----
 src/start32.s     |  5 ++---
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/src/framebuffer.c b/src/framebuffer.c
index 29f6b9d..5fc0f6c 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -20,5 +20,12 @@ 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<<fb_rpos | g<<fb_gpos | b<<fb_bpos;
+
+	if (fb_bpp == 32) {
+		*((unsigned long *)(fb_address + y*fb_pitch + x*fb_bytespp)) = r<<fb_rpos | g<<fb_gpos | b<<fb_bpos;
+	} else {
+		*((unsigned char *)(fb_address + y*fb_pitch + x*fb_bytespp + fb_rpos/8)) = r;
+		*((unsigned char *)(fb_address + y*fb_pitch + x*fb_bytespp + fb_gpos/8)) = g;
+		*((unsigned char *)(fb_address + y*fb_pitch + x*fb_bytespp + fb_bpos/8)) = b;
+	}
 }
diff --git a/src/kernel.c b/src/kernel.c
index 223d37f..e01181c 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -72,12 +72,24 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) {
 	int x, y, i;
 	unsigned char c = 0;
 	for(;;) {
-		for(y=0; y < mbootinfo->framebuffer_height; y++) {
-			for(x=0; x < mbootinfo->framebuffer_width; x++) {
-				putpixel(x, y, 0, c, c, 0xff);
+		//serial_write_string("\n");
+		for (;c<255;c+=5) {
+			//serial_write_string("/");
+			for(y=0; y < mbootinfo->framebuffer_height; y++) {
+				for(x=0; x < mbootinfo->framebuffer_width; x++) {
+					putpixel(x, y, 0, c, c, 0xff);
+				}
+			}
+		}
+		//serial_write_string("\n");
+		for (;c>0;c-=5) {
+			//serial_write_string("\\");
+			for(y=mbootinfo->framebuffer_height; y>=0; y--) {
+				for(x=mbootinfo->framebuffer_width; x>=0; x--) {
+					putpixel(x, y, 0, c, c, 0xff);
+				}
 			}
 		}
-		c+=4;
 	}
 
 	serial_write_string("\nExecution finished, halting...\n");
diff --git a/src/start32.s b/src/start32.s
index da0207a..32e185d 100644
--- a/src/start32.s
+++ b/src/start32.s
@@ -21,8 +21,8 @@
 	.long 0		# bss end address
 	.long 0		# entry address
 	.long 0		# video mode_type (0:fb, 1:txt) (set flags[2]!)
-	.long 1024	# video width
-	.long 768	# video height
+	.long 640	# video width
+	.long 480	# video height
 	.long 32	# video depth
 
 .bss
@@ -46,4 +46,3 @@ _start:
 	cli
 1:	hlt
 	jmp 1b
-#include "lol.s"

From e4172c14bb9982895adabc0ea6ac6e832dd3f4d9 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Thu, 21 Sep 2023 21:06:37 +0300
Subject: [PATCH 21/45] Fancy colour loop

---
 src/start32.asm | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/src/start32.asm b/src/start32.asm
index f8e5d36..5042d9c 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -133,6 +133,39 @@ rOSkalogodraw:
 	jne .loop
 .done:
 
+
+xor eax, eax
+xor ebx, ebx
+xor ecx, ecx
+cloop:
+push eax ;col
+push ebx ;y
+push ecx ;x
+call putpixel
+pop ecx
+pop ebx
+pop eax
+
+inc ecx
+cmp ecx, VWIDTH
+jle cloop
+
+xor ecx, ecx
+inc ebx
+cmp ebx, VHEIGHT
+jle cloop
+
+xor ebx, ebx
+add eax, 5
+cmp ax, 255
+jle cloop
+
+xor eax, eax
+jmp cloop
+
+
+
+
 	jmp hang
 
 hang:

From 5e7356f58e28193b5f791a8922abd4e81cf33ab3 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 22 Sep 2023 17:42:46 +0300
Subject: [PATCH 22/45] VGA driver deprecated

---
 src/vga.c | 97 -------------------------------------------------------
 src/vga.h | 24 --------------
 2 files changed, 121 deletions(-)
 delete mode 100644 src/vga.c
 delete mode 100644 src/vga.h

diff --git a/src/vga.c b/src/vga.c
deleted file mode 100644
index bac204d..0000000
--- a/src/vga.c
+++ /dev/null
@@ -1,97 +0,0 @@
-#include "vga.h"
-#define VGA_WIDTH 80
-#define VGA_HEIGHT 25
-#define VGA_MEM_ADDR 0xb8000
-#define CURSOR_HOME (VGA_HEIGHT-1)*VGA_WIDTH
-#define CURSOR_CHR  177;
-
-unsigned int cursor_loc = CURSOR_HOME;
-unsigned char fgcolor;
-unsigned char bgcolor;
-unsigned short blank;
-
-static unsigned char vga_entry_color(enum vga_color fg, enum vga_color bg) {
-	return fg | bg << 4;
-}
-unsigned short vga_blank_entry() {
-	return vga_entry_color(fgcolor, bgcolor) << 8;
-}
-void draw_cursor(void) {
-	*((unsigned char *)VGA_MEM_ADDR + cursor_loc * 2) = CURSOR_CHR;
-	*((unsigned char *)VGA_MEM_ADDR+1 + cursor_loc * 2) = vga_entry_color(fgcolor, bgcolor);
-}
-
-void vga_set_color(enum vga_color fg, enum vga_color bg) {
-	fgcolor = fg;
-	bgcolor = bg;
-}
-void vga_init(enum vga_color fg, enum vga_color bg) {
-	vga_set_color(fg, bg);
-	blank = vga_blank_entry();
-	cls();
-}
-void cls(void) {
-	int i;
-	for (i=0; i<VGA_HEIGHT*VGA_WIDTH;i++) {
-		*((unsigned short *) VGA_MEM_ADDR+i) = blank;
-	}
-}
-void scroll(void) {
-	int y;
-	int x;
-	*((unsigned short *) VGA_MEM_ADDR+cursor_loc) = blank;
-	for (y=0;y<VGA_HEIGHT;y++) {
-		for (x = 0;x<VGA_WIDTH;x++) {
-			*((unsigned short *) VGA_MEM_ADDR+y*VGA_WIDTH+x) = *((unsigned short *) VGA_MEM_ADDR+(y+1)*VGA_WIDTH+x);
-		}
-	}
-	for (x=0;x<VGA_WIDTH;x++) {
-		*((unsigned short *) VGA_MEM_ADDR+CURSOR_HOME+x) = blank;
-	}
-	cursor_loc = CURSOR_HOME;
-	draw_cursor();
-}
-void putchar(unsigned char chr) {
-	if (chr == '\n') {
-		scroll();
-		return;
-	}
-	*((unsigned char *) VGA_MEM_ADDR+cursor_loc * 2) = chr;
-	*((unsigned char *) VGA_MEM_ADDR+1+cursor_loc * 2) = vga_entry_color(fgcolor, bgcolor);
-	cursor_loc++;
-	if (cursor_loc >= VGA_HEIGHT*VGA_WIDTH) {
-		scroll();
-	}
-	draw_cursor();
-}
-
-void vga_write(const char* text) {
-	int i = 0;
-	while(text[i]) {
-		putchar(text[i]);
-		i++;
-	}
-}
-void vga_write_color( const char* text, enum vga_color fg, enum vga_color bg) {
-	unsigned char prevfg = fgcolor;
-	unsigned char prevbg = bgcolor;
-	vga_set_color(fg, bg);
-	vga_write(text);
-	fgcolor = prevfg;
-	bgcolor = prevbg;
-}
-void vga_write_line(const char* text) {
-	if (cursor_loc != CURSOR_HOME) {
-		scroll();
-	}
-	vga_write(text);
-	scroll();
-}
-void vga_write_line_color(const char* text, enum vga_color fg, enum vga_color bg) {
-	unsigned char prevfg = fgcolor;
-	unsigned char prevbg = bgcolor;
-	vga_set_color(fg, bg);
-	vga_write_line(text);
-	fgcolor = prevfg;
-	bgcolor = prevbg;
-}
diff --git a/src/vga.h b/src/vga.h
deleted file mode 100644
index b2aa979..0000000
--- a/src/vga.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef HEADER_VGA
-#define HEADER_VGA
-
-enum vga_color {
-	VGA_COLOR_BLACK = 0,
-	VGA_COLOR_BLUE = 1,
-	VGA_COLOR_GREEN = 2,
-	VGA_COLOR_CYAN = 3,
-	VGA_COLOR_RED = 4,
-	VGA_COLOR_MAGENTA = 5,
-	VGA_COLOR_ORANGE = 6,
-	VGA_COLOR_GREY = 7,
-	VGA_COLOR_GRAY = 7,
-};
-
-void cls(void);
-void vga_init(enum vga_color fg, enum vga_color bg);
-
-void vga_write(const char* text);
-void vga_write_color( const char* text, enum vga_color fg, enum vga_color bg);
-void vga_write_line(const char* text);
-void vga_write_line_color( const char* text, enum vga_color fg, enum vga_color bg);
-
-#endif

From d474de82282fd6840ef5e54b801d7400e6c4ceb9 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 22 Sep 2023 18:17:00 +0300
Subject: [PATCH 23/45] Trying to somewhat move to 80char line limit and tabs
 as spaces

---
 .gitignore        |   1 +
 src/framebuffer.c |  57 ++++++++++------
 src/framebuffer.h |  20 +++++-
 src/kernel.c      | 159 +++++++++++++++++++++++----------------------
 src/serial.c      |  80 ++++++++++++-----------
 src/start32.s     |  68 +++++++++----------
 src/xtoa.c        | 162 ++++++++++++++++++++++++----------------------
 src/xtoa.h        |   8 +--
 8 files changed, 303 insertions(+), 252 deletions(-)

diff --git a/.gitignore b/.gitignore
index bc70311..770baf3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 *.elf
 *.o
 *.img
+*.bin
 mnt/
 build/
diff --git a/src/framebuffer.c b/src/framebuffer.c
index 5fc0f6c..0040fe0 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -6,26 +6,43 @@ 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 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) {
-	if (x>fb_width || y> fb_height) return;
-
-	if (fb_bpp == 32) {
-		*((unsigned long *)(fb_address + y*fb_pitch + x*fb_bytespp)) = r<<fb_rpos | g<<fb_gpos | b<<fb_bpos;
-	} else {
-		*((unsigned char *)(fb_address + y*fb_pitch + x*fb_bytespp + fb_rpos/8)) = r;
-		*((unsigned char *)(fb_address + y*fb_pitch + x*fb_bytespp + fb_gpos/8)) = g;
-		*((unsigned char *)(fb_address + y*fb_pitch + x*fb_bytespp + fb_bpos/8)) = b;
-	}
+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 dest_addr = fb_address + y*fb_pitch + x*fb_bytespp;
+        if (fb_bpp == 32) {
+                *((unsigned long *)(dest_addr)) = r<<fb_rpos | g<<fb_gpos | b<<fb_bpos;
+        } else {
+                *((unsigned char *)(dest_addr + fb_rpos/8)) = r;
+                *((unsigned char *)(dest_addr + fb_gpos/8)) = g;
+                *((unsigned char *)(dest_addr + fb_bpos/8)) = b;
+        }
 }
diff --git a/src/framebuffer.h b/src/framebuffer.h
index 1993ac5..9cd5708 100644
--- a/src/framebuffer.h
+++ b/src/framebuffer.h
@@ -1,7 +1,23 @@
 #ifndef _FRAMEBUFFER_H
 #define _FRAMEBUFFER_H 1
 
-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);
-void putpixel(unsigned short x, unsigned short y,  unsigned char r, unsigned char g, unsigned char b, unsigned char a);
+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
+);
+void putpixel(
+        unsigned short x,
+        unsigned short y,
+        unsigned char r,
+        unsigned char g,
+        unsigned char b,
+        unsigned char a
+ );
 
 #endif
diff --git a/src/kernel.c b/src/kernel.c
index e01181c..a2db903 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -4,93 +4,100 @@
 #include "serial.h"
 #include "xtoa.h"
 
-static inline void outb(unsigned short port, unsigned char val) {
-	asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
+static inline void outb(unsigned short port, unsigned char val)
+{
+        asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
 }
-static inline unsigned char inb(unsigned short port) {
-	unsigned char ret;
-	asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
-	return ret;
+static inline unsigned char inb(unsigned short port)
+{
+        unsigned char ret;
+        asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
+        return ret;
 }
 
-void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) {
+void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo)
+{
+        // Cursor disabling
+        outb(0x3D4, 0x0A);
+        outb(0x3D5, 0x20);
 
-	// Cursor disabling
-	outb(0x3D4, 0x0A);
-	outb(0x3D5, 0x20);
+        int serial_initialized = serial_init();
+        serial_write_string("\n=== rOSka ===\n");
 
-	int serial_initialized = serial_init();
-	serial_write_string("\n=== rOSka ===\n");
+        // Check multiboot header
+        if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
+                return;
+        }
 
-	// Check multiboot header
-	if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
-		return;
-	}
+        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) {
+                serial_write_string("\nVBE Mode: 0x");
+                serial_write_string(itoa(mbootinfo->vbe_mode, 16));
+        }
 
-	// Check videomode
-	if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) {
-		serial_write_string("\nVBE Mode: 0x");
-		serial_write_string(itoa(mbootinfo->vbe_mode, 16));
-	}
+        if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) {
+                serial_write_string("\nVideo info not available");
+                return;
+        }
 
-	if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) {
-		serial_write_string("\nVideo info not available");
-		return;
-	}
+        serial_write_string("\nFramebuffer: ");
+        serial_write_string("\n  Address: 0x");
+        serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16));
 
-	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));
 
-	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));
+        serial_write_string("\nMemory: ");
+        serial_write_string("\n  lower: ");
+        serial_write_string(uitoa(mbootinfo->mem_lower, 10));
+        serial_write_string(" k");
+        serial_write_string("\n  upper: ");
+        serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10));
+        serial_write_string(" M");
 
-	serial_write_string("\nMemory: ");
-	serial_write_string("\n  lower: ");
-	serial_write_string(uitoa(mbootinfo->mem_lower, 10));
-	serial_write_string(" k");
-	serial_write_string("\n  upper: ");
-	serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10));
-	serial_write_string(" M");
+        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, i;
+        unsigned char c = 0;
+        for (;;) {
+                for (;c<255;c+=5) {
+                        for(y=0; y < mbootinfo->framebuffer_height; y++) {
+                                for(x=0; x < mbootinfo->framebuffer_width; x++) {
+                                        putpixel(x, y, 0, c, c, 0xff);
+                                }
+                        }
+                }
+                for (;c>0;c-=5) {
+                        for(y=mbootinfo->framebuffer_height; y>=0; y--) {
+                                for(x=mbootinfo->framebuffer_width; x>=0; x--) {
+                                        putpixel(x, y, 0, c, c, 0xff);
+                                }
+                        }
+                }
+        }
 
-	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, i;
-	unsigned char c = 0;
-	for(;;) {
-		//serial_write_string("\n");
-		for (;c<255;c+=5) {
-			//serial_write_string("/");
-			for(y=0; y < mbootinfo->framebuffer_height; y++) {
-				for(x=0; x < mbootinfo->framebuffer_width; x++) {
-					putpixel(x, y, 0, c, c, 0xff);
-				}
-			}
-		}
-		//serial_write_string("\n");
-		for (;c>0;c-=5) {
-			//serial_write_string("\\");
-			for(y=mbootinfo->framebuffer_height; y>=0; y--) {
-				for(x=mbootinfo->framebuffer_width; x>=0; x--) {
-					putpixel(x, y, 0, c, c, 0xff);
-				}
-			}
-		}
-	}
-
-	serial_write_string("\nExecution finished, halting...\n");
+        serial_write_string("\nExecution finished, halting...\n");
 }
diff --git a/src/serial.c b/src/serial.c
index e4e8e27..d19762d 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -1,50 +1,56 @@
 #include "serial.h"
 #define PORT 0x3f8 // COM1
 
-static inline void outb(unsigned short port, unsigned char val) {
-	asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
+static inline void outb(unsigned short port, unsigned char val)
+{
+        asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
 }
-static inline unsigned char inb(unsigned short port) {
-	unsigned char ret;
-	asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
-	return ret;
+static inline unsigned char inb(unsigned short port)
+{
+        unsigned char ret;
+        asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
+        return ret;
 }
 
-int serial_init() {
-	outb(PORT + 1, 0x00); // Disable all interrupts
-	outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor)
-	outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud
-	outb(PORT + 1, 0x00); //                  (hi byte)
-	outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit
-	outb(PORT + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold
-	outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set
-	outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip
-	outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial
-	// returns same byte)
+int serial_init()
+{
+        outb(PORT + 1, 0x00);   // Disable all interrupts
+        outb(PORT + 3, 0x80);   // Enable DLAB (set baud rate divisor)
+        outb(PORT + 0, 0x03);   // Set divisor to 3 (lo byte) 38400 baud
+        outb(PORT + 1, 0x00);   //                  (hi byte)
+        outb(PORT + 3, 0x03);   // 8 bits, no parity, one stop bit
+        outb(PORT + 2, 0xC7);   // Enable FIFO, clear them, 14-byte threshold
+        outb(PORT + 4, 0x0B);   // IRQs enabled, RTS/DSR set
+        outb(PORT + 4, 0x1E);   // Set in loopback mode, test the serial chip
+        outb(PORT + 0, 0xAE);   // Test serial chip (send byte 0xAE and check
+                                // if serial returns same byte)
 
-	// Check if serial is faulty (i.e: not same byte as sent)
-	if (inb(PORT + 0) != 0xAE) {
-		return 1;
-	}
+        // Check if serial is faulty (i.e: not same byte as sent)
+        if (inb(PORT + 0) != 0xAE)
+                return 1;
 
-	// If serial is not faulty set it in normal operation mode
-	// (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
-	outb(PORT + 4, 0x0F);
-	return 0;
+        // If serial is not faulty set it in normal operation mode
+        // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
+        outb(PORT + 4, 0x0F);
+        return 0;
 }
 
-static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; }
-
-static void serial_write_char(char chr) {
-	while (serial_is_transmit_empty() == 0);
-	outb(PORT, chr);
+static int serial_is_transmit_empty()
+{
+        return inb(PORT + 5) & 0x20;
 }
 
-void serial_write_string(const char* text) {
-	int i = 0;
-	while(text[i]) {
-		serial_write_char(text[i]);
-		i++;
-	}
-
+static void serial_write_char(char chr)
+{
+        while (serial_is_transmit_empty() == 0);
+        outb(PORT, chr);
+}
+
+void serial_write_string(const char* text)
+{
+        int i = 0;
+        while (text[i]) {
+                serial_write_char(text[i]);
+                i++;
+        }
 }
diff --git a/src/start32.s b/src/start32.s
index 32e185d..f03794a 100644
--- a/src/start32.s
+++ b/src/start32.s
@@ -1,48 +1,48 @@
-.set MULTIBOOT_PAGE_ALIGN,	1 << 0
-.set MULTIBOOT_MEMORY_INFO,	1 << 1
-.set MULTIBOOT_VIDEO_REQUEST,	1 << 2
-.set MULTIBOOT_AOUT_KLUDGE,	0 << 16
-.set MULTIBOOT_HEADER_MAGIC,	0x1BADB002
+.set MULTIBOOT_PAGE_ALIGN,      1 << 0
+.set MULTIBOOT_MEMORY_INFO,     1 << 1
+.set MULTIBOOT_VIDEO_REQUEST,   1 << 2
+.set MULTIBOOT_AOUT_KLUDGE,     0 << 16
+.set MULTIBOOT_HEADER_MAGIC,    0x1BADB002
 .set MULTIBOOT_HEADER_FLAGS, \
-	MULTIBOOT_PAGE_ALIGN |\
-	MULTIBOOT_MEMORY_INFO |\
-	MULTIBOOT_VIDEO_REQUEST |\
-	MULTIBOOT_AOUT_KLUDGE
-.set MULTIBOOT_CHECKSUM,	-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
+        MULTIBOOT_PAGE_ALIGN \
+        | MULTIBOOT_MEMORY_INFO \
+        | MULTIBOOT_VIDEO_REQUEST \
+        | MULTIBOOT_AOUT_KLUDGE
+.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
 
 #.section ".multiboottbabeee"
 .align 4
-	.long MULTIBOOT_HEADER_MAGIC
-	.long MULTIBOOT_HEADER_FLAGS
-	.long MULTIBOOT_CHECKSUM
-	.long 0		# header address
-	.long 0		# load address
-	.long 0		# load end address
-	.long 0		# bss end address
-	.long 0		# entry address
-	.long 0		# video mode_type (0:fb, 1:txt) (set flags[2]!)
-	.long 640	# video width
-	.long 480	# video height
-	.long 32	# video depth
+        .long MULTIBOOT_HEADER_MAGIC
+        .long MULTIBOOT_HEADER_FLAGS
+        .long MULTIBOOT_CHECKSUM
+        .long 0         # header address
+        .long 0         # load address
+        .long 0         # load end address
+        .long 0         # bss end address
+        .long 0         # entry address
+        .long 0         # video mode_type (0:fb, 1:txt) (set flags[2]!)
+        .long 1024      # video width
+        .long 768       # video height
+        .long 32        # video depth
 
 .bss
 .align 16
-	stack_bottom:
-	.skip 16384	# 16k
-	stack_top:
+        stack_bottom:
+        .skip 16384     # 16k
+        stack_top:
 
 .text
 .global  _start
 _start:
-	# Setup stack
-	mov $stack_top, %esp
+        # Setup stack
+        mov $stack_top, %esp
 
-	# Call the main kernel function.
-	push %ebx
-	push %eax
-	call kmain
+        # Call the main kernel function.
+        push %ebx
+        push %eax
+        call kmain
 
 
-	cli
-1:	hlt
-	jmp 1b
+        cli
+1:      hlt
+        jmp 1b
diff --git a/src/xtoa.c b/src/xtoa.c
index 68c9520..2a7b9a5 100644
--- a/src/xtoa.c
+++ b/src/xtoa.c
@@ -1,100 +1,104 @@
 #include "xtoa.h"
-char* itoa(int value, int base) {
-	char* result;
+char* itoa(int value, int base)
+{
+        char* result;
 
-	// check that the base if valid
-	if (base < 2 || base > 36) { *result = '\0'; return 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;
+        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 );
-	
-	// Apply negative sign
-	if (tmp_value < 0) *ptr++ = '-';
-	*ptr-- = '\0';
-	while(ptr1 < ptr) {
-		tmp_char = *ptr;
-		*ptr--= *ptr1;
-		*ptr1++ = tmp_char;
-	}
-	return result;
+        do {
+                tmp_value = value;
+                value /= base;
+                *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
+        } while ( value );
+
+        // Apply negative sign
+        if (tmp_value < 0) *ptr++ = '-';
+        *ptr-- = '\0';
+        while (ptr1 < ptr) {
+                tmp_char = *ptr;
+                *ptr--= *ptr1;
+                *ptr1++ = tmp_char;
+        }
+        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* uitoa(unsigned int value, int base)
+{
+        char* result;
 
-	char* ptr = result, *ptr1 = result, tmp_char;
-	int tmp_value;
+        // check that the base if valid
+        if (base < 2 || base > 36) { *result = '\0'; return result; }
 
-	do {
-		tmp_value = value;
-		value /= base;
-		*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
-	} while ( value );
+        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;
+        *ptr-- = '\0';
+        while (ptr1 < ptr) {
+                tmp_char = *ptr;
+                *ptr--= *ptr1;
+                *ptr1++ = tmp_char;
+        }
+        return result;
 }
-char* ltoa(long value, int base) {
-	char* result;
 
-	// check that the base if valid
-	if (base < 2 || base > 36) { *result = '\0'; return result; }
+char* ltoa(long value, int base)
+{
+        char* result;
 
-	char* ptr = result, *ptr1 = result, tmp_char;
-	int tmp_value;
+        // check that the base if valid
+        if (base < 2 || base > 36) { *result = '\0'; return result; }
 
-	do {
-		tmp_value = value;
-		value /= base;
-		*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
-	} while ( value );
+        char* ptr = result, *ptr1 = result, tmp_char;
+        int tmp_value;
 
-	// Apply negative sign
-	if (tmp_value < 0) *ptr++ = '-';
-	*ptr-- = '\0';
-	while(ptr1 < ptr) {
-		tmp_char = *ptr;
-		*ptr--= *ptr1;
-		*ptr1++ = tmp_char;
-	}
-	return result;
+        do {
+                tmp_value = value;
+                value /= base;
+                *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
+        } while ( value );
+
+        // Apply negative sign
+        if (tmp_value < 0) *ptr++ = '-';
+        *ptr-- = '\0';
+        while (ptr1 < ptr) {
+                tmp_char = *ptr;
+                *ptr--= *ptr1;
+                *ptr1++ = tmp_char;
+        }
+        return result;
 }
-char* ultoa(unsigned long value, int base) {
-	char* result;
 
-	// check that the base if valid
-	if (base < 2 || base > 36) { *result = '\0'; return result; }
+char* ultoa(unsigned long value, int base)
+{
+        char* result;
 
-	char* ptr = result, *ptr1 = result, tmp_char;
-	int tmp_value;
+        // check that the base if valid
+        if (base < 2 || base > 36) { *result = '\0'; return result; }
 
-	do {
-		tmp_value = value;
-		value /= base;
-		*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
-	} while ( value );
+        char* ptr = result, *ptr1 = result, tmp_char;
+        int tmp_value;
 
-	// Apply negative sign
-	//if (tmp_value < 0) *ptr++ = '-';
-	*ptr-- = '\0';
-	while(ptr1 < ptr) {
-		tmp_char = *ptr;
-		*ptr--= *ptr1;
-		*ptr1++ = tmp_char;
-	}
-	return result;
+        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;
 }
diff --git a/src/xtoa.h b/src/xtoa.h
index 710c774..9ac39ee 100644
--- a/src/xtoa.h
+++ b/src/xtoa.h
@@ -1,9 +1,9 @@
 #ifndef HEADER_XTOA
 #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);
+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);
 
 #endif

From 2b716fcc4cc7b367c269eed5997d4b343fcaf776 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 22 Sep 2023 22:59:02 +0300
Subject: [PATCH 24/45] Working putchar wheeww

---
 src/font8x8_basic.h | 152 ++++++++++++++++++++++++++++++++++++++++++++
 src/framebuffer.c   |  34 +++++++++-
 src/framebuffer.h   |  12 +++-
 src/kernel.c        |  43 +++++++------
 4 files changed, 218 insertions(+), 23 deletions(-)
 create mode 100644 src/font8x8_basic.h

diff --git a/src/font8x8_basic.h b/src/font8x8_basic.h
new file mode 100644
index 0000000..1452873
--- /dev/null
+++ b/src/font8x8_basic.h
@@ -0,0 +1,152 @@
+/**
+ * 8x8 monochrome bitmap fonts for rendering
+ * Author: Daniel Hepper <daniel@hepper.net>
+ *
+ * License: Public Domain
+ *
+ * Based on:
+ * // Summary: font8x8.h
+ * // 8x8 monochrome bitmap fonts for rendering
+ * //
+ * // Author:
+ * //         Marcel Sondaar
+ * //         International Business Machines (public domain VGA fonts)
+ * //
+ * // License:
+ * //         Public Domain
+ *
+ * Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm
+ **/
+
+// Constant: font8x8_basic
+// Contains an 8x8 font map for unicode points U+0000 - U+007F (basic latin)
+char font8x8_basic[128][8] = {
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0000 (nul)
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0001
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0002
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0003
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0004
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0005
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0006
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0007
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0008
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0009
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000A
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000B
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000C
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000D
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000E
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000F
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0010
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0011
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0012
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0013
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0014
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0015
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0016
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0017
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0018
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0019
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001A
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001B
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001C
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001D
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001E
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001F
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0020 (space)
+        { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00},   // U+0021 (!)
+        { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0022 (")
+        { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00},   // U+0023 (#)
+        { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00},   // U+0024 ($)
+        { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00},   // U+0025 (%)
+        { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00},   // U+0026 (&)
+        { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0027 (')
+        { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00},   // U+0028 (()
+        { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00},   // U+0029 ())
+        { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00},   // U+002A (*)
+        { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00},   // U+002B (+)
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06},   // U+002C (,)
+        { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00},   // U+002D (-)
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00},   // U+002E (.)
+        { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00},   // U+002F (/)
+        { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00},   // U+0030 (0)
+        { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00},   // U+0031 (1)
+        { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00},   // U+0032 (2)
+        { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00},   // U+0033 (3)
+        { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00},   // U+0034 (4)
+        { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00},   // U+0035 (5)
+        { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00},   // U+0036 (6)
+        { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00},   // U+0037 (7)
+        { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00},   // U+0038 (8)
+        { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00},   // U+0039 (9)
+        { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00},   // U+003A (:)
+        { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06},   // U+003B (;)
+        { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00},   // U+003C (<)
+        { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00},   // U+003D (=)
+        { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00},   // U+003E (>)
+        { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00},   // U+003F (?)
+        { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00},   // U+0040 (@)
+        { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00},   // U+0041 (A)
+        { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00},   // U+0042 (B)
+        { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00},   // U+0043 (C)
+        { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00},   // U+0044 (D)
+        { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00},   // U+0045 (E)
+        { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00},   // U+0046 (F)
+        { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00},   // U+0047 (G)
+        { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00},   // U+0048 (H)
+        { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0049 (I)
+        { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00},   // U+004A (J)
+        { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00},   // U+004B (K)
+        { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00},   // U+004C (L)
+        { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00},   // U+004D (M)
+        { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00},   // U+004E (N)
+        { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00},   // U+004F (O)
+        { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00},   // U+0050 (P)
+        { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00},   // U+0051 (Q)
+        { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00},   // U+0052 (R)
+        { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00},   // U+0053 (S)
+        { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0054 (T)
+        { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00},   // U+0055 (U)
+        { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0056 (V)
+        { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00},   // U+0057 (W)
+        { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00},   // U+0058 (X)
+        { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00},   // U+0059 (Y)
+        { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00},   // U+005A (Z)
+        { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00},   // U+005B ([)
+        { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00},   // U+005C (\)
+        { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00},   // U+005D (])
+        { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00},   // U+005E (^)
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF},   // U+005F (_)
+        { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0060 (`)
+        { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00},   // U+0061 (a)
+        { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00},   // U+0062 (b)
+        { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00},   // U+0063 (c)
+        { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00},   // U+0064 (d)
+        { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00},   // U+0065 (e)
+        { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00},   // U+0066 (f)
+        { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F},   // U+0067 (g)
+        { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00},   // U+0068 (h)
+        { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0069 (i)
+        { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E},   // U+006A (j)
+        { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00},   // U+006B (k)
+        { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+006C (l)
+        { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00},   // U+006D (m)
+        { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00},   // U+006E (n)
+        { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00},   // U+006F (o)
+        { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F},   // U+0070 (p)
+        { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78},   // U+0071 (q)
+        { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00},   // U+0072 (r)
+        { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00},   // U+0073 (s)
+        { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00},   // U+0074 (t)
+        { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00},   // U+0075 (u)
+        { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0076 (v)
+        { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00},   // U+0077 (w)
+        { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00},   // U+0078 (x)
+        { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F},   // U+0079 (y)
+        { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00},   // U+007A (z)
+        { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00},   // U+007B ({)
+        { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},   // U+007C (|)
+        { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00},   // U+007D (})
+        { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+007E (~)
+        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}        // U+007F
+};
diff --git a/src/framebuffer.c b/src/framebuffer.c
index 0040fe0..bf4a598 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -1,4 +1,6 @@
 #include "framebuffer.h"
+#include "font8x8_basic.h"
+#include "serial.h"
 
 static unsigned long fb_address;
 static unsigned long fb_pitch;
@@ -32,8 +34,7 @@ void putpixel(
         unsigned short y,
         unsigned char r,
         unsigned char g,
-        unsigned char b,
-        unsigned char a
+        unsigned char b
 ){
         if (x > fb_width || y > fb_height)
                 return;
@@ -46,3 +47,32 @@ void putpixel(
                 *((unsigned char *)(dest_addr + fb_bpos/8)) = b;
         }
 }
+
+void putchar(
+        unsigned char *character,
+        unsigned short x,
+        unsigned short y,
+        unsigned char r,
+        unsigned char g,
+        unsigned char b
+){
+        // Limit to ASCII printable
+        if (*character < 0x20) {
+                serial_write_string("\nASCII too low");
+                return;
+        }
+        if (*character > 0x7e) {
+                serial_write_string("\nASCII too hihg");
+                return;
+        }
+
+        unsigned char *rowdata = font8x8_basic[*character];
+        unsigned int charx, chary;
+        for (chary=0;chary<8;chary++) {
+                for (charx=0;charx<8;charx++) {
+                        unsigned char pix = rowdata[chary] & 1 << charx;
+                        if (pix)
+                                putpixel(x+charx, y+chary, r*pix, g*pix, b*pix);
+                }
+        }
+}
diff --git a/src/framebuffer.h b/src/framebuffer.h
index 9cd5708..dac7813 100644
--- a/src/framebuffer.h
+++ b/src/framebuffer.h
@@ -16,8 +16,14 @@ void putpixel(
         unsigned short y,
         unsigned char r,
         unsigned char g,
-        unsigned char b,
-        unsigned char a
+        unsigned char b
  );
-
+void putchar(
+        unsigned char *character,
+        unsigned short x,
+        unsigned short y,
+        unsigned char r,
+        unsigned char g,
+        unsigned char b
+);
 #endif
diff --git a/src/kernel.c b/src/kernel.c
index a2db903..91fa921 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -80,24 +80,31 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo)
                 mbootinfo->framebuffer_green_field_position,
                 mbootinfo->framebuffer_blue_field_position
         );
-        int x, y, i;
-        unsigned char c = 0;
-        for (;;) {
-                for (;c<255;c+=5) {
-                        for(y=0; y < mbootinfo->framebuffer_height; y++) {
-                                for(x=0; x < mbootinfo->framebuffer_width; x++) {
-                                        putpixel(x, y, 0, c, c, 0xff);
-                                }
-                        }
-                }
-                for (;c>0;c-=5) {
-                        for(y=mbootinfo->framebuffer_height; y>=0; y--) {
-                                for(x=mbootinfo->framebuffer_width; x>=0; x--) {
-                                        putpixel(x, y, 0, c, c, 0xff);
-                                }
-                        }
-                }
-        }
+        // int x, y, i;
+        // unsigned char c = 0;
+        // for (;;) {
+        //         for (;c<255;c+=5) {
+        //                 for (y=0; y < mbootinfo->framebuffer_height; y++) {
+        //                         for (x=0; x < mbootinfo->framebuffer_width; x++) {
+        //                                 putpixel(x, y, 0, c, c);
+        //                         }
+        //                 }
+        //         }
+        //         for (;c>0;c-=5) {
+        //                 for (y=mbootinfo->framebuffer_height; y>=0; y--) {
+        //                         for (x=mbootinfo->framebuffer_width; x>=0; x--) {
+        //                                 putpixel(x, y, 0, c, c);
+        //                         }
+        //                 }
+        //         }
+        // }
+
+        putchar("r", 0, 0, 0xff, 0xff, 0xff);
+        putchar("O", 8, 0, 0xff, 0xff, 0xff);
+        putchar("S", 16, 0, 0xff, 0xff, 0xff);
+        putchar("k", 24, 0, 0xff, 0xff, 0xff);
+        putchar("a", 32, 0, 0xff, 0xff, 0xff);
+        while(1){}
 
         serial_write_string("\nExecution finished, halting...\n");
 }

From b047235d752274bd794ae0345975710005f02ba4 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 22 Sep 2023 23:28:52 +0300
Subject: [PATCH 25/45] finetuning putchar and preparing scaling

---
 src/framebuffer.c | 13 ++++++++++---
 src/kernel.c      | 32 ++++++++++----------------------
 2 files changed, 20 insertions(+), 25 deletions(-)

diff --git a/src/framebuffer.c b/src/framebuffer.c
index bf4a598..570c3a3 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -67,12 +67,19 @@ void putchar(
         }
 
         unsigned char *rowdata = font8x8_basic[*character];
-        unsigned int charx, chary;
+        unsigned char charx, chary, iy, ix;
+        unsigned char sizex=2;
+        unsigned char sizey=2;
         for (chary=0;chary<8;chary++) {
                 for (charx=0;charx<8;charx++) {
                         unsigned char pix = rowdata[chary] & 1 << charx;
-                        if (pix)
-                                putpixel(x+charx, y+chary, r*pix, g*pix, b*pix);
+                        if (pix) {
+                                for (iy=1;iy<=sizey;iy++) {
+                                        for (ix=1;ix<=sizex;ix++) {
+                                                putpixel(x+charx*sizex+ix, y+chary*sizey+iy, r, g, b);
+                                        }
+                                }
+                        }
                 }
         }
 }
diff --git a/src/kernel.c b/src/kernel.c
index 91fa921..1d5fed8 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -80,30 +80,18 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo)
                 mbootinfo->framebuffer_green_field_position,
                 mbootinfo->framebuffer_blue_field_position
         );
-        // int x, y, i;
-        // unsigned char c = 0;
-        // for (;;) {
-        //         for (;c<255;c+=5) {
-        //                 for (y=0; y < mbootinfo->framebuffer_height; y++) {
-        //                         for (x=0; x < mbootinfo->framebuffer_width; x++) {
-        //                                 putpixel(x, y, 0, c, c);
-        //                         }
-        //                 }
-        //         }
-        //         for (;c>0;c-=5) {
-        //                 for (y=mbootinfo->framebuffer_height; y>=0; y--) {
-        //                         for (x=mbootinfo->framebuffer_width; x>=0; x--) {
-        //                                 putpixel(x, y, 0, c, c);
-        //                         }
-        //                 }
-        //         }
-        // }
+         int x, y;
+        for (y=mbootinfo->framebuffer_height; y>=0; y--) {
+                for (x=mbootinfo->framebuffer_width; x>=0; x--) {
+                        putpixel(x, y, 0, 0x55, 0x55);
+                }
+        }
 
         putchar("r", 0, 0, 0xff, 0xff, 0xff);
-        putchar("O", 8, 0, 0xff, 0xff, 0xff);
-        putchar("S", 16, 0, 0xff, 0xff, 0xff);
-        putchar("k", 24, 0, 0xff, 0xff, 0xff);
-        putchar("a", 32, 0, 0xff, 0xff, 0xff);
+        putchar("O", 16, 0, 0xff, 0xff, 0xff);
+        putchar("S", 32, 0, 0xff, 0xff, 0xff);
+        putchar("k", 48, 0, 0xff, 0xff, 0xff);
+        putchar("a", 64, 0, 0xff, 0xff, 0xff);
         while(1){}
 
         serial_write_string("\nExecution finished, halting...\n");

From e438ef985a5917ac3c2ef8446f4a3fee4cb344fc Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 23 Sep 2023 21:15:44 +0300
Subject: [PATCH 26/45] Switching back to tabs for indent

---
 src/font8x8_basic.h | 262 ++++++++++++++++++++++----------------------
 src/framebuffer.c   | 126 ++++++++++-----------
 src/framebuffer.h   |  38 +++----
 src/kernel.c        | 142 ++++++++++++------------
 src/serial.c        |  58 +++++-----
 src/start32.s       |  54 ++++-----
 src/xtoa.c          | 144 ++++++++++++------------
 7 files changed, 412 insertions(+), 412 deletions(-)

diff --git a/src/font8x8_basic.h b/src/font8x8_basic.h
index 1452873..13c38e1 100644
--- a/src/font8x8_basic.h
+++ b/src/font8x8_basic.h
@@ -9,11 +9,11 @@
  * // 8x8 monochrome bitmap fonts for rendering
  * //
  * // Author:
- * //         Marcel Sondaar
- * //         International Business Machines (public domain VGA fonts)
+ * //	 Marcel Sondaar
+ * //	 International Business Machines (public domain VGA fonts)
  * //
  * // License:
- * //         Public Domain
+ * //	 Public Domain
  *
  * Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm
  **/
@@ -21,132 +21,132 @@
 // Constant: font8x8_basic
 // Contains an 8x8 font map for unicode points U+0000 - U+007F (basic latin)
 char font8x8_basic[128][8] = {
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0000 (nul)
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0001
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0002
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0003
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0004
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0005
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0006
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0007
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0008
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0009
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000A
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000B
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000C
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000D
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000E
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000F
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0010
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0011
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0012
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0013
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0014
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0015
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0016
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0017
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0018
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0019
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001A
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001B
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001C
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001D
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001E
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001F
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0020 (space)
-        { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00},   // U+0021 (!)
-        { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0022 (")
-        { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00},   // U+0023 (#)
-        { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00},   // U+0024 ($)
-        { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00},   // U+0025 (%)
-        { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00},   // U+0026 (&)
-        { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0027 (')
-        { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00},   // U+0028 (()
-        { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00},   // U+0029 ())
-        { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00},   // U+002A (*)
-        { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00},   // U+002B (+)
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06},   // U+002C (,)
-        { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00},   // U+002D (-)
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00},   // U+002E (.)
-        { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00},   // U+002F (/)
-        { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00},   // U+0030 (0)
-        { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00},   // U+0031 (1)
-        { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00},   // U+0032 (2)
-        { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00},   // U+0033 (3)
-        { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00},   // U+0034 (4)
-        { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00},   // U+0035 (5)
-        { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00},   // U+0036 (6)
-        { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00},   // U+0037 (7)
-        { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00},   // U+0038 (8)
-        { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00},   // U+0039 (9)
-        { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00},   // U+003A (:)
-        { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06},   // U+003B (;)
-        { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00},   // U+003C (<)
-        { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00},   // U+003D (=)
-        { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00},   // U+003E (>)
-        { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00},   // U+003F (?)
-        { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00},   // U+0040 (@)
-        { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00},   // U+0041 (A)
-        { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00},   // U+0042 (B)
-        { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00},   // U+0043 (C)
-        { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00},   // U+0044 (D)
-        { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00},   // U+0045 (E)
-        { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00},   // U+0046 (F)
-        { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00},   // U+0047 (G)
-        { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00},   // U+0048 (H)
-        { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0049 (I)
-        { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00},   // U+004A (J)
-        { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00},   // U+004B (K)
-        { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00},   // U+004C (L)
-        { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00},   // U+004D (M)
-        { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00},   // U+004E (N)
-        { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00},   // U+004F (O)
-        { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00},   // U+0050 (P)
-        { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00},   // U+0051 (Q)
-        { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00},   // U+0052 (R)
-        { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00},   // U+0053 (S)
-        { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0054 (T)
-        { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00},   // U+0055 (U)
-        { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0056 (V)
-        { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00},   // U+0057 (W)
-        { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00},   // U+0058 (X)
-        { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00},   // U+0059 (Y)
-        { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00},   // U+005A (Z)
-        { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00},   // U+005B ([)
-        { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00},   // U+005C (\)
-        { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00},   // U+005D (])
-        { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00},   // U+005E (^)
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF},   // U+005F (_)
-        { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0060 (`)
-        { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00},   // U+0061 (a)
-        { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00},   // U+0062 (b)
-        { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00},   // U+0063 (c)
-        { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00},   // U+0064 (d)
-        { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00},   // U+0065 (e)
-        { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00},   // U+0066 (f)
-        { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F},   // U+0067 (g)
-        { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00},   // U+0068 (h)
-        { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0069 (i)
-        { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E},   // U+006A (j)
-        { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00},   // U+006B (k)
-        { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+006C (l)
-        { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00},   // U+006D (m)
-        { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00},   // U+006E (n)
-        { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00},   // U+006F (o)
-        { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F},   // U+0070 (p)
-        { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78},   // U+0071 (q)
-        { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00},   // U+0072 (r)
-        { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00},   // U+0073 (s)
-        { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00},   // U+0074 (t)
-        { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00},   // U+0075 (u)
-        { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0076 (v)
-        { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00},   // U+0077 (w)
-        { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00},   // U+0078 (x)
-        { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F},   // U+0079 (y)
-        { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00},   // U+007A (z)
-        { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00},   // U+007B ({)
-        { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},   // U+007C (|)
-        { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00},   // U+007D (})
-        { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+007E (~)
-        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}        // U+007F
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0000 (nul)
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0001
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0002
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0003
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0004
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0005
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0006
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0007
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0008
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0009
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000A
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000B
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000C
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000D
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000E
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000F
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0010
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0011
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0012
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0013
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0014
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0015
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0016
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0017
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0018
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0019
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001A
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001B
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001C
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001D
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001E
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001F
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0020 (space)
+	{ 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00},   // U+0021 (!)
+	{ 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0022 (")
+	{ 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00},   // U+0023 (#)
+	{ 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00},   // U+0024 ($)
+	{ 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00},   // U+0025 (%)
+	{ 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00},   // U+0026 (&)
+	{ 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0027 (')
+	{ 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00},   // U+0028 (()
+	{ 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00},   // U+0029 ())
+	{ 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00},   // U+002A (*)
+	{ 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00},   // U+002B (+)
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06},   // U+002C (,)
+	{ 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00},   // U+002D (-)
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00},   // U+002E (.)
+	{ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00},   // U+002F (/)
+	{ 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00},   // U+0030 (0)
+	{ 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00},   // U+0031 (1)
+	{ 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00},   // U+0032 (2)
+	{ 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00},   // U+0033 (3)
+	{ 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00},   // U+0034 (4)
+	{ 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00},   // U+0035 (5)
+	{ 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00},   // U+0036 (6)
+	{ 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00},   // U+0037 (7)
+	{ 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00},   // U+0038 (8)
+	{ 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00},   // U+0039 (9)
+	{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00},   // U+003A (:)
+	{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06},   // U+003B (;)
+	{ 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00},   // U+003C (<)
+	{ 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00},   // U+003D (=)
+	{ 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00},   // U+003E (>)
+	{ 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00},   // U+003F (?)
+	{ 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00},   // U+0040 (@)
+	{ 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00},   // U+0041 (A)
+	{ 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00},   // U+0042 (B)
+	{ 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00},   // U+0043 (C)
+	{ 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00},   // U+0044 (D)
+	{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00},   // U+0045 (E)
+	{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00},   // U+0046 (F)
+	{ 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00},   // U+0047 (G)
+	{ 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00},   // U+0048 (H)
+	{ 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0049 (I)
+	{ 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00},   // U+004A (J)
+	{ 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00},   // U+004B (K)
+	{ 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00},   // U+004C (L)
+	{ 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00},   // U+004D (M)
+	{ 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00},   // U+004E (N)
+	{ 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00},   // U+004F (O)
+	{ 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00},   // U+0050 (P)
+	{ 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00},   // U+0051 (Q)
+	{ 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00},   // U+0052 (R)
+	{ 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00},   // U+0053 (S)
+	{ 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0054 (T)
+	{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00},   // U+0055 (U)
+	{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0056 (V)
+	{ 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00},   // U+0057 (W)
+	{ 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00},   // U+0058 (X)
+	{ 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00},   // U+0059 (Y)
+	{ 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00},   // U+005A (Z)
+	{ 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00},   // U+005B ([)
+	{ 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00},   // U+005C (\)
+	{ 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00},   // U+005D (])
+	{ 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00},   // U+005E (^)
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF},   // U+005F (_)
+	{ 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0060 (`)
+	{ 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00},   // U+0061 (a)
+	{ 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00},   // U+0062 (b)
+	{ 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00},   // U+0063 (c)
+	{ 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00},   // U+0064 (d)
+	{ 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00},   // U+0065 (e)
+	{ 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00},   // U+0066 (f)
+	{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F},   // U+0067 (g)
+	{ 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00},   // U+0068 (h)
+	{ 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0069 (i)
+	{ 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E},   // U+006A (j)
+	{ 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00},   // U+006B (k)
+	{ 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+006C (l)
+	{ 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00},   // U+006D (m)
+	{ 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00},   // U+006E (n)
+	{ 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00},   // U+006F (o)
+	{ 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F},   // U+0070 (p)
+	{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78},   // U+0071 (q)
+	{ 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00},   // U+0072 (r)
+	{ 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00},   // U+0073 (s)
+	{ 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00},   // U+0074 (t)
+	{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00},   // U+0075 (u)
+	{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0076 (v)
+	{ 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00},   // U+0077 (w)
+	{ 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00},   // U+0078 (x)
+	{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F},   // U+0079 (y)
+	{ 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00},   // U+007A (z)
+	{ 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00},   // U+007B ({)
+	{ 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},   // U+007C (|)
+	{ 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00},   // U+007D (})
+	{ 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+007E (~)
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}	// U+007F
 };
diff --git a/src/framebuffer.c b/src/framebuffer.c
index 570c3a3..c033722 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -9,77 +9,77 @@ 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
+	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;
+	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 short x,
+	unsigned short y,
+	unsigned char r,
+	unsigned char g,
+	unsigned char b
 ){
-        if (x > fb_width || y > fb_height)
-                return;
-        unsigned long dest_addr = fb_address + y*fb_pitch + x*fb_bytespp;
-        if (fb_bpp == 32) {
-                *((unsigned long *)(dest_addr)) = r<<fb_rpos | g<<fb_gpos | b<<fb_bpos;
-        } else {
-                *((unsigned char *)(dest_addr + fb_rpos/8)) = r;
-                *((unsigned char *)(dest_addr + fb_gpos/8)) = g;
-                *((unsigned char *)(dest_addr + fb_bpos/8)) = b;
-        }
+	if (x > fb_width || y > fb_height)
+		return;
+	unsigned long dest_addr = fb_address + y*fb_pitch + x*fb_bytespp;
+	if (fb_bpp == 32) {
+		*((unsigned long *)(dest_addr)) = r<<fb_rpos | g<<fb_gpos | b<<fb_bpos;
+	} else {
+		*((unsigned char *)(dest_addr + fb_rpos/8)) = r;
+		*((unsigned char *)(dest_addr + fb_gpos/8)) = g;
+		*((unsigned char *)(dest_addr + fb_bpos/8)) = b;
+	}
 }
 
 void putchar(
-        unsigned char *character,
-        unsigned short x,
-        unsigned short y,
-        unsigned char r,
-        unsigned char g,
-        unsigned char b
+	unsigned char *character,
+	unsigned short x,
+	unsigned short y,
+	unsigned char r,
+	unsigned char g,
+	unsigned char b
 ){
-        // Limit to ASCII printable
-        if (*character < 0x20) {
-                serial_write_string("\nASCII too low");
-                return;
-        }
-        if (*character > 0x7e) {
-                serial_write_string("\nASCII too hihg");
-                return;
-        }
+	// Limit to ASCII printable
+	if (*character < 0x20) {
+		serial_write_string("\nASCII too low");
+		return;
+	}
+	if (*character > 0x7e) {
+		serial_write_string("\nASCII too hihg");
+		return;
+	}
 
-        unsigned char *rowdata = font8x8_basic[*character];
-        unsigned char charx, chary, iy, ix;
-        unsigned char sizex=2;
-        unsigned char sizey=2;
-        for (chary=0;chary<8;chary++) {
-                for (charx=0;charx<8;charx++) {
-                        unsigned char pix = rowdata[chary] & 1 << charx;
-                        if (pix) {
-                                for (iy=1;iy<=sizey;iy++) {
-                                        for (ix=1;ix<=sizex;ix++) {
-                                                putpixel(x+charx*sizex+ix, y+chary*sizey+iy, r, g, b);
-                                        }
-                                }
-                        }
-                }
-        }
+	unsigned char *rowdata = font8x8_basic[*character];
+	unsigned char charx, chary, iy, ix;
+	unsigned char sizex=5;
+	unsigned char sizey=5;
+	for (chary=0;chary<8;chary++) {
+		for (charx=0;charx<8;charx++) {
+			unsigned char pix = rowdata[chary] & 1 << charx;
+			if (pix) {
+				for (iy=1;iy<=sizey;iy++) {
+					for (ix=1;ix<=sizex;ix++) {
+						putpixel(x+charx*sizex+ix, y+chary*sizey+iy, r, g, b);
+					}
+				}
+			}
+		}
+	}
 }
diff --git a/src/framebuffer.h b/src/framebuffer.h
index dac7813..8cb760b 100644
--- a/src/framebuffer.h
+++ b/src/framebuffer.h
@@ -2,28 +2,28 @@
 #define _FRAMEBUFFER_H 1
 
 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
+	unsigned long addr,
+	unsigned short w,
+	unsigned short h,
+	unsigned char bpp,
+	unsigned long pitch,
+	unsigned char rpos,
+	unsigned char gpos,
+	unsigned char bpos
 );
 void putpixel(
-        unsigned short x,
-        unsigned short y,
-        unsigned char r,
-        unsigned char g,
-        unsigned char b
+	unsigned short x,
+	unsigned short y,
+	unsigned char r,
+	unsigned char g,
+	unsigned char b
  );
 void putchar(
-        unsigned char *character,
-        unsigned short x,
-        unsigned short y,
-        unsigned char r,
-        unsigned char g,
-        unsigned char b
+	unsigned char *character,
+	unsigned short x,
+	unsigned short y,
+	unsigned char r,
+	unsigned char g,
+	unsigned char b
 );
 #endif
diff --git a/src/kernel.c b/src/kernel.c
index 1d5fed8..3364929 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -6,93 +6,93 @@
 
 static inline void outb(unsigned short port, unsigned char val)
 {
-        asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
+	asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
 }
 static inline unsigned char inb(unsigned short port)
 {
-        unsigned char ret;
-        asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
-        return ret;
+	unsigned char ret;
+	asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
+	return ret;
 }
 
 void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo)
 {
-        // Cursor disabling
-        outb(0x3D4, 0x0A);
-        outb(0x3D5, 0x20);
+	// Cursor disabling
+	outb(0x3D4, 0x0A);
+	outb(0x3D5, 0x20);
 
-        int serial_initialized = serial_init();
-        serial_write_string("\n=== rOSka ===\n");
+	int serial_initialized = serial_init();
+	serial_write_string("\n=== rOSka ===\n");
 
-        // Check multiboot header
-        if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
-                return;
-        }
+	// Check multiboot header
+	if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
+		return;
+	}
 
-        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) {
-                serial_write_string("\nVBE Mode: 0x");
-                serial_write_string(itoa(mbootinfo->vbe_mode, 16));
-        }
+	// Check videomode
+	if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) {
+		serial_write_string("\nVBE Mode: 0x");
+		serial_write_string(itoa(mbootinfo->vbe_mode, 16));
+	}
 
-        if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) {
-                serial_write_string("\nVideo info not available");
-                return;
-        }
+	if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) {
+		serial_write_string("\nVideo info not available");
+		return;
+	}
 
-        serial_write_string("\nFramebuffer: ");
-        serial_write_string("\n  Address: 0x");
-        serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16));
+	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));
+	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));
 
-        serial_write_string("\nMemory: ");
-        serial_write_string("\n  lower: ");
-        serial_write_string(uitoa(mbootinfo->mem_lower, 10));
-        serial_write_string(" k");
-        serial_write_string("\n  upper: ");
-        serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10));
-        serial_write_string(" M");
+	serial_write_string("\nMemory: ");
+	serial_write_string("\n  lower: ");
+	serial_write_string(uitoa(mbootinfo->mem_lower, 10));
+	serial_write_string(" k");
+	serial_write_string("\n  upper: ");
+	serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10));
+	serial_write_string(" M");
 
-        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=mbootinfo->framebuffer_height; y>=0; y--) {
-                for (x=mbootinfo->framebuffer_width; x>=0; x--) {
-                        putpixel(x, y, 0, 0x55, 0x55);
-                }
-        }
+	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=mbootinfo->framebuffer_height; y>=0; y--) {
+		for (x=mbootinfo->framebuffer_width; x>=0; x--) {
+			putpixel(x, y, 0, 0x55, 0x55);
+		}
+	}
 
-        putchar("r", 0, 0, 0xff, 0xff, 0xff);
-        putchar("O", 16, 0, 0xff, 0xff, 0xff);
-        putchar("S", 32, 0, 0xff, 0xff, 0xff);
-        putchar("k", 48, 0, 0xff, 0xff, 0xff);
-        putchar("a", 64, 0, 0xff, 0xff, 0xff);
-        while(1){}
+	putchar("r", 412, 5, 0xff, 0xff, 0xff);
+	putchar("O", 452, 5, 0xff, 0xff, 0xff);
+	putchar("S", 492, 5, 0xff, 0xff, 0xff);
+	putchar("k", 532, 5, 0xff, 0xff, 0xff);
+	putchar("a", 572, 5, 0xff, 0xff, 0xff);
+	//while(1){}
 
-        serial_write_string("\nExecution finished, halting...\n");
+	serial_write_string("\nExecution finished, halting...\n");
 }
diff --git a/src/serial.c b/src/serial.c
index d19762d..5497203 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -3,54 +3,54 @@
 
 static inline void outb(unsigned short port, unsigned char val)
 {
-        asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
+	asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
 }
 static inline unsigned char inb(unsigned short port)
 {
-        unsigned char ret;
-        asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
-        return ret;
+	unsigned char ret;
+	asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
+	return ret;
 }
 
 int serial_init()
 {
-        outb(PORT + 1, 0x00);   // Disable all interrupts
-        outb(PORT + 3, 0x80);   // Enable DLAB (set baud rate divisor)
-        outb(PORT + 0, 0x03);   // Set divisor to 3 (lo byte) 38400 baud
-        outb(PORT + 1, 0x00);   //                  (hi byte)
-        outb(PORT + 3, 0x03);   // 8 bits, no parity, one stop bit
-        outb(PORT + 2, 0xC7);   // Enable FIFO, clear them, 14-byte threshold
-        outb(PORT + 4, 0x0B);   // IRQs enabled, RTS/DSR set
-        outb(PORT + 4, 0x1E);   // Set in loopback mode, test the serial chip
-        outb(PORT + 0, 0xAE);   // Test serial chip (send byte 0xAE and check
-                                // if serial returns same byte)
+	outb(PORT + 1, 0x00);   // Disable all interrupts
+	outb(PORT + 3, 0x80);   // Enable DLAB (set baud rate divisor)
+	outb(PORT + 0, 0x03);   // Set divisor to 3 (lo byte) 38400 baud
+	outb(PORT + 1, 0x00);   //		  (hi byte)
+	outb(PORT + 3, 0x03);   // 8 bits, no parity, one stop bit
+	outb(PORT + 2, 0xC7);   // Enable FIFO, clear them, 14-byte threshold
+	outb(PORT + 4, 0x0B);   // IRQs enabled, RTS/DSR set
+	outb(PORT + 4, 0x1E);   // Set in loopback mode, test the serial chip
+	outb(PORT + 0, 0xAE);   // Test serial chip (send byte 0xAE and check
+				// if serial returns same byte)
 
-        // Check if serial is faulty (i.e: not same byte as sent)
-        if (inb(PORT + 0) != 0xAE)
-                return 1;
+	// Check if serial is faulty (i.e: not same byte as sent)
+	if (inb(PORT + 0) != 0xAE)
+		return 1;
 
-        // If serial is not faulty set it in normal operation mode
-        // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
-        outb(PORT + 4, 0x0F);
-        return 0;
+	// If serial is not faulty set it in normal operation mode
+	// (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
+	outb(PORT + 4, 0x0F);
+	return 0;
 }
 
 static int serial_is_transmit_empty()
 {
-        return inb(PORT + 5) & 0x20;
+	return inb(PORT + 5) & 0x20;
 }
 
 static void serial_write_char(char chr)
 {
-        while (serial_is_transmit_empty() == 0);
-        outb(PORT, chr);
+	while (serial_is_transmit_empty() == 0);
+	outb(PORT, chr);
 }
 
 void serial_write_string(const char* text)
 {
-        int i = 0;
-        while (text[i]) {
-                serial_write_char(text[i]);
-                i++;
-        }
+	int i = 0;
+	while (text[i]) {
+		serial_write_char(text[i]);
+		i++;
+	}
 }
diff --git a/src/start32.s b/src/start32.s
index f03794a..76cfc63 100644
--- a/src/start32.s
+++ b/src/start32.s
@@ -4,45 +4,45 @@
 .set MULTIBOOT_AOUT_KLUDGE,     0 << 16
 .set MULTIBOOT_HEADER_MAGIC,    0x1BADB002
 .set MULTIBOOT_HEADER_FLAGS, \
-        MULTIBOOT_PAGE_ALIGN \
-        | MULTIBOOT_MEMORY_INFO \
-        | MULTIBOOT_VIDEO_REQUEST \
-        | MULTIBOOT_AOUT_KLUDGE
+	MULTIBOOT_PAGE_ALIGN \
+	| MULTIBOOT_MEMORY_INFO \
+	| MULTIBOOT_VIDEO_REQUEST \
+	| MULTIBOOT_AOUT_KLUDGE
 .set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
 
 #.section ".multiboottbabeee"
 .align 4
-        .long MULTIBOOT_HEADER_MAGIC
-        .long MULTIBOOT_HEADER_FLAGS
-        .long MULTIBOOT_CHECKSUM
-        .long 0         # header address
-        .long 0         # load address
-        .long 0         # load end address
-        .long 0         # bss end address
-        .long 0         # entry address
-        .long 0         # video mode_type (0:fb, 1:txt) (set flags[2]!)
-        .long 1024      # video width
-        .long 768       # video height
-        .long 32        # video depth
+	.long MULTIBOOT_HEADER_MAGIC
+	.long MULTIBOOT_HEADER_FLAGS
+	.long MULTIBOOT_CHECKSUM
+	.long 0	    # header address
+	.long 0	    # load address
+	.long 0	    # load end address
+	.long 0	    # bss end address
+	.long 0	    # entry address
+	.long 0	    # video mode_type (0:fb, 1:txt) (set flags[2]!)
+	.long 1024  # video width
+	.long 768   # video height
+	.long 32    # video depth
 
 .bss
 .align 16
-        stack_bottom:
-        .skip 16384     # 16k
-        stack_top:
+	stack_bottom:
+	.skip 16384     # 16k
+	stack_top:
 
 .text
 .global  _start
 _start:
-        # Setup stack
-        mov $stack_top, %esp
+	# Setup stack
+	mov $stack_top, %esp
 
-        # Call the main kernel function.
-        push %ebx
-        push %eax
-        call kmain
+	# Call the main kernel function.
+	push %ebx
+	push %eax
+	call kmain
 
 
-        cli
+	cli
 1:      hlt
-        jmp 1b
+	jmp 1b
diff --git a/src/xtoa.c b/src/xtoa.c
index 2a7b9a5..b6b3739 100644
--- a/src/xtoa.c
+++ b/src/xtoa.c
@@ -1,104 +1,104 @@
 #include "xtoa.h"
 char* itoa(int value, int base)
 {
-        char* result;
+	char* result;
 
-        // check that the base if valid
-        if (base < 2 || base > 36) { *result = '\0'; return 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;
+	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 );
+	do {
+		tmp_value = value;
+		value /= base;
+		*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
+	} while ( value );
 
-        // Apply negative sign
-        if (tmp_value < 0) *ptr++ = '-';
-        *ptr-- = '\0';
-        while (ptr1 < ptr) {
-                tmp_char = *ptr;
-                *ptr--= *ptr1;
-                *ptr1++ = tmp_char;
-        }
-        return result;
+	// Apply negative sign
+	if (tmp_value < 0) *ptr++ = '-';
+	*ptr-- = '\0';
+	while (ptr1 < ptr) {
+		tmp_char = *ptr;
+		*ptr--= *ptr1;
+		*ptr1++ = tmp_char;
+	}
+	return result;
 }
 
 char* uitoa(unsigned int value, int base)
 {
-        char* result;
+	char* result;
 
-        // check that the base if valid
-        if (base < 2 || base > 36) { *result = '\0'; return 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;
+	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 );
+	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;
+	*ptr-- = '\0';
+	while (ptr1 < ptr) {
+		tmp_char = *ptr;
+		*ptr--= *ptr1;
+		*ptr1++ = tmp_char;
+	}
+	return result;
 }
 
 char* ltoa(long value, int base)
 {
-        char* result;
+	char* result;
 
-        // check that the base if valid
-        if (base < 2 || base > 36) { *result = '\0'; return 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;
+	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 );
+	do {
+		tmp_value = value;
+		value /= base;
+		*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
+	} while ( value );
 
-        // Apply negative sign
-        if (tmp_value < 0) *ptr++ = '-';
-        *ptr-- = '\0';
-        while (ptr1 < ptr) {
-                tmp_char = *ptr;
-                *ptr--= *ptr1;
-                *ptr1++ = tmp_char;
-        }
-        return result;
+	// Apply negative sign
+	if (tmp_value < 0) *ptr++ = '-';
+	*ptr-- = '\0';
+	while (ptr1 < ptr) {
+		tmp_char = *ptr;
+		*ptr--= *ptr1;
+		*ptr1++ = tmp_char;
+	}
+	return result;
 }
 
 char* ultoa(unsigned long value, int base)
 {
-        char* result;
+	char* result;
 
-        // check that the base if valid
-        if (base < 2 || base > 36) { *result = '\0'; return 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;
+	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 );
+	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;
+	*ptr-- = '\0';
+	while (ptr1 < ptr) {
+		tmp_char = *ptr;
+		*ptr--= *ptr1;
+		*ptr1++ = tmp_char;
+	}
+	return result;
 }

From b077a17fa4d3ccf32a9c63329bdfeb30c24a7490 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 23 Sep 2023 21:19:53 +0300
Subject: [PATCH 27/45] Renaming putchar to putc

---
 src/framebuffer.c |  2 +-
 src/framebuffer.h |  2 +-
 src/kernel.c      | 10 +++++-----
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/framebuffer.c b/src/framebuffer.c
index c033722..35b73b5 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -48,7 +48,7 @@ void putpixel(
 	}
 }
 
-void putchar(
+void putc(
 	unsigned char *character,
 	unsigned short x,
 	unsigned short y,
diff --git a/src/framebuffer.h b/src/framebuffer.h
index 8cb760b..96ed6d7 100644
--- a/src/framebuffer.h
+++ b/src/framebuffer.h
@@ -18,7 +18,7 @@ void putpixel(
 	unsigned char g,
 	unsigned char b
  );
-void putchar(
+void putc(
 	unsigned char *character,
 	unsigned short x,
 	unsigned short y,
diff --git a/src/kernel.c b/src/kernel.c
index 3364929..1fab654 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -87,11 +87,11 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo)
 		}
 	}
 
-	putchar("r", 412, 5, 0xff, 0xff, 0xff);
-	putchar("O", 452, 5, 0xff, 0xff, 0xff);
-	putchar("S", 492, 5, 0xff, 0xff, 0xff);
-	putchar("k", 532, 5, 0xff, 0xff, 0xff);
-	putchar("a", 572, 5, 0xff, 0xff, 0xff);
+	putc("r", 412, 5, 0xff, 0xff, 0xff);
+	putc("O", 452, 5, 0xff, 0xff, 0xff);
+	putc("S", 492, 5, 0xff, 0xff, 0xff);
+	putc("k", 532, 5, 0xff, 0xff, 0xff);
+	putc("a", 572, 5, 0xff, 0xff, 0xff);
 	//while(1){}
 
 	serial_write_string("\nExecution finished, halting...\n");

From f0243cb45e10e7e9c3c10956c4d51c478ff293fd Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sun, 24 Sep 2023 01:39:22 +0300
Subject: [PATCH 28/45] Printing whole strings to screen

---
 src/framebuffer.c | 29 ++++++++++++++++++++++-------
 src/framebuffer.h |  4 ++--
 src/kernel.c      |  6 +-----
 3 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/src/framebuffer.c b/src/framebuffer.c
index 35b73b5..1e19efa 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -48,8 +48,8 @@ void putpixel(
 	}
 }
 
-void putc(
-	unsigned char *character,
+static void putc(
+	const unsigned char character,
 	unsigned short x,
 	unsigned short y,
 	unsigned char r,
@@ -57,19 +57,19 @@ void putc(
 	unsigned char b
 ){
 	// Limit to ASCII printable
-	if (*character < 0x20) {
+	if (character < 0x20) {
 		serial_write_string("\nASCII too low");
 		return;
 	}
-	if (*character > 0x7e) {
+	if (character > 0x7e) {
 		serial_write_string("\nASCII too hihg");
 		return;
 	}
 
-	unsigned char *rowdata = font8x8_basic[*character];
+	unsigned char *rowdata = font8x8_basic[character];
 	unsigned char charx, chary, iy, ix;
-	unsigned char sizex=5;
-	unsigned char sizey=5;
+	unsigned char sizex=1;
+	unsigned char sizey=1;
 	for (chary=0;chary<8;chary++) {
 		for (charx=0;charx<8;charx++) {
 			unsigned char pix = rowdata[chary] & 1 << charx;
@@ -83,3 +83,18 @@ void putc(
 		}
 	}
 }
+
+void puts(
+	const unsigned char *text,
+	unsigned short x,
+	unsigned short y,
+	unsigned char r,
+	unsigned char g,
+	unsigned char b
+){
+	unsigned char i = 0;
+	while (text[i]) {
+		putc(text[i], x+i*8, y, r, g, b);
+		i++;
+	}
+}
diff --git a/src/framebuffer.h b/src/framebuffer.h
index 96ed6d7..8066375 100644
--- a/src/framebuffer.h
+++ b/src/framebuffer.h
@@ -18,8 +18,8 @@ void putpixel(
 	unsigned char g,
 	unsigned char b
  );
-void putc(
-	unsigned char *character,
+void puts(
+	const unsigned char *text,
 	unsigned short x,
 	unsigned short y,
 	unsigned char r,
diff --git a/src/kernel.c b/src/kernel.c
index 1fab654..1f5766d 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -87,11 +87,7 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo)
 		}
 	}
 
-	putc("r", 412, 5, 0xff, 0xff, 0xff);
-	putc("O", 452, 5, 0xff, 0xff, 0xff);
-	putc("S", 492, 5, 0xff, 0xff, 0xff);
-	putc("k", 532, 5, 0xff, 0xff, 0xff);
-	putc("a", 572, 5, 0xff, 0xff, 0xff);
+	puts("rOSka", 0, 0, 0xff, 0x00, 0x00);
 	//while(1){}
 
 	serial_write_string("\nExecution finished, halting...\n");

From 2c6826e293a0a73c497c02bf8eaf8a0d73e37e62 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sun, 24 Sep 2023 20:46:39 +0300
Subject: [PATCH 29/45] Fixing putc and puts to use pointers correctly

---
 src/framebuffer.c | 18 ++++++++----------
 src/framebuffer.h | 10 +++++++++-
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/framebuffer.c b/src/framebuffer.c
index 1e19efa..3d4cbe3 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -1,6 +1,7 @@
 #include "framebuffer.h"
 #include "font8x8_basic.h"
 #include "serial.h"
+#include "xtoa.h"
 
 static unsigned long fb_address;
 static unsigned long fb_pitch;
@@ -48,8 +49,8 @@ void putpixel(
 	}
 }
 
-static void putc(
-	const unsigned char character,
+void putc(
+	const unsigned char *character,
 	unsigned short x,
 	unsigned short y,
 	unsigned char r,
@@ -57,16 +58,13 @@ static void putc(
 	unsigned char b
 ){
 	// Limit to ASCII printable
-	if (character < 0x20) {
-		serial_write_string("\nASCII too low");
-		return;
-	}
-	if (character > 0x7e) {
-		serial_write_string("\nASCII too hihg");
+	if (*character < 0x20 || *character > 0x7e) {
+		serial_write_string("\nputc ASCII out of range: ");
+		serial_write_string(uitoa(*character, 16));
 		return;
 	}
 
-	unsigned char *rowdata = font8x8_basic[character];
+	unsigned char *rowdata = font8x8_basic[*character];
 	unsigned char charx, chary, iy, ix;
 	unsigned char sizex=1;
 	unsigned char sizey=1;
@@ -94,7 +92,7 @@ void puts(
 ){
 	unsigned char i = 0;
 	while (text[i]) {
-		putc(text[i], x+i*8, y, r, g, b);
+		putc(text+i, x+i*8, y, r, g, b);
 		i++;
 	}
 }
diff --git a/src/framebuffer.h b/src/framebuffer.h
index 8066375..27c7195 100644
--- a/src/framebuffer.h
+++ b/src/framebuffer.h
@@ -17,7 +17,15 @@ void putpixel(
 	unsigned char r,
 	unsigned char g,
 	unsigned char b
- );
+);
+void putc(
+	const unsigned char *character,
+	unsigned short x,
+	unsigned short y,
+	unsigned char r,
+	unsigned char g,
+	unsigned char b
+);
 void puts(
 	const unsigned char *text,
 	unsigned short x,

From d1e3603fa51db82c02ff7584fd515dd132576272 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Mon, 25 Sep 2023 18:01:52 +0300
Subject: [PATCH 30/45] Switched font

---
 src/font_alotware.h | 260 ++++++++++++++++++++++++++++++++++++++++++++
 src/framebuffer.c   |  13 ++-
 src/kernel.c        |   6 +-
 3 files changed, 272 insertions(+), 7 deletions(-)
 create mode 100644 src/font_alotware.h

diff --git a/src/font_alotware.h b/src/font_alotware.h
new file mode 100644
index 0000000..9f59443
--- /dev/null
+++ b/src/font_alotware.h
@@ -0,0 +1,260 @@
+// Alotware's font, released under public domain.
+// Credits to OSDev forum user Muazzam
+unsigned char font[][16] = {
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x7F, 0x22, 0x44, 0x44, 0xFF, 0x44, 0x44, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x10, 0x3C, 0x52, 0x50, 0x50, 0x3C, 0x12, 0x12, 0x52, 0x3C, 0x10, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x02, 0x22, 0x54, 0x24, 0x08, 0x0A, 0x15, 0x12, 0x20, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x48, 0x30, 0x34, 0x48, 0x45, 0x3E, 0x01, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x18, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x18, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x18, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x1C, 0x1C, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x46, 0x4A, 0x52, 0x62, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7E, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x04, 0x38, 0x04, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x0C, 0x14, 0x24, 0x44, 0x44, 0x7E, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x40, 0x40, 0x7C, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7E, 0x42, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x02, 0x02, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x4E, 0x52, 0x4E, 0x40, 0x40, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x78, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7E, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7E, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x40, 0x40, 0x4E, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x66, 0x5A, 0x5A, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x46, 0x42, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x4A, 0x46, 0x3E, 0x01, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x60, 0x50, 0x48, 0x44, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x3C, 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x5A, 0x5A, 0x66, 0x42, 0x42, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x28, 0x44, 0x44, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x7E, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x7E, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x78, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x1E, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1E, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x40, 0x40, 0x7C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x40, 0x40, 0x3C, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x1C, 0x20, 0x20, 0x7C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x3C, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x40, 0x40, 0x7C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x38, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x40, 0x40, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x40, 0x3C, 0x02, 0x02, 0x3C, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x5A, 0x5A, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x10, 0x28, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x7C, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x0C, 0x10, 0x10, 0x10, 0x60, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x30, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,},
+};
diff --git a/src/framebuffer.c b/src/framebuffer.c
index 3d4cbe3..25ee486 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -1,5 +1,5 @@
 #include "framebuffer.h"
-#include "font8x8_basic.h"
+#include "font_alotware.h"
 #include "serial.h"
 #include "xtoa.h"
 
@@ -64,16 +64,17 @@ void putc(
 		return;
 	}
 
-	unsigned char *rowdata = font8x8_basic[*character];
+	unsigned char *rowdata = font[*character];
 	unsigned char charx, chary, iy, ix;
 	unsigned char sizex=1;
 	unsigned char sizey=1;
-	for (chary=0;chary<8;chary++) {
+	for (chary=0;chary<16;chary++) {
 		for (charx=0;charx<8;charx++) {
-			unsigned char pix = rowdata[chary] & 1 << charx;
+			//unsigned char pix = rowdata[chary] & 1 << charx;
+			unsigned char pix = rowdata[chary] & 0b10000000 >> charx;
 			if (pix) {
-				for (iy=1;iy<=sizey;iy++) {
-					for (ix=1;ix<=sizex;ix++) {
+				for (iy=0;iy<sizey;iy++) {
+					for (ix=0;ix<sizex;ix++) {
 						putpixel(x+charx*sizex+ix, y+chary*sizey+iy, r, g, b);
 					}
 				}
diff --git a/src/kernel.c b/src/kernel.c
index 1f5766d..31ab4ce 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -87,7 +87,11 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo)
 		}
 	}
 
-	puts("rOSka", 0, 0, 0xff, 0x00, 0x00);
+	puts(" !\"#$%&\'()*+,-./0123456789 :;<=>?@", mbootinfo->framebuffer_width-35*8, mbootinfo->framebuffer_height-16*3-8, 0xff, 0xff, 0xff);
+	puts("ABCDEFGHIJKLMNOPQRSTUVWXYZ [\\]^_`", mbootinfo->framebuffer_width-35*8, mbootinfo->framebuffer_height-16*2-8, 0xff, 0xff, 0xff);
+	puts("abcdefghijklmnopqrstuvwxyz {|}~", mbootinfo->framebuffer_width-35*8, mbootinfo->framebuffer_height-16-8, 0xff, 0xff, 0xff);
+
+	puts("rOSka on paskaa ja paska ei lopu koskaa, huehue", 0, 0, 0xff, 0xff, 0xff);
 	//while(1){}
 
 	serial_write_string("\nExecution finished, halting...\n");

From e4cf306093d049a8a62f24da4053236fd87b1ebc Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 26 Sep 2023 18:03:04 +0300
Subject: [PATCH 31/45] Formatting: Multiline does not seem like a good idea

---
 src/start32.s | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/src/start32.s b/src/start32.s
index 76cfc63..fd22a82 100644
--- a/src/start32.s
+++ b/src/start32.s
@@ -3,11 +3,7 @@
 .set MULTIBOOT_VIDEO_REQUEST,   1 << 2
 .set MULTIBOOT_AOUT_KLUDGE,     0 << 16
 .set MULTIBOOT_HEADER_MAGIC,    0x1BADB002
-.set MULTIBOOT_HEADER_FLAGS, \
-	MULTIBOOT_PAGE_ALIGN \
-	| MULTIBOOT_MEMORY_INFO \
-	| MULTIBOOT_VIDEO_REQUEST \
-	| MULTIBOOT_AOUT_KLUDGE
+.set MULTIBOOT_HEADER_FLAGS, MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST | MULTIBOOT_AOUT_KLUDGE
 .set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
 
 #.section ".multiboottbabeee"

From e0be923f35bc0b77c9d5d65e4c14ff0ccb188c29 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 26 Sep 2023 18:10:33 +0300
Subject: [PATCH 32/45] I heard strings are not unsigned lol

---
 src/framebuffer.c | 4 ++--
 src/framebuffer.h | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/framebuffer.c b/src/framebuffer.c
index 25ee486..d8ee465 100644
--- a/src/framebuffer.c
+++ b/src/framebuffer.c
@@ -50,7 +50,7 @@ void putpixel(
 }
 
 void putc(
-	const unsigned char *character,
+	const char *character,
 	unsigned short x,
 	unsigned short y,
 	unsigned char r,
@@ -84,7 +84,7 @@ void putc(
 }
 
 void puts(
-	const unsigned char *text,
+	const char *text,
 	unsigned short x,
 	unsigned short y,
 	unsigned char r,
diff --git a/src/framebuffer.h b/src/framebuffer.h
index 27c7195..144aa3f 100644
--- a/src/framebuffer.h
+++ b/src/framebuffer.h
@@ -19,7 +19,7 @@ void putpixel(
 	unsigned char b
 );
 void putc(
-	const unsigned char *character,
+	const char *character,
 	unsigned short x,
 	unsigned short y,
 	unsigned char r,
@@ -27,7 +27,7 @@ void putc(
 	unsigned char b
 );
 void puts(
-	const unsigned char *text,
+	const char *text,
 	unsigned short x,
 	unsigned short y,
 	unsigned char r,

From a0ba839215c2af7805e8419ba7680fc25fe7846c Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 13 Jan 2024 02:36:35 +0200
Subject: [PATCH 33/45] Get sweet R/G/B positions as numbers for debugging

---
 src/start32.asm | 52 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/src/start32.asm b/src/start32.asm
index 5042d9c..5feda10 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -97,6 +97,52 @@ start:
 	call serialwrite
 	add esp, 4
 
+
+push stuff.rpostxt
+call serialwrite
+add esp, 4
+
+push dword esp
+push dword 10
+xor eax, eax
+mov al, [mbootinfo.fb_rpos]
+push dword eax
+call __uitoa
+add esp, 3*4
+push esp
+call serialwrite
+add esp, 4
+
+push stuff.gpostxt
+call serialwrite
+add esp, 4
+
+push dword esp
+push dword 10
+xor eax, eax
+mov al, [mbootinfo.fb_gpos]
+push dword eax
+call __uitoa
+add esp, 3*4
+push esp
+call serialwrite
+add esp, 4
+
+push stuff.bpostxt
+call serialwrite
+add esp, 4
+
+push dword esp
+push dword 10
+xor eax, eax
+mov al, [mbootinfo.fb_bpos]
+push dword eax
+call __uitoa
+add esp, 3*4
+push esp
+call serialwrite
+add esp, 4
+
 	add esp, 36	;Clean reserved uitoa return string from stack
 
 	; Draw a test pixel to bottom right corner
@@ -132,6 +178,7 @@ rOSkalogodraw:
 	cmp byte bl, [roskalogo.h]
 	jne .loop
 .done:
+jmp hang
 
 
 xor eax, eax
@@ -189,6 +236,11 @@ stuff:
 	.fbdimensionsmsgpfx db 10, "Framebuffer dimensions: ", 0
 	.x db "x", 0
 
+
+	.rpostxt db 10, "rPos: ", 0
+	.gpostxt db 10, "gPos: ", 0
+	.bpostxt db 10, "bPos: ", 0
+
 align 4096
 bss_start:
 ;align 4096

From 3dd934bd83ce770a56cf26505d730e6ae47efcc5 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 13 Jan 2024 03:28:43 +0200
Subject: [PATCH 34/45] Fixed R/G/B field information fetching from Multiboot

---
 src/mbootinfo.asm |  2 ++
 src/start32.asm   | 51 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/src/mbootinfo.asm b/src/mbootinfo.asm
index 2ff07e8..d7425f0 100644
--- a/src/mbootinfo.asm
+++ b/src/mbootinfo.asm
@@ -54,6 +54,8 @@ mbootgetinfo:
 	mov [mbootinfo.fb_type], al
 	inc esi
 
+	;garbage?
+	add esi, 2
 	;; r/g/b positions and masks
 	mov ecx, 6
 	mov edi, mbootinfo.fb_rpos
diff --git a/src/start32.asm b/src/start32.asm
index 5feda10..495dde2 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -143,6 +143,54 @@ push esp
 call serialwrite
 add esp, 4
 
+
+
+push stuff.rmasksizetxt
+call serialwrite
+add esp, 4
+
+push dword esp
+push dword 10
+xor eax, eax
+mov al, [mbootinfo.fb_rmasksize]
+push dword eax
+call __uitoa
+add esp, 3*4
+push esp
+call serialwrite
+add esp, 4
+
+push stuff.gmasksizetxt
+call serialwrite
+add esp, 4
+
+push dword esp
+push dword 10
+xor eax, eax
+mov al, [mbootinfo.fb_gmasksize]
+push dword eax
+call __uitoa
+add esp, 3*4
+push esp
+call serialwrite
+add esp, 4
+
+push stuff.bmasksizetxt
+call serialwrite
+add esp, 4
+
+push dword esp
+push dword 10
+xor eax, eax
+mov al, [mbootinfo.fb_bmasksize]
+push dword eax
+call __uitoa
+add esp, 3*4
+push esp
+call serialwrite
+add esp, 4
+
+
 	add esp, 36	;Clean reserved uitoa return string from stack
 
 	; Draw a test pixel to bottom right corner
@@ -240,6 +288,9 @@ stuff:
 	.rpostxt db 10, "rPos: ", 0
 	.gpostxt db 10, "gPos: ", 0
 	.bpostxt db 10, "bPos: ", 0
+	.rmasksizetxt db 10, "rMaskSize: ", 0
+	.gmasksizetxt db 10, "gMaskSize: ", 0
+	.bmasksizetxt db 10, "bMaskSize: ", 0
 
 align 4096
 bss_start:

From bbd80c4f78079ee27923ca567eca9247cd48ca88 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 26 Jan 2024 18:23:51 +0200
Subject: [PATCH 35/45] Cleaning up

---
 src/start32.asm | 33 ---------------------------------
 1 file changed, 33 deletions(-)

diff --git a/src/start32.asm b/src/start32.asm
index 495dde2..1aa15fc 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -229,39 +229,6 @@ rOSkalogodraw:
 jmp hang
 
 
-xor eax, eax
-xor ebx, ebx
-xor ecx, ecx
-cloop:
-push eax ;col
-push ebx ;y
-push ecx ;x
-call putpixel
-pop ecx
-pop ebx
-pop eax
-
-inc ecx
-cmp ecx, VWIDTH
-jle cloop
-
-xor ecx, ecx
-inc ebx
-cmp ebx, VHEIGHT
-jle cloop
-
-xor ebx, ebx
-add eax, 5
-cmp ax, 255
-jle cloop
-
-xor eax, eax
-jmp cloop
-
-
-
-
-	jmp hang
 
 hang:
 	push .msg

From bcf49f4fefaee820bc2b56e0cc948431057b7fef Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 26 Jan 2024 18:29:07 +0200
Subject: [PATCH 36/45] Framebuffer supports colour now

---
 src/framebuffer.asm | 32 +++++++++++++++++++++++++++-----
 src/start32.asm     | 21 ++++++++++++---------
 2 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/src/framebuffer.asm b/src/framebuffer.asm
index 5204798..377ba9a 100644
--- a/src/framebuffer.asm
+++ b/src/framebuffer.asm
@@ -1,4 +1,4 @@
-;; x, y, brightness
+;; x, y, r, g, b
 putpixel:
 	push ebp
 	mov ebp, esp
@@ -28,12 +28,34 @@ putpixel:
 	add edi, eax
 
 
-	; Brightness
-	mov eax, [ebp + 16]
 
 	; Poke videomemory
-	cld
-	rep stosb
+	xor eax, eax
+	mov ebx, [ebp+16]
+	mov cl, [mbootinfo.fb_rpos]
+	shl ebx, cl
+	or eax, ebx
+
+	mov ebx, [ebp+20]
+	mov cl, [mbootinfo.fb_gpos]
+	shl ebx, cl
+	or eax, ebx
+
+	mov ebx, [ebp+24]
+	mov cl, [mbootinfo.fb_bpos]
+	shl ebx, cl
+	or eax, ebx
+
+	cmp [mbootinfo.fb_bpp], 32
+	jne .bpp24
+	stosd
+	jmp .done
+.bpp24:
+	stosb
+	shr eax, 8
+	stosb
+	shr eax, 8
+	stosb
 .done:
 	pop edi
 	pop ecx
diff --git a/src/start32.asm b/src/start32.asm
index 1aa15fc..1e3121f 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -13,7 +13,7 @@ MB_CHECKSUM          equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
 
 VWIDTH  equ 640
 VHEIGHT equ 480
-VDEPTH  equ 24
+VDEPTH  equ 32
 
 multiboot:
 	dd MB_HEADER_MAGIC
@@ -194,12 +194,11 @@ add esp, 4
 	add esp, 36	;Clean reserved uitoa return string from stack
 
 	; Draw a test pixel to bottom right corner
-	mov eax, 0xff
-	mov ebx, 767
-	mov ecx, 1023
 	push 0xff
-	push 479
-	push 639
+	push 0xff
+	push 0xff
+	push VHEIGHT-1
+	push VWIDTH-1
 	call putpixel
 	add esp, 3*4
 
@@ -210,13 +209,17 @@ rOSkalogodraw:
 	mov ecx, 0	;x
 .loop:
 	lodsb
-	push eax
-	push ebx
-	push ecx
+	push eax		;b
+	push eax		;g
+	push eax		;r
+	push ebx		;y
+	push ecx		;x
 	call putpixel
 	pop ecx
 	pop ebx
 	pop eax
+	pop eax
+	pop eax
 
 	inc ecx
 	cmp byte cl, [roskalogo.w]

From 32ccb3abd176002669a8f6e9e719b1887b7adf92 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 16 Aug 2024 18:22:30 +0300
Subject: [PATCH 37/45] Automating image-file creation

---
 Makefile | 29 +++++++++++++++++++++++++----
 grub.cfg |  3 +++
 2 files changed, 28 insertions(+), 4 deletions(-)
 create mode 100644 grub.cfg

diff --git a/Makefile b/Makefile
index 7864526..72c8af7 100644
--- a/Makefile
+++ b/Makefile
@@ -4,13 +4,13 @@ clean:
 
 start32.bin: src/*
 	fasm src/start32.asm start32.bin
-image: start32.bin mount
+image: start32.bin mount grub-cfg roska.img mnt/roska/
 	cp start32.bin mnt/roska/
 	sync
 
 qemu-multiboot: start32.bin
 	qemu-system-i386 -kernel start32.bin -serial stdio
-qemu-image: image
+qemu-image: image roska.img
 	qemu-system-i386 roska.img -serial stdio
 
 mount: roska.img mnt/
@@ -18,8 +18,29 @@ mount: roska.img mnt/
 		sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \
 	fi;
 umount:
-	@sudo umount mnt
+	@if mountpoint -q "mnt/"; then \
+		sudo umount mnt/; \
+	fi;
 mnt/:
-	@mkdir mnt
+	@mkdir -p mnt
+mnt/roska/: mount roska.img
+	@mkdir -p mnt/roska
 build/:
 	@mkdir build
+
+roska.img: mnt/
+	dd if=/dev/zero of=roska.img bs=16M count=1
+	echo 'type=83' | sudo sfdisk roska.img
+	sudo losetup /dev/loop0 roska.img
+	sudo losetup /dev/loop1 roska.img -o1048576
+	sudo mkdosfs -F32 -f 2 /dev/loop1
+	sudo mount /dev/loop1 mnt/
+	sudo grub-install --target=i386-pc --root-directory=mnt --boot-directory=mnt/boot --no-floppy --modules="normal part_msdos multiboot" /dev/loop0
+	sudo umount mnt/
+	sudo losetup -d /dev/loop1
+	sudo losetup -d /dev/loop0
+grub-cfg: grub.cfg mount
+	cp grub.cfg mnt/boot/grub/grub.cfg
+lo-unsetup: umount
+	sudo losetup -d /dev/loop1
+	sudo losetup -d /dev/loop0
diff --git a/grub.cfg b/grub.cfg
new file mode 100644
index 0000000..30eab69
--- /dev/null
+++ b/grub.cfg
@@ -0,0 +1,3 @@
+menuentry "rOSka" {
+   multiboot /roska/start32.bin
+}

From 7a22e4aed728eb0b5fa0cee700c70bf9928c31d4 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 17 Aug 2024 00:37:07 +0300
Subject: [PATCH 38/45] Follow C calling convention (futureproofing) and
 utilize macros

---
 src/framebuffer.asm |  14 ++-
 src/mbootinfo.asm   |  16 ++--
 src/serial.asm      |  12 ++-
 src/start32.asm     | 229 ++++++++++++++++++--------------------------
 4 files changed, 115 insertions(+), 156 deletions(-)

diff --git a/src/framebuffer.asm b/src/framebuffer.asm
index 377ba9a..e7168b0 100644
--- a/src/framebuffer.asm
+++ b/src/framebuffer.asm
@@ -1,11 +1,19 @@
+macro kputpixel x, y, r, g, b {
+	push b		;b
+	push g		;g
+	push r		;r
+	push y		;y
+	push x		;x
+	call putpixel
+	add esp, 4*5
+}
+
 ;; x, y, r, g, b
 putpixel:
 	push ebp
 	mov ebp, esp
 
-	push eax
 	push ebx
-	push ecx
 	push edi
 
 	; check pixel is in screen
@@ -58,9 +66,7 @@ putpixel:
 	stosb
 .done:
 	pop edi
-	pop ecx
 	pop ebx
-	pop eax
 
 	pop ebp
 	ret
diff --git a/src/mbootinfo.asm b/src/mbootinfo.asm
index d7425f0..3c3db73 100644
--- a/src/mbootinfo.asm
+++ b/src/mbootinfo.asm
@@ -1,7 +1,6 @@
 mbootgetinfo:
 	push ebp
 	mov ebp, esp
-	push ebx
 	push esi
 	push edi
 	cld
@@ -10,23 +9,23 @@ mbootgetinfo:
 	cmp eax, 0x2badb002
 	jne mbootnomagic
 
-	mov ebx, [ebp+12]
-	mov eax, [ebx]
+	mov edx, [ebp+12]
+	mov eax, [edx]
 	mov [mbootinfo.flags], eax
 
 	;; Get memoryinformation
 	test eax, 1b
 	jz mbootnomeminfo
-	mov eax, [ebx+4]
+	mov eax, [edx+4]
 	mov [mbootinfo.mem_lower], eax
-	mov eax, [ebx+8]
+	mov eax, [edx+8]
 	mov [mbootinfo.mem_upper], eax
 
 	;; Get videoinformation
 	test [mbootinfo.flags], (1 shl 02)
 	jz mbootnovideoinfo
 
-	mov esi, ebx
+	mov esi, edx
 	add esi, 88
 	mov eax, [esi]
 	mov [mbootinfo.fb_addr], eax
@@ -64,13 +63,12 @@ mbootgetinfo:
 .bytesppcalc:
 	xor eax, eax
 	mov al, [mbootinfo.fb_bpp]
-	mov ebx, 8
-	div bl
+	mov edx, 8
+	div dl
 	mov [mbootinfo.fb_bytespp], al
 .done:
 	pop edi
 	pop esi
-	pop ebx
 	pop ebp
 	ret
 
diff --git a/src/serial.asm b/src/serial.asm
index b4e3353..c46b511 100644
--- a/src/serial.asm
+++ b/src/serial.asm
@@ -1,9 +1,14 @@
 SERIAL_PORT equ 0x3f8
 serialinitialized db 0
 
-serialinit:
-	push ax
+; Write null terminated string in address str_pointer to serial
+macro serw str_pointer {
+	push str_pointer
+	call serialwrite
+	add esp, 4
+}
 
+serialinit:
 	;Disable ints
 	mov dx, SERIAL_PORT+1
 	mov al, 0x00
@@ -54,7 +59,6 @@ serialinit:
 	out dx, al
 	mov [serialinitialized], 1
 .end:
-	pop ax
 	ret
 .errormsg db "Serial init failed", 0
 
@@ -64,7 +68,6 @@ serialwrite:
 	push ebp
 	mov ebp, esp
 	push esi
-	push ax
 	cld
 	mov esi, [ebp+8]
 .loop:
@@ -80,7 +83,6 @@ serialwrite:
 	out dx, al
 	jmp .loop
 .done:
-	pop ax
 	pop esi
 	pop ebp
 	ret
diff --git a/src/start32.asm b/src/start32.asm
index 1e3121f..b6cb689 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -29,6 +29,13 @@ multiboot:
 	dd VHEIGHT	; video height
 	dd VDEPTH	; video depth
 
+; Includes yayyy
+include "src/serial.asm"
+include "src/mbootinfo.asm"
+include "src/itoa.asm"
+include "src/framebuffer.asm"
+include "src/roskalogoraw.asm"
+
 start:
 	; Setup stack
 	mov ebp, stack_top
@@ -38,16 +45,13 @@ start:
 	push eax
 
 	call serialinit
-	push stuff.bootmsg
-	call serialwrite
-	add esp, 4
+
+	serw stuff.bootmsg
 
 	call mbootgetinfo
 	add esp, 2*4
 
-	push stuff.fbaddrmsgpfx
-	call serialwrite
-	add esp, 4
+	serw stuff.fbaddrmsgpfx
 
 	sub esp, 36	;Reserve stack for return
 	push dword esp	;Destination address
@@ -55,36 +59,24 @@ start:
 	push dword [mbootinfo.fb_addr]	;source
 	call __uitoa
 	add esp, 3*4
-	push esp
-	call serialwrite
-	add esp, 4
+	serw esp
 
-	push stuff.fbdimensionsmsgpfx
-	call serialwrite
-	add esp, 4
+	serw stuff.fbdimensionsmsgpfx
 	push dword esp	;destination address
 	push dword 10	;base
 	push dword [mbootinfo.fb_width]
 	call __uitoa
 	add esp, 3*4
-	push esp
-	call serialwrite
-	add esp, 4
-	push stuff.x
-	call serialwrite
-	add esp, 4
+	serw esp
+	serw stuff.x
 
 	push dword esp	;destination address
 	push dword 10	;base
 	push dword [mbootinfo.fb_height]
 	call __uitoa
 	add esp, 3*4
-	push esp
-	call serialwrite
-	add esp, 4
-	push stuff.x
-	call serialwrite
-	add esp, 4
+	serw esp
+	serw stuff.x
 
 	push dword esp	;destination address
 	push dword 10	;base
@@ -93,115 +85,87 @@ start:
 	push dword eax
 	call __uitoa
 	add esp, 3*4
-	push esp
+	serw esp
+
+
+	serw stuff.rpostxt
+
+	push dword esp
+	push dword 10
+	xor eax, eax
+	mov al, [mbootinfo.fb_rpos]
+	push dword eax
+	call __uitoa
+	add esp, 3*4
+	serw esp
+
+	serw stuff.gpostxt
+
+	push dword esp
+	push dword 10
+	xor eax, eax
+	mov al, [mbootinfo.fb_gpos]
+	push dword eax
+	call __uitoa
+	add esp, 3*4
+	serw esp
+
+	serw stuff.bpostxt
+
+	push dword esp
+	push dword 10
+	xor eax, eax
+	mov al, [mbootinfo.fb_bpos]
+	push dword eax
+	call __uitoa
+	add esp, 3*4
+	serw esp
+
+
+
+	push stuff.rmasksizetxt
 	call serialwrite
 	add esp, 4
 
+	push dword esp
+	push dword 10
+	xor eax, eax
+	mov al, [mbootinfo.fb_rmasksize]
+	push dword eax
+	call __uitoa
+	add esp, 3*4
+	serw esp
 
-push stuff.rpostxt
-call serialwrite
-add esp, 4
+	push stuff.gmasksizetxt
+	call serialwrite
+	add esp, 4
 
-push dword esp
-push dword 10
-xor eax, eax
-mov al, [mbootinfo.fb_rpos]
-push dword eax
-call __uitoa
-add esp, 3*4
-push esp
-call serialwrite
-add esp, 4
+	push dword esp
+	push dword 10
+	xor eax, eax
+	mov al, [mbootinfo.fb_gmasksize]
+	push dword eax
+	call __uitoa
+	add esp, 3*4
+	serw esp
 
-push stuff.gpostxt
-call serialwrite
-add esp, 4
-
-push dword esp
-push dword 10
-xor eax, eax
-mov al, [mbootinfo.fb_gpos]
-push dword eax
-call __uitoa
-add esp, 3*4
-push esp
-call serialwrite
-add esp, 4
-
-push stuff.bpostxt
-call serialwrite
-add esp, 4
-
-push dword esp
-push dword 10
-xor eax, eax
-mov al, [mbootinfo.fb_bpos]
-push dword eax
-call __uitoa
-add esp, 3*4
-push esp
-call serialwrite
-add esp, 4
-
-
-
-push stuff.rmasksizetxt
-call serialwrite
-add esp, 4
-
-push dword esp
-push dword 10
-xor eax, eax
-mov al, [mbootinfo.fb_rmasksize]
-push dword eax
-call __uitoa
-add esp, 3*4
-push esp
-call serialwrite
-add esp, 4
-
-push stuff.gmasksizetxt
-call serialwrite
-add esp, 4
-
-push dword esp
-push dword 10
-xor eax, eax
-mov al, [mbootinfo.fb_gmasksize]
-push dword eax
-call __uitoa
-add esp, 3*4
-push esp
-call serialwrite
-add esp, 4
-
-push stuff.bmasksizetxt
-call serialwrite
-add esp, 4
-
-push dword esp
-push dword 10
-xor eax, eax
-mov al, [mbootinfo.fb_bmasksize]
-push dword eax
-call __uitoa
-add esp, 3*4
-push esp
-call serialwrite
-add esp, 4
+	serw stuff.bmasksizetxt
 
+	push dword esp
+	push dword 10
+	xor eax, eax
+	mov al, [mbootinfo.fb_bmasksize]
+	push dword eax
+	call __uitoa
+	add esp, 3*4
+	serw esp
 
 	add esp, 36	;Clean reserved uitoa return string from stack
 
-	; Draw a test pixel to bottom right corner
-	push 0xff
-	push 0xff
-	push 0xff
-	push VHEIGHT-1
-	push VWIDTH-1
-	call putpixel
-	add esp, 3*4
+	; Draw a green test pixel to bottom-right
+	kputpixel VWIDTH-1, VHEIGHT-1, 0x00, 0xff, 0x00
 
+; Draw a predefined logo in magenta to top-left
 rOSkalogodraw:
 	mov esi, roskalogo
 	mov eax, 0	;Brightness
@@ -209,17 +173,12 @@ rOSkalogodraw:
 	mov ecx, 0	;x
 .loop:
 	lodsb
-	push eax		;b
-	push eax		;g
-	push eax		;r
-	push ebx		;y
-	push ecx		;x
-	call putpixel
+
+	push ecx
+	push eax
+	kputpixel ecx, ebx, eax, 0x00, eax
+	pop eax
 	pop ecx
-	pop ebx
-	pop eax
-	pop eax
-	pop eax
 
 	inc ecx
 	cmp byte cl, [roskalogo.w]
@@ -242,12 +201,6 @@ hang:
 	jmp .loop
 .msg db 10, "Halting...", 10, 0
 
-include "src/serial.asm"
-include "src/mbootinfo.asm"
-include "src/itoa.asm"
-include "src/framebuffer.asm"
-include "src/roskalogoraw.asm"
-
 stuff:
 	.bootmsg db 10, "=== rOSka ===", 10, 0
 	.fbaddrmsgpfx db 10, "Framebuffer address: 0x", 0

From c2e69b6f7f320e8457274d2d935bb4536162e6bb Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 17 Aug 2024 06:21:47 +0300
Subject: [PATCH 39/45] More and advanceder macros

---
 src/framebuffer.asm |   2 +-
 src/itoa.asm        |   8 +++
 src/serial.asm      |   2 +-
 src/start32.asm     | 123 ++++++++++----------------------------------
 4 files changed, 37 insertions(+), 98 deletions(-)

diff --git a/src/framebuffer.asm b/src/framebuffer.asm
index e7168b0..e58e16e 100644
--- a/src/framebuffer.asm
+++ b/src/framebuffer.asm
@@ -1,4 +1,4 @@
-macro kputpixel x, y, r, g, b {
+macro kputpixel x*, y*, r*, g*, b* {
 	push b		;b
 	push g		;g
 	push r		;r
diff --git a/src/itoa.asm b/src/itoa.asm
index 914b214..429f9cf 100644
--- a/src/itoa.asm
+++ b/src/itoa.asm
@@ -26,6 +26,14 @@
 ; ECX: Target address (active)
 ; EDX: Target address (temporary)
 ;
+macro kuitoa src*, dest*, base* {
+	push dest
+	push base
+	push src
+	call __uitoa
+	add esp, 3*4
+}
+
 __uitoa:
 .start:
 	push ebp
diff --git a/src/serial.asm b/src/serial.asm
index c46b511..2699f01 100644
--- a/src/serial.asm
+++ b/src/serial.asm
@@ -2,7 +2,7 @@ SERIAL_PORT equ 0x3f8
 serialinitialized db 0
 
 ; Write null terminated string in address str_pointer to serial
-macro serw str_pointer {
+macro serw [str_pointer*] {
 	push str_pointer
 	call serialwrite
 	add esp, 4
diff --git a/src/start32.asm b/src/start32.asm
index b6cb689..b72db5e 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -51,114 +51,46 @@ start:
 	call mbootgetinfo
 	add esp, 2*4
 
-	serw stuff.fbaddrmsgpfx
-
 	sub esp, 36	;Reserve stack for return
-	push dword esp	;Destination address
-	push dword 16	;Base
-	push dword [mbootinfo.fb_addr]	;source
-	call __uitoa
-	add esp, 3*4
-	serw esp
+	kuitoa [mbootinfo.fb_addr], esp, 16
+	serw stuff.fbaddrmsgpfx, esp
 
-	serw stuff.fbdimensionsmsgpfx
-	push dword esp	;destination address
-	push dword 10	;base
-	push dword [mbootinfo.fb_width]
-	call __uitoa
-	add esp, 3*4
-	serw esp
-	serw stuff.x
+	kuitoa [mbootinfo.fb_width], esp, 10
+	serw stuff.fbdimensionsmsgpfx, esp, stuff.x
 
-	push dword esp	;destination address
-	push dword 10	;base
-	push dword [mbootinfo.fb_height]
-	call __uitoa
-	add esp, 3*4
-	serw esp
-	serw stuff.x
+	kuitoa [mbootinfo.fb_height], esp, 10
+	serw esp, stuff.x
 
-	push dword esp	;destination address
-	push dword 10	;base
-	xor eax, eax
-	mov al, [mbootinfo.fb_bpp]
-	push dword eax
-	call __uitoa
-	add esp, 3*4
+	movzx eax, byte [mbootinfo.fb_bpp]
+	kuitoa eax, esp, 10
 	serw esp
 
 
-	serw stuff.rpostxt
+	movzx eax, byte [mbootinfo.fb_rpos]
+	kuitoa eax, esp, 10
+	serw stuff.rpostxt, esp
 
-	push dword esp
-	push dword 10
-	xor eax, eax
-	mov al, [mbootinfo.fb_rpos]
-	push dword eax
-	call __uitoa
-	add esp, 3*4
-	serw esp
+	movzx eax, byte [mbootinfo.fb_gpos]
+	kuitoa eax, esp, 10
+	serw stuff.gpostxt, esp
 
-	serw stuff.gpostxt
-
-	push dword esp
-	push dword 10
-	xor eax, eax
-	mov al, [mbootinfo.fb_gpos]
-	push dword eax
-	call __uitoa
-	add esp, 3*4
-	serw esp
-
-	serw stuff.bpostxt
-
-	push dword esp
-	push dword 10
-	xor eax, eax
-	mov al, [mbootinfo.fb_bpos]
-	push dword eax
-	call __uitoa
-	add esp, 3*4
-	serw esp
+	movzx eax, byte [mbootinfo.fb_bpos]
+	kuitoa eax, esp, 10
+	serw stuff.bpostxt, esp
 
 
 
-	push stuff.rmasksizetxt
-	call serialwrite
-	add esp, 4
+	movzx eax, byte [mbootinfo.fb_rmasksize]
+	kuitoa eax, esp, 10
+	serw stuff.rmasksizetxt, esp
 
-	push dword esp
-	push dword 10
-	xor eax, eax
-	mov al, [mbootinfo.fb_rmasksize]
-	push dword eax
-	call __uitoa
-	add esp, 3*4
-	serw esp
+	movzx eax, byte [mbootinfo.fb_gmasksize]
+	kuitoa eax, esp, 10
+	serw stuff.gmasksizetxt, esp
 
-	push stuff.gmasksizetxt
-	call serialwrite
-	add esp, 4
-
-	push dword esp
-	push dword 10
-	xor eax, eax
-	mov al, [mbootinfo.fb_gmasksize]
-	push dword eax
-	call __uitoa
-	add esp, 3*4
-	serw esp
-
-	serw stuff.bmasksizetxt
-
-	push dword esp
-	push dword 10
-	xor eax, eax
-	mov al, [mbootinfo.fb_bmasksize]
-	push dword eax
-	call __uitoa
-	add esp, 3*4
-	serw esp
+	movzx eax, byte [mbootinfo.fb_bmasksize]
+	kuitoa eax, esp, 10
+	serw stuff.bmasksizetxt, esp
 
 	add esp, 36	;Clean reserved uitoa return string from stack
 
@@ -193,8 +125,7 @@ jmp hang
 
 
 hang:
-	push .msg
-	call serialwrite
+	serw .msg
 	cli
 .loop:
 	hlt

From 0d9fcf5ae4bf3b1a2a1f25dc2391a13ee28d89c5 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 17 Aug 2024 19:16:53 +0300
Subject: [PATCH 40/45] BOCHS debugging stuff

---
 .gitignore  |  1 +
 Makefile    |  9 ++++-----
 bochsrc.txt | 13 +++++++++++++
 3 files changed, 18 insertions(+), 5 deletions(-)
 create mode 100644 bochsrc.txt

diff --git a/.gitignore b/.gitignore
index 770baf3..e9c4c3e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
 *.bin
 mnt/
 build/
+bx_enh_dbg.ini
diff --git a/Makefile b/Makefile
index 72c8af7..0826a2a 100644
--- a/Makefile
+++ b/Makefile
@@ -8,11 +8,10 @@ image: start32.bin mount grub-cfg roska.img mnt/roska/
 	cp start32.bin mnt/roska/
 	sync
 
-qemu-multiboot: start32.bin
-	qemu-system-i386 -kernel start32.bin -serial stdio
-qemu-image: image roska.img
+qemu-run: image roska.img
 	qemu-system-i386 roska.img -serial stdio
-
+bochs-run: image roska.img
+	bochs -qf bochsrc.txt
 mount: roska.img mnt/
 	@if ! mountpoint -q "mnt/"; then \
 		sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \
@@ -29,7 +28,7 @@ build/:
 	@mkdir build
 
 roska.img: mnt/
-	dd if=/dev/zero of=roska.img bs=16M count=1
+	dd if=/dev/zero of=roska.img bs=1k count=16128
 	echo 'type=83' | sudo sfdisk roska.img
 	sudo losetup /dev/loop0 roska.img
 	sudo losetup /dev/loop1 roska.img -o1048576
diff --git a/bochsrc.txt b/bochsrc.txt
new file mode 100644
index 0000000..f13fbe5
--- /dev/null
+++ b/bochsrc.txt
@@ -0,0 +1,13 @@
+display_library:	x, options="gui_debug"
+magic_break:	enabled=1
+romimage:	file=$BXSHARE/BIOS-bochs-legacy
+vgaromimage:	file=$BXSHARE/VGABIOS-lgpl-latest
+clock:	sync=realtime
+cpu:	ips=4294967295, reset_on_triple_fault=false
+megs:	128
+ata0:	enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
+ata0-master:	type=disk, mode=flat, path=roska.img, cylinders=32, heads=16, spt=63
+boot:	disk
+
+# Use `bximage` to get disk geometry
+# TODO: Figure out how to get sensible TTY serial

From f9e2dc33e904fa2cbaac0ab2d08a86335d99b41c Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 17 Aug 2024 20:21:04 +0300
Subject: [PATCH 41/45] Made __uitoa comply with our calling convention

Changed __uitoa order of arguments from
  src,base,target
to
  src,target,base
Also returns target in EAX
---
 src/itoa.asm    | 23 +++++++++++++----------
 src/start32.asm | 43 ++++++++++++++++++++++---------------------
 2 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/src/itoa.asm b/src/itoa.asm
index 429f9cf..3985f9d 100644
--- a/src/itoa.asm
+++ b/src/itoa.asm
@@ -1,8 +1,12 @@
 ;; Modified from: https://gist.github.com/SplittyDev/8e728627012e57ac0deac196660014fb
 
+; __itoa(src int, target addr, base)
+;target address returned in EAX
+;EBX, EBP, ESP preserved as our calling convention,
+;refer to docs or something
+
 ;
 ; Routine to convert a 32-bit integer to a string.
-; Registers are preserved.
 ;
 ; EAX: Source integer
 ; EBX: Target address
@@ -26,9 +30,13 @@
 ; ECX: Target address (active)
 ; EDX: Target address (temporary)
 ;
+; return:
+; put original target at EAX
+; (we trust this blindly)
+
 macro kuitoa src*, dest*, base* {
-	push dest
 	push base
+	push dest
 	push src
 	call __uitoa
 	add esp, 3*4
@@ -39,14 +47,11 @@ __uitoa:
 	push ebp
 	mov ebp, esp
 
-	push eax
 	push ebx
-	push ecx
-	push edx
 
 	mov eax, [ebp+8]
-	mov ecx, [ebp+12]
-	mov ebx, [ebp+16]
+	mov ebx, [ebp+12]
+	mov ecx, [ebp+16]
 
 	mov edx, ecx
 	mov ecx, ebx
@@ -83,11 +88,9 @@ __uitoa:
 	dec ecx
 	jmp .reverse
 .end:
-	pop edx
-	pop ecx
 	pop ebx
-	pop eax
 
+	mov eax, [ebp+12]	; Return target address
 	pop ebp
 	ret
 
diff --git a/src/start32.asm b/src/start32.asm
index b72db5e..a196470 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -52,45 +52,46 @@ start:
 	add esp, 2*4
 
 	sub esp, 36	;Reserve stack for return
-	kuitoa [mbootinfo.fb_addr], esp, 16
-	serw stuff.fbaddrmsgpfx, esp
+	mov ebx, esp	;Store str buff addr
 
-	kuitoa [mbootinfo.fb_width], esp, 10
-	serw stuff.fbdimensionsmsgpfx, esp, stuff.x
+	kuitoa [mbootinfo.fb_addr], ebx, 16
+	serw stuff.fbaddrmsgpfx, ebx
 
-	kuitoa [mbootinfo.fb_height], esp, 10
-	serw esp, stuff.x
+	kuitoa [mbootinfo.fb_width], ebx, 10
+	serw stuff.fbdimensionsmsgpfx, ebx, stuff.x
+
+	kuitoa [mbootinfo.fb_height], ebx, 10
+	serw ebx, stuff.x
 
 	movzx eax, byte [mbootinfo.fb_bpp]
-	kuitoa eax, esp, 10
-	serw esp
+	kuitoa eax, ebx, 10
+	serw ebx
 
 
 	movzx eax, byte [mbootinfo.fb_rpos]
-	kuitoa eax, esp, 10
-	serw stuff.rpostxt, esp
+	kuitoa eax, ebx, 10
+	serw stuff.rpostxt, ebx
 
 	movzx eax, byte [mbootinfo.fb_gpos]
-	kuitoa eax, esp, 10
-	serw stuff.gpostxt, esp
+	kuitoa eax, ebx, 10
+	serw stuff.gpostxt, ebx
 
 	movzx eax, byte [mbootinfo.fb_bpos]
-	kuitoa eax, esp, 10
-	serw stuff.bpostxt, esp
-
+	kuitoa eax, ebx, 10
+	serw stuff.bpostxt, ebx
 
 
 	movzx eax, byte [mbootinfo.fb_rmasksize]
-	kuitoa eax, esp, 10
-	serw stuff.rmasksizetxt, esp
+	kuitoa eax, ebx, 10
+	serw stuff.rmasksizetxt, ebx
 
 	movzx eax, byte [mbootinfo.fb_gmasksize]
-	kuitoa eax, esp, 10
-	serw stuff.gmasksizetxt, esp
+	kuitoa eax, ebx, 10
+	serw stuff.gmasksizetxt, ebx
 
 	movzx eax, byte [mbootinfo.fb_bmasksize]
-	kuitoa eax, esp, 10
-	serw stuff.bmasksizetxt, esp
+	kuitoa eax, ebx, 10
+	serw stuff.bmasksizetxt, ebx
 
 	add esp, 36	;Clean reserved uitoa return string from stack
 

From 091f7cb4b842c3296f3c1c590adf1067588ef30a Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 17 Aug 2024 20:25:42 +0300
Subject: [PATCH 42/45] Bochs: serial to file

---
 .gitignore  | 1 +
 Makefile    | 1 +
 bochsrc.txt | 3 ++-
 3 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index e9c4c3e..97fbd68 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@
 mnt/
 build/
 bx_enh_dbg.ini
+serial.out
diff --git a/Makefile b/Makefile
index 0826a2a..0ecd477 100644
--- a/Makefile
+++ b/Makefile
@@ -11,6 +11,7 @@ image: start32.bin mount grub-cfg roska.img mnt/roska/
 qemu-run: image roska.img
 	qemu-system-i386 roska.img -serial stdio
 bochs-run: image roska.img
+	touch serial.out
 	bochs -qf bochsrc.txt
 mount: roska.img mnt/
 	@if ! mountpoint -q "mnt/"; then \
diff --git a/bochsrc.txt b/bochsrc.txt
index f13fbe5..32dc163 100644
--- a/bochsrc.txt
+++ b/bochsrc.txt
@@ -10,4 +10,5 @@ ata0-master:	type=disk, mode=flat, path=roska.img, cylinders=32, heads=16, spt=6
 boot:	disk
 
 # Use `bximage` to get disk geometry
-# TODO: Figure out how to get sensible TTY serial
+# Serial is piped to serial.out for your `tail`ing sweetness
+com1:	enabled=1, mode=file, dev=serial.out

From 57dd60bcef105ad3354db4f366cf552cab48f6c2 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Sat, 24 Aug 2024 15:56:51 +0300
Subject: [PATCH 43/45] Started making an ASCII font

---
 src/font.asm | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)
 create mode 100644 src/font.asm

diff --git a/src/font.asm b/src/font.asm
new file mode 100644
index 0000000..e8136a4
--- /dev/null
+++ b/src/font.asm
@@ -0,0 +1,89 @@
+;;; Resolution: 8x16
+kfontbasicascii:
+	;; 0	NULL
+	db 11001100b
+	db 11001100b
+	db 00110011b
+	db 00110011b
+	db 11001100b
+	db 11001100b
+	db 00110011b
+	db 00110011b
+	db 11001100b
+	db 11001100b
+	db 00110011b
+	db 00110011b
+	db 11001100b
+	db 11001100b
+	db 00110011b
+	db 00110011b
+	;; 1-31 control characters
+	rb 30*16
+	;; 32	Space
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	;; 33	!
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00011000b
+	db 00011000b
+	db 00011000b
+	db 00011000b
+	db 00011000b
+	db 00011000b
+	db 00011000b
+	db 00011000b
+	db 00000000b
+	db 00000000b
+	db 00011000b
+	db 00011000b
+	db 00000000b
+	;; 34	"
+	db 00000000b
+	db 01100110b
+	db 01100110b
+	db 01100110b
+	db 01100110b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	;; 35	#
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 01100110b
+	db 01100110b
+	db 11111111b
+	db 11111111b
+	db 01100110b
+	db 01100110b
+	db 11111111b
+	db 11111111b
+	db 01100110b
+	db 01100110b
+	db 00000000b
+	db 00000000b
+	db 00000000b

From f344fc52539e3a5ba4ecfb95d1838b586035f77f Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 14 Jan 2025 20:27:40 +0200
Subject: [PATCH 44/45] Fonting awayy wheeeeee

---
 Makefile        |  4 +++-
 src/font.asm    | 51 ++++++++++---------------------------------------
 src/start32.asm |  4 ++++
 3 files changed, 17 insertions(+), 42 deletions(-)

diff --git a/Makefile b/Makefile
index 0ecd477..695aa47 100644
--- a/Makefile
+++ b/Makefile
@@ -2,8 +2,10 @@ all: start32.bin
 clean:
 	-@rm *.bin 2> /dev/null || true
 
-start32.bin: src/*
+start32.bin: src/* font.bin
 	fasm src/start32.asm start32.bin
+font.bin: src/font.asm
+	fasm src/font.asm font.bin
 image: start32.bin mount grub-cfg roska.img mnt/roska/
 	cp start32.bin mnt/roska/
 	sync
diff --git a/src/font.asm b/src/font.asm
index e8136a4..3df2563 100644
--- a/src/font.asm
+++ b/src/font.asm
@@ -1,24 +1,16 @@
-;;; Resolution: 8x16
-kfontbasicascii:
+	format binary
+;;; Resolution: 8x8
 	;; 0	NULL
 	db 11001100b
-	db 11001100b
-	db 00110011b
 	db 00110011b
 	db 11001100b
-	db 11001100b
-	db 00110011b
 	db 00110011b
 	db 11001100b
-	db 11001100b
-	db 00110011b
 	db 00110011b
 	db 11001100b
-	db 11001100b
-	db 00110011b
 	db 00110011b
 	;; 1-31 control characters
-	rb 30*16
+	rb 30*8
 	;; 32	Space
 	db 00000000b
 	db 00000000b
@@ -28,43 +20,19 @@ kfontbasicascii:
 	db 00000000b
 	db 00000000b
 	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
 	;; 33	!
 	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00011000b
-	db 00011000b
-	db 00011000b
-	db 00011000b
 	db 00011000b
 	db 00011000b
 	db 00011000b
 	db 00011000b
 	db 00000000b
-	db 00000000b
 	db 00011000b
 	db 00011000b
-	db 00000000b
 	;; 34	"
 	db 00000000b
 	db 01100110b
 	db 01100110b
-	db 01100110b
-	db 01100110b
-	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
-	db 00000000b
 	db 00000000b
 	db 00000000b
 	db 00000000b
@@ -73,17 +41,18 @@ kfontbasicascii:
 	;; 35	#
 	db 00000000b
 	db 00000000b
-	db 00000000b
-	db 01100110b
 	db 01100110b
 	db 11111111b
-	db 11111111b
-	db 01100110b
 	db 01100110b
 	db 11111111b
-	db 11111111b
-	db 01100110b
 	db 01100110b
 	db 00000000b
+	;; 36	$
 	db 00000000b
+	db 00001000b
+	db 01111110b
+	db 01010000b
+	db 01111110b
+	db 00010010b
+	db 01111110b
 	db 00000000b
diff --git a/src/start32.asm b/src/start32.asm
index a196470..e36b4f7 100644
--- a/src/start32.asm
+++ b/src/start32.asm
@@ -36,6 +36,10 @@ include "src/itoa.asm"
 include "src/framebuffer.asm"
 include "src/roskalogoraw.asm"
 
+align 4096
+font FILE "font.bin"
+align 4096
+
 start:
 	; Setup stack
 	mov ebp, stack_top

From 85da5bf55277fa1db088c1fe23335cf69064b553 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Fri, 17 Jan 2025 01:39:11 +0200
Subject: [PATCH 45/45] 8x8 >> 8x12 to make font more spacious

---
 src/font.asm | 46 +++++++++++++++++++++++++++++++++++-----------
 1 file changed, 35 insertions(+), 11 deletions(-)

diff --git a/src/font.asm b/src/font.asm
index 3df2563..42d3fd4 100644
--- a/src/font.asm
+++ b/src/font.asm
@@ -1,5 +1,5 @@
 	format binary
-;;; Resolution: 8x8
+;;; Resolution: 8x12
 	;; 0	NULL
 	db 11001100b
 	db 00110011b
@@ -9,8 +9,12 @@
 	db 00110011b
 	db 11001100b
 	db 00110011b
+	db 11001100b
+	db 00110011b
+	db 11001100b
+	db 00110011b
 	;; 1-31 control characters
-	rb 30*8
+	rb 30*12
 	;; 32	Space
 	db 00000000b
 	db 00000000b
@@ -20,19 +24,31 @@
 	db 00000000b
 	db 00000000b
 	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
+	db 00000000b
 	;; 33	!
 	db 00000000b
 	db 00011000b
 	db 00011000b
 	db 00011000b
 	db 00011000b
+	db 00011000b
+	db 00011000b
+	db 00011000b
 	db 00000000b
 	db 00011000b
 	db 00011000b
+	db 00000000b
 	;; 34	"
 	db 00000000b
 	db 01100110b
 	db 01100110b
+	db 01100110b
+	db 00000000b
+	db 00000000b
+	db 00000000b
 	db 00000000b
 	db 00000000b
 	db 00000000b
@@ -40,19 +56,27 @@
 	db 00000000b
 	;; 35	#
 	db 00000000b
-	db 00000000b
-	db 01100110b
-	db 11111111b
-	db 01100110b
-	db 11111111b
-	db 01100110b
+	db 01101100b
+	db 01101100b
+	db 11111110b
+	db 01101100b
+	db 01101100b
+	db 01101100b
+	db 01101100b
+	db 11111110b
+	db 01101100b
+	db 01101100b
 	db 00000000b
 	;; 36	$
 	db 00000000b
-	db 00001000b
+	db 00011000b
 	db 01111110b
-	db 01010000b
+	db 01011000b
 	db 01111110b
-	db 00010010b
+	db 01011000b
+	db 01111110b
+	db 00011010b
+	db 00011010b
+	db 00011010b
 	db 01111110b
 	db 00000000b