
                            
                                      
                                   
                             
                                   
                                   


 ͻ
                                                                             
             VGA/MCGA Md 13H Grafick rutiny v Turbo Assembleri             
                                                                             
                    Bodov, spriteov a paletov funkcie                     
                        Turbo & Borland Pascal 7.01                          
                                Borland C++                                  
                                                                             
                         (c) 1993-97 ALAC Software                           
                                                                             
 ͼ


 Obsah


      0. vod

         o je Grafika ? .............................................. 0.0
         Podporovan funkcie .......................................... 0.1
         Grafika a programovacie jazyky ............................... 0.2
         Prehad pojmov ............................................... 0.3

      1. Adresovanie

         Pr informci o VGA v 320x200x256 ........................... 1.0
         Multiplikan spsob adresovania ............................. 1.1
         Tabukov spsob adresovania ................................. 1.2
         Rotan spsob adresovania ................................... 1.3
         Tipy na zrchlenie adresovania ............................... 1.4

      2. Hlavn funkcie

         SetVideoPage ................................................. 2.0
         SetMode ...................................................... 2.1
         SetVGAMode ................................................... 2.2
         SetTextMode .................................................. 2.3
         UseVirtual ................................................... 2.4
         CopyScreen ................................................... 2.5
         ClearScreen .................................................. 2.6
         ClearScreenVirtual ........................................... 2.7
         CopyRows ..................................................... 2.8
         CopyRowsRel .................................................. 2.9
         InvertScreen ................................................ 2.10
         WaitRetrace ................................................. 2.11
         WaitVRetrace ................................................ 2.12
         WaitNotVRetrace ............................................. 2.13
         WaitFrames .................................................. 2.14

      3. Body

         PointPage .................................................... 3.1
         SetPixel ..................................................... 3.2
         SetPixelVirtual .............................................. 3.3
         SetPixelTab .................................................. 3.4
         SetPixelTabVirtual ........................................... 3.5
         GetPixel ..................................................... 3.6
         GetPixelVirtual .............................................. 3.7
         SetPointPage ................................................. 3.8
         GetPointPage ................................................. 3.9

      4. iary

         LinePage ..................................................... 4.1
         Line ......................................................... 4.2
         LineVirtual .................................................. 4.3
         HorizontalLine ............................................... 4.4
         HorizontalLineVirtual ........................................ 4.5
         HorizontalLineRel ............................................ 4.6
         HorizontalLineRelVirtual ..................................... 4.7
         VerticalLine ................................................. 4.8
         VerticalLineVirtual .......................................... 4.9
         VerticalLineRel ............................................. 4.10
         VerticalLineRelVirtual ...................................... 4.11
         SetLinePage ................................................. 4.12
         GetLinePage ................................................. 4.13

      5. Obdniky

         BoxPage ...................................................... 5.1
         DrawBox ...................................................... 5.2
         DrawBoxVirtual ............................................... 5.3
         DrawBoxRel ................................................... 5.4
         DrawBoxRelVirtual ............................................ 5.5
         SetBoxPage ................................................... 5.6
         GetBoxPage ................................................... 5.7

      6. Kruhy

         CirclePage ................................................... 6.1
         Circle ....................................................... 6.2
         CircleVirtual ................................................ 6.3
         FilledCircle ................................................. 6.4
         FilledCircleVirtual .......................................... 6.5
         SetCirclePage ................................................ 6.6
         GetCirclePage ................................................ 6.7

      7. Elipsy

         EllipsePage .................................................. 7.1
         Ellipse ...................................................... 7.2
         EllipseVirtual ............................................... 7.3
         FilledEllipse ................................................ 7.4
         FilledEllipseVirtual ......................................... 7.5
         SetEllipsePage ............................................... 7.6
         GetEllipsePage ............................................... 7.7

      8. Paleta farieb

         SetPalette ................................................... 8.1
         GetPalette ................................................... 8.2
         IncPalette ................................................... 8.3
         DecPalette ................................................... 8.4
         ConvertRGBPalette ............................................ 8.5
         RotatePaletteLeft ............................................ 8.6
         RotatePaletteRight ........................................... 8.7

      9. Sprity

         SpritePage ................................................... 9.1
         Adress ....................................................... 9.2
         DrawSpriteXY ................................................. 9.3
         DrawSprite ................................................... 9.4
         DrawSpriteOver ............................................... 9.5
         Sprite ....................................................... 9.6
         SpriteVirtual ................................................ 9.7
         SpriteOver ................................................... 9.8
         SpriteOverVirtual ............................................ 9.9
         GetSprite ................................................... 9.10
         GetSpriteVirtual ............................................ 9.11
         SpriteScale ................................................. 9.12
         SpriteScaleVirtual .......................................... 9.13
         SpriteScaleOver ............................................. 9.14
         SpriteScaleOverVirtual ...................................... 9.15
         SpriteScaleRel .............................................. 9.16
         SpriteScaleRelVirtual ....................................... 9.17
         SpriteScaleOverRel .......................................... 9.18
         SpriteScaleOverRelVirtual ................................... 9.19
         CopySprite .................................................. 9.20
         SetSpritePage ............................................... 9.21
         GetSpritePage ............................................... 9.22

     10. asti spritov

         CellPage ..................................................... 10.1
         Cell ......................................................... 10.2
         CellVirtual .................................................. 10.3
         CellOver ..................................................... 10.4
         CellOverVirtual .............................................. 10.5
         SetCellPage .................................................. 10.6
         GetCellPage .................................................. 10.7

     11. Fontov funkcie

         WritePage .................................................... 11.1
         CharSpace .................................................... 11.2
         LineSpace .................................................... 11.3
         CharHeight ................................................... 11.4
         WriteFont .................................................... 11.5
         WriteFontHI .................................................. 11.6
         WriteFontHD .................................................. 11.7
         WriteFontVI .................................................. 11.8
         WriteFontVD .................................................. 11.9
         WriteFontOver ............................................... 11.10
         WriteFontOverHI ............................................. 11.11
         WriteFontOverHD ............................................. 11.12
         WriteFontOverVI ............................................. 11.13
         WriteFontOverVD ............................................. 11.14
         PrintFont ................................................... 11.15
         PrintFontHI ................................................. 11.16
         PrintFontHD ................................................. 11.17
         PrintFontVI ................................................. 11.18
         PrintFontVD ................................................. 11.19
         PrintFontOver ............................................... 11.20
         PrintFontOverHI ............................................. 11.21
         PrintFontOverHD ............................................. 11.22
         PrintFontOverVI ............................................. 11.23
         PrintFontOverVD ............................................. 11.24
         SetWritePage ................................................ 11.25
         SetCharSpace ................................................ 11.26
         SetLineSpace ................................................ 11.27
         SetCharHeight ............................................... 11.28
         GetWritePage ................................................ 11.29
         GetCharSpace ................................................ 11.30
         GetLineSpace ................................................ 11.31
         GetCharHeight ............................................... 11.32

     12. Obrzky, formty OBR a POB

         ShowScreen ................................................... 12.1
         ShowCompressedScreen ......................................... 12.2
         SetScreen .................................................... 12.3
         SetScreenVirtual ............................................. 12.4
         DeCompressScreen ............................................. 12.5
         DeCompressVirtual ............................................ 12.6
         DeCompressOverVirtual ........................................ 12.7

     13. Obrzky a sprity, formt PCX

         ShowPCX ...................................................... 13.1
         DeCompressPCX ................................................ 13.2
         DeCompressPCXVirtual ......................................... 13.3
         PCXSprite .................................................... 13.4
         PCXSpriteVirtual ............................................. 13.5
         PCXSpriteOver ................................................ 13.6
         PCXSpriteOverVirtual ......................................... 13.7

     14. Klvesnica

         Keyboard ..................................................... 14.1
         KeyBufferAddr ................................................ 14.2
         Key .......................................................... 14.3

     15. Hardware

         DetectVideo .................................................. 15.1
         ProcessorType ................................................ 15.2
         PresentMathCoprocessor ....................................... 15.3
         PresentCDROM ................................................. 15.4
         GetCDROMDrive ................................................ 15.5
         GetCDROMNumber ............................................... 15.6
         GetMSCDExVersion ............................................. 15.7
         GetFloppyDrive ............................................... 15.8
         FloppyDriveType .............................................. 15.9
         GetSerialPort ............................................... 15.10
         GetParallelPort ............................................. 15.11
         PresentGamePort ............................................. 15.12
         PresentMouse ................................................ 15.13
         EnhancedKeyboard ............................................ 15.14
         PresentEMS .................................................. 15.15
         GetEMSVersion ............................................... 15.16
         EMSMemory ................................................... 15.17
         GetVCPIVersion .............................................. 15.18
         GetDPMIVersion .............................................. 15.19
         PresentXMS .................................................. 15.20
         GetXMSVersion ............................................... 15.21
         XMSMemory ................................................... 15.22
         PresentVESA ................................................. 15.23
         GetVESAInfo ................................................. 15.24

     16. Pam

         AllocateMemory ............................................... 16.1
         DeAllocate ................................................... 16.2
         FreeDOSMemory ................................................ 16.3

     17. Rozlin funkcie

         ClearKeyBuffer ............................................... 17.1
         WaitMSec ..................................................... 17.2
         Time ......................................................... 17.3
         WaitTime ..................................................... 17.4
         ExtractPointer ............................................... 17.5




                                     0. vod   
                                  

