diff --git a/Makefile b/Makefile index 4b578fb..ab9f590 100644 --- a/Makefile +++ b/Makefile @@ -31,4 +31,4 @@ $(NAME) : $(OBJ) re: fclean all -.PHONY: clean fclean test all re \ No newline at end of file +.PHONY: clean fclean test all re diff --git a/headers/string.h b/headers/string.h index 513f7b8..0d3d83d 100644 --- a/headers/string.h +++ b/headers/string.h @@ -7,3 +7,4 @@ int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); size_t strlen(const char *str); char *strstr(const char *haystack, const char *needle); +void *memcpy(void *dest, const void *src, size_t n); diff --git a/src/string/memcpy.c b/src/string/memcpy.c new file mode 100644 index 0000000..70d4eb4 --- /dev/null +++ b/src/string/memcpy.c @@ -0,0 +1,14 @@ +#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; + + for (size_t i = 0; i < n; i++) + c1[i] = c2[i]; + kprintf(0, "c1: %s\n", c1); + return c1; +} diff --git a/src/terminal/put.c b/src/terminal/put.c index 5eed2be..d752be5 100644 --- a/src/terminal/put.c +++ b/src/terminal/put.c @@ -1,19 +1,20 @@ #include "terminal.h" -#include "string.h" #include "ctype.h" +#include "kprintf.h" +#include "string.h" #include #include #include -static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) +static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) { return fg | bg << 4; } -static inline uint16_t vga_entry(unsigned char uc, uint8_t color) +static inline uint16_t vga_entry(unsigned char uc, uint8_t color) { - return (uint16_t) uc | (uint16_t) color << 8; + return (uint16_t)uc | (uint16_t)color << 8; } #define VGA_WIDTH 80 @@ -22,14 +23,13 @@ static inline uint16_t vga_entry(unsigned char uc, uint8_t color) size_t terminal_row; size_t terminal_column; uint8_t terminal_color; -uint16_t* terminal_buffer; - -void terminal_initialize(void) +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; + 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; @@ -38,49 +38,60 @@ void terminal_initialize(void) } } -void terminal_setcolor(uint8_t color) +void terminal_setcolor(uint8_t color) { terminal_color = color; } -void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) +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); } -int terminal_putchar(char c) +static void terminal_scroll(void) +{ + terminal_row--; + for (size_t i = 0; i < VGA_WIDTH * (VGA_HEIGHT - 1); i++) + terminal_buffer[i] = terminal_buffer[i + VGA_WIDTH]; + for (size_t i = 0; i < VGA_WIDTH; i++) + terminal_putentryat(' ', terminal_color, i, VGA_HEIGHT - 1); +} + +static void terminal_new_line(void) +{ + terminal_column = 0; + if (++terminal_row == VGA_HEIGHT) + terminal_scroll(); +} + +int terminal_putchar(char c) { if (c == '\r') terminal_column = 0; - else if (c == '\n') { - terminal_column = 0; - terminal_row++; - } + 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_column = 0; - if (++terminal_row == VGA_HEIGHT) - terminal_row = 0; - } - return 1; + if (++terminal_column == VGA_WIDTH) + terminal_new_line(); + return 1; } -int terminal_write(const char* data, size_t size) +int terminal_write(const char *data, size_t size) { - size_t i; + size_t i; for (i = 0; i < size; i++) terminal_putchar(data[i]); - return (int) i; + return (int)i; } -int terminal_writestring(const char* data) +int terminal_writestring(const char *data) { - size_t len = strlen(data); + size_t len = strlen(data); terminal_write(data, len); - return len; + return len; } int terminal_writelong(long n) @@ -99,4 +110,4 @@ int terminal_writelong(long n) div /= 10; } return rv; -} \ No newline at end of file +}