Приведено 6 вариантов вывода точки на экран в режиме 320x200x256
и пример программы заполнения экрана точками...
{> Cut here. FileName= PIXEL.MSG }
Что, Dmitry, не спится ? Тогда почитай мое письмецо:
А вот однажды 30 Oct 97 06:46, Dmitry Savin отписал(а) к All вот че:
DS:> кaк можно в TP нapисовaть точку в pежиме 320*200
DS:> (допустим, звездное небо, a то pисовaть линией с одинaковыми
DS:> кооpдинaтaми, IMHO, пpосто извpaт).
Ну почему же? Можно еще окружностью с диаметром 1 :-)
Вот несколько вариантов после обсуждения в SU.P.M.A.:
0. через прерывание BIOS (медленно):
asm
mov cx,X;
mov dx,Y;
mov ah,0Ch;
mov al,Color;
mov bx,0;
int 10h;
end;
1. С помощью GRAPH.TPU (медленно):
PutPixel(X,Y,Color);
2. Прямым выводом в видеопамять:
Mem[SegA000:X+Y*320]:=Color;
3. Вместо умножения можно использовать два сдвига и сложение,
тогда будет побыстрее:
Mem[SegA000:X+(Y shl 8)+(Y shl 6)]:=Color;
4. Самым оптимальным вариантом будет:
var
Screen:array[0..63999]of byte absolute SegA000:0000;
...
Screen[X + (Y shl 8) + (Y shl 6)] := Color;
5. Ну, и наконец, можно переписать все это на ассемблер:
{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;
Тут конец. Пока ! Ваш Роман Потапыч.
... Зачем мне эта строчка ?
--- [Team Кушать] [Team Спать] [Team Пиво]
* Origin: А четырехсотку я все одно поставлю ! (С) Игорич (2:5020/1308.55)
{> Cut here. FileName= PIXEL.PAS }
{
From : Vadim Bodrov 2:5011/5.3 22.10.97
Subj : Вывод точки в режиме 320х200х256
}
{ установка 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.