0.0  o je Grafika ?

  Grafika je sada rutn, sliacich na podporu programovania grafiky a hier.
  Ku vine rutn s pripraven aj prklady, ktor ukazuj, ako sa maj
  pouva.

  Podporovan je jedin rozlenie grafiky, a to VGA/MCGA 320x200 v 256
  farbch. Toto rozlenie poskytuje obrovsk rchlos, ale ia pomer vekosti
  a rozlenia obrazu pre horizontl:vertikl je 1 : 1.2, ie na obrazovke
  nedokeme vytvori tvorcov body, ale iba body, ktorch vka je 1.2-krt
  via ako rka. Prirodzene, e od obrazu v tomto rozlen nemono oakva
  kvalitu SVGA, ale pre vinu hier sa toto rozlenie doke uplatni.

  Tto dokumentcia je uren tm, ktor nemaj zujem len o referencie
  o jednotlivch funkcich, ale aj tm, ktor maj zujem o pochopenie
  princpov a nemaj ete vek sksenosti s programovanm grafiky.
  Samozrejme, urit programtorsk a matematick sksenos je vemi
  potrebn.

0.1  Podporovan funkcie

     - vykresovanie bodov, iar, plnch obdnikov
     - vykresovanie krunc, kruhov a elps
     - vykresovanie spritov, ich ast a zmena vekosti spritov
     - vpis textu cez dva typy fontov
     - nastavovanie palety, rotcia, zhasnanie a zosvetovanie
     - prca s obrzkami vo formtoch OBR, POB a PCX
     - priamy prstup na klvesnicu, monos snmania viacerch klves naraz
     - detekcia najrznejieho hardware, videa, procesoru
     - priama prca s pamou
     - rzne matematick funkcie

0.2  Grafika a programovacie jazyky

     Vina rutn je programovan v Assembleri (99%). Kompilovan s prostred-
     nctvom Turbo Assembleru 3.2 v reime MASM. Ich vntorn truktra zodpo-
     ved poiadavkam kladenm na rutiny v Turbo Pascale. Pokia maj by tieto
     rutiny pouvan v C/C++, treba deklarovat vsetky funkcie ako "pascal",
     alebo previes menie zmeny, a to :

              1. Prehdza poradie argumentov za operandami ARG v ASM
                 zdrojkoch tak, aby bolo presne opan.
              2. Previes RET bez parametra.
              3. Pre vpis reazcov si treba vytvori truktru, ktor
                 je typovo kompatibiln s Pascalovskm stringom, ie
                 pole s max. 256 znakmi, z ktorch 0-t znak je poet
                 znakov reazca. Potom treba do funkcie vrti pointer
                 na tto truktru.

     Toto vetko u je vykonan v sbore Grafika.H
     Rutiny su programovan pre Real Mode procesora, take nechodia v protecte.
     Bohuia, zatia neviem programova pod Protected mdom, take 386+ sa
     tu uplatn len okrajovo.

0.3  Prehad pojmov

     Niektor zkladn pojmy pre prcu s grafikou.

     Video RAM - as pamti, v ktorej je uloen vetko viditen
                 na obrazovke. Povinou zana na A000:0000

     Virtulna obrazovka - as pamti, ktor pouvame na prpravu novho
                 obrazu, ktor potom prenesieme do Video RAM. Je to dobr
                 na to, e pri viacerch pohyblivch objektoch by bolo mon
                 vidie postup vykresovania tchto objektov a tak si obraz
                 dopredu pripravme niekde v pamti a a po skonen
                 vykresovania obrazu prenesieme jej obsah do Video RAM.

     Sprite  -   mal obrzok, ktor chceme vykresli na obrazovku. Je to
                 naprklad postavika, ktorej kad pohyb je rozfzovan
                 prve v jednom sprite. Ich skladanm v ase dostaneme pohyb.
                 Vdy ide o obdnikov obrzok.
                 Tie sa oznauje pojmom BitMap.

     Font    -   Sada znakov, v ktorej s uloen tvary vetkch psmen.
                 Dalo by sa to definova ako sada spritov, z ktorch kad
                 znzoruje jedno psmeno.
                 Tu s podporovan viacer formty.

     Transparentn farba - farba, ktor sa nevykresuje, m umouje v sprite
                           odli tvar od nevyuitch bodov v obdniku.
                           Umouje vykresli napr. postaviku tak, 
                           aby nemazala pozadie pod sebou.

     

     Pojmy, ktor dotvraj nzvy procedr. Tieto pojmy s obsiahnut v nzvoch
     niektorch procedr a je lepie ich pozna, aby lovek hne vedel, o om
     asi tieto procedry s.

     Virtual - vykresovanie sa uskutouje na virtulnej obrazovke, ktorej
               segment je prvm parametrom funkcie. Ak budeme chcie vidie,
               o sme vytvorili, budeme musie tto obrazovku skoprova
               do Video RAM.

     Over  -   poas vykresovania sa ignoruj body s hodnotou 0, ktor sa
               potom nevykresuj, ie pod nimi ostva pvodn podklad, ak
               sa u na obrazovke vyskytoval. Je to dobr, ak nechceme
               vykresli sprite ako cel tvorec, ale iba jeho zakreslen
               as.

     Rel   -   oznauje relatvne zadvanie sradnc, kedy s zadan prv
               sradnice X, Y a potom je zadan rka, resp. vka objektu.
               To znamen, e ak je DrawBox (X1,Y1,X2,Y2), tak potom relatvne
               zadan funkcia je DrawBoxRel (X,Y,rka,Vka).


1. Adresovanie bodov

     Pre pochopenie tchto vec by bolo dobr pozna aspo zklady spsobu
     adresovania pamte na 80x86. Take hor sa na TAsm Reference Guide !-)

     Ale pre prehad aspo strune o adresovan na PC :
     Adresa sa sklad z dvoch zloiek, segmentu a offsetu. o to m by ?
     Predstavte si tabuku v tvare pky a s npisom 5 km. Segment je akoby
     t pka, offset zase tch 5 km. Pri troche predstavivosti by sa dalo
     poveda, e segment ukazuje pribline smer kam s, offset to dopa
     konkrtnym vyjadrenm (hodnotou) miesta.

     Ako to technicky funguje ?
     Adresa je zloen z 20 bitov. Offset zaber dolnch 16 bitov, segment
     zaber hornch 16 bitov. Nieo sa vm na tom nezd ? Samozrejme, segment
     sa s offsetom prelna na 12 bitoch. Nakresli by sa to dalo asi takto :

                                   Ŀ
                          Segment   A   8  1   2 
                                   
                                       Ŀ
                          Offset    +   3   2  5   C 
                                       
                                   
                                   Ŀ
                          Adresa    A  B  3  7  C 
                                   

     Inak napsan : A812:325C = A000:B37C = 0AB37CH

     Nieo sa vm nepi ? Neviete, o znamenaj tie psmen ?
     Na tomto mieste by asi bolo dobr zopakova si vedomosti z matematiky
     a dozvedie sa osi o selnch sstavch.
     Pota funguje v dvojkovej sstave, to s tie klasick 10010110 ...
     Ako vidte, nie je to moc prjemn na pohad a tak sa kedysi ktosi
     rozhodol, e si vyberie 4 bity a poet ich kombinci bude zkladom
     pre vyjadrovanie sel v potai. Naastie tch kombinci bolo iba
     16, lebo ako sa ochvu uke, inak by nm u nestaila abeceda...
     Zkladom naej sstavy je teda slo 16. To znamen, e pre kad
     slo od 0 po 15 musme njs uniktny znak. Pre 0 a 9 je to ahk,
     0 je 0, 1 je 1, ... 9 je 9. Ale o s 10 ? Je to predsa kombincia
     znakov 1 a 0, a my predsa potrebujeme ma pre 10 zvltny znak !?
     No a tak tieto zvyn sla vyjadrme porade psmenami abecedy.
     Potom 10 = A, 11 = B, 12 = C, 13 = D, 14 = E a 15 = F. No pri sle
     0AB37CH mme ete slo 0 a psmeno H, ktor by tam nemali o robi,
     teda o s tm ? 0 je na zaiatku preto, aby bolo vidno, e ide o slo,
     ktor vak zana psmenom. H na konci oznauje estnstkov, ie
     hexadecimlnu sstavu.
     Pvod psmen je teda objasnen, ako vak s tm narba ?
     Pome si pozrie byte z dvojkovho a estnstkovho pohadu :

                                   Ŀ
            Byte:                   5   C    -  estnstkova sstava
                                        (hexadecimlna)

                         8   4   2   1   8   4   2   1
                       Ŀ - dvojkov sstava
                        0  1  0  1  1  1  0  0    (binrna)
                       

     Hore mme byte 5CH v estnstkovej sstave, dolu v dvojkovej sstave.
     Ak spotame v kadej polovici sty sel nad rmekmi vtedy, ke je
     v rmekoch 1, dostaneme sla 5 a 12. 5 je v estnstkovej sstave 5,
     12 zase C. A mme vyjadren byte - 5CH. Ako si do dvojkovej sstavy
     prepeme ubovon slo u nechm na vs. Pomcka: To, o sme robili
     so 4 bitmi meme robi s 8, 16, 21 ...


