2017-11-01 01:01:29 -04:00
|
|
|
#include "console.h"
|
|
|
|
|
2017-11-04 02:21:22 -04:00
|
|
|
#include <kernelmq/stdlib.h>
|
2017-11-01 01:01:29 -04:00
|
|
|
|
2017-11-01 06:34:48 -04:00
|
|
|
static unsigned short *const console_buffer = (unsigned short*)0xB8000;
|
|
|
|
|
2017-11-01 06:31:26 -04:00
|
|
|
static const unsigned int console_width = 80;
|
|
|
|
static const unsigned int console_height = 25;
|
2017-11-01 01:01:29 -04:00
|
|
|
|
2017-11-01 06:08:09 -04:00
|
|
|
static unsigned int console_row;
|
|
|
|
static unsigned int console_column;
|
2017-11-01 01:01:29 -04:00
|
|
|
|
2017-11-01 06:08:09 -04:00
|
|
|
static unsigned char console_color;
|
2017-11-01 01:01:29 -04:00
|
|
|
|
2017-11-01 06:08:09 -04:00
|
|
|
static unsigned char vga_entry_color(enum vga_color fg, enum vga_color bg);
|
|
|
|
static unsigned short vga_entry(unsigned char uc, unsigned char color);
|
|
|
|
static void console_putentryat(char c, unsigned char color, unsigned int x, unsigned int y);
|
2017-11-01 01:01:29 -04:00
|
|
|
|
2017-11-04 04:53:01 -04:00
|
|
|
static void console_scroll();
|
|
|
|
|
2017-11-01 01:01:29 -04:00
|
|
|
void console_initialize() {
|
|
|
|
console_row = 0;
|
|
|
|
console_column = 0;
|
|
|
|
console_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
|
|
|
|
|
2017-11-01 06:31:26 -04:00
|
|
|
for (unsigned int y = 0; y < console_height; y++) {
|
|
|
|
for (unsigned int x = 0; x < console_width; x++) {
|
|
|
|
const unsigned int index = y * console_width + x;
|
2017-11-01 01:01:29 -04:00
|
|
|
console_buffer[index] = vga_entry(' ', console_color);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void console_print(const char *const s)
|
|
|
|
{
|
2017-11-04 03:33:31 -04:00
|
|
|
console_write(s, kstrlen(s));
|
2017-11-01 01:01:29 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void console_putc(const char c) {
|
|
|
|
if (c == '\n') {
|
|
|
|
console_column = 0;
|
|
|
|
|
2017-11-04 04:53:01 -04:00
|
|
|
if (++console_row >= console_height) {
|
|
|
|
console_row = console_height - 1;
|
|
|
|
console_scroll();
|
2017-11-01 01:01:29 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
console_putentryat(c, console_color, console_column, console_row);
|
|
|
|
|
2017-11-04 04:53:01 -04:00
|
|
|
if (++console_column >= console_width) {
|
2017-11-01 01:01:29 -04:00
|
|
|
console_column = 0;
|
|
|
|
|
2017-11-04 04:53:01 -04:00
|
|
|
if (++console_row >= console_height) {
|
|
|
|
console_row = console_height - 1;
|
|
|
|
console_scroll();
|
2017-11-01 01:01:29 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void console_puts(const char *const s)
|
|
|
|
{
|
|
|
|
console_print(s);
|
|
|
|
console_putc('\n');
|
|
|
|
}
|
|
|
|
|
2017-11-01 06:08:09 -04:00
|
|
|
void console_setcolor(const unsigned char color) {
|
2017-11-01 01:01:29 -04:00
|
|
|
console_color = color;
|
|
|
|
}
|
|
|
|
|
2017-11-01 06:08:09 -04:00
|
|
|
void console_write(const char *const data, const unsigned int size) {
|
|
|
|
for (unsigned int i = 0; i < size; i++) {
|
2017-11-01 01:01:29 -04:00
|
|
|
console_putc(data[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-01 06:08:09 -04:00
|
|
|
unsigned char vga_entry_color(enum vga_color fg, enum vga_color bg) {
|
2017-11-01 01:01:29 -04:00
|
|
|
return fg | bg << 4;
|
|
|
|
}
|
|
|
|
|
2017-11-01 06:08:09 -04:00
|
|
|
unsigned short vga_entry(unsigned char uc, unsigned char color) {
|
|
|
|
return (unsigned short) uc | (unsigned short) color << 8;
|
2017-11-01 01:01:29 -04:00
|
|
|
}
|
|
|
|
|
2017-11-01 06:08:09 -04:00
|
|
|
void console_putentryat(char c, unsigned char color, unsigned int x, unsigned int y) {
|
2017-11-01 06:31:26 -04:00
|
|
|
const unsigned int index = y * console_width + x;
|
2017-11-01 01:01:29 -04:00
|
|
|
console_buffer[index] = vga_entry(c, color);
|
|
|
|
}
|
2017-11-04 04:53:01 -04:00
|
|
|
|
|
|
|
void console_scroll()
|
|
|
|
{
|
|
|
|
for (unsigned int row = 1; row < console_height; ++row) {
|
|
|
|
for (unsigned int col = 0; col < console_width; ++col) {
|
|
|
|
console_buffer[(row - 1) * console_width + col] = console_buffer[row * console_width + col];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for(unsigned int col = 0; col < console_width; ++col) {
|
|
|
|
console_buffer[(console_height - 1) * console_width + col] = ' ';
|
|
|
|
}
|
|
|
|
}
|