Рисование пикселей в C: OSdev - PullRequest
0 голосов
/ 14 декабря 2018

Я совершенно новичок в осдевинге.сейчас я только что реализовал экран клавиатуры и VGA, следуя osdevwiki.Теперь я хотел бы нарисовать правильный пиксель, подобный этому

void drawPixel(int x, int y, int rgb)

на отдельном языке Си.теперь в режиме VGA адрес для печати текста и цветов равен 0xB8000.Чтобы нарисовать пиксели на экране, как я могу сделать?я понятия не имею.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Я использую этот метод для рисования пикселей из текстового режима.Установите символ на пробел и используйте цвет в качестве цвета пикселя, например.

   char* video  = (char*)0xb8000;
   video [0] = 0x20; // space character
   video [1] = 0x12; // color of the pixel
0 голосов
/ 14 декабря 2018

Текстовый режим обсуждается здесь:

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 различен!

...