From 77928aca4b03a2f3e2679359840786a404475d30 Mon Sep 17 00:00:00 2001 From: 0x35c Date: Wed, 18 Dec 2024 14:13:45 +0100 Subject: [PATCH] feature: black screen with scrolling is better, it also uses the full screen length --- headers/font.h | 2 -- headers/terminal.h | 6 ++++-- src/multiboot.c | 3 +-- src/shell/exec.c | 8 +++++++- src/terminal/put.c | 36 +++++++++++++++++++----------------- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/headers/font.h b/headers/font.h index c6522e8..b214f0f 100644 --- a/headers/font.h +++ b/headers/font.h @@ -2,8 +2,6 @@ #include -#define FONT_SIZE 13 - struct font { uint32_t height; uint32_t width; diff --git a/headers/terminal.h b/headers/terminal.h index 2980218..21201c9 100644 --- a/headers/terminal.h +++ b/headers/terminal.h @@ -5,10 +5,11 @@ #include #include -#define VGA_WIDTH 80 -#define VGA_HEIGHT 25 #define SCREEN_WIDTH 1024 #define SCREEN_HEIGHT 768 +#define FONT_SIZE 13 +#define VGA_WIDTH (SCREEN_WIDTH / FONT_SIZE) +#define VGA_HEIGHT (SCREEN_HEIGHT / FONT_SIZE) #define TERM_COUNT 10 struct screen { @@ -51,6 +52,7 @@ int terminal_writestring(const char *data); int terminal_writelong(long number); void terminal_set_screen(int pos); void terminal_clear(void); +void terminal_refresh(void); struct key_event terminal_getkey(void); void update_cursor(void); void move_cursor(int direction); diff --git a/src/multiboot.c b/src/multiboot.c index cb2adf6..ddcc924 100644 --- a/src/multiboot.c +++ b/src/multiboot.c @@ -33,8 +33,7 @@ static void init_vbe(multiboot_info_t *mbd_virt) { const uint32_t framebuffer_size = mbd_virt->framebuffer_height * mbd_virt->framebuffer_pitch; - uint32_t i = 0; - for (; i < CEIL(framebuffer_size, PAGE_SIZE); i++) { + for (uint32_t i = 0; i < CEIL(framebuffer_size, PAGE_SIZE); i++) { vbe_page_table[i % 1024] = ((mbd_virt->framebuffer_addr + i * PAGE_SIZE) & PAGE_MASK) | INIT_FLAGS; diff --git a/src/shell/exec.c b/src/shell/exec.c index 2a41beb..ccc47cc 100644 --- a/src/shell/exec.c +++ b/src/shell/exec.c @@ -3,11 +3,13 @@ #include "alloc.h" #include "commands.h" #include "ctype.h" +#include "font.h" #include "kprintf.h" #include "shell.h" #include "string.h" #include "terminal.h" #include "utils.h" +#include "vbe.h" #define BORDER "===========================================================" #define HEADER "Welcome to bozOShell - Available Commands" @@ -34,6 +36,7 @@ const struct shell_command cmds[] = { #define NB_CMDS ARRAY_SIZE(cmds) extern struct screen *screen; +extern struct icon *terminal_bg; extern int line_status; void help_cmd(char *arg) @@ -74,6 +77,9 @@ void auto_complete(void) kprintf("%c", screen->line[i]); } } +void terminal_putentryat(struct font node, uint32_t fg_color, uint32_t bg_color, + size_t x, size_t y); +struct font get_font_node(int c); static char *get_line(void) { @@ -93,7 +99,7 @@ static char *get_line(void) continue; buf[--i] = '\0'; move_cursor(LEFT); - terminal_putchar(' '); + /* terminal_refresh(); */ move_cursor(LEFT); } else if (ev.scan_code == KEY_TAB && i) { auto_complete(); diff --git a/src/terminal/put.c b/src/terminal/put.c index 27c1021..24d4124 100644 --- a/src/terminal/put.c +++ b/src/terminal/put.c @@ -18,6 +18,11 @@ static struct screen screens[TERM_COUNT]; struct screen *screen = &screens[0]; struct font *current_font = eating_pasta_regular_13_font; +struct icon *terminal_bg = &image_icon; + +static struct font get_font_node(int c); +static void terminal_scroll(void); +static void terminal_new_line(void); void terminal_initialize(void) { @@ -26,8 +31,6 @@ void terminal_initialize(void) screens[i].column = 0; screens[i].default_color = 0xffffff; screens[i].fg_color = screens[i].default_color; - /* memcpy(screens[i].buffer, TERM_BUF, sizeof(screen->buffer)); - */ } } @@ -76,21 +79,11 @@ uint8_t terminal_get_char(int x, int y) void terminal_putentryat(struct font node, uint32_t fg_color, uint32_t bg_color, size_t x, size_t y) { - if (node.width == 1 && node.height == 1) { - return; - } char *glyph = node.bitmap; for (size_t cy = 0; cy < node.height; cy++) { for (size_t cx = 0; cx < node.width; cx++) { if (glyph[cy * node.width + cx] == '#') put_pixel(fg_color, x + cx, y + cy); - /* put_pixel((glyph[cy * node.width + - * cx] == '#') ? fg_color */ - /* : bg_color, */ - /* x + cx, y + cy); */ - /* else if (bg_color) */ - /* put_pixel(bg_color, x + cx, y + cy); - */ } } } @@ -100,10 +93,22 @@ static struct font get_font_node(int c) return current_font[c]; } +/* void terminal_refresh(void) */ +/* { */ +/* memset(display.buff, 0, display.height * display.pitch); */ +/* for (size_t i = 0; i < VGA_WIDTH * VGA_HEIGHT; i++) { */ +/* const uint32_t x = (i % VGA_WIDTH) * FONT_SIZE; */ +/* const uint32_t y = (i / VGA_WIDTH) * FONT_SIZE; */ +/* terminal_putentryat(get_font_node(screen->buffer[i]), */ +/* screen->fg_color, screen->bg_color, x, y); + */ +/* } */ +/* } */ + static void terminal_scroll(void) { screen->row--; - draw_icon(0, 0, &image_icon); + memset(display.buff, 0, display.height * display.pitch); for (size_t i = 0; i < VGA_WIDTH * (VGA_HEIGHT - 1); i++) { const uint32_t x = (i % VGA_WIDTH) * FONT_SIZE; const uint32_t y = (i / VGA_WIDTH) * FONT_SIZE; @@ -111,9 +116,6 @@ static void terminal_scroll(void) terminal_putentryat(get_font_node(screen->buffer[i]), screen->fg_color, screen->bg_color, x, y); } - /* for (size_t i = 0; i < VGA_WIDTH; i++) */ - /* terminal_putentryat(get_font_node(' '), 0, 0, i * FONT_SIZE, */ - /* (VGA_HEIGHT - 1) * FONT_SIZE); */ } static void terminal_new_line(void) @@ -153,7 +155,7 @@ void terminal_change_default_color(uint32_t color) void terminal_change_default_fg_color(uint32_t fg_color) { terminal_set_fg_color(fg_color); - terminal_change_default_color(screen->fg_color); + /* terminal_change_default_color(screen->fg_color); */ } void terminal_clear(void)