1. Predpocitane tabulky

   Tak ako, uz vas problem prekladanej videoramky netrapi ? Minule sme si naznacili, ze vas naozaj nemusi trapit. V tejto casti uvidite, ze najrychlejsim a najlepsim sposobom ako riesit, pripadne aj obchadzat rozne problemy, su tzv. "predpocitane tabulky." Co to je ta predpocitana tabulka ?
   Predpocitana tabulka je akesi jednorozmerne pole, ktore obsahuje vysledky nejakej funkcie narocnej na cas vypoctu, kde index prvku pola je vstup do funkcie a hodnota prvku pola je vysledok funkcie.
   Z matematickeho hladiska to nie je nic ine, ako definovanie funkcie tabulkou kde definicny obor (mnozina moznych hodnot argumentu) funkcie je konecny pocet za sebou iducich celych cisel.
   Ale vratme sa zase k nasmu povodnemu problemu. Spominali sme, ze predpocitana tabulka je vyborny sposob ako vyriesit problem prekladanej videoramky. Staci si len vymysliet nejaku funkciu, ktorej vstupom bude Y suradnica a vystupom bude adresa pixeloveho riadku leziaceho na danej Y suradnici, dimenzovat nejake pole o velkosti 192 prvkov (tolko je moznych Y suradnic), a este vymysliet nejaku malicku rutinku, ktora toto pole naplni vhodnymi hodnotami.
   Ako najjednoduchsie naplnime pole vhodnymi hodnotami ? Vieme, ze adresa prveho bodoveho riadku je #4000. Na vypocet adresy dalsieho riadku, ktory lezi hned pod nim, mozeme pouzit nasu rutinku "dole" ktoru sme si ukazali v minulej casti. Rutinka bude pracovat tak, ze do prvej polozky v tabulke vlozi adresu #4000, a kazdu dalsiu polozku vypocita tak, ze na poslednu vypocitanu adresu bude aplikovat nasu rutinku "dole". Nazvime tuto rutinku "mkadd".
   Pre jednoduchost a efektivnost celeho vypoctu predpokladajme ze Y suradnice mozu byt v rozsahu 0 az 255 (aby to bol jeden cely bajt). Kedze adresa je dvojbajtova a mame 256 moznosti suradnic, budeme potrebovat 512 bajtov pamete pre tabulku.
   Rutinka "y2add" je ta nasa inkriminovana rutinka, ktora pomocou predpocitanej tabulky prepocitava Y suradnicu na udaj - adresu bodoveho riadku vo videoramke. Na vstupe jej treba Y suradnicu vlozit do registra L, na vystupe vracia adresu v registri DE. Vsimnite si, ako rutinka naraba s indexom do predpocitanej tabulky. Y suradnica je priamo nizsi bajt adresy, na ktorej sa nachadza nizsi bajt udaja ktory ide na vystup. Vyssi bajt udaja by sa logicky mal nachadzat na adrese nasledujucej, avsak na tejto adrese sa uz nachadza nizsi bajt ineho udaja. Kde je potom umiestneny vyssi bajt udaja ? Kedze udajov mame len 256, tak vyssi bajt udaja je umiestneny o 256 bajtov dalej. Pristupime k nemu teda tak, ze namiesto inkrementovania nizsieho bajtu adresy budeme inkrementovat vyssi bajt adresy a je to.
   Vysoku efektivnost a rychlost rutinky danu skutocnostou ze Y suradnica je priamo nizsi bajt adresy udaja v tabulke musime ale zaplatit tym, ze sa nam drasticky znizi pocet moznosti ulozenia tabulky v pameti - tabulka moze lezat iba na adresach, ktore maju nizsi bajt nulovy, t.j. adresach delitelnych cislom 256. Avsak z praktickeho hladiska nas to nemusi trapit, lebo este stale nam ostava dost adries kde mozeme tabulku umiestnit.

mktab ld hl,tabadd 
 ld de,#4000 
mktt1 ld (hl),d 
 inc 
 ld (hl),e 
 dec 
 inc 
 ld a,d 
 and #07 
 jr nz,mktt2 
 ld a,#20 
 add a,e 
 ld e,a 
 jr c,mktt2 
 ld a,#f8 
 add a,d 
 ld d,a 
mktt2 inc 
 jr nz,mktt1 
 ret  
   
tabadd #6000 
   
y2add ld h,>tabadd 
 ld d,(hl) 
 inc 
 ld e,(hl) 
 ret  

   Adresa #6000 vo vypise je priklad moznej adresy umiestnenia tabulky v pameti. Tabulka bude od tejto adresy zaberat 512 bajtov.
   Pri pohlade na tento vypis si mozno polozite otazku: A kde je spominana rutinka "dole" ? Skuste sa na vypis zahladiet pozornejsie, a urcite ju tam najdete, aj ked nie celkom v povodnej podobe. Ak ju stale nevidite, tak skuste navzajom zamenit registre HL a DE.
   A co vas caka nabuduce ? Prikaz PLOT na 83 taktov...

Vas Busy.

Nazad / back , predchadzajuca a dalsia lekcia