From e11298e56be560de64bbccfe74fef7ff85c623d1 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Mon, 8 Aug 2022 21:25:55 +0200 Subject: stdio.h; gcc $(WARNINGS) --- Makefile | 7 +++- kernel/Makefile | 2 +- kernel/include/graphics.h | 16 ++++----- kernel/include/irq_handler.h | 56 ++++++++++++++++++++++++++++++ kernel/include/keyboard.h | 3 -- kernel/include/libk/stdio.h | 8 +++++ kernel/include/paging.h | 3 ++ kernel/src/boot/multiboot2.c | 15 ++++---- kernel/src/cpu/idt.c | 3 +- kernel/src/cpu/io.c | 1 + kernel/src/cpu/irq.c | 80 +++++++++++++++++++++++++------------------ kernel/src/devices/keyboard.c | 55 +++++------------------------ kernel/src/libk/math.c | 1 + kernel/src/libk/stdio.c | 76 ++++++++++++++++++++++++++++++++++++++++ kernel/src/libk/string.c | 7 ++-- kernel/src/main.c | 7 ++-- kernel/src/mem/heap.c | 1 + kernel/src/mem/paging.c | 8 ++++- kernel/src/misc/debug.c | 2 ++ kernel/src/misc/graphics.c | 33 ++++++++++-------- 20 files changed, 258 insertions(+), 126 deletions(-) create mode 100644 kernel/include/irq_handler.h create mode 100644 kernel/include/libk/stdio.h create mode 100644 kernel/src/libk/stdio.c diff --git a/Makefile b/Makefile index 7bfb97b..cd64db1 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,12 @@ LD = $(ARCH)ld OBJDUMP = $(ARCH)objcopy OBJCOPY = $(ARCH)objdump -CFLAGS = -Wall -Werror -Wno-error=infinite-recursion -O -fno-omit-frame-pointer +WARNINGS := -Wall -Werror -Wextra -pedantic -Wshadow -Wpointer-arith \ + -Wcast-align -Wwrite-strings -Wmissing-prototypes \ + -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline \ + -Wno-long-long -Wconversion -Wstrict-prototypes + +CFLAGS = $(WARNINGS) -Wno-error=infinite-recursion -O -fno-omit-frame-pointer # -mgeneral-regs-only disables SIMD instructions CFLAGS += -MD -O3 -mgeneral-regs-only -mcmodel=large CFLAGS += -ffreestanding -fno-common -nostdlib diff --git a/kernel/Makefile b/kernel/Makefile index 22f5775..ca068b0 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -12,9 +12,9 @@ OBJS = \ src/cpu/pic.o \ src/devices/keyboard.o \ src/libk/math.o \ + src/libk/stdio.o \ src/libk/string.o \ src/main.o \ - src/mem/heap.o \ src/mem/paging_asm.o \ src/mem/paging.o \ src/misc/debug.o \ diff --git a/kernel/include/graphics.h b/kernel/include/graphics.h index 2714f62..6876d3a 100644 --- a/kernel/include/graphics.h +++ b/kernel/include/graphics.h @@ -13,7 +13,7 @@ struct fb_t { } __attribute__((packed, aligned(8))); typedef struct fb_t fb_t; -extern fb_t fb; +extern fb_t main_fb; #define RED 0x00ff0000 #define GREEN 0x0000ff00 @@ -23,12 +23,12 @@ extern fb_t fb; #define WHITE 0x00ffffff #define BLACK 0x00000000 -uint64_t* pixel_offset(fb_t fb, uint32_t x, uint32_t y); -void fb_draw_pixel(fb_t fb, uint32_t x, uint32_t y, uint32_t col); -void fb_draw_line_low(fb_t fb, uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t col); -void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t col); -void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t col); -void fb_draw_character(fb_t fb, char c, uint32_t x, uint32_t y, uint32_t char_col, uint32_t bg_col); -void fb_draw_string(fb_t fb, const char* str, uint32_t x, uint32_t y, uint32_t char_col, uint32_t bg_col); +uint64_t* pixel_offset(fb_t fb, int32_t x, int32_t y); +void fb_draw_pixel(fb_t fb, int32_t x, int32_t y, uint32_t col); +void fb_draw_line_low(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col); +void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col); +void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col); +void fb_draw_character(fb_t fb, char c, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col); +void fb_draw_string(fb_t fb, const char* str, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col); #endif diff --git a/kernel/include/irq_handler.h b/kernel/include/irq_handler.h new file mode 100644 index 0000000..f7c4f00 --- /dev/null +++ b/kernel/include/irq_handler.h @@ -0,0 +1,56 @@ +#ifndef IRQ_HANDLER_H +#define IRQ_HANDLER_H + +#include + +void isr0_handler(void); +void isr1_handler(void); +void isr2_handler(void); +void isr3_handler(void); +void isr4_handler(void); +void isr5_handler(void); +void isr6_handler(void); +void isr7_handler(void); +void isr8_handler(uint64_t error); +void isr9_handler(void); +void isr10_handler(uint64_t error); +void isr11_handler(uint64_t error); +void isr12_handler(uint64_t error); +void isr13_handler(uint64_t error); +void isr14_handler(uint64_t error); +void isr15_handler(void); +void isr16_handler(void); +void isr17_handler(uint64_t error); +void isr18_handler(void); +void isr19_handler(void); +void isr20_handler(void); +void isr21_handler(uint64_t error); +void isr22_handler(void); +void isr23_handler(void); +void isr24_handler(void); +void isr25_handler(void); +void isr26_handler(void); +void isr27_handler(void); +void isr28_handler(void); +void isr29_handler(uint64_t error); +void isr30_handler(uint64_t error); +void isr31_handler(void); + +void irq0_handler(void); +void irq1_handler(void); +void irq2_handler(void); +void irq3_handler(void); +void irq4_handler(void); +void irq5_handler(void); +void irq6_handler(void); +void irq7_handler(void); +void irq8_handler(void); +void irq9_handler(void); +void irq10_handler(void); +void irq11_handler(void); +void irq12_handler(void); +void irq13_handler(void); +void irq14_handler(void); +void irq15_handler(void); + +#endif diff --git a/kernel/include/keyboard.h b/kernel/include/keyboard.h index 5d7acd0..6d395f3 100644 --- a/kernel/include/keyboard.h +++ b/kernel/include/keyboard.h @@ -8,9 +8,6 @@ uint64_t stoi(const char *s); void itos(uint64_t num, char* s); -void print_char(char c); -void print_string(char* s); void keyboard_handler(void); -void print_int(uint64_t num); #endif diff --git a/kernel/include/libk/stdio.h b/kernel/include/libk/stdio.h new file mode 100644 index 0000000..6799f11 --- /dev/null +++ b/kernel/include/libk/stdio.h @@ -0,0 +1,8 @@ +#ifndef STDIO_H +#define STDIO_H + +#include + +void printf(const char *s, ...); + +#endif diff --git a/kernel/include/paging.h b/kernel/include/paging.h index 79d9dea..a61d34d 100644 --- a/kernel/include/paging.h +++ b/kernel/include/paging.h @@ -1,6 +1,9 @@ #ifndef PAGING_H #define PAGING_H +#include + void init_paging(void); +void page_fault(uint64_t error); #endif diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c index fd8a652..75a1f8d 100644 --- a/kernel/src/boot/multiboot2.c +++ b/kernel/src/boot/multiboot2.c @@ -1,14 +1,11 @@ #include - #include + #include #include - #define KERNEL_VMA 0xc0000000 -fb_t fb; - /* https://www.gnu.org/software/grub/manual/multiboot2/html_node/Boot-information-format.html */ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) @@ -39,9 +36,9 @@ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) tag_header += tag_header->size / 8 + ((tag_header->size % 8) > 0); } - fb.addr = tag_fb->framebuffer_addr; - fb.width = tag_fb->framebuffer_width; - fb.height = tag_fb->framebuffer_height; - fb.pitch = tag_fb->framebuffer_pitch; - fb.bpp = tag_fb->framebuffer_bpp; + main_fb.addr = tag_fb->framebuffer_addr; + main_fb.width = tag_fb->framebuffer_width; + main_fb.height = tag_fb->framebuffer_height; + main_fb.pitch = tag_fb->framebuffer_pitch; + main_fb.bpp = tag_fb->framebuffer_bpp; } diff --git a/kernel/src/cpu/idt.c b/kernel/src/cpu/idt.c index bf285b7..e900c77 100644 --- a/kernel/src/cpu/idt.c +++ b/kernel/src/cpu/idt.c @@ -1,4 +1,5 @@ #include + #include #include @@ -14,7 +15,7 @@ void add_to_idt(uint16_t num, uint64_t offset, uint16_t selector, uint8_t type) { idt_table[num].offset_1 = offset & 0xFFFF; idt_table[num].offset_2 = (offset >> 16) & 0xFFFF; - idt_table[num].offset_3 = offset >> 32; + idt_table[num].offset_3 = (uint32_t)(offset >> 32); idt_table[num].selector = selector; idt_table[num].type_attributes = type; idt_table[num].ist = 0; diff --git a/kernel/src/cpu/io.c b/kernel/src/cpu/io.c index a73c5b1..84298cb 100644 --- a/kernel/src/cpu/io.c +++ b/kernel/src/cpu/io.c @@ -1,4 +1,5 @@ #include +#include uint8_t inb(uint32_t port) { diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c index c81cc98..be0d2a2 100644 --- a/kernel/src/cpu/irq.c +++ b/kernel/src/cpu/irq.c @@ -1,11 +1,13 @@ #include +#include #include #include #include -#include +#include +#include -char* exception_name[] = { +const char* exception_name[] = { "Divide-by-zero Error", "Debug", "Non-maskable Interrupt", @@ -42,162 +44,172 @@ char* exception_name[] = { void isr0_handler(void) { - fb_draw_string(fb, exception_name[0], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[0]); } void isr1_handler(void) { - fb_draw_string(fb, exception_name[1], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[1]); } void isr2_handler(void) { - fb_draw_string(fb, exception_name[2], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[2]); } void isr3_handler(void) { - fb_draw_string(fb, exception_name[3], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[3]); } void isr4_handler(void) { - fb_draw_string(fb, exception_name[4], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[4]); } void isr5_handler(void) { - fb_draw_string(fb, exception_name[5], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[5]); } void isr6_handler(void) { - fb_draw_string(fb, exception_name[6], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[6]); } void isr7_handler(void) { - fb_draw_string(fb, exception_name[7], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[7]); } void isr8_handler(uint64_t error) { - fb_draw_string(fb, exception_name[8], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[8]); + printf("error: %d\n", error); } void isr9_handler(void) { - fb_draw_string(fb, exception_name[9], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[9]); } void isr10_handler(uint64_t error) { - fb_draw_string(fb, exception_name[10], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[10]); + printf("error: %d\n", error); } void isr11_handler(uint64_t error) { - fb_draw_string(fb, exception_name[11], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[11]); + printf("error: %d\n", error); } void isr12_handler(uint64_t error) { - fb_draw_string(fb, exception_name[12], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[12]); + printf("error: %d\n", error); } void isr13_handler(uint64_t error) { - fb_draw_string(fb, exception_name[13], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[13]); + printf("error: %d\n", error); } void isr14_handler(uint64_t error) { - fb_draw_string(fb, exception_name[14], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[14]); + printf("error: %d\n", error); } void isr15_handler(void) { - fb_draw_string(fb, exception_name[15], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[15]); } void isr16_handler(void) { - fb_draw_string(fb, exception_name[16], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[16]); } void isr17_handler(uint64_t error) { - fb_draw_string(fb, exception_name[17], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[17]); + printf("error: %d\n", error); } void isr18_handler(void) { - fb_draw_string(fb, exception_name[18], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[18]); } void isr19_handler(void) { - fb_draw_string(fb, exception_name[19], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[19]); } void isr20_handler(void) { - fb_draw_string(fb, exception_name[20], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[20]); } void isr21_handler(uint64_t error) { - fb_draw_string(fb, exception_name[21], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[21]); + printf("error: %d\n", error); } void isr22_handler(void) { - fb_draw_string(fb, exception_name[22], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[22]); } void isr23_handler(void) { - fb_draw_string(fb, exception_name[23], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[23]); } void isr24_handler(void) { - fb_draw_string(fb, exception_name[24], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[24]); } void isr25_handler(void) { - fb_draw_string(fb, exception_name[25], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[25]); } void isr26_handler(void) { - fb_draw_string(fb, exception_name[26], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[26]); } void isr27_handler(void) { - fb_draw_string(fb, exception_name[27], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[27]); } void isr28_handler(void) { - fb_draw_string(fb, exception_name[28], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[28]); } void isr29_handler(uint64_t error) { - fb_draw_string(fb, exception_name[29], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[29]); + printf("error: %d\n", error); } void isr30_handler(uint64_t error) { - fb_draw_string(fb, exception_name[30], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[30]); + printf("error: %d\n", error); } void isr31_handler(void) { - fb_draw_string(fb, exception_name[31], 0, 0, WHITE, BLACK); + printf("%s\n", exception_name[31]); } void irq0_handler(void) diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c index f873a29..76c12c7 100644 --- a/kernel/src/devices/keyboard.c +++ b/kernel/src/devices/keyboard.c @@ -1,53 +1,17 @@ #include +#include #include #include -#include -#include #include -#include +#include +#include #define KEYBOARD_DATA_PORT 0x60 #define KEYBOARD_STATUS_PORT 0x64 -static uint32_t x; -static uint32_t y; bool is_pressed[128]; -void print_char(char c) -{ - - if (c == '\n') { - x = 0; - y++; - return; - } - if (x * 8 >= fb.width) { - x = 0; - y++; - } - if (y * 16 >= fb.height) { - x = 0; - y = 0; - } - fb_draw_character(fb, c, x * 8, y * 16, WHITE, BLACK); - x++; -} - -void print_string(char* s) -{ - for (size_t i = 0; i < strlen(s); i++) { - print_char(s[i]); - } -} - -void print_int(uint64_t num) -{ - char a[100]; - itos(num, a); - print_string(a); -} - void keyboard_handler(void) { uint8_t status = inb(KEYBOARD_STATUS_PORT); @@ -58,21 +22,18 @@ void keyboard_handler(void) if (keycode < keymap_len) { is_pressed[keycode] = true; if (keycode == KEY_SPACE) { - print_char(' '); + printf(" "); } else if (keycode == KEY_BACKSPACE) { - if (!x) return; - x--; - print_char(' '); - x--; + printf("\b \b"); } else if (keycode == KEY_ENTER) { - print_char(keymap[keycode]); + printf("%c", keymap[keycode]); } else { if (keymap[keycode] == ' ') return; if (is_pressed[KEY_LSHIFT] || is_pressed[KEY_RSHIFT]) - print_char(shift_keymap[keycode]); + printf("%c", shift_keymap[keycode]); else - print_char(keymap[keycode]); + printf("%c", keymap[keycode]); } } else { is_pressed[keycode - 128] = false; diff --git a/kernel/src/libk/math.c b/kernel/src/libk/math.c index c2f9c5e..f625fb5 100644 --- a/kernel/src/libk/math.c +++ b/kernel/src/libk/math.c @@ -1,4 +1,5 @@ #include +#include int64_t abs(int64_t val) { diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c new file mode 100644 index 0000000..b8ddb67 --- /dev/null +++ b/kernel/src/libk/stdio.c @@ -0,0 +1,76 @@ +#include +#include + +#include +#include +#include + +int32_t x; +int32_t y; + +inline void print_char(char c) +{ + if (c == '\n') { + x = 0; + y++; + return; + } + if (c == '\b') { + if (x != 0) { + x--; + } + return; + } + if (x * 8 >= (int32_t)main_fb.width) { + x = 0; + y++; + } + if (y * 16 >= (int32_t)main_fb.height) { + x = 0; + y = 0; + } + fb_draw_character(main_fb, c, x * 8, y * 16, WHITE, BLACK); + x++; +} + +inline void print_string(const char* s) +{ + for (size_t i = 0; i < strlen(s); i++) { + print_char(s[i]); + } +} + +inline void print_int(uint64_t num) +{ + char a[100]; + itos(num, a); + print_string(a); +} + +void printf(const char *s, ...) +{ + size_t count = 0; + for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++; + + va_list list; + va_start(list, s); + + for(size_t i = 0; i < strlen(s); i++) + { + if(s[i] == '%') + { + i++; + if(s[i] == 'c') print_char((char)va_arg(list, uint32_t)); + else if(s[i] == 's') print_string(va_arg(list, char*)); + else if(s[i] == 'd') print_int((uint64_t)va_arg(list, uint64_t)); + else + { + print_string("Wrong format using printf\n"); + return; + } + } + else print_char(s[i]); + } + + va_end(list); +} diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c index a4d0191..fde9645 100644 --- a/kernel/src/libk/string.c +++ b/kernel/src/libk/string.c @@ -1,10 +1,11 @@ #include +#include size_t strlen(const char* s) { char *p = (char*)s; while (*p) p++; - return p - s; + return (size_t)(p - s); } uint64_t stoi(const char *s) @@ -14,7 +15,7 @@ uint64_t stoi(const char *s) for (size_t i = 0; i < n; i++) { num *= 10; - num += s[i] - '0'; + num += (uint64_t)(s[i] - '0'); } return num; @@ -36,7 +37,7 @@ void itos(uint64_t num, char* s) { size_t i; for (i = 0; num; num/=10, i++) { - s[i] = '0' + num%10; + s[i] = (char)('0' + num%10); } s[i] = '\0'; strrev(s); diff --git a/kernel/src/main.c b/kernel/src/main.c index 8a57d45..80b0d6a 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -3,19 +3,20 @@ #include #include #include -#include #include #include #include +#include +int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic); int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) { init_paging(); - init_heap(HEAP_START_ADDR, HEAP_SIZE, HEAP_BLOCK_SIZE); +// init_heap(HEAP_START_ADDR, HEAP_SIZE, HEAP_BLOCK_SIZE); init_idt(); init_fb(multiboot_bootinfo, multiboot_magic); - print_int(0x1000); + __asm__ volatile ("int $2;"); for(;;) { __asm__ volatile ("hlt;"); diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c index 545f6ea..b47cec0 100644 --- a/kernel/src/mem/heap.c +++ b/kernel/src/mem/heap.c @@ -1,3 +1,4 @@ +#include #include void init_heap(uint64_t addr, uint64_t size, uint64_t block_size) diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index f0181cd..fdd1dd2 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -1,7 +1,8 @@ #include - #include +#include + void load_pt_lvl4(uint64_t*); __attribute__((aligned(4096))) uint64_t page_table_lvl4[512]; @@ -35,3 +36,8 @@ void init_paging(void) load_pt_lvl4(page_table_lvl4); } + +void page_fault(uint64_t error) +{ + printf("%d\n", error); +} diff --git a/kernel/src/misc/debug.c b/kernel/src/misc/debug.c index 2a940d3..d244d7a 100644 --- a/kernel/src/misc/debug.c +++ b/kernel/src/misc/debug.c @@ -1,3 +1,5 @@ +#include + void bochs_breakpoint(void) { __asm__ volatile ("xchgw %bx, %bx;"); diff --git a/kernel/src/misc/graphics.c b/kernel/src/misc/graphics.c index 488e4fa..5cb11bf 100644 --- a/kernel/src/misc/graphics.c +++ b/kernel/src/misc/graphics.c @@ -1,19 +1,22 @@ #include +#include #include -#include #include #include #include -uint64_t* pixel_offset(fb_t fb, uint32_t x, uint32_t y) +fb_t main_fb; + +uint64_t* pixel_offset(fb_t fb, int32_t x, int32_t y) { - return (uint64_t*)((char*)fb.addr + y * fb.pitch + x * fb.bpp / 8); + return (uint64_t*)((char*)fb.addr + y * (int32_t)fb.pitch + x * fb.bpp / 8); } -void fb_draw_pixel(fb_t fb, uint32_t x, uint32_t y, uint32_t col) +void fb_draw_pixel(fb_t fb, int32_t x, int32_t y, uint32_t col) { - if (x >= fb.width || y >= fb.height) return; + if (x < 0 || y < 0) return; + if (x >= (int32_t)fb.width || y >= (int32_t)fb.height) return; uint32_t* fb_offset = (uint32_t*)pixel_offset(fb, x, y); *fb_offset = col; @@ -21,7 +24,7 @@ void fb_draw_pixel(fb_t fb, uint32_t x, uint32_t y, uint32_t col) /* https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm */ -void fb_draw_line_low(fb_t fb, uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t col) +void fb_draw_line_low(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col) { int32_t dx = x1 - x0; int32_t dy = y1 - y0; @@ -45,7 +48,7 @@ void fb_draw_line_low(fb_t fb, uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y } -void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t col) +void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col) { int32_t dx = x1 - x0; int32_t dy = y1 - y0; @@ -68,7 +71,7 @@ void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, } } -void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t col) +void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col) { if (abs(y1 - y0) < abs(x1 - x0)) { if (x0 > x1) @@ -83,14 +86,14 @@ void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32 } } -void fb_draw_character(fb_t fb, char c, uint32_t x, uint32_t y, uint32_t char_col, uint32_t bg_col) +void fb_draw_character(fb_t fb, char c, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col) { if (c < 0) return; - uint32_t offset = 32 + c * 16; - for (uint32_t i = 0 ; i < 16; i++) + int32_t offset = 32 + c * 16; + for (int32_t i = 0 ; i < 16; i++) { - for (uint32_t j = 0 ; j < 8; j++) + for (int32_t j = 0 ; j < 8; j++) { if (font[offset + i] & (1 << (7 - j))) { fb_draw_pixel(fb, x + j, y + i, char_col); @@ -101,9 +104,9 @@ void fb_draw_character(fb_t fb, char c, uint32_t x, uint32_t y, uint32_t char_co } } -void fb_draw_string(fb_t fb, const char* s, uint32_t x, uint32_t y, uint32_t char_col, uint32_t bg_col) +void fb_draw_string(fb_t fb, const char* s, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col) { - for (uint32_t i = 0; i < strlen(s); i++) { - fb_draw_character(fb, s[i], x + i * 8, y, char_col, bg_col); + for (size_t i = 0; i < strlen(s); i++) { + fb_draw_character(fb, s[i], (x + (int32_t)i * 8), y, char_col, bg_col); } } -- cgit v1.2.3