}
main () {
setTridentMode ( 0x5D ); // 640x480x256
for (int і = 0; і < 640; i++ )
for (int j = 0; j < 480; j++ )
writePixel (i, j, ((i/20)+1)*(j/20+1));
getch ();
)

Аналогичный пример для SVGA Cirrus Logic выглядит следующим образом: У // File Cirrus.Cpp

#include <conio.h> #include <dos.h> #include <process.h> #include <stdio.h>
#define LOWORD(I) ((int)(l)) #define HIWORD(I) ((int)((l) » 16))
inline void writeReg (int base, int reg, int value ) {
outportb ( base, reg ); ' outportb ( base + 1, value );
}
inline char readReg (int base, int reg )
{
outportb ( base, reg ); return inportb ( base + 1 );
}
static int curBank = 0;
// check bits specified by mask in port for being
// readable/writable
int testPort (int port, char mask )
{
char save = inportb ( port); outportb ( port, save & -mask );

Компьютерная графика. Полигональные модели

char v1 = inportb ( port) & mask; outportb ( port, save | mask ); char v2 = inportb ( port) & mask; outportb (port, save ); return v1 == 0 && v2 == mask;
}
int testReg (int port, int reg, char mask ) {
outportb ( port, reg ); return testPort ( port + 1, mask );
}
int find Cirrus ()
{
char save = readReg ( 0x3C4, 6 ); int res = 0;
writeReg ( 0x3C4, 6, 0x12 ); // enable extended registers
if (readReg ( 0x3C4, 6 ) == 0x12 )
if (testReg ( 0x3C4, 0x1 E, 0x3F ) && testReg ( 0x3D4, 0x1 B, OxFF )) res = 1;
writeReg ( 0x3C4, 6, save ); return res;
}
void setCirrusMode (int mode ) {
asm {
mov ax, mode int 10h
mov dx, 3C4h // enable extended registers mov al, 6 out dx, al inc dx mov al, 12h out dx, al
}
}
void setCirrusBank (int start) {
if ( start == curBank ) return;
curBank = start; asm {
mov dx, 3CEh
mov al, 9
mov ah, byte ptr start
mov cl, 4
shl ah, cl

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

out dx, ax
}
}
void writePixel (int x, int y, int color)
{
long addr = 6401 * (long)y + (long)x; setCirrusBank ( HIWORD ( addr)); pokeb ( OxAOOO, LOWORD ( addr), color);

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