xxxxxxxxx xx xx xx xxxxx xxxx xx xxxx xx xx xx xx x xx xxx x xxx x xx xx x xx xx x xx x xx xx x xx xxxx xx x xxx xxxxx ------------------------------- xx --- xxxxxx p ř e s p o r t y ----------------------- V minulé Výhni se objevil článek, který mě hodně zaujal - mám tím na mysli grafickou myš v textu. No a protože jsem měl zrovna dost času, tak jsem to zkusil vytvořit sám, jenže pod DJGPP C++. A došel jsem k jednomu problému - a sice se segmenty a chráněným režimem. No a protože stejně nemám BIOS moc v lásce, tak jsem si sehnal chytrou literaturu a zjistil, že se dají fonty v textu měnit i přímo přes videoram a několik portů. Ta knížka se mimochodem jmenuje Programování obrazových adaptérů PC (Miroslav Šnorek, Pavel Slavík; GRADA 1993), je velice solidní, ale ne každý ji má doma. Díky ní je taky napsán tenhle článek. Takže - proč se vlastně otravovat s porty, když to BIOS umožňuje přímo? Třeba proto, že ho taky nemáte rádi. Nebo proto, že děláte v protektu a nechce se vám to zbytečně obcházet. A nebo proto, že to je oproti BIOSu o něco rychlejší. Postup sám o sobě je až primitivní (pokud ho někde vyčtete, tak jako já :)) ). Stačí jenom nastavit pár registrů VGAčka, kopnout pár bajtů na správné místo v paměti a je to. Teď trochu podrobnějc: Jak funguje textmod, to už asi víte. Co možná nevíte je, jak to vypadá ještě víc zblízka. Tak já to zkusím v tomhle odstavci vysvětlit. Videoram, do které se běžně programátorsky zapisuje, má velikost 64 kB. A protože VGAčko má (minimálně) 256 kB své ramky, je rozděleno do 4 tzv. rovin právě o velikosti 64 kB. Aktivní je vždycky jenom jedna rovina. Pokud jste zrovna v textovém režimu, využívají se pro informace na monitoru nultá a první rovina. Obrazová paměť pro textmod je uložena od adresy 0b8000h takovým způsobem, že bajty na sudých adresách (znaky) jsou v nulté rovině, bajty na lichých (atributy) v první. To se provádí automaticky a vy se o to nemusíte nijak starat. Třetí rovina je nevyužita a to, co zajímá nás, je rovina druhá. Tam jsou uloženy právě definiční tabulky znaků (= fonty). U EGAček byly ve 2. rovině tabulky jenom 4, u VGAček už jich je tam plnohodnotně 8, každá tabulka bere 2000h (8192d) bajtů. Krát 8 vám vyjde přesně těch 64 kB. Adresa videoram pro přístup k fontům začíná na adrese 0a0000h, protože jenom takhle můžete zapsat všech 64 kB bez rizika zásahu někam jinam, než je paměť VGAčka. [Pro šťouraly - klidně si pak můžete zkusit nastavit počátek videoramky na 0b8000, ale pokud se pokusíte zapsat tabulku s offsetem větším než 08000h, tak by se vám taky mohly stát prapodivné věci :) ] No a aby to nebylo příliš jednoduchý, jsou offsety tabulek poházený v rovině dost zvláštně (je to kvůli kompatibilitě VGA s EGA kartou... asi): +---------+--------+ | Tabulka | Offset | +---------+--------+ | 0 | 0000h | | 1 | 4000h | | 2 | 8000h | | 3 | c000h | | 4 | 2000h | | 5 | 6000h | | 6 | a000h | | 7 | e000h | +---------+--------+ A teď k těm portům: Registry VGAčka jsou vcelku složitá věc - aspoň pro mě. Nebýt té knížky, asi nikdy bych to přímé definování fontu nedal dohromady. Každý registr má svoje anglické pojmenování (český překlad se většinou nepoužívá) a dá se k němu přistupovat pomocí různých portů. Ještě jsou ty registry ve speciálních skupinách, jako Graphics Controler, Sequencer, CRTC Controler a Attribute Controler. Ale to by bylo na děsně dlouho, to je spíš námět na článek (chopíte se toho někdo????). Já to teď ve srovnání s knížkou hodně zkrátím a řeknu jenom zhruba, o co se jedná - zkrátka přeprogramujeme VGAčko tak, aby se na místě videoram nacházela ne 0. nebo 1. rovina, ale právě ta naše fontová. Kolem toho je potřeba udělat pár machinací s registry, ale tohle je princip. Pak se zapíše font (nebo třeba jenom jeden znak) na příslušné místo ve videoram a zase se všechno vrátí do původního stavu. [Machinace s registry = změnit pár registrů ze skupin Sequencer a Graphics Controler. V podstatě je to zápis několika čísel na 4 porty (pokud se zapisují wordy, tak jenom na 2). Dá se to hezky hodit do pole wordů.] K tomuhle článku by měly být připojeny další soubory, a sice - jednodušší implementace tohohle všeho povídání v Pascalu a trochu rozsáhlejší v Céčku (pro DJGPP a Watcom). Tam je to snad názorně napsaný a popsaný. [Dokonce je tam uvedená i úprava pro šťouraly :) ] Kvůli technicky založeným a VGA-registrů-znalým lidem jsem se přemluvil a tu důležitou pasáž přepsal, aby o nic nepřišli. Tady je. ---------------------------------------------------------------------- [ Tady je několik poznámek k tomuhle článku ] ---------------------------------------------------------------------- Snad vám to k něčemu bude, možná se začnete víc zajímat o to, co všechno se dá dělat bez použití BIOSu :)) a třeba se rozhodnete napsat ten článek o registrech VGAčka ;-). Export: (soubory jsou samorozbalovací RAR archivy) [ Zdrojáky pro Pascal ] [ Zdrojáky pro C/C++ ] Valor PS: Pokud byste v tomhle textu shledali nějaké závažné nedostatky nebo věděli něco navíc, tak to napiště sem do Výhně - já si aspoň zmenším míru mé neznalosti :)) - a třeba nejen já... výheň