Как вывести точку в режиме 320х200?
Приведем 6 вариантов вывода точки на экран в режиме 320x200x256 и пример программы заполнения экрана точками.
1. Через прерывание BIOS (медленно):
asm
mov cx,X;
mov dx,Y;
mov ah,0Ch;
mov al,Color;
mov bx,0;
int 10h;
end;
2. С помощью GRAPH.TPU (медленно):
3. Прямым выводом в видеопамять:
Mem[SegA000:X+Y*320]:=Color;
4. Вместо умножения можно использовать два сдвига и сложение, тогда будет побыстрее:
Mem[SegA000:X+(Y shl 8)+(Y shl 6)]:=Color;
5. Самым оптимальным вариантом будет:
var
Screen:array[0..63999]of byte absolute SegA000:0000;
...
Screen[X + (Y shl 8) + (Y shl 6)] := Color;
6. Ну, и наконец, можно переписать все это на ассемблер:
{From : Vadim Bodrov 2:5011/5.3 21.10.97 самый быстpый и пpавильный способ
pисования пикселя (pаботает и в Real Mode и в Protected Mode / DPMI16)}
procedure PutPixel(X,Y: Word; Color: Word); assembler;
asm
mov ax,[Y]
mov bx,ax
shl bx,6
add bh,al
add bx,[X]
mov es,[SEGA000]
mov ax,[Color]
mov es:[bx],al
end;
Пример программы
{ установка pежима MCGA/VGA 320x200x256 }
procedure SetMCGA320x200; assembler;
asm
mov ax,$13
int $10
end;
{ установка текстового pежима VGA 80x25 }
procedure SetTextMode80x25; assembler;
asm
mov ax,$03
int $10
end;
{ печать пикселя }
procedure PutPixel(X,Y: Word; Color: Word); assembler;
asm
mov ax,[Y]
mov bx,ax
shl bx,6
add bh,al
add bx,[X]
mov es,[SEGA000]
mov ax,[Color]
mov es:[bx],al
end;
{---------- пpимеp ----------}
var i,j: Word;
begin
SetMCGA320x200;
for i:=0 to 199 do
for j:=0 to 319 do
PutPixel(j,i,Random(256));
ReadLn;
SetTextMode80x25;
end.