diff --git a/.gitignore b/.gitignore index aa51d5e..c57157f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build obj .* +compile_commands.json diff --git a/Makefile b/Makefile index 8351dfd..c9b8ea1 100644 --- a/Makefile +++ b/Makefile @@ -7,10 +7,10 @@ NAME := bozOS AS := i386-elf-as ASFLAGS := CC := i386-elf-gcc -CCFLAGS := -std=gnu99 -ffreestanding -O2 -Wall -Wextra -iquotelibbozo/headers -g +CCFLAGS := -std=gnu99 -ffreestanding -O2 -Wall -Wextra -iquotelibbozo/headers -iquoteheaders -g LD := $(CC) LDFLAGS := -T boot/linker.ld -ffreestanding -O2 -nostdlib -LIBS := ./libbozo/build/libbozo.a -lgcc +LIBS := -L libbozo/build/ -lbozo -lgcc SSRC := $(shell find $(SOURCEDIR) -name '*.s') CSRC := $(shell find $(SOURCEDIR) -name '*.c') diff --git a/libbozo/headers/kprintf.h b/headers/kprintf.h similarity index 100% rename from libbozo/headers/kprintf.h rename to headers/kprintf.h diff --git a/headers/terminal.h b/headers/terminal.h new file mode 100644 index 0000000..162fdf0 --- /dev/null +++ b/headers/terminal.h @@ -0,0 +1,128 @@ +#pragma once + +#include +#include +#include + +#define VGA_WIDTH 80 +#define VGA_HEIGHT 25 +#define TERM_BUF ((uint16_t *)0xB8000) +#define TERM_COUNT 10 + +#define KEYBOARD_PORT 0x60 + +#define KEY_A 0x1E +#define KEY_B 0x30 +#define KEY_C 0x2E +#define KEY_D 0x20 +#define KEY_E 0x12 +#define KEY_F 0x21 +#define KEY_G 0x22 +#define KEY_H 0x23 +#define KEY_I 0x17 +#define KEY_J 0x24 +#define KEY_K 0x25 +#define KEY_L 0x26 +#define KEY_M 0x32 +#define KEY_N 0x31 +#define KEY_O 0x18 +#define KEY_P 0x19 +#define KEY_Q 0x10 +#define KEY_R 0x13 +#define KEY_S 0x1F +#define KEY_T 0x14 +#define KEY_U 0x16 +#define KEY_V 0x2F +#define KEY_W 0x11 +#define KEY_X 0x2D +#define KEY_Y 0x15 +#define KEY_Z 0x2C +#define KEY_1 0x02 +#define KEY_2 0x03 +#define KEY_3 0x04 +#define KEY_4 0x05 +#define KEY_5 0x06 +#define KEY_6 0x07 +#define KEY_7 0x08 +#define KEY_8 0x09 +#define KEY_9 0x0A +#define KEY_0 0x0B +#define KEY_MINUS 0x0C +#define KEY_EQUAL 0x0D +#define KEY_SQUARE_OPEN_BRACKET 0x1A +#define KEY_SQUARE_CLOSE_BRACKET 0x1B +#define KEY_SEMICOLON 0x27 +#define KEY_BACKSLASH 0x2B +#define KEY_COMMA 0x33 +#define KEY_DOT 0x34 +#define KEY_FORESLHASH 0x35 +#define KEY_F1 0x3B +#define KEY_F2 0x3C +#define KEY_F3 0x3D +#define KEY_F4 0x3E +#define KEY_F5 0x3F +#define KEY_F6 0x40 +#define KEY_F7 0x41 +#define KEY_F8 0x42 +#define KEY_F9 0x43 +#define KEY_F10 0x44 +#define KEY_F11 0x85 +#define KEY_F12 0x86 +#define KEY_BACKSPACE 0x0E +#define KEY_DELETE 0x53 +#define KEY_DOWN 0x50 +#define KEY_END 0x4F +#define KEY_ENTER 0x1C +#define KEY_ESC 0x01 +#define KEY_HOME 0x47 +#define KEY_INSERT 0x52 +#define KEY_KEYPAD_5 0x4C +#define KEY_KEYPAD_MUL 0x37 +#define KEY_KEYPAD_Minus 0x4A +#define KEY_KEYPAD_PLUS 0x4E +#define KEY_KEYPAD_DIV 0x35 +#define KEY_LEFT 0x4B +#define KEY_PAGE_DOWN 0x51 +#define KEY_PAGE_UP 0x49 +#define KEY_PRINT_SCREEN 0x37 +#define KEY_RIGHT 0x4D +#define KEY_SPACE 0x39 +#define KEY_TAB 0x0F +#define KEY_UP 0x48 + +struct screen { + size_t row; + size_t column; + uint8_t color; + uint16_t buffer[VGA_WIDTH * VGA_HEIGHT]; +}; + +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_BROWN = 6, + VGA_COLOR_LIGHT_GREY = 7, + VGA_COLOR_DARK_GREY = 8, + VGA_COLOR_LIGHT_BLUE = 9, + VGA_COLOR_LIGHT_GREEN = 10, + VGA_COLOR_LIGHT_CYAN = 11, + VGA_COLOR_LIGHT_RED = 12, + VGA_COLOR_LIGHT_MAGENTA = 13, + VGA_COLOR_LIGHT_BROWN = 14, + VGA_COLOR_WHITE = 15, +}; + +void terminal_initialize(void); +void terminal_setcolor(uint8_t color); +void terminal_putentryat(char c, uint8_t color, size_t x, size_t y); +int terminal_putchar(char c); +int terminal_write(const char *data, size_t size); +int terminal_writestring(const char *data); +int terminal_writelong(long number); +void terminal_set_screen(int pos); +uint8_t terminal_getkey(void); +void update_cursor(void); diff --git a/libbozo/headers/sys/io.h b/libbozo/headers/sys/io.h index 48ab534..c072f04 100644 --- a/libbozo/headers/sys/io.h +++ b/libbozo/headers/sys/io.h @@ -1,16 +1,15 @@ #pragma once +#include + static inline void outb(uint16_t port, uint8_t val) { - __asm__ volatile ( "outb %b0, %w1" : : "a"(val), "Nd"(port) : "memory"); + __asm__ volatile("outb %b0, %w1" : : "a"(val), "Nd"(port) : "memory"); } static inline uint8_t inb(uint16_t port) { - uint8_t ret; - __asm__ volatile ( "inb %w1, %b0" - : "=a"(ret) - : "Nd"(port) - : "memory"); - return ret; -} \ No newline at end of file + uint8_t ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port) : "memory"); + return ret; +} diff --git a/libbozo/headers/terminal.h b/libbozo/headers/terminal.h deleted file mode 100644 index ffb338e..0000000 --- a/libbozo/headers/terminal.h +++ /dev/null @@ -1,115 +0,0 @@ -#pragma once - -#include -#include -#include - -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_BROWN = 6, - VGA_COLOR_LIGHT_GREY = 7, - VGA_COLOR_DARK_GREY = 8, - VGA_COLOR_LIGHT_BLUE = 9, - VGA_COLOR_LIGHT_GREEN = 10, - VGA_COLOR_LIGHT_CYAN = 11, - VGA_COLOR_LIGHT_RED = 12, - VGA_COLOR_LIGHT_MAGENTA = 13, - VGA_COLOR_LIGHT_BROWN = 14, - VGA_COLOR_WHITE = 15, -}; - -void terminal_initialize(void); -void terminal_setcolor(uint8_t color); -void terminal_putentryat(char c, uint8_t color, size_t x, size_t y); -int terminal_putchar(char c); -int terminal_write(const char* data, size_t size); -int terminal_writestring(const char* data); -int terminal_writelong(long number); - -#define KEYBOARD_PORT 0x60 - -#define KEY_A 0x1E -#define KEY_B 0x30 -#define KEY_C 0x2E -#define KEY_D 0x20 -#define KEY_E 0x12 -#define KEY_F 0x21 -#define KEY_G 0x22 -#define KEY_H 0x23 -#define KEY_I 0x17 -#define KEY_J 0x24 -#define KEY_K 0x25 -#define KEY_L 0x26 -#define KEY_M 0x32 -#define KEY_N 0x31 -#define KEY_O 0x18 -#define KEY_P 0x19 -#define KEY_Q 0x10 -#define KEY_R 0x13 -#define KEY_S 0x1F -#define KEY_T 0x14 -#define KEY_U 0x16 -#define KEY_V 0x2F -#define KEY_W 0x11 -#define KEY_X 0x2D -#define KEY_Y 0x15 -#define KEY_Z 0x2C -#define KEY_1 0x02 -#define KEY_2 0x03 -#define KEY_3 0x04 -#define KEY_4 0x05 -#define KEY_5 0x06 -#define KEY_6 0x07 -#define KEY_7 0x08 -#define KEY_8 0x09 -#define KEY_9 0x0A -#define KEY_0 0x0B -#define KEY_MINUS 0x0C -#define KEY_EQUAL 0x0D -#define KEY_SQUARE_OPEN_BRACKET 0x1A -#define KEY_SQUARE_CLOSE_BRACKET 0x1B -#define KEY_SEMICOLON 0x27 -#define KEY_BACKSLASH 0x2B -#define KEY_COMMA 0x33 -#define KEY_DOT 0x34 -#define KEY_FORESLHASH 0x35 -#define KEY_F1 0x3B -#define KEY_F2 0x3C -#define KEY_F3 0x3D -#define KEY_F4 0x3E -#define KEY_F5 0x3F -#define KEY_F6 0x40 -#define KEY_F7 0x41 -#define KEY_F8 0x42 -#define KEY_F9 0x43 -#define KEY_F10 0x44 -#define KEY_F11 0x85 -#define KEY_F12 0x86 -#define KEY_BACKSPACE 0x0E -#define KEY_DELETE 0x53 -#define KEY_DOWN 0x50 -#define KEY_END 0x4F -#define KEY_ENTER 0x1C -#define KEY_ESC 0x01 -#define KEY_HOME 0x47 -#define KEY_INSERT 0x52 -#define KEY_KEYPAD_5 0x4C -#define KEY_KEYPAD_MUL 0x37 -#define KEY_KEYPAD_Minus 0x4A -#define KEY_KEYPAD_PLUS 0x4E -#define KEY_KEYPAD_DIV 0x35 -#define KEY_LEFT 0x4B -#define KEY_PAGE_DOWN 0x51 -#define KEY_PAGE_UP 0x49 -#define KEY_PRINT_SCREEN 0x37 -#define KEY_RIGHT 0x4D -#define KEY_SPACE 0x39 -#define KEY_TAB 0x0F -#define KEY_UP 0x48 - -uint8_t terminal_getkey(); \ No newline at end of file diff --git a/libbozo/src/string/memcpy.c b/libbozo/src/string/memcpy.c index 70d4eb4..e2417ae 100644 --- a/libbozo/src/string/memcpy.c +++ b/libbozo/src/string/memcpy.c @@ -1,14 +1,12 @@ -#include "kprintf.h" #include #include void *memcpy(void *dest, const void *src, size_t n) { - uint16_t *c1 = (uint16_t *)dest; - const uint16_t *c2 = (const uint16_t *)src; + uint8_t *c1 = (uint8_t *)dest; + const uint8_t *c2 = (const uint8_t *)src; for (size_t i = 0; i < n; i++) c1[i] = c2[i]; - kprintf(0, "c1: %s\n", c1); return c1; } diff --git a/libbozo/src/terminal/get.c b/libbozo/src/terminal/get.c deleted file mode 100644 index e1d18b7..0000000 --- a/libbozo/src/terminal/get.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "terminal.h" -#include "sys/io.h" -#include "kprintf.h" - -uint8_t terminal_getkey() -{ - static uint8_t prev_scan_code = 0; - uint8_t scan_code; - - scan_code = inb(KEYBOARD_PORT); - if (scan_code != prev_scan_code && prev_scan_code != 0) - kprintf(0, "%d", scan_code); - prev_scan_code = scan_code; - return scan_code; -} \ No newline at end of file diff --git a/src/kernel.c b/src/kernel.c index 4e8125e..5d5cf31 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -24,6 +24,7 @@ void kernel_main(void) /* Newline support is left as an exercise. */ for (int i = 1001; i; i--) kprintf(0, "%d\n", i); + kprintf(0, "mange ta mere avec ton argument a kprintf fdp\n"); while (true) terminal_getkey(); } diff --git a/libbozo/src/kprint/kprintf.c b/src/kprint/kprintf.c similarity index 85% rename from libbozo/src/kprint/kprintf.c rename to src/kprint/kprintf.c index 2eafaa0..db7db2d 100644 --- a/libbozo/src/kprint/kprintf.c +++ b/src/kprint/kprintf.c @@ -1,18 +1,17 @@ #include "kprintf.h" +#include "ctype.h" #include "string.h" #include "terminal.h" -#include "ctype.h" #include int kprintf(int level, const char *restrict format, ...) { - va_list va; - int i; + va_list va; + int i; va_start(va, format); i = kvprintf(level, format, va); va_end(va); - - return (i); -} \ No newline at end of file + return i; +} diff --git a/libbozo/src/kprint/kvprintf.c b/src/kprint/kvprintf.c similarity index 96% rename from libbozo/src/kprint/kvprintf.c rename to src/kprint/kvprintf.c index 2f18982..ee19cdf 100644 --- a/libbozo/src/kprint/kvprintf.c +++ b/src/kprint/kvprintf.c @@ -28,6 +28,7 @@ int kvprintf(int level, const char *restrict format, va_list ap) const char *start = format; int ret = 0; + (void)level; while (*start != '\0') { if (*start == '%' && *(start + 1) != '\0') { ret += print_flag(*(start + 1), &ap); @@ -37,5 +38,6 @@ int kvprintf(int level, const char *restrict format, va_list ap) } start++; } + update_cursor(); return ret; } diff --git a/src/terminal/get.c b/src/terminal/get.c new file mode 100644 index 0000000..4361b08 --- /dev/null +++ b/src/terminal/get.c @@ -0,0 +1,18 @@ +#include "kprintf.h" +#include "sys/io.h" +#include "terminal.h" + +uint8_t terminal_getkey(void) +{ + static uint8_t prev_scan_code = 0; + uint8_t scan_code; + + scan_code = inb(KEYBOARD_PORT); + if (scan_code != prev_scan_code && prev_scan_code != 0) { + kprintf(0, "%d", scan_code); + if (scan_code >= KEY_F1 && scan_code <= KEY_F10) + terminal_set_screen(scan_code - KEY_F1); + } + prev_scan_code = scan_code; + return scan_code; +} diff --git a/libbozo/src/terminal/put.c b/src/terminal/put.c similarity index 58% rename from libbozo/src/terminal/put.c rename to src/terminal/put.c index d752be5..3083c13 100644 --- a/libbozo/src/terminal/put.c +++ b/src/terminal/put.c @@ -1,12 +1,16 @@ -#include "terminal.h" #include "ctype.h" #include "kprintf.h" #include "string.h" +#include "sys/io.h" +#include "terminal.h" #include #include #include +static struct screen screens[TERM_COUNT]; +struct screen *screen = &screens[0]; + static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) { return fg | bg << 4; @@ -17,64 +21,67 @@ static inline uint16_t vga_entry(unsigned char uc, uint8_t color) return (uint16_t)uc | (uint16_t)color << 8; } -#define VGA_WIDTH 80 -#define VGA_HEIGHT 25 - -size_t terminal_row; -size_t terminal_column; -uint8_t terminal_color; -uint16_t *terminal_buffer; void terminal_initialize(void) { - terminal_row = 0; - terminal_column = 0; - terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); - terminal_buffer = (uint16_t *)0xB8000; for (size_t y = 0; y < VGA_HEIGHT; y++) { for (size_t x = 0; x < VGA_WIDTH; x++) { const size_t index = y * VGA_WIDTH + x; - terminal_buffer[index] = vga_entry(' ', terminal_color); + TERM_BUF[index] = vga_entry(' ', screen->color); } } + for (int i = 0; i < TERM_COUNT; i++) { + screens[i].row = 0; + screens[i].column = 0; + screens[i].color = + vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); + memcpy(screens[i].buffer, TERM_BUF, sizeof(screen->buffer)); + } +} + +void terminal_set_screen(int pos) +{ + memcpy(screen->buffer, TERM_BUF, sizeof(screen->buffer)); + screen = &screens[pos]; + memcpy(TERM_BUF, screen->buffer, sizeof(screen->buffer)); } void terminal_setcolor(uint8_t color) { - terminal_color = color; + screen->color = color; } void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) { const size_t index = y * VGA_WIDTH + x; - terminal_buffer[index] = vga_entry(c, color); + TERM_BUF[index] = vga_entry(c, color); } static void terminal_scroll(void) { - terminal_row--; + screen->row--; for (size_t i = 0; i < VGA_WIDTH * (VGA_HEIGHT - 1); i++) - terminal_buffer[i] = terminal_buffer[i + VGA_WIDTH]; + TERM_BUF[i] = TERM_BUF[i + VGA_WIDTH]; for (size_t i = 0; i < VGA_WIDTH; i++) - terminal_putentryat(' ', terminal_color, i, VGA_HEIGHT - 1); + terminal_putentryat(' ', screen->color, i, VGA_HEIGHT - 1); } static void terminal_new_line(void) { - terminal_column = 0; - if (++terminal_row == VGA_HEIGHT) + screen->column = 0; + if (++screen->row == VGA_HEIGHT) terminal_scroll(); } int terminal_putchar(char c) { if (c == '\r') - terminal_column = 0; + screen->column = 0; else if (c == '\n') terminal_new_line(); if (!isprint(c)) return 1; - terminal_putentryat(c, terminal_color, terminal_column, terminal_row); - if (++terminal_column == VGA_WIDTH) + terminal_putentryat(c, screen->color, screen->column, screen->row); + if (++screen->column == VGA_WIDTH) terminal_new_line(); return 1; } @@ -111,3 +118,13 @@ int terminal_writelong(long n) } return rv; } + +void update_cursor(void) +{ + uint16_t pos = screen->row * VGA_WIDTH + screen->column; + + outb(0x3D4, 0x0F); + outb(0x3D5, pos & 0xFF); + outb(0x3D4, 0x0E); + outb(0x3D5, (pos >> 8) & 0xFF); +}