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