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ň