Как вывести точку в режиме 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 (медленно):

PutPixel(X,Y,Color);

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.