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ň