Текстовый режим обсуждается здесь:
https://wiki.osdev.org/Text_mode
Здесь приведен пример написания цветного символа в текстовом режиме:
void WriteCharacter(unsigned char c, unsigned char forecolour, unsigned char backcolour, int x, int y)
{
uint16_t attrib = (backcolour << 4) | (forecolour & 0x0F);
volatile uint16_t * where;
where = (volatile uint16_t *)0xB8000 + (y * 80 + x) ;
*where = c | (attrib << 8);
}
Если вы хотитечтобы записать пиксель RGB в графическом режиме, сначала необходимо переключиться в другой режим видео.
Это объясняется здесь:
https://wiki.osdev.org/Drawing_In_Protected_Mode
Вот код изна этой странице показано, как нарисовать пиксель в графическом режиме:
/* only valid for 800x600x16M */
static void putpixel(unsigned char* screen, int x,int y, int color) {
unsigned where = x*3 + y*2400;
screen[where] = color & 255; // BLUE
screen[where + 1] = (color >> 8) & 255; // GREEN
screen[where + 2] = (color >> 16) & 255; // RED
}
/* only valid for 800x600x32bpp */
static void putpixel(unsigned char* screen, int x,int y, int color) {
unsigned where = x*4 + y*3200;
screen[where] = color & 255; // BLUE
screen[where + 1] = (color >> 8) & 255; // GREEN
screen[where + 2] = (color >> 16) & 255; // RED
}
По сути, вам нужно записать три цветовых значения в три байта, начиная с видеопамяти и смещая их на координаты, умноженные на некоторые значения, чтобы добраться доправая строка и столбец.
Значения для разных режимов видео различны.
Имейте в виду, что даже адрес видеопамяти для режимов VGA / CGA / EGA различен!