#include <sys/console.h>
void console_init(console_t *con) {
con->base = (char *)0xb8000;
con->attr = 0x07;
con->col = 0;
con->row = 0;
con->num_cols = 80;
con->num_rows = 25;
}
void console_clear(console_t *con) {
char *p = con->base;
for (int i=0;i<4000;i++) {
*p++ = 0x00;
}
con->col = 0;
con->row = 0;
}
void console_print(console_t *con, const char *str) {
char *dst = con->base + 2*(con->row * con->num_cols + con->col);
const char *txt = str;
while (*txt != 0) {
switch(*txt) {
case '\n':
con->col = 0;
con->row++;
if (con->row >= con->num_rows) {
console_scroll(con);
dst = con->base + 2*(con->row * con->num_cols + con->col);
} else {
dst = con->base + 2*(con->row * con->num_cols + con->col);
}
txt++;
break;
default:
*dst++ = *txt++;
*dst++ = con->attr;
con->col++;
if (con->col >= con->num_cols) {
con->col = 0;
con->row++;
}
break;
}
}
}
void console_scroll(console_t *con) {
unsigned int *s = (unsigned int *)(con->base + con->num_cols * 2);
unsigned int *d = (unsigned int *)(con->base);
for (int i=0;i<960;i++) {
*d++ = *s++;
}
for (int i=0;i<40;i++) {
*d++ = 0;
}
con->row--;
}