+----------------------------------+
                      | JAK SOBĚ VYROBITI DEMO GRAFICKÉ  |
                      |KU POTĚŠE VLASTNÍ I OSOB OSTATNÍCH|
                      +----------------------------------+

      Začněme  s  tím  nejjednodušším.
      Grafický mód 13h, tedy 320x200, 256 barev.
      Budu se snažit držet Pascalu, sem tam zabrousím do Assembleru.

      Grafický  mód  320x200  ve  256  barvách  je  znám  jako  mód  MCGA.
      Assembleristi jej znají jako mód 13h. Jak se přepnout do grafiky bez
      použití  BGI? Uvědomte si, že BGI je strašlivě pomalá věc. Pokud vám
      jde o rychlost, budete si muset vzít starost o grafiku na svá bedra.
      Pro  přepínání do grafického módu slouží přerušení INT10h, služba 0.
      To  znamená  do  AH nacpat nulu, do AL číslo videomódu a zavolat INT
      10h.

      procedure SetMCGA;
      begin
        asm
              mov     ax,0013h
              int     10h
        end;
      end;

      Tak a je to, jak prosté milý Watsone!!

      Klasický textový mód má číslo tři, takže:

      Procedure SetText;
      begin
        asm
              mov     ax,0003h
              int     10h
        end;
      end;

      No  paráda,  ale  k  čemu  je to dobré? Pokud inicializujete grafiku
      takto,  pascalovské příkazy pro grafiku nebudou fungovat. Problém je
      v  tom,  že  jsme  neprovedli  inicializaci  grafiky pomoci BGI, ale
      dovolili  jsme si soukromou iniciativu. Takže budeme muse i soukromě
      kreslit, mazat a přenášet. Začněme mazáním.

      V  grafickém  módu  13h  je  obrazovka  uložena v paměti na segmentu
      0A000h,   Cokoliv   zapíšete  do  segmentu  0A000h,  se  projeví  na
      obrazovce.
      320x200=64000. Tedy paměť obrazovky zabírá 64000 bajtů.

      Pro smazání obrazovky tedy musíme nacpat od adresy 0A000:0000h 64000
      bajtů, nějakým číslem.

      FillChar (Mem [a000:0],64000,Col);

      FillChar  plní  zadanou  oblast  zadaným bajtem. Onen bajt je barva.
      Změnou proměnné Col, se obrazovka smaže příslušnou barvou.

                                +--------------+
                                |Kreslení bodu:|
                                +--------------+

      První  možnost  je použít opět přerušení 10 a příslušnou funkci. Pro
      kreslení bodu je to funkce 0Ch.

      Procedure INTPutpixel (X,Y : Integer; Col : Byte);
      BEGIN
        asm
           mov        ah,0Ch          {Sluzba 0Ch}
           mov        al,[col]        {barva do AL}
           mov        cx,[x]          {Souradnice x do CX}
           mov        dx,[y]          {Souradnice y do DX}
           mov        bx,[1]          {BX = 1}
           int        10h             {a vyvolame preruseni 10h}
        end;
      END;

      Funguje  to,  ale  jde  to  i rychleji. Přerušení bývají vetšinou ta
      pomalejší  metoda,  jak  něco  udělat.  Nejrychlejší bude zapsat bod
      přímo  do  videopaměti,  tedy  někam  do těch 64000 bajtů v segmentu
      0A000h. Ale kam? A co tam zapsat?

      Nejdříve  vyřešíme  otázku co zapsat. Je to prosté, to co zapisujete
      je barva.

      A  teď kam. Souřadnice obrazovky [0,0] jsou levý horní roh. Pak tedy
      první  bajt  videopaměti  určuje  barvu tohoto bodu, druhý bajt bodu
      vpravo  od  něj,  tedy [1,0], třetí je [2,0], atd. až po 320tý bajt,
      který  určuje  barvu  pravého krajního bodu na prvním (nultém) řádku
      obrazovky,  tedy  [319,0].  Další  bajt, tedy 321 začíná o řádek níž
      opět zleva, souřadnice [0,1], atd.. poslední bajt číslo 64000 určuje
      barvu pravého dolního rohu obrazovky [319,199].

      0A000:0000h.............................................0A000:13Fh
      0A000:140h..............................................0A000:27Fh
      0A000:280h..............................................
      ..
      .
      .
      .
      .
      .
      0A000:F8C0h.............................................0A000:0FA00h

      Toto  je  schematický  náčrt  jak  to  vypadá ve vidopaměti. Asi vám
      trošku  budou  dělat  potíže  ty  hexadecimální  údaje,  jen trpte a
      počítejte.

      Pokud  se  zamyslíte nad tím obrázkem, vymyslíte vzoreček na výpočet
      offsetu pro jakýkoliv bod. Ten vzoreček bude vypadat takto:

                                offset = Y*320+X

      takže rozsvítíme bod příkazem:

                          mem[0A000:Y*320+X] := Barva

      Na  závěr  tedy  program,  který  porovná  obě metody kreslení bodu.
      Jednak pomocí přerušení 10h a zadruhé přímým zápisem do videopaměti.

           Už to bylo moc dlouhé, zdroják jsem dal na další stránku.
               Takže si cvakněte sem ==>  Zdroják 

      Pokud  se  se  mnou  budete  chtít  spojit  máte dvě možnosti FIDO a
      internet.
      Moje fidonetí adresa je 2:421/59.
      A internetí je:         SysOp@pizi.fido.cz

                             Čaute příště  PIŽI


            výheň