JAK SOBĚ VYROBITI DEMO GRAFICKÉ
KU POTĚŠE VLASTNÍ I OSOB OSTATNÍCH
(počtvrté)
Petr Klimovič l.p.1996
Od dnešního dílu budou k dispozici i zdrojáky v Céčku.
Poděkujte za ně panu Aleši Zíkovi.
Takže, jak jsem minule slíbil, vrhneme se dnes na onen efekt s
proužkem. Obrazovka se vykresluje postupně zleva do prava, zhora
dolů. Jesliže si počkáme na vertikální impuls, pak si odpočítáme
nějakou dobu, bude paprsek někde uprostřed obrazovky, změníme barvu
černé na červenou a od teď kreslí paprsek místo černého pozadí
červeně. Za chvíli tam zase dáme černou a zase se kreslí černě,
vznikl červený proužek. Budeme-li postupně měnit dobu čekání po
retrace, bude se proužek pohybovat.
uses crt;
const
HHrana = 300; {Horni uvrat}
DHrana = 6000; {Dolni uvrat}
Rychlost = 30; {Rychlost prouzku}
Sirka = 2000; {Sirka prouzku}
var Citac, Pozice : integer;
procedure CekejRet; {Cekani na retrace}
var
Bajt : byte;
begin
repeat until (Port [3DA] and 8) = 0; {Cekam na konec retrace}
repeat until (Port [3DA] and 8) > 0; {Cekam na zacatek retrace}
end;
procedure Cervena; {Nastavi barvu 0 jako cervenou}
begin
Port[3c8] := 0;
Port[3c9] := 63;
Port[3c9] := 0;
Port[3c9] := 0;
end;
procedure Cerna; {Nastavi barvu 0 jako cernou}
begin
Port[3c8] := 0;
Port[3c9] := 0;
Port[3c9] := 0;
Port[3c9] := 0;
end;
begin
repeat {Hlavni, nekonecna smycka}
Pozice := HHrana; {Zacinam v horni uvrati}
repeat
asm
cli {Zakazu preruseni}
end;
CekejRet; {Cekam na retrace a pocitam pauzu}
for Citac := 1 to Pozice do begin end;
Cervena; {Zacnu cerveny pruh, pocitam sirku}
for Citac := 1 to Sirka do begin end;
Cerna; {Koncim cerveny pruh}
Pozice := Pozice + Rychlost;
{Vypocitam pristi polohu prouzku}
asm
sti {Povolim preruseni}
end;
until (Pozice > DHrana) or keypressed; {Az po dolni uvrat}
repeat
asm
cli {Zakaz preruseni}
end;
CekejRet;
for Citac := 1 to Pozice do begin end;
Cervena;
for Citac := 1 to Sirka do begin end;
Cerna;
Pozice := Pozice - Rychlost;
asm
sti
end;
until (Pozice < HHrana) or keypressed; {Az po horni uvrat}
until keypressed;
end.
Tento program má jednu velkou nevýhodu, na každém počítači bude
fungovat jinou rychlostí. Konstanty na začátku si musíte nastavit
podle vašeho počítače. Tak jak jsou uvedeny nyní fungují pro mou
386SX 33MHz. Jestliže nezakážete přerušení, bude se proužek pohybovat
trhaně. Zákaz přerušení má ovšem nevýhodu, zastaví se vám vnitřní
čas. Takže po vykonání tohoto programu budete mít pravděpodobně
rozhozený čas. Ten se znovu nastaví až při studeném startu.
Můžeme to zkusit pomocí delay, to by mělo být na každém počítači
stejné.
uses crt;
const
HHrana = 1; {Horni uvrat}
DHrana = 12; {Dolni uvrat}
Rychlost = 1; {Rychlost prouzku}
Sirka = 1; {Sirka prouzku}
var Citac, Pozice : integer;
procedure CekejRet; {Cekani na retrace}
var
Bajt : byte;
begin
repeat until (Port [3DA] and 8) = 0; {Cekam na konec retrace}
repeat until (Port [3DA] and 8) > 0; {Cekam na zacatek retrace}
end;
procedure Cervena; {Nastavi barvu 0 jako cervenou}
begin
Port[3c8] := 0;
Port[3c9] := 63;
Port[3c9] := 0;
Port[3c9] := 0;
end;
procedure Cerna; {Nastavi barvu 0 jako cernou}
begin
Port[3c8] := 0;
Port[3c9] := 0;
Port[3c9] := 0;
Port[3c9] := 0;
end;
begin
repeat {Hlavni, nekonecna smycka}
Pozice := HHrana; {Zacinam v horni uvrati}
repeat
asm
cli {Zakazu preruseni}
end;
CekejRet; {Cekam na retrace a pocitam pauzu}
delay (Pozice);
Cervena; {Zacnu cerveny pruh, pocitam sirku}
delay (Sirka);
Cerna; {Koncim cerveny pruh}
Pozice := Pozice + Rychlost;
{Vypocitam pristi polohu prouzku}
asm
sti {Povolim preruseni}
end;
until (Pozice > DHrana) or keypressed; {Az po dolni uvrat}
repeat
asm
cli {Zakaz preruseni}
end;
CekejRet;
delay (Pozice);
Cervena;
Delay (Sirka);
Cerna;
Pozice := Pozice - Rychlost;
asm
sti
end;
until (Pozice < HHrana) or keypressed; {Az po horni uvrat}
until keypressed;
end.
Spusťte a zjistíte, že krok po 1 ms je příliš velký. Proužek
lítá jako splašený.
Ovšem ještě je tu jedna možnost a tou je horizontální zatemnění.
Doba kdy paprsek přeskakuje z řádku na řádek. Na známém portu 3DAh je
třetí bit informace o tom, že probíhá vertikální retrace, ovšem ještě
tu je bit nultý a ten informuje o tom, že probíhá retrace obecně,
jestliže je tedy nastaven bit 0 a zároveň není nastaven bit 3,
znamená to, že probíha retrace horizontální. Místo zběsilého čítání
naprázdno, budeme počítat jednotlivé retrace. Ty probíhají na každém
počítači stejně rychle, takže se nebudeme muset otravovat s nějakýma
konstantama.
Přibyde tedy procedura, která čeká na horizontální retrace:
procedure CekejHor;
begin
repeat until Port [3DA] and 9 = 0; {Cekam na konec retrace}
repeat until Port [3DA] and 9 = 1; {Cekam na zacatek retrace}
end;
Takže výsledek je tento. Tento program by už měl běhat stejně
rychle na všech PC.
uses crt;
const
HHrana = 1; {Horni uvrat}
DHrana = 348; {Dolni uvrat}
Rychlost = 1; {Rychlost prouzku}
Sirka = 50; {Sirka prouzku}
var Citac, Pozice : integer;
procedure CekejRet; {Cekani na KONEC retrace}
var
Bajt : byte;
begin
repeat until (Port [3DA] and 8) > 0; {Cekam na zacatek retrace}
repeat until (Port [3DA] and 8) = 0; {Cekam na konec retrace}
end;
procedure CekejHor;
begin
repeat until Port [3DA] and 9 = 0; {Cekam na konec retrace}
repeat until Port [3DA] and 9 = 1; {Cekam na zacatek retrace}
end;
procedure Cervena; {Nastavi barvu 0 jako cervenou}
begin
Port[3c8] := 0;
Port[3c9] := 63;
Port[3c9] := 0;
Port[3c9] := 0;
end;
procedure Cerna; {Nastavi barvu 0 jako cernou}
begin
Port[3c8] := 0;
Port[3c9] := 0;
Port[3c9] := 0;
Port[3c9] := 0;
end;
begin
repeat {Hlavni, nekonecna smycka}
Pozice := HHrana; {Zacinam v horni uvrati}
repeat
asm
cli {Zakazu preruseni}
end;
CekejRet; {Cekam na retrace a pocitam pauzu}
for Citac := 1 to Pozice do
CekejHor;
Cervena; {Zacnu cerveny pruh, pocitam sirku}
for Citac := 1 to Sirka do
CekejHor;
Cerna; {Koncim cerveny pruh}
Pozice := Pozice + Rychlost;
{Vypocitam pristi polohu prouzku}
asm
sti {Povolim preruseni}
end;
until (Pozice > DHrana) or keypressed; {Az po dolni uvrat}
repeat
asm
cli {Zakaz preruseni}
end;
CekejRet;
for Citac := 1 to Pozice do
CekejHor;
Cervena;
for Citac := 1 to Sirka do
CekejHor;
Cerna;
Pozice := Pozice - Rychlost;
asm
sti
end;
until (Pozice < HHrana) or keypressed; {Az po horni uvrat}
until keypressed;
end.
Upravil jsem i proceduru pro čekání na vertikální retrace. Teď
nečekám na začátek, ale na konec retrace.
Poslední úpravou bude ještě vizuální vyhezkání. Uděláme proužek
odstínovaný.
VIZ DEMO4.PAS nebo
VIZ DEMO4.C
Zde se opět objevuje sněžení, protože měním barvu v době kdy se
kreslí. Kdo ví jak na to, napište.
V dalším díle bysme konečně mohli šáhnout na kreslení čar.
Nashle příště
Piži.
Jó ještě jsem si vzpoměl. Lidi napište mi!!! Potřebuji znát vaše
názory, na to co to tady píšu. Usměrněte mě. Nebaví mě psát, když ani
nevím jestli to někdo čte.
+------------------------------------------------------+
| Petr Klimovič |
| Masarykova 857 |
| 735 14 Orlová-Lutyně |
| |
| Internet: http://buut.home.ml.org |
| BBS: 69-6512397 (21-16 hod. Víkendy 21-09 hod.) |
| Mobil: 0601-535226 |
| Email: sysop@pizi.fido.cz |
| FidoNet: 2:421/59 |
+------------------------------------------------------+
výheň