Espresso 0.0.2a

This commit is contained in:
2026-02-12 20:33:46 -06:00
parent c0dc95e255
commit 021fdbbcef
26 changed files with 452 additions and 27315 deletions

View File

@ -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)

View File

@ -48,4 +48,3 @@ void pit_sleep(uint64_t ms)
asm volatile ("hlt");
}
}

View File

@ -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();

View File

@ -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' };

View File

@ -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;
}