You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
960 B
C++

#include "cga.h"
#include "../debug/output.h"
#include "../arch/ioport.h"
namespace CGA {
IOPort index_port = IOPort(0x3d4);
IOPort data_port = IOPort(0x3d5);
void writeCGAReg(int reg, int data){
index_port.outb(reg);
data_port.outw(data);
}
uint16_t readCGAReg(int reg){
index_port.outb(reg);
return data_port.inb();
}
void setCursor(unsigned abs_x, unsigned abs_y) {
uint16_t pos = abs_y * COLUMNS + abs_x;
writeCGAReg(RegisterIndex::CURSOR_LOW, pos & 0xFF);
writeCGAReg(RegisterIndex::CURSOR_HIGH, ((pos >> 8) & 0xFF));
}
void getCursor(unsigned& abs_x, unsigned& abs_y) {
uint16_t pos = readCGAReg(RegisterIndex::CURSOR_LOW);
pos |= (readCGAReg(RegisterIndex::CURSOR_HIGH) << 8);
abs_y = pos / COLUMNS;
abs_x = pos % COLUMNS;
}
void show(unsigned abs_x, unsigned abs_y, char character, Attribute attrib) {
TEXT_BUFFER_BASE[abs_x + (COLUMNS * abs_y)] = Cell(character, attrib);
}
}; // namespace CGA