1.0  Pr informci o VGA v 320x200x256

     Rozlenie 320 x 200 v 256 farbch m linerne bytov adresovanie.
     Znamen to asi to, e body s v pamti uren slami farieb, ktor
     za sebou nsleduj linerne.
     ie 0. bod je na adrese 0, 1.bod na adrese 1, ... 35275. bod je
     na adrese 35275 at.
     sla farieb udvaj polohu farby v palete. Paleta je v tomto mde
     vlastne pole 256 trojc bytov, ktor udvaj intenzity troch farieb,
     ervenej, zelenej a modrej (RGB), z ktorch je kad farba zloen.
     V ach astiach sa budeme zaobera spsobmi adresovania bodov.

1.1  Multiplikan spsob adresovania

     Adresa bodu v rozlen 320 x 200 sa d hne zisti, ak pre jej vpoet
     pouijeme vzah Adresa = X + Y * 320, kde X je horizontlna poloha bodu,
     Y je vertiklna poloha bodu a 320 je v naom prpade rka. Toto
     adresovanie vyuva nsobenie, a tak som si ho nazval multiplikanm.
     ( V Assembleri nsob intrukcia MUL - multiply ;-)
     Tento spsob je sce jednoduch a kad mu pochop, ale je to aj spsob
     najpomal. Preto teraz ukem a spsob adresovania.
                          
1.2  Tabukov spsob adresovania

     Najvm problmom v predchdzajcom adresovan je pomal nsobenie.
     Tmto nsobenm sme dostali adresu riadku, ku ktorej potom iba stailo
     pripota sradnicu X.
     o keby sme si vak sksili dopredu vypota adresy vetkch riadkov a
     v prpade potreby by sme si ich iba vybrali z pamti ? Vytvorme si teda
     tabuku, kde vlome offsety (2 byty) kadho riadku. Tieto offsety
     dostaneme, ak si spustme cyklus od 0 do 199, kad z tchto sel
     vynsobme 320 (rkou) a potom tieto 2-bajtov sla ulome za sebou
     do pamti. V Pascale potom na zistenie adresy riadku sta urobi toto:
     Adresa = X + MemW [ Seg (Tabuka): Ofs (Tabuka) + Y * 2 ]. Inmi slovami:
     Zoberieme (Y*2)-h slovo od adresy tabuky a to je adresa riadku.
     A mme to vyrieen. Alebo nie ?
     
1.3  Rotan spsob adresovania

     No je tu aj in monos. A to pouitie logickch posunov vavo na zskanie
     adresy. Preo a ako ?
     Posun doava m ten ist efekt ako nsobenie dvomi. Posun vpravo m zase
     efekt delenia dvomi. Tieto vlastnosti vyplvaj z binrnosti bytov, t.j.
     byty s poskladan z bitov a tie mu ma len dve hodnoty. Teda ako to
     ale vyui ? Chceme vyjadri nsobenie nejakm nepeknm slom - dajme
     tomu 137. Take chceme vypota 137 * Y. 137 si meme rozpsa ako
     128 + 8 + 1. ie chceme vypota (128 + 8 + 1) * Y. Toto poda pravidla
     distributvnosti meme rozpsa ako 128 * Y + 8 * Y + Y. No 128 je
     predsa 2^7 (dve na siedmu) a 8 je 2^3. ie ak chceme nsobi 128, sta
     nm sedemkrt nsobi dvomi, ie posun to cel o 7 doava. No a konene
     nm tu vyjde, e nsobenie 137-imi vyjadrme ako Y Shl 7 + Y Shl 3 + Y.
     A toto je zaruene v potai rchlejie ako nsobenie.
     My tu vak mme celkom sympatick slo 320. A teda adresa riadku je:
          Y * 320 = 5 * 64 * Y = 5 * (Y Shl 6) = (Y Shl 6) * (4 + 1)
          = 4 * (Y Shl 6) + (Y Shl 6) = Y Shl 8 + Y Shl 6
     Vsledn adresu zskame pomerne jednoducho:
     Adresa = X + (Y Shl 8) + (Y Shl 6)
     Toto adresovanie je zrejme najrchlejie, preto je pouit vo vetkch
     rutinch, v ktorch nie je uveden, ak adresovanie pouvaj.

1.4  Tipy na zrchlenie adresovania

     Urite ste si vimli, e spsob 1.2 nm moc nepomohol, pretoe tam ostalo
     to Y * 2. Ale ke ste si u vimli spsob 1.3, je u jasn, e to meme
     nahradi ovea rchlejm a jednoduchm posunom Y doava. ie spsob 1.2
     je nakoniec Adresa = X + MemW [ Seg (Tabuka): Ofs (Tabuka) + Y Shl 1 ]
     Celkove je vak 1.3 aj tak o mlo rchlej ako 1.2.

     Avak najrchlejm spsobom, ako zrchli adresovanie je programova
     ho v Assembleri. Z tohto potom vyplvaj niektor zrchlenia.

     Spsob 1.3:         1) 286               2) 386+
                            MOV  AX,Y            MOV  AX,Y
                            MOV  DI,AX           MOV  DI,AX
                            MOV  AH,AL           SHL  AX,8
                            SHL  DI,6            SHL  DI,6
                            MOV  AL,X            MOV  AL,X
                            ADD  DI,AX           ADD  DI,AX

                              - Offset adresy je v DI

     Zrchlenie spsobu 1.3 spova v tom, e opercie s 8-bitovmi registrami
     s na 386+ pomalie ako opercie so 16-bitovmi registrami. Preto na 286
     je rchlejie presun AL do AH miesto posunu AL do AH cez AX. Na 386+
     je to vak naopak, posun AX o 8 doava je rchlej ako presun AL do AH.

     Je zaujmav programova s tm, e nejak spsob je najrchlej a potom
     zisti, e existuje aj ovea rchlej. Toto vak neobilo ani ma a preto
     sa dopredu ospravedlujem, ak by sa niektor z mojich rutn ukzali by
     pomalmi, ako by som akal. Tieto spsoby adresovania s tu uveden
     preto, aby bolo trochu vidie, akmi fzami vvoja preli tieto rutiny.




2. Hlavn funkcie
   Slia na prepnutie VGA do mdu 13H a sp do textovho mdu, obsahuj
   rutiny na pouvanie virtulnej obrazovky, na mazanie obrazovky a na test
   pohybu la po obrazovke. Je to vlastne zkladn balk pre prcu s VGA.

2.0 Procedra SetVideoPage (VPage: Word)
    void SetVideoPage (unsigned int VPage)

    Nastav vetky premenn XXXXPage na rovnak hodnotu. Premenn XXXXPage
    uruj segment adresy obrazovky, implicitne s nastaven na 0A000H.
    Pri tan tohto dokumentu bude alej jasn, o znamen XXXXPage.
    S rzne pre kad sbor rutn (napr. LinePage, PointPage, WritePage...).
    SetVideoPage sa nachdza v Graphics.Pas (TPU).

2.1 Procedra SetMode (Mode: Byte)
    void SetMode (unsigned char Mode)

    Nastav grafick md cez preruenie video BIOSu INT 10H Fn 00H.
    Nastav "ubovon" md, ktor je podporovan BIOSom (ie ni moc).

2.2 Procedra SetVGAMode
    void SetVGAMode (void)

    Nastav md 13H (320 x 200 x 256), teda md, v ktorom toto vetko beh.
    Je to nieo ako Borlandovsk InitGraph.

2.3 Procedra SetTextMode
    void SetTextMode (void)

    Nastav textov md 3, 80 x 25, color (CO80). Dobr je to poui, ke
    sa vraciame z programu sp do DOSu. Nieo ako CloseGraph.

2.4 Procedra UseVirtual (SegVirtual: Word)
    void UseVirtual (unsigned int SegVirtual)

    Skopruje cel obrazovku (64000 bytov) zo segmentu SegVirtual do video
    pamte na A000:0000.

