Espresso 0.0.2a
This commit is contained in:
@ -19,8 +19,8 @@ void irq_init(void)
|
||||
{
|
||||
func_list[i] = 0x0;
|
||||
}
|
||||
set_irq_handler(0, (irq_func_t*)pit_handler);
|
||||
set_irq_handler(1, (irq_func_t*)keyboard_handler);
|
||||
set_irq_handler(0, (irq_func_t*) pit_handler);
|
||||
set_irq_handler(1, (irq_func_t*) keyboard_handler);
|
||||
}
|
||||
|
||||
void irq_handler(uint8_t irq_number)
|
||||
|
||||
@ -48,4 +48,3 @@ void pit_sleep(uint64_t ms)
|
||||
asm volatile ("hlt");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -31,6 +31,14 @@
|
||||
|
||||
#define RETURN_STI() do { _sti_asm(); return; } while (0)
|
||||
|
||||
|
||||
#define GETS_BUFFER_SIZE 256
|
||||
|
||||
static char gets_buffer[GETS_BUFFER_SIZE];
|
||||
volatile char* gets_string = gets_buffer;
|
||||
volatile int32_t gets_capacity = GETS_BUFFER_SIZE;
|
||||
volatile int32_t gets_length = 0;
|
||||
|
||||
bool ps2keyboard_initialized = false;
|
||||
|
||||
/* State for shift key */
|
||||
@ -50,11 +58,8 @@ static volatile bool gets_finished = false;
|
||||
|
||||
volatile unsigned char current_char;
|
||||
volatile char* current_string = NULL;
|
||||
volatile char* gets_string = NULL;
|
||||
volatile int32_t current_length = 0;
|
||||
volatile int32_t gets_length = 0;
|
||||
volatile int32_t capacity = 0;
|
||||
volatile int32_t gets_capacity = 0;
|
||||
volatile uint16_t current_key;
|
||||
|
||||
volatile ps2_hook_t* hooks = NULL;
|
||||
@ -88,7 +93,7 @@ void keyboard_init(void)
|
||||
|
||||
outb(0x64, 0xAE); /* Enable keyboard interface (often optional, but here for safety) */
|
||||
|
||||
hooks = (ps2_hook_t*) malloc(sizeof(ps2_hook_t) * hook_count);
|
||||
hooks = NULL;
|
||||
|
||||
ps2keyboard_initialized = true;
|
||||
|
||||
@ -251,143 +256,95 @@ char* get_string(void)
|
||||
return current_string;
|
||||
}
|
||||
|
||||
static inline void print_(void)
|
||||
{
|
||||
static char ch = 'a';
|
||||
|
||||
int r = 0, c = 0;
|
||||
|
||||
terminal_get_cursor(&r, &c);
|
||||
terminal_set_cursor((uint16_t) 30, (uint16_t) 0);
|
||||
printf("%c", ch);
|
||||
terminal_set_cursor((uint16_t) r, (uint16_t) c);
|
||||
|
||||
ch++;
|
||||
}
|
||||
|
||||
char* kbd_gets(void)
|
||||
{
|
||||
gets_called = true;
|
||||
gets_finished = false;
|
||||
|
||||
while (gets_finished != true)
|
||||
gets_length = 0;
|
||||
gets_string[0] = '\0';
|
||||
|
||||
while (!gets_finished)
|
||||
{
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
char* result = strdup(gets_string); /* Could be NULL, that is checked below */
|
||||
|
||||
free(gets_string);
|
||||
|
||||
gets_string = NULL;
|
||||
gets_capacity = 0;
|
||||
|
||||
_cli_asm();
|
||||
|
||||
char* result = strdup((char*) gets_string);
|
||||
|
||||
gets_length = 0;
|
||||
gets_string[0] = '\0';
|
||||
gets_called = false;
|
||||
|
||||
return result == NULL ? "" : result;
|
||||
|
||||
_sti_asm();
|
||||
|
||||
return result ? result : "";
|
||||
}
|
||||
|
||||
void gets_append_char(unsigned char c)
|
||||
{
|
||||
_cli_asm();
|
||||
|
||||
if (!gets_string && gets_capacity > 0)
|
||||
if (!gets_called)
|
||||
{
|
||||
printf("[keyboard] ERROR: gets_string is NULL but capacity > 0!\n");
|
||||
RETURN_STI();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (c == KEY_ARROW_UP || c == KEY_ARROW_DOWN || c == KEY_ARROW_RIGHT || c == KEY_ARROW_LEFT)
|
||||
{
|
||||
gets_string[1] = '\0';
|
||||
|
||||
char tc = '\0';
|
||||
|
||||
switch (c)
|
||||
if (GETS_BUFFER_SIZE >= 2)
|
||||
{
|
||||
case KEY_ARROW_UP:
|
||||
tc = KEY_UP;
|
||||
break;
|
||||
case KEY_ARROW_DOWN:
|
||||
tc = KEY_DOWN;
|
||||
break;
|
||||
case KEY_ARROW_RIGHT:
|
||||
tc = KEY_RIGHT;
|
||||
break;
|
||||
case KEY_ARROW_LEFT:
|
||||
tc = KEY_LEFT;
|
||||
break;
|
||||
default:
|
||||
tc = '\0';
|
||||
break;
|
||||
gets_string[0] = (char)c;
|
||||
gets_string[1] = '\0';
|
||||
}
|
||||
|
||||
gets_string[0] = tc;
|
||||
|
||||
|
||||
gets_finished = true;
|
||||
|
||||
RETURN_STI();
|
||||
return;
|
||||
}
|
||||
else if (c == '\n')
|
||||
{
|
||||
/* The returned string must/will not have newlines in it, so we return here after setting gets_finished to 'true'. */
|
||||
|
||||
gets_finished = true;
|
||||
|
||||
printf("\n");
|
||||
|
||||
RETURN_STI();
|
||||
return;
|
||||
}
|
||||
else if (c == 27) /* ASCII escape, here it's used to cancel input. */
|
||||
else if (c == 27)
|
||||
{
|
||||
gets_finished = true;
|
||||
gets_string[0] = '\0';
|
||||
|
||||
RETURN_STI();
|
||||
gets_finished = true;
|
||||
return;
|
||||
}
|
||||
else if (c == '\b')
|
||||
{
|
||||
if (gets_length < 1)
|
||||
if (gets_length > 0)
|
||||
{
|
||||
RETURN_STI();
|
||||
gets_length--;
|
||||
gets_string[gets_length] = '\0';
|
||||
printf("\b \b");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
gets_length--;
|
||||
if (gets_length < GETS_BUFFER_SIZE - 1)
|
||||
{
|
||||
gets_string[gets_length++] = (char)c;
|
||||
gets_string[gets_length] = '\0';
|
||||
|
||||
printf("\b \b");
|
||||
|
||||
RETURN_STI();
|
||||
printf("%c", c);
|
||||
}
|
||||
|
||||
if ((gets_length) >= gets_capacity)
|
||||
{
|
||||
int new_capacity = (gets_capacity == 0) ? 64 : gets_capacity * 2;
|
||||
|
||||
char* new_str = (char*) malloc(new_capacity);
|
||||
|
||||
if (!new_str)
|
||||
{
|
||||
RETURN_STI();
|
||||
}
|
||||
|
||||
if (gets_string)
|
||||
{
|
||||
for (int i = 0; i < gets_length; i++)
|
||||
{
|
||||
new_str[i] = gets_string[i];
|
||||
}
|
||||
|
||||
new_str[gets_length] = '\0';
|
||||
|
||||
free(gets_string);
|
||||
}
|
||||
|
||||
gets_string = new_str;
|
||||
gets_capacity = new_capacity;
|
||||
}
|
||||
|
||||
if (!gets_string)
|
||||
{
|
||||
RETURN_STI();
|
||||
}
|
||||
|
||||
gets_string[gets_length] = (char) c;
|
||||
gets_length++;
|
||||
gets_string[gets_length] = '\0';
|
||||
|
||||
printf("%c", c);
|
||||
|
||||
RETURN_STI();
|
||||
}
|
||||
|
||||
|
||||
void append_char(char c)
|
||||
{
|
||||
_cli_asm();
|
||||
|
||||
@ -18,6 +18,12 @@ void terminal_initialize(void)
|
||||
terminal_update_cursor();
|
||||
}
|
||||
|
||||
void terminal_get_cursor(int* row, int* column)
|
||||
{
|
||||
*row = (int) terminal_row;
|
||||
*column = (int) terminal_column;
|
||||
}
|
||||
|
||||
void terminal_initializec(uint8_t color)
|
||||
{
|
||||
terminal_row = 0;
|
||||
@ -170,12 +176,15 @@ void terminal_writeline(const char* data)
|
||||
|
||||
void terminal_writechar_r(const char ch)
|
||||
{
|
||||
unsigned char uch = ch;
|
||||
size_t saved_row = terminal_row;
|
||||
size_t saved_col = terminal_column;
|
||||
|
||||
for (size_t i = 0; i < VGA_WIDTH; i++)
|
||||
{
|
||||
terminal_putchar(uch);
|
||||
terminal_putentryat(ch, terminal_color, i, saved_row);
|
||||
}
|
||||
|
||||
terminal_set_cursor(saved_row, saved_col);
|
||||
}
|
||||
|
||||
void terminal_clear(void)
|
||||
@ -185,46 +194,49 @@ void terminal_clear(void)
|
||||
|
||||
void terminal_clearl(size_t num_lines)
|
||||
{
|
||||
if (num_lines == (size_t) -1)
|
||||
if (num_lines == (size_t)-1)
|
||||
{
|
||||
terminal_initializec(terminal_getcolor());
|
||||
}
|
||||
else
|
||||
{
|
||||
/* XXX note to self: VGA_HEIGHT is 25, and VGA_WIDTH is 80 XXX */
|
||||
/* static size_t terminal_row; static size_t terminal_column; */
|
||||
|
||||
terminal_row = VGA_HEIGHT;
|
||||
terminal_column = 0;
|
||||
|
||||
while (terminal_row < num_lines)
|
||||
if (num_lines > VGA_HEIGHT)
|
||||
{
|
||||
for (int32_t k = 0; k < (int32_t)VGA_WIDTH; k++)
|
||||
{
|
||||
terminal_putentryat((unsigned char)' ', terminal_getcolor(), (size_t)terminal_row, (size_t)k);
|
||||
}
|
||||
terminal_row -= 1;
|
||||
num_lines = VGA_HEIGHT;
|
||||
}
|
||||
|
||||
size_t start = VGA_HEIGHT - num_lines;
|
||||
for (size_t y = start; y < VGA_HEIGHT; y++)
|
||||
{
|
||||
for (size_t x = 0; x < VGA_WIDTH; x++)
|
||||
{
|
||||
terminal_putentryat(' ', terminal_getcolor(), x, y);
|
||||
}
|
||||
}
|
||||
|
||||
terminal_set_cursor(start, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void terminal_scroll(void)
|
||||
{
|
||||
|
||||
memmove(
|
||||
terminal_buffer,
|
||||
terminal_buffer + VGA_WIDTH,
|
||||
sizeof(uint16_t) * VGA_WIDTH * (VGA_HEIGHT/* + 1*/)
|
||||
sizeof(uint16_t) * VGA_WIDTH * (VGA_HEIGHT - 1)
|
||||
);
|
||||
|
||||
|
||||
terminal_row = VGA_HEIGHT - 1;
|
||||
|
||||
for (int32_t k = 0; k < (int32_t)VGA_WIDTH; k++)
|
||||
for (int32_t x = 0; x < (int32_t)VGA_WIDTH; x++)
|
||||
{
|
||||
terminal_putentryat((unsigned char)' ', terminal_getcolor(), (size_t)terminal_row, (size_t)k);
|
||||
terminal_putentryat(' ', terminal_getcolor(), (size_t)x, (size_t)terminal_row);
|
||||
}
|
||||
|
||||
terminal_column = 0;
|
||||
terminal_update_cursor();
|
||||
}
|
||||
|
||||
|
||||
unsigned char terminal_get_shifted(unsigned char uc)
|
||||
{
|
||||
unsigned char lowerc[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '\0' };
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
#include <stddef.h>
|
||||
#include <vga/vga.h>
|
||||
|
||||
uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) {
|
||||
return fg | bg << 4;
|
||||
uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg)
|
||||
{
|
||||
return fg | bg << 4;
|
||||
}
|
||||
|
||||
uint16_t vga_entry(unsigned char uc, uint8_t color) {
|
||||
return (uint16_t) uc | (uint16_t) color << 8;
|
||||
uint16_t vga_entry(unsigned char uc, uint8_t color)
|
||||
{
|
||||
return (uint16_t) uc | (uint16_t) color << 8;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user