From 12e7efb8b53d38a00c76c6396dd3ce8c036ae086 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Tue, 19 Sep 2023 19:51:51 +0300 Subject: [PATCH 01/14] TCC-anothertry begins --- Makefile | 16 +++++++--------- README.md | 7 ++++--- src/kernel.c | 7 ++++--- src/serial.c | 45 +++++++++++++++++++++++---------------------- src/start32.asm | 47 ----------------------------------------------- src/start32.s | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 87 insertions(+), 84 deletions(-) delete mode 100644 src/start32.asm create mode 100644 src/start32.s diff --git a/Makefile b/Makefile index 098565f..28c65a3 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,21 @@ all: build/kernel-i386.elf clean: - -@rm build/*.o build/*.elf 2> /dev/null || true + -@rm build/* 2> /dev/null || true -build/start32.o: build/ src/start32.asm - nasm -felf32 src/start32.asm -o build/start32.o -build/kernel-i386.elf: build/start32.o - tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/*.c build/start32.o +build/kernel-i386.elf: src/* + tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/start32.s src/*.c image: build/kernel-i386.elf mount - cp build/kernel-i386.elf mnt/ + cp build/kernel-i386.elf mnt/roska/start32.elf sync qemu-multiboot: build/kernel-i386.elf qemu-system-i386 -kernel build/kernel-i386.elf -serial stdio qemu-image: image - qemu-system-i386 koalemos.img -serial stdio + qemu-system-i386 roska.img -serial stdio -mount: koalemos.img mnt/ +mount: roska.img mnt/ @if ! mountpoint -q "mnt/"; then \ - sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) koalemos.img mnt/; \ + sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \ fi; umount: @sudo umount mnt diff --git a/README.md b/README.md index b6df57b..95b53e8 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ -# KoalemOS +# rOSka Multiboot compatible stupid useless OS-like project. ## Compatibility -32bit x86 legacy BIOS system +- x86 system with MultiBoot compatible bootloader. +- Linear framebuffer graphics ## Building -NASM and TinyCCompiler are used. +TinyCCompiler is used, even for assembly lol. TCC might need manual compilation for 32bit crosscompilation on 64bit systems. Just download the source and `make cross` or something. diff --git a/src/kernel.c b/src/kernel.c index 60d6c3a..223d37f 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1,3 +1,4 @@ + #include "multiboot.h" #include "framebuffer.h" #include "serial.h" @@ -19,7 +20,7 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) { outb(0x3D5, 0x20); int serial_initialized = serial_init(); - serial_write_string("\n=== KoalemOS ===\n"); + serial_write_string("\n=== rOSka ===\n"); // Check multiboot header if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) { @@ -73,11 +74,11 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) { for(;;) { for(y=0; y < mbootinfo->framebuffer_height; y++) { for(x=0; x < mbootinfo->framebuffer_width; x++) { - putpixel(x, y, c, c, c, 0xff); + putpixel(x, y, 0, c, c, 0xff); } } c+=4; } - serial_write_string("\nExecution finished, halting..."); + serial_write_string("\nExecution finished, halting...\n"); } diff --git a/src/serial.c b/src/serial.c index a9747cf..e4e8e27 100644 --- a/src/serial.c +++ b/src/serial.c @@ -20,30 +20,31 @@ int serial_init() { outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial - // returns same byte) + // returns same byte) - // Check if serial is faulty (i.e: not same byte as sent) - if (inb(PORT + 0) != 0xAE) { - return 1; - } - - // If serial is not faulty set it in normal operation mode - // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) - outb(PORT + 4, 0x0F); - return 0; + // Check if serial is faulty (i.e: not same byte as sent) + if (inb(PORT + 0) != 0xAE) { + return 1; } - static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; } - static void serial_write_char(char chr) { - while (serial_is_transmit_empty() == 0); - outb(PORT, chr); - } - - void serial_write_string(const char* text) { - int i = 0; - while(text[i]) { - serial_write_char(text[i]); - i++; - } + // If serial is not faulty set it in normal operation mode + // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) + outb(PORT + 4, 0x0F); + return 0; +} +static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; } + +static void serial_write_char(char chr) { + while (serial_is_transmit_empty() == 0); + outb(PORT, chr); +} + +void serial_write_string(const char* text) { + int i = 0; + while(text[i]) { + serial_write_char(text[i]); + i++; } + +} diff --git a/src/start32.asm b/src/start32.asm deleted file mode 100644 index d4e7471..0000000 --- a/src/start32.asm +++ /dev/null @@ -1,47 +0,0 @@ -MULTIBOOT_HEADER_MAGIC equ 0x1BADB002 -MULTIBOOT_PAGE_ALIGN equ 1 << 0 -MULTIBOOT_MEMORY_INFO equ 1 << 1 -MULTIBOOT_VIDEO_REQUEST equ 0 << 2 -MULTIBOOT_AOUT_KLUDGE equ 0 << 16 -MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST -MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST | MULTIBOOT_AOUT_KLUDGE -MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) - -section .multiboot -align 4 - dd MULTIBOOT_HEADER_MAGIC - dd MULTIBOOT_HEADER_FLAGS - dd MULTIBOOT_CHECKSUM - dd 0 ; header address - dd 0 ; load address - dd 0 ; load end address - dd 0 ; bss end address - dd 0 ; entry address - dd 0 ; video mode_type (0:fb, 1:txt) (set flags[2]!) - dd 1024 ; video width - dd 768 ; video height - dd 32 ; video depth - -section .bss -align 16 - stack_bottom: - resb 16384 - stack_top: - -section .text - global _start - extern kmain - -_start: - ; Setup stack - mov esp, stack_top - - ; Call the main kernel function. - push ebx - push eax - call kmain - -.hang: - cli - hlt - jmp .hang diff --git a/src/start32.s b/src/start32.s new file mode 100644 index 0000000..da0207a --- /dev/null +++ b/src/start32.s @@ -0,0 +1,49 @@ +.set MULTIBOOT_PAGE_ALIGN, 1 << 0 +.set MULTIBOOT_MEMORY_INFO, 1 << 1 +.set MULTIBOOT_VIDEO_REQUEST, 1 << 2 +.set MULTIBOOT_AOUT_KLUDGE, 0 << 16 +.set MULTIBOOT_HEADER_MAGIC, 0x1BADB002 +.set MULTIBOOT_HEADER_FLAGS, \ + MULTIBOOT_PAGE_ALIGN |\ + MULTIBOOT_MEMORY_INFO |\ + MULTIBOOT_VIDEO_REQUEST |\ + MULTIBOOT_AOUT_KLUDGE +.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) + +#.section ".multiboottbabeee" +.align 4 + .long MULTIBOOT_HEADER_MAGIC + .long MULTIBOOT_HEADER_FLAGS + .long MULTIBOOT_CHECKSUM + .long 0 # header address + .long 0 # load address + .long 0 # load end address + .long 0 # bss end address + .long 0 # entry address + .long 0 # video mode_type (0:fb, 1:txt) (set flags[2]!) + .long 1024 # video width + .long 768 # video height + .long 32 # video depth + +.bss +.align 16 + stack_bottom: + .skip 16384 # 16k + stack_top: + +.text +.global _start +_start: + # Setup stack + mov $stack_top, %esp + + # Call the main kernel function. + push %ebx + push %eax + call kmain + + + cli +1: hlt + jmp 1b +#include "lol.s" From 2a8169e8fa2b8c5935c8836a523e2913fad55e74 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Tue, 19 Sep 2023 19:56:31 +0300 Subject: [PATCH 02/14] Tiny makefile touchup to autocreate build directory --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 28c65a3..9617a39 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all: build/kernel-i386.elf clean: -@rm build/* 2> /dev/null || true -build/kernel-i386.elf: src/* +build/kernel-i386.elf: src/* build/ tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/start32.s src/*.c image: build/kernel-i386.elf mount cp build/kernel-i386.elf mnt/roska/start32.elf From 5ee43c6e9f22cc22257686f176fe91f85a174d5e Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Thu, 21 Sep 2023 20:01:24 +0300 Subject: [PATCH 03/14] Made the framebuffer support both 24 and 32 bpp --- src/framebuffer.c | 9 ++++++++- src/kernel.c | 20 ++++++++++++++++---- src/start32.s | 5 ++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/framebuffer.c b/src/framebuffer.c index 29f6b9d..5fc0f6c 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -20,5 +20,12 @@ void initfb(unsigned long addr, unsigned short w, unsigned short h, unsigned cha void putpixel(unsigned short x, unsigned short y, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { if (x>fb_width || y> fb_height) return; - *((unsigned long *)(fb_address + y*fb_pitch + x*fb_bytespp)) = r<framebuffer_height; y++) { - for(x=0; x < mbootinfo->framebuffer_width; x++) { - putpixel(x, y, 0, c, c, 0xff); + //serial_write_string("\n"); + for (;c<255;c+=5) { + //serial_write_string("/"); + for(y=0; y < mbootinfo->framebuffer_height; y++) { + for(x=0; x < mbootinfo->framebuffer_width; x++) { + putpixel(x, y, 0, c, c, 0xff); + } + } + } + //serial_write_string("\n"); + for (;c>0;c-=5) { + //serial_write_string("\\"); + for(y=mbootinfo->framebuffer_height; y>=0; y--) { + for(x=mbootinfo->framebuffer_width; x>=0; x--) { + putpixel(x, y, 0, c, c, 0xff); + } } } - c+=4; } serial_write_string("\nExecution finished, halting...\n"); diff --git a/src/start32.s b/src/start32.s index da0207a..32e185d 100644 --- a/src/start32.s +++ b/src/start32.s @@ -21,8 +21,8 @@ .long 0 # bss end address .long 0 # entry address .long 0 # video mode_type (0:fb, 1:txt) (set flags[2]!) - .long 1024 # video width - .long 768 # video height + .long 640 # video width + .long 480 # video height .long 32 # video depth .bss @@ -46,4 +46,3 @@ _start: cli 1: hlt jmp 1b -#include "lol.s" From 5e7356f58e28193b5f791a8922abd4e81cf33ab3 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Fri, 22 Sep 2023 17:42:46 +0300 Subject: [PATCH 04/14] VGA driver deprecated --- src/vga.c | 97 ------------------------------------------------------- src/vga.h | 24 -------------- 2 files changed, 121 deletions(-) delete mode 100644 src/vga.c delete mode 100644 src/vga.h diff --git a/src/vga.c b/src/vga.c deleted file mode 100644 index bac204d..0000000 --- a/src/vga.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "vga.h" -#define VGA_WIDTH 80 -#define VGA_HEIGHT 25 -#define VGA_MEM_ADDR 0xb8000 -#define CURSOR_HOME (VGA_HEIGHT-1)*VGA_WIDTH -#define CURSOR_CHR 177; - -unsigned int cursor_loc = CURSOR_HOME; -unsigned char fgcolor; -unsigned char bgcolor; -unsigned short blank; - -static unsigned char vga_entry_color(enum vga_color fg, enum vga_color bg) { - return fg | bg << 4; -} -unsigned short vga_blank_entry() { - return vga_entry_color(fgcolor, bgcolor) << 8; -} -void draw_cursor(void) { - *((unsigned char *)VGA_MEM_ADDR + cursor_loc * 2) = CURSOR_CHR; - *((unsigned char *)VGA_MEM_ADDR+1 + cursor_loc * 2) = vga_entry_color(fgcolor, bgcolor); -} - -void vga_set_color(enum vga_color fg, enum vga_color bg) { - fgcolor = fg; - bgcolor = bg; -} -void vga_init(enum vga_color fg, enum vga_color bg) { - vga_set_color(fg, bg); - blank = vga_blank_entry(); - cls(); -} -void cls(void) { - int i; - for (i=0; i= VGA_HEIGHT*VGA_WIDTH) { - scroll(); - } - draw_cursor(); -} - -void vga_write(const char* text) { - int i = 0; - while(text[i]) { - putchar(text[i]); - i++; - } -} -void vga_write_color( const char* text, enum vga_color fg, enum vga_color bg) { - unsigned char prevfg = fgcolor; - unsigned char prevbg = bgcolor; - vga_set_color(fg, bg); - vga_write(text); - fgcolor = prevfg; - bgcolor = prevbg; -} -void vga_write_line(const char* text) { - if (cursor_loc != CURSOR_HOME) { - scroll(); - } - vga_write(text); - scroll(); -} -void vga_write_line_color(const char* text, enum vga_color fg, enum vga_color bg) { - unsigned char prevfg = fgcolor; - unsigned char prevbg = bgcolor; - vga_set_color(fg, bg); - vga_write_line(text); - fgcolor = prevfg; - bgcolor = prevbg; -} diff --git a/src/vga.h b/src/vga.h deleted file mode 100644 index b2aa979..0000000 --- a/src/vga.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef HEADER_VGA -#define HEADER_VGA - -enum vga_color { - VGA_COLOR_BLACK = 0, - VGA_COLOR_BLUE = 1, - VGA_COLOR_GREEN = 2, - VGA_COLOR_CYAN = 3, - VGA_COLOR_RED = 4, - VGA_COLOR_MAGENTA = 5, - VGA_COLOR_ORANGE = 6, - VGA_COLOR_GREY = 7, - VGA_COLOR_GRAY = 7, -}; - -void cls(void); -void vga_init(enum vga_color fg, enum vga_color bg); - -void vga_write(const char* text); -void vga_write_color( const char* text, enum vga_color fg, enum vga_color bg); -void vga_write_line(const char* text); -void vga_write_line_color( const char* text, enum vga_color fg, enum vga_color bg); - -#endif From d474de82282fd6840ef5e54b801d7400e6c4ceb9 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Fri, 22 Sep 2023 18:17:00 +0300 Subject: [PATCH 05/14] Trying to somewhat move to 80char line limit and tabs as spaces --- .gitignore | 1 + src/framebuffer.c | 57 ++++++++++------ src/framebuffer.h | 20 +++++- src/kernel.c | 159 +++++++++++++++++++++++---------------------- src/serial.c | 80 ++++++++++++----------- src/start32.s | 68 +++++++++---------- src/xtoa.c | 162 ++++++++++++++++++++++++---------------------- src/xtoa.h | 8 +-- 8 files changed, 303 insertions(+), 252 deletions(-) diff --git a/.gitignore b/.gitignore index bc70311..770baf3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.elf *.o *.img +*.bin mnt/ build/ diff --git a/src/framebuffer.c b/src/framebuffer.c index 5fc0f6c..0040fe0 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -6,26 +6,43 @@ static unsigned short fb_width, fb_height; static unsigned char fb_bpp, fb_bytespp; static unsigned char fb_rpos, fb_bpos, fb_gpos; -void initfb(unsigned long addr, unsigned short w, unsigned short h, unsigned char bpp, unsigned long pitch, unsigned char rpos, unsigned char gpos, unsigned char bpos) { - fb_address = addr; - fb_pitch = pitch; - fb_width = w; - fb_height = h; - fb_bpp = bpp; - fb_bytespp = bpp/8; - fb_rpos = rpos; - fb_gpos = gpos; - fb_bpos = bpos; +void initfb( + unsigned long addr, + unsigned short w, + unsigned short h, + unsigned char bpp, + unsigned long pitch, + unsigned char rpos, + unsigned char gpos, + unsigned char bpos +){ + fb_address = addr; + fb_pitch = pitch; + fb_width = w; + fb_height = h; + fb_bpp = bpp; + fb_bytespp = bpp/8; + fb_rpos = rpos; + fb_gpos = gpos; + fb_bpos = bpos; } -void putpixel(unsigned short x, unsigned short y, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { - if (x>fb_width || y> fb_height) return; - - if (fb_bpp == 32) { - *((unsigned long *)(fb_address + y*fb_pitch + x*fb_bytespp)) = r< fb_width || y > fb_height) + return; + unsigned long dest_addr = fb_address + y*fb_pitch + x*fb_bytespp; + if (fb_bpp == 32) { + *((unsigned long *)(dest_addr)) = r<flags, 2)); - serial_write_string("\nMultiboot flags: "); - serial_write_string(itoa(mbootinfo->flags, 2)); + // Check videomode + if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) { + serial_write_string("\nVBE Mode: 0x"); + serial_write_string(itoa(mbootinfo->vbe_mode, 16)); + } - // Check videomode - if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) { - serial_write_string("\nVBE Mode: 0x"); - serial_write_string(itoa(mbootinfo->vbe_mode, 16)); - } + if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) { + serial_write_string("\nVideo info not available"); + return; + } - if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) { - serial_write_string("\nVideo info not available"); - return; - } + serial_write_string("\nFramebuffer: "); + serial_write_string("\n Address: 0x"); + serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16)); - serial_write_string("\nFramebuffer: "); - serial_write_string("\n Address: 0x"); - serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16)); + serial_write_string("\n Dimensions: "); + serial_write_string(itoa(mbootinfo->framebuffer_width, 10)); + serial_write_string("X"); + serial_write_string(itoa(mbootinfo->framebuffer_height, 10)); + serial_write_string("x"); + serial_write_string(itoa(mbootinfo->framebuffer_bpp, 10)); + serial_write_string("\n Pitch: "); + serial_write_string(itoa(mbootinfo->framebuffer_pitch, 10)); + serial_write_string("\n RPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_red_field_position, 10)); + serial_write_string("\n GPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_green_field_position, 10)); + serial_write_string("\n BPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_blue_field_position, 10)); - serial_write_string("\n Dimensions: "); - serial_write_string(itoa(mbootinfo->framebuffer_width, 10)); - serial_write_string("X"); - serial_write_string(itoa(mbootinfo->framebuffer_height, 10)); - serial_write_string("x"); - serial_write_string(itoa(mbootinfo->framebuffer_bpp, 10)); - serial_write_string("\n Pitch: "); - serial_write_string(itoa(mbootinfo->framebuffer_pitch, 10)); - serial_write_string("\n RPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_red_field_position, 10)); - serial_write_string("\n GPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_green_field_position, 10)); - serial_write_string("\n BPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_blue_field_position, 10)); + serial_write_string("\nMemory: "); + serial_write_string("\n lower: "); + serial_write_string(uitoa(mbootinfo->mem_lower, 10)); + serial_write_string(" k"); + serial_write_string("\n upper: "); + serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10)); + serial_write_string(" M"); - serial_write_string("\nMemory: "); - serial_write_string("\n lower: "); - serial_write_string(uitoa(mbootinfo->mem_lower, 10)); - serial_write_string(" k"); - serial_write_string("\n upper: "); - serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10)); - serial_write_string(" M"); + initfb( + mbootinfo->framebuffer_addr, + mbootinfo->framebuffer_width, + mbootinfo->framebuffer_height, + mbootinfo->framebuffer_bpp, + mbootinfo->framebuffer_pitch, + mbootinfo->framebuffer_red_field_position, + mbootinfo->framebuffer_green_field_position, + mbootinfo->framebuffer_blue_field_position + ); + int x, y, i; + unsigned char c = 0; + for (;;) { + for (;c<255;c+=5) { + for(y=0; y < mbootinfo->framebuffer_height; y++) { + for(x=0; x < mbootinfo->framebuffer_width; x++) { + putpixel(x, y, 0, c, c, 0xff); + } + } + } + for (;c>0;c-=5) { + for(y=mbootinfo->framebuffer_height; y>=0; y--) { + for(x=mbootinfo->framebuffer_width; x>=0; x--) { + putpixel(x, y, 0, c, c, 0xff); + } + } + } + } - initfb(mbootinfo->framebuffer_addr, mbootinfo->framebuffer_width, mbootinfo->framebuffer_height, mbootinfo->framebuffer_bpp, mbootinfo->framebuffer_pitch, mbootinfo->framebuffer_red_field_position, mbootinfo->framebuffer_green_field_position, mbootinfo->framebuffer_blue_field_position); - int x, y, i; - unsigned char c = 0; - for(;;) { - //serial_write_string("\n"); - for (;c<255;c+=5) { - //serial_write_string("/"); - for(y=0; y < mbootinfo->framebuffer_height; y++) { - for(x=0; x < mbootinfo->framebuffer_width; x++) { - putpixel(x, y, 0, c, c, 0xff); - } - } - } - //serial_write_string("\n"); - for (;c>0;c-=5) { - //serial_write_string("\\"); - for(y=mbootinfo->framebuffer_height; y>=0; y--) { - for(x=mbootinfo->framebuffer_width; x>=0; x--) { - putpixel(x, y, 0, c, c, 0xff); - } - } - } - } - - serial_write_string("\nExecution finished, halting...\n"); + serial_write_string("\nExecution finished, halting...\n"); } diff --git a/src/serial.c b/src/serial.c index e4e8e27..d19762d 100644 --- a/src/serial.c +++ b/src/serial.c @@ -1,50 +1,56 @@ #include "serial.h" #define PORT 0x3f8 // COM1 -static inline void outb(unsigned short port, unsigned char val) { - asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port) : "memory"); +static inline void outb(unsigned short port, unsigned char val) +{ + asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory"); } -static inline unsigned char inb(unsigned short port) { - unsigned char ret; - asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory"); - return ret; +static inline unsigned char inb(unsigned short port) +{ + unsigned char ret; + asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory"); + return ret; } -int serial_init() { - outb(PORT + 1, 0x00); // Disable all interrupts - outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) - outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud - outb(PORT + 1, 0x00); // (hi byte) - outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit - outb(PORT + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold - outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set - outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip - outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial - // returns same byte) +int serial_init() +{ + outb(PORT + 1, 0x00); // Disable all interrupts + outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) + outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud + outb(PORT + 1, 0x00); // (hi byte) + outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit + outb(PORT + 2, 0xC7); // Enable FIFO, clear them, 14-byte threshold + outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set + outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip + outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check + // if serial returns same byte) - // Check if serial is faulty (i.e: not same byte as sent) - if (inb(PORT + 0) != 0xAE) { - return 1; - } + // Check if serial is faulty (i.e: not same byte as sent) + if (inb(PORT + 0) != 0xAE) + return 1; - // If serial is not faulty set it in normal operation mode - // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) - outb(PORT + 4, 0x0F); - return 0; + // If serial is not faulty set it in normal operation mode + // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) + outb(PORT + 4, 0x0F); + return 0; } -static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; } - -static void serial_write_char(char chr) { - while (serial_is_transmit_empty() == 0); - outb(PORT, chr); +static int serial_is_transmit_empty() +{ + return inb(PORT + 5) & 0x20; } -void serial_write_string(const char* text) { - int i = 0; - while(text[i]) { - serial_write_char(text[i]); - i++; - } - +static void serial_write_char(char chr) +{ + while (serial_is_transmit_empty() == 0); + outb(PORT, chr); +} + +void serial_write_string(const char* text) +{ + int i = 0; + while (text[i]) { + serial_write_char(text[i]); + i++; + } } diff --git a/src/start32.s b/src/start32.s index 32e185d..f03794a 100644 --- a/src/start32.s +++ b/src/start32.s @@ -1,48 +1,48 @@ -.set MULTIBOOT_PAGE_ALIGN, 1 << 0 -.set MULTIBOOT_MEMORY_INFO, 1 << 1 -.set MULTIBOOT_VIDEO_REQUEST, 1 << 2 -.set MULTIBOOT_AOUT_KLUDGE, 0 << 16 -.set MULTIBOOT_HEADER_MAGIC, 0x1BADB002 +.set MULTIBOOT_PAGE_ALIGN, 1 << 0 +.set MULTIBOOT_MEMORY_INFO, 1 << 1 +.set MULTIBOOT_VIDEO_REQUEST, 1 << 2 +.set MULTIBOOT_AOUT_KLUDGE, 0 << 16 +.set MULTIBOOT_HEADER_MAGIC, 0x1BADB002 .set MULTIBOOT_HEADER_FLAGS, \ - MULTIBOOT_PAGE_ALIGN |\ - MULTIBOOT_MEMORY_INFO |\ - MULTIBOOT_VIDEO_REQUEST |\ - MULTIBOOT_AOUT_KLUDGE -.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) + MULTIBOOT_PAGE_ALIGN \ + | MULTIBOOT_MEMORY_INFO \ + | MULTIBOOT_VIDEO_REQUEST \ + | MULTIBOOT_AOUT_KLUDGE +.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) #.section ".multiboottbabeee" .align 4 - .long MULTIBOOT_HEADER_MAGIC - .long MULTIBOOT_HEADER_FLAGS - .long MULTIBOOT_CHECKSUM - .long 0 # header address - .long 0 # load address - .long 0 # load end address - .long 0 # bss end address - .long 0 # entry address - .long 0 # video mode_type (0:fb, 1:txt) (set flags[2]!) - .long 640 # video width - .long 480 # video height - .long 32 # video depth + .long MULTIBOOT_HEADER_MAGIC + .long MULTIBOOT_HEADER_FLAGS + .long MULTIBOOT_CHECKSUM + .long 0 # header address + .long 0 # load address + .long 0 # load end address + .long 0 # bss end address + .long 0 # entry address + .long 0 # video mode_type (0:fb, 1:txt) (set flags[2]!) + .long 1024 # video width + .long 768 # video height + .long 32 # video depth .bss .align 16 - stack_bottom: - .skip 16384 # 16k - stack_top: + stack_bottom: + .skip 16384 # 16k + stack_top: .text .global _start _start: - # Setup stack - mov $stack_top, %esp + # Setup stack + mov $stack_top, %esp - # Call the main kernel function. - push %ebx - push %eax - call kmain + # Call the main kernel function. + push %ebx + push %eax + call kmain - cli -1: hlt - jmp 1b + cli +1: hlt + jmp 1b diff --git a/src/xtoa.c b/src/xtoa.c index 68c9520..2a7b9a5 100644 --- a/src/xtoa.c +++ b/src/xtoa.c @@ -1,100 +1,104 @@ #include "xtoa.h" -char* itoa(int value, int base) { - char* result; +char* itoa(int value, int base) +{ + char* result; - // check that the base if valid - if (base < 2 || base > 36) { *result = '\0'; return result; } + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; - do { - tmp_value = value; - value /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - } while ( value ); - - // Apply negative sign - if (tmp_value < 0) *ptr++ = '-'; - *ptr-- = '\0'; - while(ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; - } - return result; + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); + + // Apply negative sign + if (tmp_value < 0) *ptr++ = '-'; + *ptr-- = '\0'; + while (ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; } -char* uitoa(unsigned int value, int base) { - char* result; - // check that the base if valid - if (base < 2 || base > 36) { *result = '\0'; return result; } +char* uitoa(unsigned int value, int base) +{ + char* result; - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } - do { - tmp_value = value; - value /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - } while ( value ); + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); - *ptr-- = '\0'; - while(ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; - } - return result; + *ptr-- = '\0'; + while (ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; } -char* ltoa(long value, int base) { - char* result; - // check that the base if valid - if (base < 2 || base > 36) { *result = '\0'; return result; } +char* ltoa(long value, int base) +{ + char* result; - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } - do { - tmp_value = value; - value /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - } while ( value ); + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; - // Apply negative sign - if (tmp_value < 0) *ptr++ = '-'; - *ptr-- = '\0'; - while(ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; - } - return result; + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); + + // Apply negative sign + if (tmp_value < 0) *ptr++ = '-'; + *ptr-- = '\0'; + while (ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; } -char* ultoa(unsigned long value, int base) { - char* result; - // check that the base if valid - if (base < 2 || base > 36) { *result = '\0'; return result; } +char* ultoa(unsigned long value, int base) +{ + char* result; - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } - do { - tmp_value = value; - value /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - } while ( value ); + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; - // Apply negative sign - //if (tmp_value < 0) *ptr++ = '-'; - *ptr-- = '\0'; - while(ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; - } - return result; + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); + + *ptr-- = '\0'; + while (ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; } diff --git a/src/xtoa.h b/src/xtoa.h index 710c774..9ac39ee 100644 --- a/src/xtoa.h +++ b/src/xtoa.h @@ -1,9 +1,9 @@ #ifndef HEADER_XTOA #define HEADER_XTOA -char* itoa(int value, int base); -char* uitoa(unsigned int value, int base); -char* ltoa(long value, int base); -char* ultoa(unsigned long value, int base); +char *itoa(int value, int base); +char *uitoa(unsigned int value, int base); +char *ltoa(long value, int base); +char *ultoa(unsigned long value, int base); #endif From 2b716fcc4cc7b367c269eed5997d4b343fcaf776 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Fri, 22 Sep 2023 22:59:02 +0300 Subject: [PATCH 06/14] Working putchar wheeww --- src/font8x8_basic.h | 152 ++++++++++++++++++++++++++++++++++++++++++++ src/framebuffer.c | 34 +++++++++- src/framebuffer.h | 12 +++- src/kernel.c | 43 +++++++------ 4 files changed, 218 insertions(+), 23 deletions(-) create mode 100644 src/font8x8_basic.h diff --git a/src/font8x8_basic.h b/src/font8x8_basic.h new file mode 100644 index 0000000..1452873 --- /dev/null +++ b/src/font8x8_basic.h @@ -0,0 +1,152 @@ +/** + * 8x8 monochrome bitmap fonts for rendering + * Author: Daniel Hepper + * + * License: Public Domain + * + * Based on: + * // Summary: font8x8.h + * // 8x8 monochrome bitmap fonts for rendering + * // + * // Author: + * // Marcel Sondaar + * // International Business Machines (public domain VGA fonts) + * // + * // License: + * // Public Domain + * + * Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm + **/ + +// Constant: font8x8_basic +// Contains an 8x8 font map for unicode points U+0000 - U+007F (basic latin) +char font8x8_basic[128][8] = { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space) + { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!) + { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (") + { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#) + { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($) + { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%) + { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&) + { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (') + { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (() + { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ()) + { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*) + { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,) + { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.) + { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/) + { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0) + { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1) + { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2) + { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3) + { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4) + { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5) + { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6) + { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7) + { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8) + { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (;) + { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<) + { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=) + { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>) + { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) + { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) + { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) + { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) + { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) + { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) + { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) + { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) + { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) + { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) + { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) + { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) + { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) + { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) + { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) + { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) + { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) + { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) + { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) + { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) + { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) + { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) + { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) + { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) + { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) + { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) + { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) + { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) + { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) + { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) + { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) + { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) + { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) + { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) + { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) + { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) + { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) + { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) + { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) + { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) + { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) + { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) + { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) + { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) + { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) + { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) + { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) + { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) + { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) + { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) + { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) + { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) + { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F +}; diff --git a/src/framebuffer.c b/src/framebuffer.c index 0040fe0..bf4a598 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -1,4 +1,6 @@ #include "framebuffer.h" +#include "font8x8_basic.h" +#include "serial.h" static unsigned long fb_address; static unsigned long fb_pitch; @@ -32,8 +34,7 @@ void putpixel( unsigned short y, unsigned char r, unsigned char g, - unsigned char b, - unsigned char a + unsigned char b ){ if (x > fb_width || y > fb_height) return; @@ -46,3 +47,32 @@ void putpixel( *((unsigned char *)(dest_addr + fb_bpos/8)) = b; } } + +void putchar( + unsigned char *character, + unsigned short x, + unsigned short y, + unsigned char r, + unsigned char g, + unsigned char b +){ + // Limit to ASCII printable + if (*character < 0x20) { + serial_write_string("\nASCII too low"); + return; + } + if (*character > 0x7e) { + serial_write_string("\nASCII too hihg"); + return; + } + + unsigned char *rowdata = font8x8_basic[*character]; + unsigned int charx, chary; + for (chary=0;chary<8;chary++) { + for (charx=0;charx<8;charx++) { + unsigned char pix = rowdata[chary] & 1 << charx; + if (pix) + putpixel(x+charx, y+chary, r*pix, g*pix, b*pix); + } + } +} diff --git a/src/framebuffer.h b/src/framebuffer.h index 9cd5708..dac7813 100644 --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -16,8 +16,14 @@ void putpixel( unsigned short y, unsigned char r, unsigned char g, - unsigned char b, - unsigned char a + unsigned char b ); - +void putchar( + unsigned char *character, + unsigned short x, + unsigned short y, + unsigned char r, + unsigned char g, + unsigned char b +); #endif diff --git a/src/kernel.c b/src/kernel.c index a2db903..91fa921 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -80,24 +80,31 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) mbootinfo->framebuffer_green_field_position, mbootinfo->framebuffer_blue_field_position ); - int x, y, i; - unsigned char c = 0; - for (;;) { - for (;c<255;c+=5) { - for(y=0; y < mbootinfo->framebuffer_height; y++) { - for(x=0; x < mbootinfo->framebuffer_width; x++) { - putpixel(x, y, 0, c, c, 0xff); - } - } - } - for (;c>0;c-=5) { - for(y=mbootinfo->framebuffer_height; y>=0; y--) { - for(x=mbootinfo->framebuffer_width; x>=0; x--) { - putpixel(x, y, 0, c, c, 0xff); - } - } - } - } + // int x, y, i; + // unsigned char c = 0; + // for (;;) { + // for (;c<255;c+=5) { + // for (y=0; y < mbootinfo->framebuffer_height; y++) { + // for (x=0; x < mbootinfo->framebuffer_width; x++) { + // putpixel(x, y, 0, c, c); + // } + // } + // } + // for (;c>0;c-=5) { + // for (y=mbootinfo->framebuffer_height; y>=0; y--) { + // for (x=mbootinfo->framebuffer_width; x>=0; x--) { + // putpixel(x, y, 0, c, c); + // } + // } + // } + // } + + putchar("r", 0, 0, 0xff, 0xff, 0xff); + putchar("O", 8, 0, 0xff, 0xff, 0xff); + putchar("S", 16, 0, 0xff, 0xff, 0xff); + putchar("k", 24, 0, 0xff, 0xff, 0xff); + putchar("a", 32, 0, 0xff, 0xff, 0xff); + while(1){} serial_write_string("\nExecution finished, halting...\n"); } From b047235d752274bd794ae0345975710005f02ba4 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Fri, 22 Sep 2023 23:28:52 +0300 Subject: [PATCH 07/14] finetuning putchar and preparing scaling --- src/framebuffer.c | 13 ++++++++++--- src/kernel.c | 32 ++++++++++---------------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/framebuffer.c b/src/framebuffer.c index bf4a598..570c3a3 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -67,12 +67,19 @@ void putchar( } unsigned char *rowdata = font8x8_basic[*character]; - unsigned int charx, chary; + unsigned char charx, chary, iy, ix; + unsigned char sizex=2; + unsigned char sizey=2; for (chary=0;chary<8;chary++) { for (charx=0;charx<8;charx++) { unsigned char pix = rowdata[chary] & 1 << charx; - if (pix) - putpixel(x+charx, y+chary, r*pix, g*pix, b*pix); + if (pix) { + for (iy=1;iy<=sizey;iy++) { + for (ix=1;ix<=sizex;ix++) { + putpixel(x+charx*sizex+ix, y+chary*sizey+iy, r, g, b); + } + } + } } } } diff --git a/src/kernel.c b/src/kernel.c index 91fa921..1d5fed8 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -80,30 +80,18 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) mbootinfo->framebuffer_green_field_position, mbootinfo->framebuffer_blue_field_position ); - // int x, y, i; - // unsigned char c = 0; - // for (;;) { - // for (;c<255;c+=5) { - // for (y=0; y < mbootinfo->framebuffer_height; y++) { - // for (x=0; x < mbootinfo->framebuffer_width; x++) { - // putpixel(x, y, 0, c, c); - // } - // } - // } - // for (;c>0;c-=5) { - // for (y=mbootinfo->framebuffer_height; y>=0; y--) { - // for (x=mbootinfo->framebuffer_width; x>=0; x--) { - // putpixel(x, y, 0, c, c); - // } - // } - // } - // } + int x, y; + for (y=mbootinfo->framebuffer_height; y>=0; y--) { + for (x=mbootinfo->framebuffer_width; x>=0; x--) { + putpixel(x, y, 0, 0x55, 0x55); + } + } putchar("r", 0, 0, 0xff, 0xff, 0xff); - putchar("O", 8, 0, 0xff, 0xff, 0xff); - putchar("S", 16, 0, 0xff, 0xff, 0xff); - putchar("k", 24, 0, 0xff, 0xff, 0xff); - putchar("a", 32, 0, 0xff, 0xff, 0xff); + putchar("O", 16, 0, 0xff, 0xff, 0xff); + putchar("S", 32, 0, 0xff, 0xff, 0xff); + putchar("k", 48, 0, 0xff, 0xff, 0xff); + putchar("a", 64, 0, 0xff, 0xff, 0xff); while(1){} serial_write_string("\nExecution finished, halting...\n"); From e438ef985a5917ac3c2ef8446f4a3fee4cb344fc Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sat, 23 Sep 2023 21:15:44 +0300 Subject: [PATCH 08/14] Switching back to tabs for indent --- src/font8x8_basic.h | 262 ++++++++++++++++++++++---------------------- src/framebuffer.c | 126 ++++++++++----------- src/framebuffer.h | 38 +++---- src/kernel.c | 142 ++++++++++++------------ src/serial.c | 58 +++++----- src/start32.s | 54 ++++----- src/xtoa.c | 144 ++++++++++++------------ 7 files changed, 412 insertions(+), 412 deletions(-) diff --git a/src/font8x8_basic.h b/src/font8x8_basic.h index 1452873..13c38e1 100644 --- a/src/font8x8_basic.h +++ b/src/font8x8_basic.h @@ -9,11 +9,11 @@ * // 8x8 monochrome bitmap fonts for rendering * // * // Author: - * // Marcel Sondaar - * // International Business Machines (public domain VGA fonts) + * // Marcel Sondaar + * // International Business Machines (public domain VGA fonts) * // * // License: - * // Public Domain + * // Public Domain * * Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm **/ @@ -21,132 +21,132 @@ // Constant: font8x8_basic // Contains an 8x8 font map for unicode points U+0000 - U+007F (basic latin) char font8x8_basic[128][8] = { - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul) - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019 - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space) - { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!) - { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (") - { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#) - { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($) - { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%) - { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&) - { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (') - { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (() - { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ()) - { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*) - { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+) - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,) - { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-) - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.) - { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/) - { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0) - { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1) - { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2) - { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3) - { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4) - { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5) - { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6) - { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7) - { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8) - { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9) - { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:) - { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (;) - { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<) - { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=) - { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>) - { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) - { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) - { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) - { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) - { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) - { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) - { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) - { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) - { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) - { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) - { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) - { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) - { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) - { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) - { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) - { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) - { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) - { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) - { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) - { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) - { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) - { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) - { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) - { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) - { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) - { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) - { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) - { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) - { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) - { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) - { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) - { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) - { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) - { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) - { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) - { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) - { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) - { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) - { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) - { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) - { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) - { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) - { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) - { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) - { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) - { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) - { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) - { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) - { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) - { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) - { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) - { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) - { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) - { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) - { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) - { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) - { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) - { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) - { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) - { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) - { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) - { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) - { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space) + { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!) + { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (") + { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#) + { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($) + { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%) + { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&) + { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (') + { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (() + { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ()) + { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*) + { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,) + { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.) + { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/) + { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0) + { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1) + { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2) + { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3) + { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4) + { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5) + { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6) + { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7) + { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8) + { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (;) + { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<) + { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=) + { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>) + { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) + { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) + { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) + { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) + { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) + { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) + { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) + { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) + { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) + { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) + { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) + { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) + { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) + { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) + { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) + { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) + { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) + { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) + { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) + { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) + { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) + { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) + { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) + { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) + { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) + { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) + { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) + { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) + { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) + { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) + { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) + { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) + { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) + { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) + { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) + { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) + { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) + { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) + { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) + { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) + { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) + { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) + { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) + { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) + { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) + { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) + { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) + { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) + { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) + { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) + { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) + { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) + { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F }; diff --git a/src/framebuffer.c b/src/framebuffer.c index 570c3a3..c033722 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -9,77 +9,77 @@ static unsigned char fb_bpp, fb_bytespp; static unsigned char fb_rpos, fb_bpos, fb_gpos; void initfb( - unsigned long addr, - unsigned short w, - unsigned short h, - unsigned char bpp, - unsigned long pitch, - unsigned char rpos, - unsigned char gpos, - unsigned char bpos + unsigned long addr, + unsigned short w, + unsigned short h, + unsigned char bpp, + unsigned long pitch, + unsigned char rpos, + unsigned char gpos, + unsigned char bpos ){ - fb_address = addr; - fb_pitch = pitch; - fb_width = w; - fb_height = h; - fb_bpp = bpp; - fb_bytespp = bpp/8; - fb_rpos = rpos; - fb_gpos = gpos; - fb_bpos = bpos; + fb_address = addr; + fb_pitch = pitch; + fb_width = w; + fb_height = h; + fb_bpp = bpp; + fb_bytespp = bpp/8; + fb_rpos = rpos; + fb_gpos = gpos; + fb_bpos = bpos; } void putpixel( - unsigned short x, - unsigned short y, - unsigned char r, - unsigned char g, - unsigned char b + unsigned short x, + unsigned short y, + unsigned char r, + unsigned char g, + unsigned char b ){ - if (x > fb_width || y > fb_height) - return; - unsigned long dest_addr = fb_address + y*fb_pitch + x*fb_bytespp; - if (fb_bpp == 32) { - *((unsigned long *)(dest_addr)) = r< fb_width || y > fb_height) + return; + unsigned long dest_addr = fb_address + y*fb_pitch + x*fb_bytespp; + if (fb_bpp == 32) { + *((unsigned long *)(dest_addr)) = r< 0x7e) { - serial_write_string("\nASCII too hihg"); - return; - } + // Limit to ASCII printable + if (*character < 0x20) { + serial_write_string("\nASCII too low"); + return; + } + if (*character > 0x7e) { + serial_write_string("\nASCII too hihg"); + return; + } - unsigned char *rowdata = font8x8_basic[*character]; - unsigned char charx, chary, iy, ix; - unsigned char sizex=2; - unsigned char sizey=2; - for (chary=0;chary<8;chary++) { - for (charx=0;charx<8;charx++) { - unsigned char pix = rowdata[chary] & 1 << charx; - if (pix) { - for (iy=1;iy<=sizey;iy++) { - for (ix=1;ix<=sizex;ix++) { - putpixel(x+charx*sizex+ix, y+chary*sizey+iy, r, g, b); - } - } - } - } - } + unsigned char *rowdata = font8x8_basic[*character]; + unsigned char charx, chary, iy, ix; + unsigned char sizex=5; + unsigned char sizey=5; + for (chary=0;chary<8;chary++) { + for (charx=0;charx<8;charx++) { + unsigned char pix = rowdata[chary] & 1 << charx; + if (pix) { + for (iy=1;iy<=sizey;iy++) { + for (ix=1;ix<=sizex;ix++) { + putpixel(x+charx*sizex+ix, y+chary*sizey+iy, r, g, b); + } + } + } + } + } } diff --git a/src/framebuffer.h b/src/framebuffer.h index dac7813..8cb760b 100644 --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -2,28 +2,28 @@ #define _FRAMEBUFFER_H 1 void initfb( - unsigned long addr, - unsigned short w, - unsigned short h, - unsigned char bpp, - unsigned long pitch, - unsigned char rpos, - unsigned char gpos, - unsigned char bpos + unsigned long addr, + unsigned short w, + unsigned short h, + unsigned char bpp, + unsigned long pitch, + unsigned char rpos, + unsigned char gpos, + unsigned char bpos ); void putpixel( - unsigned short x, - unsigned short y, - unsigned char r, - unsigned char g, - unsigned char b + unsigned short x, + unsigned short y, + unsigned char r, + unsigned char g, + unsigned char b ); void putchar( - unsigned char *character, - unsigned short x, - unsigned short y, - unsigned char r, - unsigned char g, - unsigned char b + unsigned char *character, + unsigned short x, + unsigned short y, + unsigned char r, + unsigned char g, + unsigned char b ); #endif diff --git a/src/kernel.c b/src/kernel.c index 1d5fed8..3364929 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -6,93 +6,93 @@ static inline void outb(unsigned short port, unsigned char val) { - asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory"); + asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory"); } static inline unsigned char inb(unsigned short port) { - unsigned char ret; - asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory"); - return ret; + unsigned char ret; + asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory"); + return ret; } void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) { - // Cursor disabling - outb(0x3D4, 0x0A); - outb(0x3D5, 0x20); + // Cursor disabling + outb(0x3D4, 0x0A); + outb(0x3D5, 0x20); - int serial_initialized = serial_init(); - serial_write_string("\n=== rOSka ===\n"); + int serial_initialized = serial_init(); + serial_write_string("\n=== rOSka ===\n"); - // Check multiboot header - if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) { - return; - } + // Check multiboot header + if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) { + return; + } - serial_write_string("\nMultiboot flags: "); - serial_write_string(itoa(mbootinfo->flags, 2)); + serial_write_string("\nMultiboot flags: "); + serial_write_string(itoa(mbootinfo->flags, 2)); - // Check videomode - if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) { - serial_write_string("\nVBE Mode: 0x"); - serial_write_string(itoa(mbootinfo->vbe_mode, 16)); - } + // Check videomode + if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) { + serial_write_string("\nVBE Mode: 0x"); + serial_write_string(itoa(mbootinfo->vbe_mode, 16)); + } - if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) { - serial_write_string("\nVideo info not available"); - return; - } + if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) { + serial_write_string("\nVideo info not available"); + return; + } - serial_write_string("\nFramebuffer: "); - serial_write_string("\n Address: 0x"); - serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16)); + serial_write_string("\nFramebuffer: "); + serial_write_string("\n Address: 0x"); + serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16)); - serial_write_string("\n Dimensions: "); - serial_write_string(itoa(mbootinfo->framebuffer_width, 10)); - serial_write_string("X"); - serial_write_string(itoa(mbootinfo->framebuffer_height, 10)); - serial_write_string("x"); - serial_write_string(itoa(mbootinfo->framebuffer_bpp, 10)); - serial_write_string("\n Pitch: "); - serial_write_string(itoa(mbootinfo->framebuffer_pitch, 10)); - serial_write_string("\n RPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_red_field_position, 10)); - serial_write_string("\n GPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_green_field_position, 10)); - serial_write_string("\n BPos:"); - serial_write_string(itoa(mbootinfo->framebuffer_blue_field_position, 10)); + serial_write_string("\n Dimensions: "); + serial_write_string(itoa(mbootinfo->framebuffer_width, 10)); + serial_write_string("X"); + serial_write_string(itoa(mbootinfo->framebuffer_height, 10)); + serial_write_string("x"); + serial_write_string(itoa(mbootinfo->framebuffer_bpp, 10)); + serial_write_string("\n Pitch: "); + serial_write_string(itoa(mbootinfo->framebuffer_pitch, 10)); + serial_write_string("\n RPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_red_field_position, 10)); + serial_write_string("\n GPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_green_field_position, 10)); + serial_write_string("\n BPos:"); + serial_write_string(itoa(mbootinfo->framebuffer_blue_field_position, 10)); - serial_write_string("\nMemory: "); - serial_write_string("\n lower: "); - serial_write_string(uitoa(mbootinfo->mem_lower, 10)); - serial_write_string(" k"); - serial_write_string("\n upper: "); - serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10)); - serial_write_string(" M"); + serial_write_string("\nMemory: "); + serial_write_string("\n lower: "); + serial_write_string(uitoa(mbootinfo->mem_lower, 10)); + serial_write_string(" k"); + serial_write_string("\n upper: "); + serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10)); + serial_write_string(" M"); - initfb( - mbootinfo->framebuffer_addr, - mbootinfo->framebuffer_width, - mbootinfo->framebuffer_height, - mbootinfo->framebuffer_bpp, - mbootinfo->framebuffer_pitch, - mbootinfo->framebuffer_red_field_position, - mbootinfo->framebuffer_green_field_position, - mbootinfo->framebuffer_blue_field_position - ); - int x, y; - for (y=mbootinfo->framebuffer_height; y>=0; y--) { - for (x=mbootinfo->framebuffer_width; x>=0; x--) { - putpixel(x, y, 0, 0x55, 0x55); - } - } + initfb( + mbootinfo->framebuffer_addr, + mbootinfo->framebuffer_width, + mbootinfo->framebuffer_height, + mbootinfo->framebuffer_bpp, + mbootinfo->framebuffer_pitch, + mbootinfo->framebuffer_red_field_position, + mbootinfo->framebuffer_green_field_position, + mbootinfo->framebuffer_blue_field_position + ); + int x, y; + for (y=mbootinfo->framebuffer_height; y>=0; y--) { + for (x=mbootinfo->framebuffer_width; x>=0; x--) { + putpixel(x, y, 0, 0x55, 0x55); + } + } - putchar("r", 0, 0, 0xff, 0xff, 0xff); - putchar("O", 16, 0, 0xff, 0xff, 0xff); - putchar("S", 32, 0, 0xff, 0xff, 0xff); - putchar("k", 48, 0, 0xff, 0xff, 0xff); - putchar("a", 64, 0, 0xff, 0xff, 0xff); - while(1){} + putchar("r", 412, 5, 0xff, 0xff, 0xff); + putchar("O", 452, 5, 0xff, 0xff, 0xff); + putchar("S", 492, 5, 0xff, 0xff, 0xff); + putchar("k", 532, 5, 0xff, 0xff, 0xff); + putchar("a", 572, 5, 0xff, 0xff, 0xff); + //while(1){} - serial_write_string("\nExecution finished, halting...\n"); + serial_write_string("\nExecution finished, halting...\n"); } diff --git a/src/serial.c b/src/serial.c index d19762d..5497203 100644 --- a/src/serial.c +++ b/src/serial.c @@ -3,54 +3,54 @@ static inline void outb(unsigned short port, unsigned char val) { - asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory"); + asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory"); } static inline unsigned char inb(unsigned short port) { - unsigned char ret; - asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory"); - return ret; + unsigned char ret; + asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory"); + return ret; } int serial_init() { - outb(PORT + 1, 0x00); // Disable all interrupts - outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) - outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud - outb(PORT + 1, 0x00); // (hi byte) - outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit - outb(PORT + 2, 0xC7); // Enable FIFO, clear them, 14-byte threshold - outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set - outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip - outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check - // if serial returns same byte) + outb(PORT + 1, 0x00); // Disable all interrupts + outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) + outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud + outb(PORT + 1, 0x00); // (hi byte) + outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit + outb(PORT + 2, 0xC7); // Enable FIFO, clear them, 14-byte threshold + outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set + outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip + outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check + // if serial returns same byte) - // Check if serial is faulty (i.e: not same byte as sent) - if (inb(PORT + 0) != 0xAE) - return 1; + // Check if serial is faulty (i.e: not same byte as sent) + if (inb(PORT + 0) != 0xAE) + return 1; - // If serial is not faulty set it in normal operation mode - // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) - outb(PORT + 4, 0x0F); - return 0; + // If serial is not faulty set it in normal operation mode + // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) + outb(PORT + 4, 0x0F); + return 0; } static int serial_is_transmit_empty() { - return inb(PORT + 5) & 0x20; + return inb(PORT + 5) & 0x20; } static void serial_write_char(char chr) { - while (serial_is_transmit_empty() == 0); - outb(PORT, chr); + while (serial_is_transmit_empty() == 0); + outb(PORT, chr); } void serial_write_string(const char* text) { - int i = 0; - while (text[i]) { - serial_write_char(text[i]); - i++; - } + int i = 0; + while (text[i]) { + serial_write_char(text[i]); + i++; + } } diff --git a/src/start32.s b/src/start32.s index f03794a..76cfc63 100644 --- a/src/start32.s +++ b/src/start32.s @@ -4,45 +4,45 @@ .set MULTIBOOT_AOUT_KLUDGE, 0 << 16 .set MULTIBOOT_HEADER_MAGIC, 0x1BADB002 .set MULTIBOOT_HEADER_FLAGS, \ - MULTIBOOT_PAGE_ALIGN \ - | MULTIBOOT_MEMORY_INFO \ - | MULTIBOOT_VIDEO_REQUEST \ - | MULTIBOOT_AOUT_KLUDGE + MULTIBOOT_PAGE_ALIGN \ + | MULTIBOOT_MEMORY_INFO \ + | MULTIBOOT_VIDEO_REQUEST \ + | MULTIBOOT_AOUT_KLUDGE .set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) #.section ".multiboottbabeee" .align 4 - .long MULTIBOOT_HEADER_MAGIC - .long MULTIBOOT_HEADER_FLAGS - .long MULTIBOOT_CHECKSUM - .long 0 # header address - .long 0 # load address - .long 0 # load end address - .long 0 # bss end address - .long 0 # entry address - .long 0 # video mode_type (0:fb, 1:txt) (set flags[2]!) - .long 1024 # video width - .long 768 # video height - .long 32 # video depth + .long MULTIBOOT_HEADER_MAGIC + .long MULTIBOOT_HEADER_FLAGS + .long MULTIBOOT_CHECKSUM + .long 0 # header address + .long 0 # load address + .long 0 # load end address + .long 0 # bss end address + .long 0 # entry address + .long 0 # video mode_type (0:fb, 1:txt) (set flags[2]!) + .long 1024 # video width + .long 768 # video height + .long 32 # video depth .bss .align 16 - stack_bottom: - .skip 16384 # 16k - stack_top: + stack_bottom: + .skip 16384 # 16k + stack_top: .text .global _start _start: - # Setup stack - mov $stack_top, %esp + # Setup stack + mov $stack_top, %esp - # Call the main kernel function. - push %ebx - push %eax - call kmain + # Call the main kernel function. + push %ebx + push %eax + call kmain - cli + cli 1: hlt - jmp 1b + jmp 1b diff --git a/src/xtoa.c b/src/xtoa.c index 2a7b9a5..b6b3739 100644 --- a/src/xtoa.c +++ b/src/xtoa.c @@ -1,104 +1,104 @@ #include "xtoa.h" char* itoa(int value, int base) { - char* result; + char* result; - // check that the base if valid - if (base < 2 || base > 36) { *result = '\0'; return result; } + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; - do { - tmp_value = value; - value /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - } while ( value ); + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); - // Apply negative sign - if (tmp_value < 0) *ptr++ = '-'; - *ptr-- = '\0'; - while (ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; - } - return result; + // Apply negative sign + if (tmp_value < 0) *ptr++ = '-'; + *ptr-- = '\0'; + while (ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; } char* uitoa(unsigned int value, int base) { - char* result; + char* result; - // check that the base if valid - if (base < 2 || base > 36) { *result = '\0'; return result; } + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; - do { - tmp_value = value; - value /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - } while ( value ); + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); - *ptr-- = '\0'; - while (ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; - } - return result; + *ptr-- = '\0'; + while (ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; } char* ltoa(long value, int base) { - char* result; + char* result; - // check that the base if valid - if (base < 2 || base > 36) { *result = '\0'; return result; } + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; - do { - tmp_value = value; - value /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - } while ( value ); + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); - // Apply negative sign - if (tmp_value < 0) *ptr++ = '-'; - *ptr-- = '\0'; - while (ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; - } - return result; + // Apply negative sign + if (tmp_value < 0) *ptr++ = '-'; + *ptr-- = '\0'; + while (ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; } char* ultoa(unsigned long value, int base) { - char* result; + char* result; - // check that the base if valid - if (base < 2 || base > 36) { *result = '\0'; return result; } + // check that the base if valid + if (base < 2 || base > 36) { *result = '\0'; return result; } - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; + char* ptr = result, *ptr1 = result, tmp_char; + int tmp_value; - do { - tmp_value = value; - value /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - } while ( value ); + do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); - *ptr-- = '\0'; - while (ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; - } - return result; + *ptr-- = '\0'; + while (ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; } From b077a17fa4d3ccf32a9c63329bdfeb30c24a7490 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sat, 23 Sep 2023 21:19:53 +0300 Subject: [PATCH 09/14] Renaming putchar to putc --- src/framebuffer.c | 2 +- src/framebuffer.h | 2 +- src/kernel.c | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/framebuffer.c b/src/framebuffer.c index c033722..35b73b5 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -48,7 +48,7 @@ void putpixel( } } -void putchar( +void putc( unsigned char *character, unsigned short x, unsigned short y, diff --git a/src/framebuffer.h b/src/framebuffer.h index 8cb760b..96ed6d7 100644 --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -18,7 +18,7 @@ void putpixel( unsigned char g, unsigned char b ); -void putchar( +void putc( unsigned char *character, unsigned short x, unsigned short y, diff --git a/src/kernel.c b/src/kernel.c index 3364929..1fab654 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -87,11 +87,11 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) } } - putchar("r", 412, 5, 0xff, 0xff, 0xff); - putchar("O", 452, 5, 0xff, 0xff, 0xff); - putchar("S", 492, 5, 0xff, 0xff, 0xff); - putchar("k", 532, 5, 0xff, 0xff, 0xff); - putchar("a", 572, 5, 0xff, 0xff, 0xff); + putc("r", 412, 5, 0xff, 0xff, 0xff); + putc("O", 452, 5, 0xff, 0xff, 0xff); + putc("S", 492, 5, 0xff, 0xff, 0xff); + putc("k", 532, 5, 0xff, 0xff, 0xff); + putc("a", 572, 5, 0xff, 0xff, 0xff); //while(1){} serial_write_string("\nExecution finished, halting...\n"); From f0243cb45e10e7e9c3c10956c4d51c478ff293fd Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sun, 24 Sep 2023 01:39:22 +0300 Subject: [PATCH 10/14] Printing whole strings to screen --- src/framebuffer.c | 29 ++++++++++++++++++++++------- src/framebuffer.h | 4 ++-- src/kernel.c | 6 +----- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/framebuffer.c b/src/framebuffer.c index 35b73b5..1e19efa 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -48,8 +48,8 @@ void putpixel( } } -void putc( - unsigned char *character, +static void putc( + const unsigned char character, unsigned short x, unsigned short y, unsigned char r, @@ -57,19 +57,19 @@ void putc( unsigned char b ){ // Limit to ASCII printable - if (*character < 0x20) { + if (character < 0x20) { serial_write_string("\nASCII too low"); return; } - if (*character > 0x7e) { + if (character > 0x7e) { serial_write_string("\nASCII too hihg"); return; } - unsigned char *rowdata = font8x8_basic[*character]; + unsigned char *rowdata = font8x8_basic[character]; unsigned char charx, chary, iy, ix; - unsigned char sizex=5; - unsigned char sizey=5; + unsigned char sizex=1; + unsigned char sizey=1; for (chary=0;chary<8;chary++) { for (charx=0;charx<8;charx++) { unsigned char pix = rowdata[chary] & 1 << charx; @@ -83,3 +83,18 @@ void putc( } } } + +void puts( + const unsigned char *text, + unsigned short x, + unsigned short y, + unsigned char r, + unsigned char g, + unsigned char b +){ + unsigned char i = 0; + while (text[i]) { + putc(text[i], x+i*8, y, r, g, b); + i++; + } +} diff --git a/src/framebuffer.h b/src/framebuffer.h index 96ed6d7..8066375 100644 --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -18,8 +18,8 @@ void putpixel( unsigned char g, unsigned char b ); -void putc( - unsigned char *character, +void puts( + const unsigned char *text, unsigned short x, unsigned short y, unsigned char r, diff --git a/src/kernel.c b/src/kernel.c index 1fab654..1f5766d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -87,11 +87,7 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) } } - putc("r", 412, 5, 0xff, 0xff, 0xff); - putc("O", 452, 5, 0xff, 0xff, 0xff); - putc("S", 492, 5, 0xff, 0xff, 0xff); - putc("k", 532, 5, 0xff, 0xff, 0xff); - putc("a", 572, 5, 0xff, 0xff, 0xff); + puts("rOSka", 0, 0, 0xff, 0x00, 0x00); //while(1){} serial_write_string("\nExecution finished, halting...\n"); From 2c6826e293a0a73c497c02bf8eaf8a0d73e37e62 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sun, 24 Sep 2023 20:46:39 +0300 Subject: [PATCH 11/14] Fixing putc and puts to use pointers correctly --- src/framebuffer.c | 18 ++++++++---------- src/framebuffer.h | 10 +++++++++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/framebuffer.c b/src/framebuffer.c index 1e19efa..3d4cbe3 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -1,6 +1,7 @@ #include "framebuffer.h" #include "font8x8_basic.h" #include "serial.h" +#include "xtoa.h" static unsigned long fb_address; static unsigned long fb_pitch; @@ -48,8 +49,8 @@ void putpixel( } } -static void putc( - const unsigned char character, +void putc( + const unsigned char *character, unsigned short x, unsigned short y, unsigned char r, @@ -57,16 +58,13 @@ static void putc( unsigned char b ){ // Limit to ASCII printable - if (character < 0x20) { - serial_write_string("\nASCII too low"); - return; - } - if (character > 0x7e) { - serial_write_string("\nASCII too hihg"); + if (*character < 0x20 || *character > 0x7e) { + serial_write_string("\nputc ASCII out of range: "); + serial_write_string(uitoa(*character, 16)); return; } - unsigned char *rowdata = font8x8_basic[character]; + unsigned char *rowdata = font8x8_basic[*character]; unsigned char charx, chary, iy, ix; unsigned char sizex=1; unsigned char sizey=1; @@ -94,7 +92,7 @@ void puts( ){ unsigned char i = 0; while (text[i]) { - putc(text[i], x+i*8, y, r, g, b); + putc(text+i, x+i*8, y, r, g, b); i++; } } diff --git a/src/framebuffer.h b/src/framebuffer.h index 8066375..27c7195 100644 --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -17,7 +17,15 @@ void putpixel( unsigned char r, unsigned char g, unsigned char b - ); +); +void putc( + const unsigned char *character, + unsigned short x, + unsigned short y, + unsigned char r, + unsigned char g, + unsigned char b +); void puts( const unsigned char *text, unsigned short x, From d1e3603fa51db82c02ff7584fd515dd132576272 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Mon, 25 Sep 2023 18:01:52 +0300 Subject: [PATCH 12/14] Switched font --- src/font_alotware.h | 260 ++++++++++++++++++++++++++++++++++++++++++++ src/framebuffer.c | 13 ++- src/kernel.c | 6 +- 3 files changed, 272 insertions(+), 7 deletions(-) create mode 100644 src/font_alotware.h diff --git a/src/font_alotware.h b/src/font_alotware.h new file mode 100644 index 0000000..9f59443 --- /dev/null +++ b/src/font_alotware.h @@ -0,0 +1,260 @@ +// Alotware's font, released under public domain. +// Credits to OSDev forum user Muazzam +unsigned char font[][16] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x7F, 0x22, 0x44, 0x44, 0xFF, 0x44, 0x44, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x10, 0x3C, 0x52, 0x50, 0x50, 0x3C, 0x12, 0x12, 0x52, 0x3C, 0x10, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x02, 0x22, 0x54, 0x24, 0x08, 0x0A, 0x15, 0x12, 0x20, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x48, 0x30, 0x34, 0x48, 0x45, 0x3E, 0x01, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x18, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x18, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x18, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x1C, 0x1C, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x46, 0x4A, 0x52, 0x62, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7E, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x04, 0x38, 0x04, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x0C, 0x14, 0x24, 0x44, 0x44, 0x7E, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x40, 0x40, 0x7C, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7E, 0x42, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x02, 0x02, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x4E, 0x52, 0x4E, 0x40, 0x40, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x78, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7E, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7E, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x40, 0x40, 0x4E, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x66, 0x5A, 0x5A, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x46, 0x42, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x4A, 0x46, 0x3E, 0x01, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x60, 0x50, 0x48, 0x44, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x3C, 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x5A, 0x5A, 0x66, 0x42, 0x42, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x28, 0x44, 0x44, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x7E, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x7E, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x78, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x1E, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1E, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x40, 0x40, 0x7C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x40, 0x40, 0x3C, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x1C, 0x20, 0x20, 0x7C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x3C, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x40, 0x40, 0x7C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x38, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x40, 0x40, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x40, 0x3C, 0x02, 0x02, 0x3C, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x5A, 0x5A, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x10, 0x28, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x7C, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x0C, 0x10, 0x10, 0x10, 0x60, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x30, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, +}; diff --git a/src/framebuffer.c b/src/framebuffer.c index 3d4cbe3..25ee486 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -1,5 +1,5 @@ #include "framebuffer.h" -#include "font8x8_basic.h" +#include "font_alotware.h" #include "serial.h" #include "xtoa.h" @@ -64,16 +64,17 @@ void putc( return; } - unsigned char *rowdata = font8x8_basic[*character]; + unsigned char *rowdata = font[*character]; unsigned char charx, chary, iy, ix; unsigned char sizex=1; unsigned char sizey=1; - for (chary=0;chary<8;chary++) { + for (chary=0;chary<16;chary++) { for (charx=0;charx<8;charx++) { - unsigned char pix = rowdata[chary] & 1 << charx; + //unsigned char pix = rowdata[chary] & 1 << charx; + unsigned char pix = rowdata[chary] & 0b10000000 >> charx; if (pix) { - for (iy=1;iy<=sizey;iy++) { - for (ix=1;ix<=sizex;ix++) { + for (iy=0;iy?@", mbootinfo->framebuffer_width-35*8, mbootinfo->framebuffer_height-16*3-8, 0xff, 0xff, 0xff); + puts("ABCDEFGHIJKLMNOPQRSTUVWXYZ [\\]^_`", mbootinfo->framebuffer_width-35*8, mbootinfo->framebuffer_height-16*2-8, 0xff, 0xff, 0xff); + puts("abcdefghijklmnopqrstuvwxyz {|}~", mbootinfo->framebuffer_width-35*8, mbootinfo->framebuffer_height-16-8, 0xff, 0xff, 0xff); + + puts("rOSka on paskaa ja paska ei lopu koskaa, huehue", 0, 0, 0xff, 0xff, 0xff); //while(1){} serial_write_string("\nExecution finished, halting...\n"); From e4cf306093d049a8a62f24da4053236fd87b1ebc Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Tue, 26 Sep 2023 18:03:04 +0300 Subject: [PATCH 13/14] Formatting: Multiline does not seem like a good idea --- src/start32.s | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/start32.s b/src/start32.s index 76cfc63..fd22a82 100644 --- a/src/start32.s +++ b/src/start32.s @@ -3,11 +3,7 @@ .set MULTIBOOT_VIDEO_REQUEST, 1 << 2 .set MULTIBOOT_AOUT_KLUDGE, 0 << 16 .set MULTIBOOT_HEADER_MAGIC, 0x1BADB002 -.set MULTIBOOT_HEADER_FLAGS, \ - MULTIBOOT_PAGE_ALIGN \ - | MULTIBOOT_MEMORY_INFO \ - | MULTIBOOT_VIDEO_REQUEST \ - | MULTIBOOT_AOUT_KLUDGE +.set MULTIBOOT_HEADER_FLAGS, MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST | MULTIBOOT_AOUT_KLUDGE .set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) #.section ".multiboottbabeee" From e0be923f35bc0b77c9d5d65e4c14ff0ccb188c29 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Tue, 26 Sep 2023 18:10:33 +0300 Subject: [PATCH 14/14] I heard strings are not unsigned lol --- src/framebuffer.c | 4 ++-- src/framebuffer.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/framebuffer.c b/src/framebuffer.c index 25ee486..d8ee465 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -50,7 +50,7 @@ void putpixel( } void putc( - const unsigned char *character, + const char *character, unsigned short x, unsigned short y, unsigned char r, @@ -84,7 +84,7 @@ void putc( } void puts( - const unsigned char *text, + const char *text, unsigned short x, unsigned short y, unsigned char r, diff --git a/src/framebuffer.h b/src/framebuffer.h index 27c7195..144aa3f 100644 --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -19,7 +19,7 @@ void putpixel( unsigned char b ); void putc( - const unsigned char *character, + const char *character, unsigned short x, unsigned short y, unsigned char r, @@ -27,7 +27,7 @@ void putc( unsigned char b ); void puts( - const unsigned char *text, + const char *text, unsigned short x, unsigned short y, unsigned char r,