Učebnice Assembleru 86

Aby se animace netrhala

Když chce člověk něco rozpohybovat po obrazovce, začne mít problémy s tím, že se obrázek pohybuje trhaně. Je to nepříjemné a odstranitelné docela jednoduše. Stačí počkat na to, až se bude vracet paprsek po vykreslení obrazovky na původní pozici. V ten okamžik obrazovku co nejrychleji překreslíme. Čekání na zpětný snímkový běh provede procedura, kterou mi kdysi napsal Tom Chadima:

procedure snim_beh;assembler;
asm
     mov dx,03dah
@@1: in al,dx
     test al,8
     jz @@1
end;

Ta opakuje čtení právě toho registru VGA, který nese informaci o tom, jestli probíhá zpětný běh. Tento podprogram zařadíme těsně před část, která zajišťuje překreslení obrazovky.

POZOR! Tento podprogram pomůže, když vykreslujeme tak rychle, že to počítač stihne dokončit před návratem paprsku. V opačném případě je k ničemu a jen zdržuje.

Jak zrychlit program s animací?

  • Vykreslujeme zápisem přímo do VRAM
  • Nepoužíváme datový typ REAL (fakt zdržuje)
  • Smysluplně používáme assembler (jeho nešikovné použití je horší, než kdybysme to nechali na Pascalu)
  • Využíváme maximálně vlastností grafické karty

Uvedenou proceduru jsem použil i v Delphi. Program měl skutečně plynulejší animace. Problém byl, že pracoval jen pod Windows'95. NT se nelíbilo, že pracuje s portem. Pro Windows NT je to privilegovaná instrukce, kterou nepustí (co kdyby to byla síťová karta nebo tak, pak by je to sesypalo). Po čase jsem zjistil, že Windows mají už "inteligentní překreslování" zabudované.

Literatura:

  • Michal Brandejs: Mikroprocesory INTEL 8086-80486, Grada 1991
  • Tomáš Novák: Turbo Pascal 6 - Popis jazyka, Grada 1991
  • Pavel Mikula, Kateřina Juhová, Jiří Soukenka: Borland Pascal 7.0, Kompendium, Grada 1994

Směr