2.5 Procedra CopyScreen (SegSource, SegDestination: Word)
    void CopyScreen (unsigned int SegSource, unsigned int SegDestination)

    Skopruje obsah obrazovky na segmente SegSource na obrazovku na segmente
    SegDestination.

2.6 Procedra ClearScreen (Color: Byte)
    void ClearScreen (unsigned char Color)

    Vymae obrazovku a vypln ju farbou Color.

2.7 Procedra ClearScreenVirtual (SegVirtual: Word; Color: Byte)
    void ClearScreenVirtual (unsigned int SegVirtual, unsigned char Color)

    Vymae virtulnu obrazovku na segmente SegVirtual a vypln ju farbou Color.

2.8 Procedra CopyRows (SegSource,SegDestination,Y1,Y2: Word)
    Prekopruje riadky medzi Y1 a Y2 z obrazovky na segmente SegSource
    na obrazovku na segmente SegDestination.

2.9 Procedra CopyRowsRel (SegSource,SegDestination,Y,Count: Word)
    Prekopruje Count riadkov, ponajc Y-tm, z obrazovky na segmente
    SegSource na obrazovku na segmente SegDestination.

2.10 Procedra InvertScreen (SegScreen: Word)
     Obrti obrazovku na segmente SegScreen "hore nohami". Treba vyska,
     mono sa njde vyuitie ;-)

2.11 Procedra WaitRetrace
     ak na cel nvrat svetelnho la. Ke chceme nieo kresli na obrazovku,
     je vhodn, aby sme si pokali na nvrat a hne potom vykreslili nov
     obrazovku. Vtedy by nemalo by vidno prekreslenie obrazu.

2.12 Procedra WaitVRetrace
     ak na nvrat svetelnho la.

2.13 Procedra WaitNotVRetrace
     ak na koniec nvratu svetelnho la.

2.14 Procedra WaitFrames (Frames: Word)
     ak Frames snmok (nvratov la monitora).




3. Bodov funkcie

   Slia na prcu s jednotlivmi bodmi. Kee video pam je v mde 320 x 200
   organizovan tak, e kad byte vo video pamti oznauje farbu bodu a tieto
   body nsleduj za sebou, adresovanie je linerne a vemi rchle.


3.1 Premenn PointPage - oznauje segment adresy video pamti, implicitne je
                         nastaven na tandartn hodnotu 0A000H. Vetky proce-
                         dry okrem procedr, ktor maj v nzve Virtual,
                         v Point.Asm ju pouvaj ako segment obrazovky.
                         Pojem "obrazovka" bude alej oznaova pam
                         na segmente PointPage.

3.2 Procedra SetPixel (X,Y: Word; Color: Byte)
    Vykresl bod na sradniciach X,Y obrazovky s farbou Color.

3.3 Procedra SetPixelVirtual (SegVirtual,X,Y: Word; Color: Byte)
    Vykresl bod na sradniciach X,Y virtulnej obrazovky, ktorej segment je
    SegVirtual, s farbou Color.

3.4 Procedra SetPixelTab (X,Y: Word; Color: Byte)
    Vykresl bod na sradniciach X,Y obrazovky, farbou Color. Pouva
    tabukov adresovanie (pre 286), tabuka je v Table13H.Inc.

3.5 Procedra SetPixelTabVirtual (SegVirtual,X,Y: Word; Color: Byte)
    Vykresl bod na sradniciach X,Y virtulnej obrazovky, ktorej segment je
    SegVirtual, farbou Color. Pouva tabukov adresovanie.

3.6 Funkcia GetPixel (X,Y: Word): Byte
    Vrti hodnotu farby bodu na pozcii X,Y obrazovky.

3.7 Funkcia GetPixelVirtual (SegVirtual,X,Y: Word): Byte
    Vrti hodnotu farby bodu na pozcii X,Y virtulnej obrazovky na segmente
    SegVirtual.

3.8 Procedra SetPointPage (PPage: Word)
    Nastav hodnotu premennej PointPage.

3.9 Funkcia GetPointPage: Word
    Vrti hodnotu premennej PointPage.



4. iarov funkcie

   iarov funkcie umouj, ako inak, kreslenie iar. Podporovan s zvisl,
   vodorovn, ale i "obyajn" iary. Tieto obyajn iary s postaven
   na zklade algoritmu Bresenhama, ktorho vpis pod Pascalom sa nachdza
   v sbore Algoritm.Txt ako vpis .1. Hlavn vhoda tohto algoritmu
   spova v tom, e vetko je vyjadren celoselne, ie odpad pouvanie
   pomalch relnych sel. Pre vodorovn iaru sa zase zisuje, i m prnu
   alebo neprnu dku. Ak m prnu, vykresl iaru intrukciou REP STOSW,
   ak m neprnu dku, vykresl ju intrukciami REP STOSW a STOSB. Vpis
   v Pascale .2.

   Mimochodom, existuje aj rchlej algoritmus na vykreslenie iary, ako
   je Bresenhamov. Pouva relne sla interpretovan celmi slami.

4.1 Premenn LinePage - oznauje segment adresy video pamti, implicitne je
                        nastaven na tandartn hodnotu 0A000H. Vetky proce-
                        dry okrem procedr, ktor maj v nzve Virtual,
                        v Line.Asm ju pouvaj ako segment obrazovky.
                        Pojem "obrazovka" bude alej oznaova pam
                        na segmente LinePage.

4.2 Procedra Line (X1,X2,Y1,Y2: Word; Color: Byte)
    Vykresl iaru z X1,Y1 do X2,Y2 s farbou Color. Pouva znane zrchlen
    algoritmus Bresenhama (asi 4x rchlej ako pvodn) zsluhou priameho
    prstupu do pamti.

4.3 Procedra LineVirtual (SegVirtual,X1,X2,Y1,Y2: Word; Color: Byte)
    Ako Line, ale na virtulnu obrazovku na segmente SegVirtual.

4.4 Procedra HorizontalLine (X1,X2,Y: Word; Color: Byte)
    Vykresl vodorovn iaru z X1 do X2 v riadku Y farbou Color.
    X1 mus by menie ako X2 !

4.5 Procedra HorizontalLineVirtual (SegVirtual,X1,X2,Y: Word; Color: Byte)
    Ako HorizontalLine, ale na virtulnu obrazovku na segmente SegVirtual.

4.6 Procedra HorizontalLineRel (X,Y,Length: Word; Color: Byte)
    Vykresl vodorovn iaru z X,Y s dkou Length farbou Color.

4.7 Procedra HorizontalLineRelVirtual (SegVirtual,X,Y,Length: Word;
                                        Color: Byte)
    Ako HorizontalLineRel, ale na virtulnu obrazovku na segmente SegVirtual.

4.8 VerticalLine (X,Y1,Y2: Word; Color: Byte)
    Vykresl zvisl iaru na stpci X medzi riadkami Y1 a Y2 farbou Color.
    Y1 mus by menie ako Y2 !

4.9 VerticalLineVirtual (SegVirtual,X,Y1,Y2: Word; Color: Byte)
    Ako VerticalLine, ale na virtulnu obrazovku na segmente SegVirtual.

4.10 VerticalLineRel (X,Y,Length: Word; Color: Byte)
     Vykresl zvisl iaru z X,Y s dkou Length farbou Color.

4.11 VerticalLineRelVirtual (SegVirtual,X,Y1,Y2: Word; Color: Byte)
     Ako VerticalLineRel, ale na virtulnu obrazovku na segmente SegVirtual.

4.12 Procedra SetLinePage (LPage: Word)
     Nastav hodnotu premennej LinePage.

4.13 Funkcia GetLinePage: Word
     Vrti hodnotu premennej LinePage.



5. Obdnikov funkcie.

   Umouj kresli "pln" obdniky. Algoritmus je ten ist ako pri
   vodorovnch iarach, ibae tch vodorovnch iar kresl pod seba toko,
   koko je vka obdnika.

5.1 Premenn BoxPage - oznauje segment adresy video pamti, implicitne je
                       nastaven na tandartn hodnotu 0A000H. Vetky pro-
                       cedry okrem procedr, ktor maj v nzve Virtual,
                       v Box.Asm ju pouvaj ako segment obrazovky.
                       Pojem "obrazovka" bude alej oznaova pam
                       na segmente BoxPage.

5.2 Procedra DrawBox (X1, Y1, X2, Y2: Word; Color: Byte)
    Vykresl vntro obdnika farbou Color, ktorho jeden roh m sradnice
    X1,Y1 a druh, opan, sradnice X2,Y2.

5.3 Procedra DrawBoxVirtual (SegVirtual: Word; X1, Y1, X2, Y2: Word; Color: Byte)
    Ako DrawBox, ale na virtulnu obrazovku na segmente SegVirtual.

