Рассмотрим работу SVGA-адаптеров с 256-цветными режимами. Почти все они построены одинаково: под каждый пиксел отводится 1 байт и вся видеопамять разбивается на банки одинакового размера (обычно по 64 Кбайт), при этом область адресного пространства 0xAO00:0-OxAOO0:0xFFFF соответствует выбранному банку. Ряд карт позволяет работать сразу с двумя банками.

При такой организации памяти процедура writePixel для карі с 64-кило-байтовыми банками выглядит следующим образом:

void writePixel (int х, int у, int color) {

long addr = bytesPerLine * (long)y + (iong)x; setBank ( addr » 16 ); pokeb ( OxAOOO, (unsigned)addr, color);
}

о

1Ж.

Компьютерная графика. Полигональные модели где функция selBank служит для установки банка с заданным номером.

Практически все различие между картами сводится к установке режима с заданным разрешеним и установке банка с заданным номером.

Ниже приводится пример программы, работающей с режимом 640 на 480 точек для SVGA Trident при 256 цветах. Функция findTrident служит для проверки того, что данный видеоадаптер действительно установлен.

(21 // File Trident.Cpp
#include <conio.h> #include <dos.h>
#define LOWORD(I) ('(ini)(l)) #define HIWORD(I) ((int)((l) »16))
static int curBank = 0;
void setTridentMode (int mode ) {
asm {
mov ax, mode
int 10h
mov dx, 3CEh // set pagesize to 64k
mov al, 6
out dx, al
inc dx
in al, dx
dec dx
or al, 4
mov ah, al
mov al, 6
out dx, ax
mov dx, 3C4h // set to BPS mode
mov al, OBh
out dx, al
inc dx
in al, dx
}
}
void setTridentBank (int start) {
if ( start == curBank ) return;
curBank = start; , asm {
mov dx, 3C4h
mov al, OBh
out dx, al
inc dx
mov al, 0
out dx, al
in al.dx
dec dx

4. Работа с основными графическими устройст

mov al, OEh
mov ah, byte ptr start
xor ah, 2
out dx, ax
}
}
void writePixel (int x, int y, int color)
{
long addr = 6401 * (long)y + (long)x;
setTridentBank ( HIWORD ( addr) ); pokeb ( OxAOOO, LOWORD ( addr), color);

⇐ Предыдущая| |Следующая ⇒