+----------------------------------+
| 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ň