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ň