From 2503938fc49256b3ac36dfdfea84d71ba6e3a654 Mon Sep 17 00:00:00 2001 From: Andreew Gregory Date: Sat, 4 Apr 2026 12:36:25 +0300 Subject: [PATCH] shift done, backspace done --- bootmain.c | 2 +- cpu/memlayout.h | 2 +- drivers/keyboard.c | 4 ++++ drivers/keyboard.h | 4 +++- drivers/vga.c | 33 ++++++++++++--------------------- drivers/vga.h | 21 ++++++++++++++++++++- kernel.c | 23 +++++++++++++++-------- 7 files changed, 56 insertions(+), 33 deletions(-) diff --git a/bootmain.c b/bootmain.c index 77d3263..516b61b 100644 --- a/bootmain.c +++ b/bootmain.c @@ -27,7 +27,7 @@ bootmain(void) void (*entry)(void); uchar* pa; - elf = (Elf32_Ehdr*)0x10000; // scratch space + elf = (Elf32_Ehdr*)0x20000; // scratch space // Read 1st page off disk readseg((uchar*)elf, 4096, 0); diff --git a/cpu/memlayout.h b/cpu/memlayout.h index fd0dcbd..62dfd22 100644 --- a/cpu/memlayout.h +++ b/cpu/memlayout.h @@ -2,7 +2,7 @@ #define KERNBASE 0x80000000 #define PGSIZE 0x1000 -#define PHYSTOP 0x8000000 +#define PHYSTOP 0x8000000 // 128 Mib #define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1)) #define PGROUNDDOWN(a) (((a)) & ~((uintptr_t)(PGSIZE-1))) diff --git a/drivers/keyboard.c b/drivers/keyboard.c index 381a385..9c60d44 100644 --- a/drivers/keyboard.c +++ b/drivers/keyboard.c @@ -41,4 +41,8 @@ uint8_t kbd_take_from_copy_buffer() { bool kbd_can_take_from_copy_buffer() { return kbd_state_shrd.copy_len > 0; +} +bool kbd_is_pressed(uint8_t code) { + check(code < 128); + return kbd_state_shrd.copy_pressed[code >> 3] & (1u << (code & 0x7)); } \ No newline at end of file diff --git a/drivers/keyboard.h b/drivers/keyboard.h index 508658f..337ac17 100644 --- a/drivers/keyboard.h +++ b/drivers/keyboard.h @@ -16,6 +16,7 @@ typedef struct { #define KEYCODE_SHIFT 42 #define KEYCODE_ENTER 28 +#define KEYCODE_BACKSPACE 14 /* decoding */ static const char keysym_mapped_ascii_lower[] = { @@ -40,4 +41,5 @@ extern keyboard_interrupt_shared_t kbd_state_shrd; void init_keyboard(); uint8_t kbd_take_from_copy_buffer(); -bool kbd_can_take_from_copy_buffer(); \ No newline at end of file +bool kbd_can_take_from_copy_buffer(); +bool kbd_is_pressed(uint8_t code); \ No newline at end of file diff --git a/drivers/vga.c b/drivers/vga.c index c31dcea..dc28ae3 100644 --- a/drivers/vga.c +++ b/drivers/vga.c @@ -1,3 +1,4 @@ +#include "vga.h" #include "port.h" #include "../lib/string.h" #include "cpu/memlayout.h" @@ -27,22 +28,12 @@ static unsigned char get_color(unsigned char fg, unsigned char bg) { return (bg << 4) + fg; } -enum { - ROWS = 25, - COLS = 80, - - VGA_CTRL_REGISTER = 0x3d4, - VGA_DATA_REGISTER = 0x3d5, - VGA_OFFSET_LOW = 0x0f, - VGA_OFFSET_HIGH = 0x0e, -}; - -static unsigned get_offset(unsigned col, unsigned row) { - return row * COLS + col; +unsigned vga_get_offset(unsigned col, unsigned row) { + return row * VGA_COLS + col; } -static unsigned get_row_from_offset(unsigned offset) { - return offset / COLS; +unsigned vga_get_row_from_offset(unsigned offset) { + return offset / VGA_COLS; } void vga_set_cursor(unsigned offset) { @@ -66,31 +57,31 @@ void vga_set_char(unsigned offset, char c) { } void vga_clear_screen() { - for (unsigned i = 0; i < ROWS * COLS; ++i) { + for (unsigned i = 0; i < VGA_ROWS * VGA_COLS; ++i) { vga_set_char(i, ' '); } vga_set_cursor(0); } static unsigned scroll() { - kmemmove(video_memory, video_memory + 2 * COLS, 2 * COLS * (ROWS-1)); - for (int col = 0; col < COLS; col++) { - vga_set_char(get_offset(col, ROWS - 1), ' '); + kmemmove(video_memory, video_memory + 2 * VGA_COLS, 2 * VGA_COLS * (VGA_ROWS-1)); + for (int col = 0; col < VGA_COLS; col++) { + vga_set_char(vga_get_offset(col, VGA_ROWS - 1), ' '); } - return get_offset(0, ROWS - 1); + return vga_get_offset(0, VGA_ROWS - 1); } void vga_print_string(const char* s) { unsigned offset = vga_get_cursor(); while (*s != 0) { if (*s == '\n') { - offset = get_offset(0, get_row_from_offset(offset) + 1); + offset = vga_get_offset(0, vga_get_row_from_offset(offset) + 1); } else { vga_set_char(offset, *s); offset++; } s++; - if (offset >= COLS * ROWS) { + if (offset >= VGA_COLS * VGA_ROWS) { offset = scroll(); } } diff --git a/drivers/vga.h b/drivers/vga.h index 08634dd..8bdca64 100644 --- a/drivers/vga.h +++ b/drivers/vga.h @@ -1,7 +1,26 @@ #pragma once -void vga_clear_screen(); +#include +enum { + VGA_ROWS = 25, + VGA_COLS = 80, + + VGA_CTRL_REGISTER = 0x3d4, + VGA_DATA_REGISTER = 0x3d5, + VGA_OFFSET_LOW = 0x0f, + VGA_OFFSET_HIGH = 0x0e, +}; + + + +unsigned vga_get_cursor(); +unsigned vga_get_row_from_offset(unsigned offset); +unsigned vga_get_offset(unsigned col, unsigned row); +void vga_set_cursor(unsigned offset); + +void vga_clear_screen(); +void vga_set_char(unsigned offset, char c); void vga_print_string(const char* s); void vgaMode13(); diff --git a/kernel.c b/kernel.c index d8bfe99..0a8bbcb 100644 --- a/kernel.c +++ b/kernel.c @@ -36,14 +36,24 @@ void read_line_input(char* buf, size_t* ret_len, size_t cap) { while (kbd_can_take_from_copy_buffer()) { uint8_t keycode = kbd_take_from_copy_buffer(); - bool shift_pressed = kbd_state_shrd.copy_pressed[42 >> 3] & (42 & 0x7); + bool shift_pressed = kbd_is_pressed(KEYCODE_SHIFT); const size_t keycodes = sizeof(keysym_mapped_ascii_upper); check(keycodes == sizeof(keysym_mapped_ascii_lower)); if (keycode == KEYCODE_ENTER) { goto end; - } - if (keycode < keycodes && keycode) { + } else if (keycode == KEYCODE_BACKSPACE) { + unsigned scr_offset = vga_get_cursor(); + if (len > 0 && scr_offset > 0) { + // if (scr_offset % VGA_COLS) { + // vga_set + // } + // vga_set_char() + vga_set_char(scr_offset - 1, ' '); + vga_set_cursor(scr_offset - 1); + len--; + } + } else if (keycode < keycodes) { char ch = shift_pressed ? keysym_mapped_ascii_upper[keycode] : keysym_mapped_ascii_lower[keycode]; if (ch != 0) { @@ -61,8 +71,6 @@ void read_line_input(char* buf, size_t* ret_len, size_t cap) { asm("hlt"); size_t count = kbd_state_shrd.len; if (count > 0) { - // char haha[2] = {count+'0', 0}; - // printk(haha); cli(); size_t rem = KEYBOARD_INTERRUPT_BUF_CAP - kbd_state_shrd.copy_len; size_t copying = rem < count ? rem : count; @@ -79,9 +87,9 @@ void read_line_input(char* buf, size_t* ret_len, size_t cap) { void kmain() { - freerange(P2V(1u<<20), P2V(2u<<20)); // 1MB - 2MB + freerange(P2V(2u<<20), P2V(3u<<20)); kvmalloc(); // map all of physical memory at KERNBASE - freerange(P2V(2u<<20), P2V(PHYSTOP)); + freerange(P2V(3u<<20), P2V(PHYSTOP)); load_gdt(); init_keyboard(); @@ -116,7 +124,6 @@ void kmain() { const char* cmd = input + 4; run_elf(cmd); } else { - printk("as\n"); printk("unknown command, try: halt | run CMD\n"); } }