Terminal
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
#include "vga.h"
|
||||
|
||||
VGAChar_t* framebuffer = (VGAChar_t*)0xB8000;
|
||||
|
||||
void putcar(int x, int y, char c, char foreground, char background) {
|
||||
framebuffer[(y * TERM_WIDTH) + x].c = c;
|
||||
framebuffer[(y * TERM_WIDTH) + x].foreground = foreground;
|
||||
framebuffer[(y * TERM_WIDTH) + x].background = background;
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
#define TERM_WIDTH 80
|
||||
#define TERM_HEIGHT 25
|
||||
|
||||
struct VGAChar_t {
|
||||
char c;
|
||||
char foreground:4;
|
||||
char background:4;
|
||||
}__attribute__((packed));
|
||||
|
||||
void putcar(int x, int y, char c, char foreground, char background);
|
||||
@@ -5,35 +5,55 @@
|
||||
static const int TERMINAL_WIDTH = 80;
|
||||
static const int TERMINAL_HEIGHT = 24;
|
||||
|
||||
static char* frameBuffer = (char*)0xB8000;
|
||||
static VGAChar_t* frameBuffer = (VGAChar_t*)0xB8000;
|
||||
|
||||
static char clearColour = 0x0;
|
||||
static char bgColour = 0x0;
|
||||
static char bgColour = 0x0;
|
||||
static char fgColour = 0xF;
|
||||
|
||||
struct Cursor {
|
||||
uint8_t x;
|
||||
uint8_t y;
|
||||
} __attribute__((packed));
|
||||
|
||||
Cursor cursor;
|
||||
|
||||
void cls() {
|
||||
for (uint8_t x = 0; x < TERMINAL_WIDTH; x++) {
|
||||
for (uint8_t y = 0; y < TERMINAL_HEIGHT; y++) {
|
||||
frameBuffer[x + TERMINAL_WIDTH * y] = 0;
|
||||
}
|
||||
}
|
||||
for (uint8_t x = 0; x < TERMINAL_WIDTH; x++)
|
||||
for (uint8_t y = 0; y < TERMINAL_HEIGHT; y++)
|
||||
putchar(x, y, ' ', fgColour, clearColour);
|
||||
|
||||
moveCursor(0,0);
|
||||
cursor.x = 0; cursor.y = 0;
|
||||
updateCursor(cursor);
|
||||
}
|
||||
|
||||
void putchar(char input) {
|
||||
if (cursor.x + 1 > TERMINAL_WIDTH) {
|
||||
nline();
|
||||
}
|
||||
if (input == '\n') {
|
||||
nline();
|
||||
} else {
|
||||
putchar(cursor.x, cursor.y, input, fgColour, bgColour);
|
||||
cursor.x++;
|
||||
}
|
||||
updateCursor(cursor);
|
||||
}
|
||||
|
||||
void putchar(int x, int y, char c, char foreground, char background) {
|
||||
frameBuffer[(y * TERMINAL_WIDTH) + x].c = c;
|
||||
frameBuffer[(y * TERMINAL_WIDTH) + x].foreground = foreground;
|
||||
frameBuffer[(y * TERMINAL_WIDTH) + x].background = background;
|
||||
}
|
||||
|
||||
void write(char* input) {
|
||||
|
||||
for (uint32_t i = 0; i < strlen(input); i++) {
|
||||
if (cursor.x + 1 > TERMINAL_WIDTH) {
|
||||
nline();
|
||||
}
|
||||
if (input[i] == '\n') {
|
||||
nline();
|
||||
} else {
|
||||
putchar(cursor.x, cursor.y, input[i], fgColour, bgColour);
|
||||
cursor.x++;
|
||||
}
|
||||
}
|
||||
updateCursor(cursor);
|
||||
}
|
||||
|
||||
void writeln(char* input) {
|
||||
@@ -42,19 +62,29 @@ void writeln(char* input) {
|
||||
}
|
||||
|
||||
void nline() {
|
||||
|
||||
cursor.y++;
|
||||
cursor.x = 0;
|
||||
updateCursor(cursor);
|
||||
}
|
||||
|
||||
void setClearColour(char col) {
|
||||
clearColour = col;
|
||||
}
|
||||
|
||||
void setFGColour(char col) {
|
||||
fgColour = col;
|
||||
}
|
||||
|
||||
void setBGColour(char col) {
|
||||
bgColour = col;
|
||||
}
|
||||
|
||||
void showCursor() {
|
||||
outb(0x3D4, 0x0A);
|
||||
outb(0x3D5, (inb(0x3D5) & 0xC0) | 1);
|
||||
outb(0x3D5, (inb(0x3D5) & 0xC0) | 0x0); // Cursor start top
|
||||
|
||||
outb(0x3D4, 0x0B);
|
||||
outb(0x3D5, (inb(0x3D5) & 0xE0) | 1);
|
||||
outb(0x3D5, (inb(0x3D5) & 0xE0) | 0xF); // Cursor start bottom
|
||||
}
|
||||
|
||||
void hideCursor() {
|
||||
@@ -62,11 +92,20 @@ void hideCursor() {
|
||||
outb(0x3D5, 0x20);
|
||||
}
|
||||
|
||||
void moveCursor(int x, int y) {
|
||||
uint16_t pos = y * TERMINAL_WIDTH + x;
|
||||
void updateCursor(Cursor c) {
|
||||
uint16_t pos = c.y * TERMINAL_WIDTH + c.x;
|
||||
|
||||
outb(0x3D4, 0x0F);
|
||||
outb(0x3D5, (uint8_t) (pos & 0xFF));
|
||||
outb(0x3D4, 0x0E);
|
||||
outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF));
|
||||
}
|
||||
|
||||
void setCursorPosition(int x, int y) {
|
||||
cursor.x = x; cursor.y = y;
|
||||
updateCursor(cursor);
|
||||
}
|
||||
|
||||
uint8_t getVGACol(char f, char b) {
|
||||
return f | b << 4;
|
||||
}
|
||||
|
||||
@@ -2,27 +2,39 @@
|
||||
#include <lib/stdint.h>
|
||||
|
||||
enum {
|
||||
BLACK = 0x0,
|
||||
BLUE = 0x1,
|
||||
GREEN = 0x2,
|
||||
CYAN = 0x3,
|
||||
RED = 0x4,
|
||||
MAGENTA = 0x5,
|
||||
BROWN = 0x6,
|
||||
GREY = 0x7,
|
||||
DARK_GREY = 0x8,
|
||||
BRIGHT_BLUE = 0x9,
|
||||
BRIGHT_GREEN = 0xA,
|
||||
BRIGHT_CYAN = 0xB,
|
||||
BRIGHT_RED = 0xC,
|
||||
BRIGHT_MAGENTA = 0xD,
|
||||
YELLOW = 0xE,
|
||||
WHITE = 0xF,
|
||||
VGA_BLACK = 0x0,
|
||||
VGA_BLUE = 0x1,
|
||||
VGA_GREEN = 0x2,
|
||||
VGA_CYAN = 0x3,
|
||||
VGA_RED = 0x4,
|
||||
VGA_MAGENTA = 0x5,
|
||||
VGA_BROWN = 0x6,
|
||||
VGA_GREY = 0x7,
|
||||
VGA_DARK_GREY = 0x8,
|
||||
VGA_BRIGHT_BLUE = 0x9,
|
||||
VGA_BRIGHT_GREEN = 0xA,
|
||||
VGA_BRIGHT_CYAN = 0xB,
|
||||
VGA_BRIGHT_RED = 0xC,
|
||||
VGA_BRIGHT_MAGENTA = 0xD,
|
||||
VGA_YELLOW = 0xE,
|
||||
VGA_WHITE = 0xF,
|
||||
};
|
||||
|
||||
struct VGAChar_t {
|
||||
char c;
|
||||
char foreground:4;
|
||||
char background:4;
|
||||
}__attribute__((packed));
|
||||
|
||||
struct Cursor {
|
||||
uint8_t x;
|
||||
uint8_t y;
|
||||
} __attribute__((packed));
|
||||
|
||||
void cls();
|
||||
|
||||
void putchar(char input);
|
||||
void putchar(int x, int y, char c, char foreground, char background);
|
||||
|
||||
void write(char* input);
|
||||
void writeln(char* input);
|
||||
@@ -30,8 +42,11 @@ void writeln(char* input);
|
||||
void nline();
|
||||
|
||||
void setClearColour(char col);
|
||||
void setFGColour(char col);
|
||||
void setBGColour(char col);
|
||||
|
||||
void showCursor();
|
||||
void hideCursor();
|
||||
|
||||
void moveCursor(int x, int y);
|
||||
void updateCursor(Cursor c);
|
||||
void setCursorPosition(int x, int y);
|
||||
|
||||
Reference in New Issue
Block a user