shift done, backspace done
This commit is contained in:
parent
79f4d25c27
commit
2503938fc4
@ -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);
|
||||
|
||||
@ -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)))
|
||||
|
||||
@ -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));
|
||||
}
|
||||
@ -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();
|
||||
bool kbd_can_take_from_copy_buffer();
|
||||
bool kbd_is_pressed(uint8_t code);
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,7 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
void vga_clear_screen();
|
||||
#include <stdint.h>
|
||||
|
||||
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();
|
||||
|
||||
23
kernel.c
23
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");
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user