5.4 Procedra DrawBoxRel (X, Y, BWidth, BHeight: Word; Color: Byte)
    Vykresl vntro obdnika farbou Color, ktorho av horn roh m
    sradnice X,Y a m rozmery BWidth x BHeight.

5.5 Procedra DrawBoxRelVirtual (SegVirtual: Word; X1, Y1, X2, Y2: Word;
                                 Color: Byte)
    Ako DrawBoxRel, ale na virtulnu obrazovku na segmente SegVirtual.

5.6 Procedra SetBoxPage (BPage: Word)
    Nastav premenn BoxPage, ktor uruje segment obrazovky.

5.7 Funkcia GetBoxPage: Word
    Vrti hodnotu premennej BoxPage.



6. Kruhy

   Obsahuj dva typy procedr - vykreslenie krunice a kruhu.
   Krunica je vykresovan algoritmom Bresenhama, ktor je postaven
   na podobnom princpe ako algoritmus na kresbu iary (Line), take je v om
   pouit len celoseln aritmetika. Taktie je tu vyuit aj princp
   symetrie poda stredu krunice, kde je krunica rozdelen na 8 rovnakch
   ast. Potom nm sta pota sradnicu jednho bodu, z ktor0ho zistme
   sradnice ach siedmich (vpis .3). Kruh je vykresovan obdobnm 
   spsobom, ale na rozdiel od krunice sa nevykresuje osem bodov, ale tyri
   seky, ktor maj zaiaton a koncov bod s rovnakou sradnicou Y
   (v zujme dosiahnutia najvyej rchlosti s tieto seky vodorovn
   - vpis .4).

6.1 Premenn CirclePage - oznauje segment adresy video pamti, implicitne je
                          nastaven na tandartn hodnotu 0A000H. Vetky proce-
                          dry okrem procedr, ktor maj v nzve Virtual,
                          v Circle.Asm ju pouvaj ako segment obrazovky.
                          Pojem "obrazovka" bude alej oznaova pam
                          na segmente CirclePage.

6.2 Procedra Circle (X,Y,R: Word; Color: Byte)
    Vykresl krunicu so stredom v X,Y a polomerom R farbou Color.
    Krunica je vykresovan symetricky (osem bodov naraz)

6.3 Procedra CircleVirtual (SegVirtual,X,Y,R: Word; Color: Byte)
    Ako Circle, ale na virtulnu obrazovku na segmente SegVirtual.

6.4 Procedra FilledCircle (X,Y,R: Word; Color: Byte)
    Vykresl kruh so stredom v X,Y a polomerom R farbou Color.
    Krunica je vykresovan symetricky (tyri seky naraz)

6.5 Procedra FilledCircleVirtual (SegVirtual,X,Y,R: Word; Color: Byte)
    Ako FilledCircle, ale na virtulnu obrazovku na segmente SegVirtual.

6.6 Procedra SetCirclePage (CPage: Word)
    Nastav hodnotu premennej CirclePage.

6.7 Funkcia CircleLinePage: Word
    Vrti hodnotu premennej CirclePage.



7. Elipsy

   Obsahuj dva typy procedr - kresba elipsy a vntornej oblasti elipsy.
   kresba elipsy je postaven na algoritmoch van Akena a Earnshawa (vpis .5).
   Vyuva symetriu tyroch bodov. Vntorn oblas elipsy je vykresovan
   podobne ako kruh, pouva vak iba dve seky (vpis .6).

7.1 Premenn EllipsePage - oznauje segment adresy video pamti, implicitne je
                           nastaven na tandartn hodnotu 0A000H. Vetky pro-
                           cedry okrem procedr, ktor maj v nzve Virtual,
                           v Ellipse.Asm ju pouvaj ako segment obrazovky.
                           Pojem "obrazovka" bude alej oznaova pam
                           na segmente EllipsePage.

7.2 Procedra Ellipse (X,Y,A,B: Word; Color: Byte)
    Vykresl elipsu so stredom v X,Y, hlavnou polosou A, vedajou B farbou
    color. Vykresuje tyri symetrick body.

7.3 Procedra EllipseVirtual (SegVirtual,X,Y,A,B: Word; Color: Byte)
    Ako Ellipse, ale na virtulnu obrazovku na segmente SegVirtual.

7.4 Procedra FilledEllipse (X,Y,A,B: Word; Color: Byte)
    Vykresl vntorn oblas elipsy so stredom v X,Y, hlavnou polosou A,
    vedajou B farbou color. Vykresuje dve symetrick vodorovn seky.

7.5 Procedra FilledEllipseVirtual (SegVirtual,X,Y,A,B: Word; Color: Byte)
    Ako FilledEllipse, ale na virtulnu obrazovku na segmente SegVirtual.

7.6 Procedra SetEllipsePage (EPage: Word)
    Nastav hodnotu premennej EllipsePage.

7.7 Funkcia EllipseLinePage: Word
    Vrti hodnotu premennej EllipsePage.



8. Paletov funkcie
   S to funkcie, ktorch vyuitie spova v nastaven alebo zisten aktulnej
   palety VGA. Umouj "rozsvietenie" alebo "zhasnanie" obrazovky a rotciu
   palety.

8.1 Procedra SetPalette (PPal: Pointer)
    Nastav paletu, na ktor ukazuje PPal.

8.2 Procedra GetPalette (Var Pal: TPalette)
    Zist aktulnu paletu a ulo ju do Pal.

8.3 Procedra IncPalette (PPal: Pointer; Step: Byte)
    Rozsvieuje paletu PPal s krokom Step, tzn. paleta sa rozsvieti na 64/Step
    krt.

8.4 Procedra DecPalette (PPal: Pointer; Step: Byte)
    Zhasna paletu PPal s krokom Step, tzn. paleta zhasne na 64/Step krt.

8.5 Procedra ConvertRGBPalette (POldPal: Pointer; Var PNewPal: Pointer)
    Skonvertuje paletu "888", na ktor ukazuje POldPal, na paletu "666", ktor
    ulo na miesto, kde ukazuje PNewPal. Paleta "888" je paleta, ktor m
    pre kad zloku (RGB) 8-bitov intenzitu, paleta "666" m intenzitu
    6-bitov.

    "888" paleta umouje miea 16 777 220 rznych farieb, ale "666"
    paleta umouje miea iba 262 144 farieb. Bohuia, pri prci s VGA
    je mon pouva iba 6-bitov paletu.
    Neviem, ak zmysel malo prejs od 8-bitovho potaovho tandartu
    ku 6-bitovmu, ktor vetko iba skomplikuje. Zase IBM ...

8.6 Procedra RotatePaletteLeft (PPal: Pointer)
    Zrotuje paletu, na ktor ukazuje PPal, doava.

8.7 Procedra RotatePaletteRight
    Zrotuje paletu, na ktor ukazuje PPal, doprava.



9. Sprity
   Sprite je urit obrzok, ktor m formu obdnika. Nsledujce funkcie
   umouj vykresovanie, prekrvanie, koprovanie, zvovanie a zmenovanie
   spritov. Vykresovanie a prekrvanie je v Algoritm.Txt ako vpis .7 a .8,
   zmena vekosti aj s okomentovanm ako vpis .9.
   Sprite me ma maximlne rozmery 255 x 255 bodov (65025 bytov).
   Pre zmenu vekosti spritov me ma sprite rozmery 65535 x 65535 bodov (?).

9.1 Premenn SpritePage - oznauje segment adresy video pamti, implicitne je
                          nastaven na tandartn hodnotu 0A000H. Vetky pro-
                          cedry okrem procedr, ktor maj v nzve Virtual,
                          v Sprite.Asm ju pouvaj ako segment obrazovky.
                          Pojem "obrazovka" bude alej oznaova pam
                          na segmente SpritePage.

9.2 Funkcia Adress (X,Y: Word): Word
    Vypota adresu sradnc X,Y, priom obrazovka je ako pole [1..40,1..25].
    Vsledn adresa = 8 * (X - 1) + 8 * (Y - 1) * 320.
    Funkcia je potrebn pre DrawSpriteXY.

9.3 Procedra DrawSpriteXY (PSprite: Pointer; X,Y: Word; Count: Byte)
    Vykresl Count-y sprite, na ktor ukazuje PSprite s rozmerom 8x8
    na sradnice X,Y, kde X je kad smy stpec a Y kad smy riadok.
    Obrazovka m teda rozmer 40 x 25.
    Toto je moja plne prv rutina na vykresovanie spritov, preto prosm
    o pochopenie. Je to tak nostalgia za poiatonm elnom ...

9.4 Procedra DrawSprite (PSprite: Pointer; X,Y: Word; Count: Byte)
    Vykresl Count-y sprite, na ktor ukazuje PSprite s rozmerom 8x8
    na sradnice X,Y, je tu pouit adresovanie cez nsobenie, trochu
    pomal... Je to jedna z mojich plne prvch rutn, tak tu m estn
    miesto.

