Espresso 0.0.2a
This commit is contained in:
109
drivers/tty.c
109
drivers/tty.c
@ -1,16 +1,21 @@
|
||||
#include <string.h>
|
||||
#include <vga/vga.h>
|
||||
#include <stdio.h>
|
||||
#include <port_io.h>
|
||||
|
||||
#include <tty.h>
|
||||
|
||||
static size_t terminal_row;
|
||||
static size_t terminal_column;
|
||||
static uint8_t terminal_color;
|
||||
static uint16_t* terminal_buffer;
|
||||
size_t terminal_row;
|
||||
size_t terminal_column;
|
||||
uint8_t terminal_color;
|
||||
uint16_t* terminal_buffer;
|
||||
|
||||
|
||||
void terminal_initialize(void)
|
||||
{
|
||||
terminal_initializec(0x00);
|
||||
|
||||
terminal_update_cursor();
|
||||
}
|
||||
|
||||
void terminal_initializec(uint8_t color)
|
||||
@ -22,11 +27,13 @@ void terminal_initializec(uint8_t color)
|
||||
{
|
||||
terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
terminal_color = color;
|
||||
}
|
||||
|
||||
terminal_buffer = VGA_MEMORY;
|
||||
|
||||
for (size_t y = 0; y < VGA_HEIGHT; y++)
|
||||
{
|
||||
for (size_t x = 0; x < VGA_WIDTH; x++)
|
||||
@ -55,6 +62,7 @@ void terminal_putentryat(unsigned char c, uint8_t color, size_t x, size_t y)
|
||||
|
||||
void terminal_putchar(const char c)
|
||||
{
|
||||
|
||||
unsigned char uc = c;
|
||||
|
||||
if (uc == '\n')
|
||||
@ -62,9 +70,21 @@ void terminal_putchar(const char c)
|
||||
terminal_column = 0;
|
||||
if (++terminal_row == VGA_HEIGHT)
|
||||
{
|
||||
terminal_scroll();
|
||||
terminal_row = VGA_HEIGHT - 1;
|
||||
if (1)
|
||||
{
|
||||
terminal_scroll();
|
||||
terminal_row = VGA_HEIGHT - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
terminal_clear();
|
||||
terminal_row = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
terminal_update_cursor();
|
||||
|
||||
return;
|
||||
}
|
||||
else if (uc == '\t')
|
||||
@ -76,28 +96,35 @@ void terminal_putchar(const char c)
|
||||
terminal_putchar('\n');
|
||||
}
|
||||
|
||||
terminal_update_cursor();
|
||||
|
||||
return;
|
||||
}
|
||||
else if (uc == '\b')
|
||||
{
|
||||
if (terminal_column == 0)
|
||||
{
|
||||
terminal_row -= 1;
|
||||
|
||||
if (terminal_row == (size_t)-1)
|
||||
if (terminal_row > 0)
|
||||
{
|
||||
terminal_row = 0;
|
||||
terminal_row--;
|
||||
terminal_column = VGA_WIDTH - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
terminal_update_cursor(); /* For good measure */
|
||||
|
||||
terminal_column = VGA_WIDTH;
|
||||
|
||||
terminal_putentryat(' ', terminal_getcolor(), (size_t)terminal_column, (size_t)terminal_row);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
terminal_putentryat(' ', terminal_getcolor(), (size_t)--terminal_column, (size_t)terminal_row);
|
||||
terminal_column--;
|
||||
}
|
||||
|
||||
terminal_putentryat(' ', terminal_color, terminal_column, terminal_row);
|
||||
|
||||
terminal_update_cursor();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -110,9 +137,10 @@ void terminal_putchar(const char c)
|
||||
if (++terminal_row == VGA_HEIGHT)
|
||||
{
|
||||
terminal_scroll();
|
||||
terminal_row = VGA_HEIGHT - 1;
|
||||
}
|
||||
}
|
||||
|
||||
terminal_update_cursor();
|
||||
}
|
||||
|
||||
void terminal_write(const char* data, size_t size)
|
||||
@ -157,7 +185,7 @@ 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());
|
||||
}
|
||||
@ -182,20 +210,18 @@ void terminal_clearl(size_t num_lines)
|
||||
|
||||
void terminal_scroll(void)
|
||||
{
|
||||
for (size_t y = 1; y < VGA_HEIGHT; y++)
|
||||
|
||||
memmove(
|
||||
terminal_buffer,
|
||||
terminal_buffer + VGA_WIDTH,
|
||||
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 (size_t x = 0; x < VGA_WIDTH; x++)
|
||||
{
|
||||
const size_t src_index = y * VGA_WIDTH + x;
|
||||
const size_t dst_index = (y - 1) * VGA_WIDTH + x;
|
||||
terminal_buffer[dst_index] = terminal_buffer[src_index];
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t x = 0; x < VGA_WIDTH; x++)
|
||||
{
|
||||
const size_t index = (VGA_HEIGHT - 1) * VGA_WIDTH + x;
|
||||
terminal_buffer[index] = (terminal_color << 8) | ' ';
|
||||
terminal_putentryat((unsigned char)' ', terminal_getcolor(), (size_t)terminal_row, (size_t)k);
|
||||
}
|
||||
}
|
||||
|
||||
@ -208,7 +234,7 @@ unsigned char terminal_get_shifted(unsigned char uc)
|
||||
unsigned char syms1[] = { ',', '.', '/', ';', '\'', '[', ']', '`', '-', '=', '\\', '\0' };
|
||||
unsigned char syms2[] = { '<', '>', '?', ':', '\"', '{', '}', '~', '_', '+', '|', '\0' };
|
||||
|
||||
for (int32_t i = 0; i < (int32_t)(strlen((char*)lowerc)); ++i)
|
||||
for (int32_t i = 0; i < (int32_t) (strlen((char*)lowerc)); ++i)
|
||||
{
|
||||
if (uc == lowerc[i])
|
||||
{
|
||||
@ -220,7 +246,7 @@ unsigned char terminal_get_shifted(unsigned char uc)
|
||||
}
|
||||
}
|
||||
|
||||
for (int32_t i = 0; i < (int32_t)(strlen((char*)nums)); ++i)
|
||||
for (int32_t i = 0; i < (int32_t) (strlen((char*)nums)); ++i)
|
||||
{
|
||||
if (uc == nums[i])
|
||||
{
|
||||
@ -232,7 +258,7 @@ unsigned char terminal_get_shifted(unsigned char uc)
|
||||
}
|
||||
}
|
||||
|
||||
for (int32_t i = 0; i < (int32_t)(strlen((char*)syms1)); ++i)
|
||||
for (int32_t i = 0; i < (int32_t) (strlen((char*) syms1)); ++i)
|
||||
{
|
||||
if (uc == syms1[i])
|
||||
{
|
||||
@ -251,7 +277,20 @@ void terminal_set_cursor(uint16_t row, uint16_t column)
|
||||
{
|
||||
if (row < VGA_HEIGHT && column < VGA_WIDTH)
|
||||
{
|
||||
terminal_row = (size_t)row;
|
||||
terminal_column = (size_t)column;
|
||||
terminal_row = (size_t) row;
|
||||
terminal_column = (size_t) column;
|
||||
}
|
||||
|
||||
terminal_update_cursor();
|
||||
}
|
||||
|
||||
void terminal_update_cursor(void)
|
||||
{
|
||||
uint16_t pos = terminal_row * VGA_WIDTH + terminal_column;
|
||||
|
||||
outb(0x3D4, 0x0F);
|
||||
outb(0x3D5, (uint8_t) (pos & 0xFF));
|
||||
outb(0x3D4, 0x0E);
|
||||
outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user