From e2572d50afb32735c59a7a098786037c987287f5 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Mon, 24 Jul 2023 04:20:54 +0300 Subject: [PATCH 01/31] 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<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) { - 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 Date: Mon, 24 Jul 2023 05:17:57 +0300 Subject: [PATCH 02/31] 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 Date: Mon, 24 Jul 2023 17:08:48 +0300 Subject: [PATCH 03/31] 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 Date: Mon, 24 Jul 2023 21:48:21 +0300 Subject: [PATCH 04/31] 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 Date: Tue, 25 Jul 2023 01:02:13 +0300 Subject: [PATCH 05/31] 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 Date: Tue, 25 Jul 2023 05:45:32 +0300 Subject: [PATCH 06/31] 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 Date: Tue, 1 Aug 2023 21:05:36 +0300 Subject: [PATCH 07/31] 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 Date: Tue, 1 Aug 2023 21:23:14 +0300 Subject: [PATCH 08/31] 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 Date: Wed, 2 Aug 2023 13:49:16 +0300 Subject: [PATCH 09/31] 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 Date: Wed, 2 Aug 2023 14:19:46 +0300 Subject: [PATCH 10/31] 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 Date: Wed, 2 Aug 2023 20:16:43 +0300 Subject: [PATCH 11/31] 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 Date: Wed, 6 Sep 2023 19:58:40 +0300 Subject: [PATCH 12/31] 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 Date: Wed, 6 Sep 2023 20:28:25 +0300 Subject: [PATCH 13/31] 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 Date: Thu, 7 Sep 2023 21:32:00 +0300 Subject: [PATCH 14/31] 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 Date: Fri, 8 Sep 2023 12:02:02 +0300 Subject: [PATCH 15/31] 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 Date: Fri, 8 Sep 2023 12:03:52 +0300 Subject: [PATCH 16/31] 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 Date: Fri, 8 Sep 2023 12:06:58 +0300 Subject: [PATCH 17/31] 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 e4172c14bb9982895adabc0ea6ac6e832dd3f4d9 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Thu, 21 Sep 2023 21:06:37 +0300 Subject: [PATCH 18/31] 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 a0ba839215c2af7805e8419ba7680fc25fe7846c Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sat, 13 Jan 2024 02:36:35 +0200 Subject: [PATCH 19/31] 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 Date: Sat, 13 Jan 2024 03:28:43 +0200 Subject: [PATCH 20/31] 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 Date: Fri, 26 Jan 2024 18:23:51 +0200 Subject: [PATCH 21/31] 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 Date: Fri, 26 Jan 2024 18:29:07 +0200 Subject: [PATCH 22/31] 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 Date: Fri, 16 Aug 2024 18:22:30 +0300 Subject: [PATCH 23/31] 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 Date: Sat, 17 Aug 2024 00:37:07 +0300 Subject: [PATCH 24/31] 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 Date: Sat, 17 Aug 2024 06:21:47 +0300 Subject: [PATCH 25/31] 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 Date: Sat, 17 Aug 2024 19:16:53 +0300 Subject: [PATCH 26/31] 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 Date: Sat, 17 Aug 2024 20:21:04 +0300 Subject: [PATCH 27/31] 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 Date: Sat, 17 Aug 2024 20:25:42 +0300 Subject: [PATCH 28/31] 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 Date: Sat, 24 Aug 2024 15:56:51 +0300 Subject: [PATCH 29/31] 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 Date: Tue, 14 Jan 2025 20:27:40 +0200 Subject: [PATCH 30/31] 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 Date: Fri, 17 Jan 2025 01:39:11 +0200 Subject: [PATCH 31/31] 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