+----------------------------------+ | JAK SOBĚ VYROBITI DEMO GRAFICKÉ | |KU POTĚŠE VLASTNÍ I OSOB OSTATNÍCH| +----------------------------------+ Začněme s tím nejjednodušším. Grafický mód 13h, tedy 320x200, 256 barev. Budu se snažit držet Pascalu, sem tam zabrousím do Assembleru. Grafický mód 320x200 ve 256 barvách je znám jako mód MCGA. Assembleristi jej znají jako mód 13h. Jak se přepnout do grafiky bez použití BGI? Uvědomte si, že BGI je strašlivě pomalá věc. Pokud vám jde o rychlost, budete si muset vzít starost o grafiku na svá bedra. Pro přepínání do grafického módu slouží přerušení INT10h, služba 0. To znamená do AH nacpat nulu, do AL číslo videomódu a zavolat INT 10h. procedure SetMCGA; begin asm mov ax,0013h int 10h end; end; Tak a je to, jak prosté milý Watsone!! Klasický textový mód má číslo tři, takže: Procedure SetText; begin asm mov ax,0003h int 10h end; end; No paráda, ale k čemu je to dobré? Pokud inicializujete grafiku takto, pascalovské příkazy pro grafiku nebudou fungovat. Problém je v tom, že jsme neprovedli inicializaci grafiky pomoci BGI, ale dovolili jsme si soukromou iniciativu. Takže budeme muse i soukromě kreslit, mazat a přenášet. Začněme mazáním. V grafickém módu 13h je obrazovka uložena v paměti na segmentu 0A000h, Cokoliv zapíšete do segmentu 0A000h, se projeví na obrazovce. 320x200=64000. Tedy paměť obrazovky zabírá 64000 bajtů. Pro smazání obrazovky tedy musíme nacpat od adresy 0A000:0000h 64000 bajtů, nějakým číslem. FillChar (Mem [a000:0],64000,Col); FillChar plní zadanou oblast zadaným bajtem. Onen bajt je barva. Změnou proměnné Col, se obrazovka smaže příslušnou barvou. +--------------+ |Kreslení bodu:| +--------------+ První možnost je použít opět přerušení 10 a příslušnou funkci. Pro kreslení bodu je to funkce 0Ch. Procedure INTPutpixel (X,Y : Integer; Col : Byte); BEGIN asm mov ah,0Ch {Sluzba 0Ch} mov al,[col] {barva do AL} mov cx,[x] {Souradnice x do CX} mov dx,[y] {Souradnice y do DX} mov bx,[1] {BX = 1} int 10h {a vyvolame preruseni 10h} end; END; Funguje to, ale jde to i rychleji. Přerušení bývají vetšinou ta pomalejší metoda, jak něco udělat. Nejrychlejší bude zapsat bod přímo do videopaměti, tedy někam do těch 64000 bajtů v segmentu 0A000h. Ale kam? A co tam zapsat? Nejdříve vyřešíme otázku co zapsat. Je to prosté, to co zapisujete je barva. A teď kam. Souřadnice obrazovky [0,0] jsou levý horní roh. Pak tedy první bajt videopaměti určuje barvu tohoto bodu, druhý bajt bodu vpravo od něj, tedy [1,0], třetí je [2,0], atd. až po 320tý bajt, který určuje barvu pravého krajního bodu na prvním (nultém) řádku obrazovky, tedy [319,0]. Další bajt, tedy 321 začíná o řádek níž opět zleva, souřadnice [0,1], atd.. poslední bajt číslo 64000 určuje barvu pravého dolního rohu obrazovky [319,199]. 0A000:0000h.............................................0A000:13Fh 0A000:140h..............................................0A000:27Fh 0A000:280h.............................................. .. . . . . . 0A000:F8C0h.............................................0A000:0FA00h Toto je schematický náčrt jak to vypadá ve vidopaměti. Asi vám trošku budou dělat potíže ty hexadecimální údaje, jen trpte a počítejte. Pokud se zamyslíte nad tím obrázkem, vymyslíte vzoreček na výpočet offsetu pro jakýkoliv bod. Ten vzoreček bude vypadat takto: offset = Y*320+X takže rozsvítíme bod příkazem: mem[0A000:Y*320+X] := Barva Na závěr tedy program, který porovná obě metody kreslení bodu. Jednak pomocí přerušení 10h a zadruhé přímým zápisem do videopaměti. Už to bylo moc dlouhé, zdroják jsem dal na další stránku. Takže si cvakněte sem ==> Zdroják Pokud se se mnou budete chtít spojit máte dvě možnosti FIDO a internet. Moje fidonetí adresa je 2:421/59. A internetí je: SysOp@pizi.fido.cz Čaute příště PIŽI výheň