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 | h | |
ld | (hl),e | |
dec | h | |
inc | d | |
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 | l |
jr | nz,mktt1 | |
ret | ||
tabadd | = | #6000 |
y2add | ld | h,>tabadd |
ld | d,(hl) | |
inc | h | |
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.