9.5 Procedra DrawSpriteOver (PSprite: Pointer; X,Y: Word; Count: Byte)
    Ako DrawSprite, ale body spritu s farbou 0 sa nevykresuj (umouje
    to prekrvanie).

9.6 Procedra Sprite (PSprite: Pointer, X,Y: Word; SWidth, SHeight: Byte)
    Vykresl sprite, na ktor ukazuje PSprite, so rkou SWidth a vkou
    SHeight na sradnice X,Y obrazovky. Je to vemi rchle, a d sa vemi
    dobre uplatni pri rolovan (scrolling).

9.7 Procedra SpriteVirtual (SegVirtual: Word; PSprite: Pointer, X,Y: Word;
                             SWidth, SHeight: Byte)
    Ako Sprite, ale na virtulnu obrazovku na segmente SegVirtual.

9.8 Procedra SpriteOver (PSprite: Pointer, X,Y: Word; SWidth, SHeight: Byte)
    Ako Sprite, ale body s farbou 0 sa nevykresuj. Nie je to u tak rchle
    ako Sprite, ale umouje to prekrvanie jednotlivch spritov, pozadia...

9.9 Procedra SpriteOverVirtual (SegVirtual: Word; PSprite: Pointer, X,Y: Word;
                                 SWidth, SHeight: Byte)
    Ako SpriteOver, ale na virtulnu obrazovku na segmente SegVirtual.

9.10 Procedra GetSprite (PSprite: Pointer, X,Y: Word; SWidth, SHeight: Byte)
     Ulo sprite z obrazovky na sradniciach X,Y s rozmermy SWidth x SHeight
     na miesto v pamti, kde ukazuje PSprite.

9.11 Procedra GetSpriteVirtual (SegVirtual: Word; PSprite: Pointer, X,Y: Word;
                                 SWidth, SHeight: Byte)
     Ako GetSprite, ale na virtulnu obrazovku na segmente SegVirtual.

9.12 Procedra SpriteScale (PSprite: Pointer; X,Y,Width,Height,NewWidth,
                            NewHeight: Word)
     Vykresl sprite tak, aby sa jeho rka Width zmenila na NewWidth a jeho
     vka z Height na NewHeight. Mono ubovone meni rku a vku novho
     spritu. D sa to poui na efektn vzaovanie/pribliovanie predmetov,
     na rzne deformcie predmetov...

9.13 Procedra SpriteScaleVirtual (SegVirtual: Word; PSprite: Pointer; X,Y,
                                   Width,Height,NewWidth,NewHeight: Word)
     Ako SpriteScale, ale na virtulnu obrazovku na segmente SegVirtual.

9.14 Procedra SpriteScaleOver (PSprite: Pointer; X,Y,Width,Height,NewWidth,
                                NewHeight: Word)
     Ako SpriteScale, ale body s farbou 0 sa nevykresuj.

9.15 Procedra SpriteScaleOverVirtual (SegVirtual: Word; PSprite: Pointer; X,Y,
                                       Width,Height,NewWidth,NewHeight: Word)
     Ako SpriteScaleOver, ale na virtulnu obrazovku na segmente SegVirtual.

9.16 Procedra SpriteScaleRel (PSprite: Pointer; X,Y,Width,Height,Step: Word)
     Vykresl sprite tak, aby sa jeho vekos zmenila na Step % z pvodnej
     vekosti. ie ak je Step menie ako 100, nov sprite je men, ak sa
     rovn 100, je rovnak a ak je v ako 100, je nov sprite v ako
     pvodn. Plat, e rka a vka s vek Step % z pvodnej rky a vky.

9.17 Procedra SpriteScaleRelVirtual (SegVirtual: Word; PSprite: Pointer; X,Y,
                                      Width,Height,Step: Word)
     Ako SpriteScaleRel, ale na virtulnu obrazovku na segmente SegVirtual.

9.18 Procedra SpriteScaleOverRel (PSprite: Pointer; X,Y,Width,Height,Step: Word)
     Ako SpriteScaleRel, ale body s farbou 0 sa nevykresuj.

9.19 Procedra SpriteScaleOverRelVirtual (SegVirtual: Word; PSprite: Pointer;
                                          X,Y,Width,Height,Step: Word)
     Ako SpriteScaleOverRel, ale na virtulnu obrazovku na segmente SegVirtual.

9.20 Procedra CopySprite (SegSource, SegDestination, X1, Y1, X2, Y2: Word;
                           SWidth, SHeight: Byte)
     Skopruje sprite z pozcie X1,Y1 obrazovky na segmente SegSource na pozciu
     X2,Y2 obrazovky na segmente SegDestination s rozmermy SWidth x SHeight.

9.21 Procedra SetSpritePage (SPage: Word)
     Nastav premenn SpritePage tak, aby ukazovala segment obrazovky.

9.22 Funkcia GetSpritePage: Word
     Vrti premenn SpritePage.



10. asti spritov
    aie funkcie s uren na vykresovanie iba uritch obdnikovch ast
    spritov. Tieto funkcie s vyuiten na "orezanie" spritu, ak u vyboil
    z viditenho miesta obrazovky, ale tie aj na niektor pecilne efekty,
    ako je naprklad vntorn scrolling spritu.

10.1 Premenn CellPage - oznauje segment adresy video pamti, implicitne je
                         nastaven na tandartn hodnotu 0A000H. Vetky pro-
                         cedry okrem procedr, ktor maj v nzve Virtual,
                         v Cell.Asm ju pouvaj ako segment obrazovky.
                         Pojem "obrazovka" bude alej oznaova pam
                         na segmente CellPage.

10.2 Procedra Cell (PSprite: Pointer;X,Y: Word; Wdt,Hgt,X2,Y2,NWdt,NHgt: Byte)
     Na pozciu X,Y obrazovky vykresl obdnikov as spritu, ktor zana
     na sradniciach X2,Y2 spritu a m rozmery NWdt x NHgt, priom PSprite
     ukazuje na sprite a ten m rozmery Wdt x Hgt. Samozrejme, NWDt <= Wdt
     a NHgt <= Hgt.

10.3 Procedra CellVirtual (SegVirtual: Word; X,Y: Word; Wdt,Hgt,X2,Y2,NWdt,
                            NHgt: Byte)
     Ako Cell, ale na virtulnu obrazovku na segmente SegVirtual.

10.4 Procedra CellOver (PSprite: Pointer;X,Y: Word; Wdt,Hgt,X2,Y2,NWdt,
                         NHgt: Byte)
     Ako Cell, ale body s farbou 0 sa nevykresuj.

10.5 Procedra CellOverVirtual (SegVirtual: Word; X,Y: Word; Wdt,Hgt,X2,Y2,
                                NWdt,NHgt: Byte)
     Ako CellOver, ale na virtulnu obrazovku na segmente SegVirtual.

10.6 Procedra SetCellPage (CPage: Word)
     Nastav premenn CellPage, ktor uruje segment obrazovky.

10.7 Funkcia GetCellPage: Word
     Vrti hodnotu premennej CellPage.




11. Fontov funkcie
    Oznauj funkcie, sliace na vpis psmen. Podporovan s dva formty
    fontov: 1.Font - znaky 32-127
                   - truktra - przdne body = 0
                               - vyznaen body = 1
                               - kad bod zaber 1 byte
                   - tento font som pouval vo svojich zaiatkoch ako
                     najrchlejiu cestu pre vykreslenie fontu a pre jednoduch
                     prevod fontov z Didaktiku M na PC.
                   - na prevod ZX fontov sli program FontMake.

            2.Font - znaky 0-255
                   - tandartn typ fontu 8x??, napr. 8x16, 8x14.
                   - vka je voliten procedrou SetCharHeight.
                   - pole bytov, kde kad byte oznauje 8 bodov psmena
                     v kadom riadku. Psmena nsleduj tesne za sebou.
                   - vetky znaky maj rovnak rozmery

     Niektor skratky v mench procedr:

      HI - Horizontal Increase - zvyuje farbu o 1 pri kadom zven X
      HD - Horizontal Decrease - zniuje farbu o 1 pri kadom zven X
      VI - Vertical Increase - zvyuje farbu o 1 pri kadom zven Y
      VD - Vertical Decrease - zniuje farbu o 1 pri kadom zven Y

11.1 Premenn WritePage - oznauje segment adresy video pamti, implicitne je
                          nastaven na tandartn hodnotu 0A000H. Vetky pro-
                          cedry okrem procedr, ktor maj v nzve Virtual,
                          v Font.Asm ju pouvaj ako segment obrazovky.
                          Pojem "obrazovka" bude alej oznaova pam
                          na segmente WritePage.

