Rezidentní programyVelká skupina programů je schopna pracovat na pozadí prováděné úlohy. Patří mezi ně ovladače (myši, klávesnice, . . .), utility (hodiny, antivirová kontrola, stahovače obrazovek, . . .), viry (bez komentáře). Těmto programům přidáváme označení rezidentní. Jejich základní vlastností je jejich neustálá přítomnost v paměti počítače a schopnost se vyvolat, jestliže je to nutné. Z toho vyplývají i požadavky na ně: malá délka kódu (musí obsadit co nejméně paměti) a nezávislost na spuštěných aplikacích. Činnost těchto programů na pozadí aplikací zaručuje jejich volání spolu s obsluhami přerušení. Jestliže tedy dojde k nějaké události (stisk klávesy, přijetí dat na port, uplynutí určité doby, . . .), je voláno přerušení obsluhující tuto událost. Po této obsluze (,nebo před ní) proběhne i část rezidentního programu připojeného k ní. Aby k tomu došlo, musí tvůrce rezidentního programu změnit adresu v tabulce vektorů přerušení na adresu svého podprogramu. Přitom si starou adresu obsluhy uschová, aby mohl zajistit volání původní obsluhy události. Je jen na tvůrci, jestli starou obsluhu bude volat nebo ne (jestliže ji ale nezavolá, mohou se vyskytnout problémy). Programátor se také může rozhodnout, ve které části svého programu bude obsluhu volat (např. nemohu číst jaká klávesa byla stisknuta, když ještě neproběhla obsluha klávesnice). Rezidentní program má tyto části:
V Pascalu musíme navíc v rezidentním programu ohraničit podprogramy interrupt direktivou {$F+}, která zajistí, že bude uvnitř použito vzdálené volání (za podprogram napíšeme {$F-} pro návrat do automatického zjišťování vzdálených adres). Navíc musíme zajistit správnou alokaci paměti pro rezidentní program označením v úvodu programu {$M 400,0,0}, které vymezí oblast rezervovanou pro zásobník atd. (hodnoty je nejlepší vyzkoušet). Nejčastěji se pro rezidentní programy používají přerušení:
Ostatní hodnoty přerušení se dají zjistit z literatury (nebo SYSMANu). Na jaké přerušení rezident připojíme, závisí do značné míry na tom, co má dělat a na co má reagovat. Občas je dobré si v obsluze jednoho přerušení nastavit proměnné a v závislosti na jejich stavu vykonat (nebo nevykonat) určitou činnost v obsluze jiného přerušení. Často si ani neuvědomíme, že náš podprogram připojený k určitému přerušení, ho nepřímo volá. Dojde tak k zacyklení. Toho se částečně vyvarujeme tím, že veškeré činnosti, spojené se vstupy a výstupy, provádíme sami a nevoláme pascalovské procedury (např. výstup na obrazovku realizujeme přímým zápisem do VRAM, použití writeln vede k chybě). Příklad:
Uvedený program čte při obsluze přerušení $1C stav hodin z paměti CMOS. Po přepočtu adres a úpravě znaků z BCD kódu do ASCII je informace o čase zobrazena v pravém horním rohu obrazovky. Hlavní program má za úkol jen změnu adresy původní obsluhy na naší. |
|