#include "vgatxt.h" #include #include static uint16_t *video_memory = (uint16_t*)((size_t)K_HIGHHALF_ADDR + 0xB8000); vgatxt *text_display; vgatxt::vgatxt(node *parent) : display(parent) { // nothing to do, really } int vgatxt::text_w() { return 80; } int vgatxt::text_h() { return 25; } void vgatxt::text_setcsr(int l, int c, bool visible) { uint16_t cursor_location = l * 80 + c; if (!visible) cursor_location = 10000; outb(0x3D4, 14); //Sending high cursor byte outb(0x3D5, cursor_location >> 8); outb(0x3D4, 15); //Sending high cursor byte outb(0x3D5, cursor_location); } void vgatxt::text_put(int l, int c, int ch, uint8_t fgcolor, uint8_t bgcolor) { if (ch >= 0x80) ch = '?'; video_memory[l * 80 + c] = (char)ch | ((bgcolor << 4 | fgcolor) << 8); } void vgatxt::text_scroll(int n, uint8_t fgcolor, uint8_t bgcolor) { //TODO: optimize for (int i = 0; i < n; i++) { uint16_t blank = (((bgcolor << 4) | fgcolor) << 8) | 0x20; int j; for (j = 0; j < 80*24; j++) { video_memory[j] = video_memory[j+80]; } for (j = 80*24; j < 80*25; j++) { video_memory[j] = blank; } } }