11.2 Premenn CharSpace - oznauje vekos horizontlnej medzery medzi
                          jednotlivmi znakmi vypisovanho textu.

11.3 Premenn LineSpace - oznauje vekos vertiklnej medzery medzi riadkami
                          textu. Zatia nevyuit.

11.4 Premenn CharHeight - oznauje vku psmen pre vpis fontu. Napr.
                           pre font 8x16 je 16, 8x14 je 14, 8x8 je 8...

11.5 Procedra WriteFont (PFont: Pointer; Txt: String; X,Y: Word; Color: Byte)
     Vype fontom typu 1, na ktor ukazuje PFont text Txt na sradnice X,Y
     farbou Color.

11.6 Procedra WriteFontHI (PFont: Pointer; Txt: String; X,Y: Word;
                            Color: Byte)
     Ako WriteFont, ale pri kadom zven X-ovej sradnice u kadho psmena
     zvi farbu o 1 (na efektn vpis textu).

11.7 Procedra WriteFontHD (PFont: Pointer; Txt: String; X,Y: Word;
                            Color: Byte)
     Ako WriteFont, ale pri kadom zven X-ovej sradnice u kadho psmena
     zni farbu o 1 (na efektn vpis textu).

11.8 Procedra WriteFontVI (PFont: Pointer; Txt: String; X,Y: Word;
                            Color: Byte)
     Ako WriteFont, ale pri kadom zven Y-ovej sradnice u kadho psmena
     zvi farbu o 1 (na efektn vpis textu).

11.9 Procedra WriteFontVD (PFont: Pointer; Txt: String; X,Y: Word;
                            Color: Byte)
     Ako WriteFont, ale pri kadom zven Y-ovej sradnice u kadho psmena
     zni farbu o 1 (na efektn vpis textu).

11.10 WriteFontOver
11.11 WriteFontOverHI
11.12 WriteFontOverHD
11.13 WriteFontOverVI
11.14 WriteFontOverVD
11.15 PrintFont
11.16 PrintFontHI
11.17 PrintFontHD
11.18 PrintFontVI
11.19 PrintFontVD
11.20 PrintFontOver
11.21 PrintFontOverHI
11.22 PrintFontOverHD
11.23 PrintFontOverVI
11.24 PrintFontOverVD
11.25 SetWritePage
11.26 SetCharSpace
11.27 SetLineSpace
11.28 SetCharHeight
11.29 GetWritePage
11.30 GetCharSpace
11.31 GetLineSpace
11.32 GetCharHeight



C. Obrzky
   Prirodzene, je podporovan aj prca s obrzkami. Podporovan s interne
   dva formty obrzkov - nepakovan a pakovan. Obidva typy obrzkov s
   v rozlen 320 x 200 x 256.

C.1 Procedra ShowScreen (PScreen: Pointer);
    Vykresl nepakovan obrzok OBR, na ktor ukazuje PScreen a nastav
    paletu.

C.2 ShowCompressedScreen (PScreen: Pointer);
    Vykresl pakovan obrzok POB, na ktor ukazuje PScreen a nastav
    paletu.

C.3 SetScreen (PScreen: Pointer);
    Vykresl nepakovan obrzok OBR, na ktor ukazuje PScreen bez nastavenia
    palety.

C.4 SetScreenVirtual (SegVirtual: Word; PScreen: Pointer);
    Vykresl nepakovan obrzok OBR, na ktor ukazuje PScreen na virtulnu
    obrazovku, na ktor ukazuje SegVirtual.

C.5 DeCompressScreen (PScreen: Pointer);
    Vykresl pakovan obrzok POB, na ktor ukazuje PScreen bez nastavenia
    palety.

C.6 DeCompressVirtual (SegVirtual: Word; PScreen: Pointer);
    Vykresl pakovan obrzok POB, na ktor ukazuje PScreen na virtulnu
    obrazovku, na ktor ukazuje SegVirtual.

C.7 DeCompressOverVirtual (SegVirtual: Word; PScreen: Pointer);
    Vykresl pakovan obrzok POB, na ktor ukazuje PScreen na virtulnu
    obrazovku, na ktor ukazuje SegVirtual, priom body s hodnotou 0 sa
    nevykresuj.



13. Obrzky a sprity, formt PCX

13.1 Procedra ShowPCX (PPCX: Pointer)
     Zobrazi obrzok PCX a nastav paletu.

13.2 Procedra DeCompressPCX (PPCX: Pointer)
     Vykresl PCX obrzok na obrazovku bez toho, e by nastavila paletu.

13.3 Procedra DeCompressPCXVirtual (SegVirtual: Word, PPCX: Pointer)
     Vykresl PCX obrzok na virtulnu obrazovku.

13.4 Procedra PCXSprite (PPCX: Pointer; X,Y: Word)
     Zobraz PCX ako sprite na sradnice X,Y.

13.5 Procedra PCXSpriteVirtual (SegVirtual: Word;PPCX: Pointer; X,Y: Word)
     Zobraz PCX ako sprite na sradnice X,Y virtulnej obrazovky.

13.6 Procedra PCXSpriteOver (PPCX: Pointer; X,Y: Word)
     Zobraz PCX ako sprite na sradnice X,Y s transparentnou farbou 0.

13.7 Procedra PCXSpriteOverVirtual (SegVirtual: Word;PPCX: Pointer; X,Y: Word)
     Zobraz PCX ako sprite na sradnice X,Y virtulnej obrazovky 
     s transparentnou farbou 0.


14. Klvesnica
    Umonenie snmania viacerch klves naraz (pokia to hardware klvesnice
    dovol). Vytvor pole klves, kde pre kad klvesu je definovan jedno
    polko, na ktorom je bu 1 alebo 0, poda toho, i je klvesa stlaen,
    alebo nie.

14.1 Procedra Keyboard;
     void Keyboard (void);
     
     Naintaluje ovlda klvesnice, ktor umouje snmanie vetkch klves
     naraz.

14.2 Procedra KeyBufferAddr (Var PPBuf: Pointer);
     void KeyBufferAddr (PPBuf *void);

     Vracia Pointer na buffer klves.

14.3 Funkcia Key;
     char Key (void);

     Vracia posledn stlaen klvesu.

D. Hardware
   Zopr funkci pre zistenie prostredia, v ktorom beme.

D.1 Funkcia DetectVideo: Byte;
    unsigned int DetectVideo;

    Asi prvm problmom grafickho programu, ktor chceme spusti, je to, i
    bude fungova aj na naej grafickej karte. Grafick rutiny v tomto balku
    s roben bez vnimky na VGA-kompatibiln kartu. Ako zisti, i naozaj
    meme spusti program bez toho, aby vypisoval haky-baky po obrazovke ?
    Na zistenie typu karty sli funkcia DetectVideo, ktor vrti hodnotu
    adaptra. Ak s to vlastne adaptry ? :

                        0.Bez grafickej karty (???)
                        1.MDA
                        2.Hercules Graphics Card
                        3.Hercules InColor
                        4.Hercules Graphics Card +
                        5.CGA
                        6.EGA
                        7.EGA Mono
                        8.PGA Color
                        9.VGA
                       10.VGA Mono
                       11.MCGA Digital
                       12.MCGA
                       13.MCGA Mono
                       14.XGA
                       15.XGA NI
                      255.Ktohovie ...

    Nedvam zruku, e to bude vade funova, vetko som toti ani sm
    nevyskal (kde mm zohna PGA, MCGA, i XGA ?)

