S..C..R..O..L..L..I..N..G

    Mnohý začínající programátor chce, aby mu v nějakém programu
    (např. plošinová skákačka) plynule scrolloval obraz na monitoru.
    Nejdříve to zkouší datově, třeba takhle:

      procedure Move386(source_seg,source_ofs,dest_seg,dest_ofs:word);
      assembler;
      asm
      mov ax,source_seg
      mov ds,ax
      mov si,source_ofs
      mov ax,dest_seg
      mov es,ax
      mov di,dest_ofs
      mov cx,count
      rep movsd
      end;

    Pokud to pustí na počítači s procesorem 486, řekne si: "nádhera" !
    A hned vesele programuje dál. Když zdárně dokončí svoji plošinovku,
    jejíž virtualní obrazovka se krásně plynule (no občas trochu trhne)
    scrolluje, vypustí svůj nový produkt do světa a ouha ! Někdo mu pošle
    mejl, že si ji pustil na své 386 a že to skoro vůbec nejde hrát,
    protože v situacích, kdy je na obrazovce hodně sprajtů, se obraz
    neskutečně trhá a někdy se i sekne docela. Programátor nato:
    "To není možný, dyť to fachčilo perfektně, no ale na třílitru sem
    to nezkoušel." Když si to vyzkouší i na té nejlepší 386 (DX40MHz)
    zjistí, že podaná stížnost je opravdu na místě. (Z toho mimochodem
    plyne, že je záhodno programovat a odlaďovat program s instrukčním
    souborem 80386 na pravé 386 a ne se holedbat tím, jak je to všechno
    rychlé na mém Hexiu. Může to být ale i obchodní záměr, viz. Wing
    Commander 3.)

    Kdyby však náš programátor využil videopaměti a ke scrollování
    použil následujících pár instrukcí:

    procedure setstartaddr(new_addr:word); assembler;
    asm
   {----------------}
     mov dx,3dah
 @1: in  al,dx
     and al,8
     jz  @1
 @2: in  al,dx
     and al,8
     jnz @2
   {----------------}
     mov cx,new_addr
     mov dx,03d4h
     mov al,0ch
     mov ah,ch
     out dx,ax
     inc al
     mov ah,cl
     out dx,ax
     end;

   Jde v podstatě o to, říci kartě, odkud má začít vyobrazovat videopaměť
   na stínítko monitoru. První část (vymezená čarami) je takzvaný
   wait-retrace cyklus (čekání na paprsek). Jedná se o jakýsi delay,
   který má opodstatnění při samotném scrollování. Pokud by jste jej
   nepoužili, došlo by k okamžitému přesunu začátku zobrazování a bylo
   by po scrollingu. Samotná funkce set-start-addr je vlastně hardwérová
   operace grafické karty a nejde tedy o přesun dat jako v minulém případě.
   K vlastnímu plynulému scrollingu už není daleko. Stačí nahodit grafiku,
   něčím zaplácat videopamět a použí např. tento cyklus:

   for Y:=0 to 199 do setstartaddr(Y*80);

   a měli byste vidět krásně plynulý scrolling i na PC-XT.
   Pokud je tohleto pro vás novinka a máte stejné problémy jako můj
   smyšlený programátor, zkuste to a když vás bude něco ohledně scrollingu
   zajímat více, napište mi o svém problému na jednu z mých E-mail adres.


                                                  ReDox