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