D.2 Funkcia ProcessorType: Byte;
    unsigned char ProcessorType (void)

    Samozrejme, ak chceme robi nieo pre 286+, malo by tu by aj nieo
    identifikujce typ procesora. Na to je tu funkcia ProcessorType, ktor
    vrti typ procesora. Ak s to typy ? :

                           0 - neznmy procesor
                           1 - 8088
                           2 - 8086
                           3 - NEC V20
                           4 - NEC V30
                           5 - 80188
                           6 - 80186
                           7 - 80286
                           8 - 80386SX
                           9 - 80386DX
                          10 - Cx486SLC
                          11 - Cx486DLC/SX/DX
                          12 - 80486SX
                          13 - 80486DX
                          14 - 80486SX-S
                          15 - 80486DX-S
                          16 - Pentium-K5-6x86-Gx86
                          17 - Pentium Pro-K6-6x86MX
                          18 - P7+  (minimlne 786)

    Ako sa to vlastne detekuje ?

    1. 8086/8088 - Tento procesor m jednu pecifick vlastnos. Ak ulome
                   na zsobnk register SP (Stack Pointer), zistme, e
                   SP sa najskr zmen o 2 a a potom sa ulo, zatia o
                   na ostatnch procesoroch sa najskr ulo a a potom sa
                   zni.

    2. NEC V20/V30 - Ak sme detekovali 8086/88, ete si nememe by plne
                   ist, e to aj naozaj mme. Toti NEC V20 a V30 robia
                   presne to ist, ako v prpade 1. Rozlenie medzi 808x
                   a Vx0 je zaloen na tom, e Vx0 maj niektor intrukcie
                   navye. Podporuj aj intrukciu REP SEG ES: LODSB, ktor
                   v tomto prefixe 808x nepodporuj. Ak sa vykon tto
                   intrukcia, v CX ostane 0 ako po spenej intrukcii,
                   inak tam ostane 0FFFFH.

    3. 80186/80188 - Tieto dva typy procesorov nesprvne prevdzaj intrukcie
                   logickho posuvu SHL a SHR. Doku posva iba n mod 32
                   bitov. Sta im da posun o 32+x vavo, ale register posun
                   iba o x bitov. Na predchdzajcich procesoroch zskame 0.

    4. 8086/V30/80186 vs 8088/V20/80188 - tieto procesory sa lia rznou
                   dkou intruknej fronty.

    5. 80286     - Tento procesor u pracoval v chrnenom mde, a tak by sme
                   pri teste mohli vyui, e od 80188 sa pri vskyte neznmej
                   intrukcie vyvol INT 6H a to, e 286 m urite aj in
                   intrukcie ako 80188/186. Take sa vyvol 3 bytov intruk-
                   cia SMSW DX a ak sa nm v ovldai na INT 6H zmen premenn,
                   znamen to, e zrejme na 286 nebehme.

    6. 80386     - Podobne ako u 286 vyuijeme to, e 386 m aj in intruk-
                   cie ako 286 a vyvolme MOV EDX,CR0.

    7. 80386DX vs 80386SX - Na procesori 386SX sa ned prepn bit ET (4.bit)
                  v CR0. Sksime ho teda prepn.

    8. 80486    - podobne ako u 286 a 386 pustme 3 bytov intrukciu, ktor
                  funguje len na 486 - XADD DX,DX.

    9. 80486DX vs 80486SX - na 486SX chba koprocesor. Sksime ho teda dete-
                  kova. Nedetekuje 486SX s 487SX ;-(

   10. Cyrix 486 vs Intel/AMD 486 - Cyrix nemen nedefinovan prznaky
                  pri delen ako i/Am486. Podelme a pozrieme sa, i sa
                  zmenili.

   11. Cx486SLC vs Cx486DLC/SX/DX - Podobne ako pri 8086/88, aj tu sa tieto
                  procesory lia dkou intruknej fronty.

   12. 486-S    - u tchto 486 sa sptne zaviedli niektor Pentiovsk intruk-
                  cie, napr. CPU ID. Ak sa zist z EFLAGS nastaven ID byte,
                  mme 486-S. CPU ID je vemi uiton intrukcia, pretoe
                  ns zbav starost o detekciu procesoru.

   13. Pentium, K5, K6, MediaGX, C6 - v tchto typoch procesoroch sa nm CPU ID
                  ozve s family = 5, ie 586.
       6x86     - CPU ID tu nie je tandartne implementovan, treba
                  prepn bit na konfiguranom registri.

   14. Pentium Pro, Pentium II, Pentium III, 6x86MX, M II - na tchto
                  procesoroch zase dostaneme family = 6.

   15. P7+      - predpokladm, e kad z ach typov procesorov x86 sa bude
                  hlsi s nejakou CPU ID "family".

   Niektore CPUID Vendor nzvy a typy procesorov:

                  Intel  - "GenuineIntel" - Pentium...
                  AMD    - "AuthenticAMD" - K5, K6, K7...
                  Cyrix  - "CyrixInstead" - 5x86, 6x86, 6x86MX, M II, MediaGX
                  IDT    - "CantaurHauls" - C6, WinChip, WinChip-2 3D...
                  UMC    - "UMC UMC UMC " - U5S, U5D, U5SD (486SX)...
                  NexGen - "NexGenDriven" - Nx586, Nx686 (K6)...

D.3 Funkcia PresentMathCoprocessor: Boolean;
    unsigned char PresentMathCoprocessor (void)

    Detekuje, i je aktvny matematick koprocesor. Poksi sa ho zinicializova
    a pokia inicializcia prebehne, je koprocesor naintalovan.
    Netdetekuje typ koprocesoru.

D.4 Funkcia PresentCDROM: Boolean;
    unsigned char PresentCDROM (void)

    Zist, i je naintalovan MicroSoft CD Extension (MSCDEx).

D.5 Funkcia GetCDROMDrive: Char;
    char GetCDROMDrive (void)

    Vrti psmeno logickho disku prvej CD-ROM.

D.6 Funkcia GetCDROMNumber: Byte;
    unsigned char GetCDROMNumber (void)

    Vrti poet naintalovanch CD-ROM.

D.7 Procedra GetMSCDExVersion (Var VerHi,VerLo: Byte);
    void GetMSCDExVersion (unsigned int *VerHi, unsigned int *VerLo)

    Vrti verziu MSCDEx (ovldaa CD-ROM). VerHi - prv slo verzie, VerLo -
    druh slo verzie, normlne desiatkov sla.

D.8 Funkcia GetFloppyDrive: Byte;
    Vrti poet naintalovanch disketovch mechank.

D.9 Procedra FloppyDriveType (Var Floppy1,Floppy2: Byte);
    Vrti typy jednotlivch disketovch mechank.

                        0 - nenaintalovan
                        1 - 5.25", 360kB
                        2 - 5.25", 1.2MB
                        3 - 3.5", 720kB
                        4 - 3.5", 1.44MB
                        5 - 3.5", 2.88MB

D.A Funkcia GetSerialPort: Byte;
    Vrti poet sriovch portov.

D.B Funkcia GetParallelPort: Byte;
    Vrti poet paralelnch portov.

D.C Funkcia PresentGamePort: Boolean;
    Vrti, i BIOS podporuje joystick.

D.D Funkcia PresentMouse: Byte;
    Vrti typ myi: 0 - bez myi/nespusten ovlda
                    2 - dvojtlatkov
                    3 - trojtlatkov
                  255 - neznma

D.E Funkcia EnhancedKeyboard: Boolean;
    Vrti, i BIOS podporuje rozren klvesnicu.

D.F Funkcia PresentEMS: Boolean;
    Test prtomnosti Expanded Memory Support.

D.G Funkcia GetEMSVersion: Byte;
    Vrti verziu EMS v BCD tvare.

D.H Procedra EMSMemory (Var MTotal,MFree: Word);
    Vrti stav EMS. MTotal - celkov pam v 16kB blokoch, MFree - von
    pam v 16k blokoch.

D.I Funkcia GetVCPIVersion: Word;
    Vrti verziu Virtual Control Program Interface v BCD formte, ak nie je
    naintalovan, vrti 0.

D.J Funkcia GetDPMIVersion: Word;
    Vrti verziu DOS Protected Mode Interface v BCD formte, ak nie je
    naintalovan, vrti 0.

D.K Funkcia PresentXMS: Boolean;
    Test prtomnosti Extended Memory Support.

D.L Procedra GetXMSVersion (Var XMSVer,DriverRev: Word);
    Vrti verziu XMS a ovldaa v BCD formte.

D.M Procedra XMSMemory (Var XMSMem,XMSFree: Word);
    Vrti vekos celkovej a vonej pamte v kB.

D.N Funkcia PresentVESA: Boolean;
    Detekuje prtomnos Video Electronics Standards Association Super VGA
    BIOS Enhancement (VESA VBE).

D.O Procedra GetVESAInfo (Var VESABuffer: TVESABuf);
    Vrti informan blok 256-512 bytov s informciami o Super VGA.




E. Pam
E.1 AllocateMemory (Var PMem: Pointer; MSize: Word): Word;
    Alokuje pam mimo Pascal Heap cez DOS, vrti pointer PMem, ktor
    ukazuje na alokovan blok pamti.

E.2 DeAllocate (Var PMem: Pointer): Word;
    Vrti pam, na ktor ukazuje PMem sp DOS-u.

E.3 FreeDOSMemory: LongInt;
    Vrti vekos vonej DOS-ovskej pamti v bytoch.




F. Rozlin funkcie
   Tieto funkcie slia na vykonanie uritch systmovch innost, ktor
   sce nie s nutn, ale mu by uiton.

F.1 ClearKeyBuffer
    Vymae buffer klvesnice.

F.2 WaitMSec (MSec: Word);
    ak MSec miliseknd.

F.3 Time (Var Hour, Minute, Second, Hundreds: Byte)
    Zist systmov as (ekvivalent GetTime, potrebn pre WaitTime)

F.4 WaitTime (Hundreds: Word)
    ak Hundreds stotn sekundy.

F.5 ExtractPointer (PPointer: Pointer; Var PSegment,POffset: Word);
    Rozlo pointer na segment a offset, miesto pretypovania.

