¢Posloupnosti podm)nek¢Radek ③t%rba, RASTER¢¢Spousta podm)nek za sebou se ve strojov[m kdu objevuje dost 'asto, zvl*&t% v t%ch '*stech, kde nap@. reagujeme na stisk n%jak[ kl*vesy nebo podle jin[ho parametru rozhodujeme o proveden) ur'it[ akce.¢¢Nej'ast%j&) formou je postupn[ kladen) podm)nek:¢¢ LDA PARAM ;tj.n%jak` parametr, kter` porovn*v*me¢ CMP #0¢ BNE NA1¢ ;pro PARAM=0¢ ...¢NA1 CMP #1¢ BNE NA3¢ ;pro PARAM=1¢ ...¢NA2 CMP #2¢ BNE NA3¢ ;pro PARAM=2¢ ...¢ ...¢¢Tento zp+sob je p@ehledn` a vzhledem k rychlosti prov*d%n) strojov[ho kdu i hojn% pou()van`. Pokud bude podm)nek hodn% ╱t@eba i n%kolik des)tek$, je mo(n[ pou()t metodu s rozeskakovac) tabulkou.¢Tento p@)klad provede skok na dan[ n*v%&t) podle hodnoty nalezen[ na adrese PARAM. ╱Je to vlastn% obdoba BASICovsk[ho p@)kazu ON GOTO.$ Hodnot% 0 odpov)d* skok na NA0, 1 skok na NA1, 2 skok na NA2, atd... ╱Pozn.: N*zvy n*v%&t) mohou b`t libovoln[, pouze je nutn[ bezpodm)ne'n% dodr(et jejich po@ad) na @*dku s definic) VECTAB.$ ¢¢ LDA PARAM¢ ASL A¢ TAX¢ LDA VECTAB,X¢ STA ADR¢ LDA VECTAB⇩1,X¢ STA ADR⇩1¢ JMP ╱ADR$¢ADR .WORD ◆0000 ¢VECTAB .WORD NA0,NA1,NA2,...¢NA0¢ ...¢NA1 ¢ ...¢NA2¢ ...¢¢Vysv%tlivky:¢ASL A ¢..n*soben) dv%ma, proto(e adresa se skl*d* ze dvou byt+¢TAX ¢..p@esun do X¢LDA VECTAB,X ¢..z)sk*n) ni(&)ho bytu c)lov[ adresy¢STA ADR ¢..ulo(en) ni(&)ho bytu na adresu ADR¢LDA VECTAB⇩1,X¢..vy&&) byte c)lov[ adresy¢STA ADR⇩1¢..ulo(en) vy&&)ho bytu na ADR⇩1¢JMP ╱ADR$ ¢..nep@)m` skok. Program sko') na adresu, jej)( hodnotu najde na adrese uveden[ v z*vork*ch ╱ADR$. P@esn%ji @e'eno: skute'nou adresu pro skok dostaneme tak, (e vezmeme obsah adresy ADR a p@i'teme 256-ti n*sobek obsahu adresy ADR⇩1.¢ADR .WORD ◆0000 ¢..vyhrazen) m)sta pro ulo(en) doln)ho a horn)ho bytu skute'n[ c)lov[ adresy, na kterou m* b`t proveden skok.¢VECTAB .WORD NA0,NA1,NA2,...¢..tabulka n*v%&t) pro skoky ╱od adresy VECTAB budou v pam%ti za sebou dvojice hodnot - v(dy doln) a horn) byte hodnoty dan[ho n*v%&t)$.¢¢¢Dal&) '*st tohoto textu bude ur'ena sp)&e pokro'il`m a t%m, kter`m jde ve sv`ch strojov`ch programech o u&et@en) ka(d[ho taktu procesoru ╱tj. cca 1/1720000sec.$. Zab`vat se takov`mi ]sporami m* v`znam pouze u rutin, kter[ jsou vol*ny mnohokr*t za vte@inu ╱@*dov% v 10000-c)ch$. Teprve pak m* vynalo(en[ ]sil) pat@i'n` efekt..¢¢Pokud hodnota parametru nen) 0,1,2,3,.. ale je to n%jak[ ')slo ╱nap@. kd stisknut[ kl*vesy$, @e&) se to v%t&inou posloupnost) podm)nek, nebo④ rozeskakovac) tabulku nelze pou()t ╱pokud nechceme ob%tovat 256byt+ pam%ti a tak vlastn% ud%lat tabulku pro parametr od 0 a( do 127$.¢I tady v&ak lze ud%lat jist[ vylep&en):¢¢P@. Podle hodnot PARAM = 63,21,18,58,42,56,61,57 ╱tj. Kdy kl*ves A,B,C,..,H$ chceme prov*d%t r+zn[ 'innosti.¢Kdy( tento probl[m budeme @e&it posloupnost) 8-mi podm)nek, bude to jist% fungovat, ale nap@. pro p)smeno H bude nejprve porovn*v*no v&ech 7 p@edchoz)ch ')sel. Existuje v&ak i efektivn%j&) zp+sob:¢¢1.$ se@ad)me si hodnoty podle velikosti:¢18,21,42,56,57,58,61,63¢2.$ vybereme prost@edn) hodnotu¢tj. 56¢3.$ rozd%l)me posloupnost na 2 '*sti ╱d%l)c)m prvkem je '.56$¢4.$ v ka(d[ '*sti vybereme prost@edn) hodnotu a posloupnosti zase rozd%l)me na dv% '*sti ╱atd.$¢╱ ╱18$ 21 ╱42$ $ 56 ╱ ╱57 $ 58 ╱ 61 ╱ 63$ $ $¢¢Program pak bude vypadat takto:¢ LDA PARAM¢ CMP #56 ¢ BEQ J56 ;=56¢ BCS N56 ;>=56¢ CMP #21¢ BEQ J21 ;=21¢ BCS N21 ;>=21¢ CMP #18¢ BEQ J18 ;=18¢ JMP NIC¢N21 CMP#42¢ BEQ J42 ;=42¢ JMP NIC¢N56 CMP#58¢ BEQ J58 ;=58¢ BCS N58 ;>=58¢ CMP #57¢ BEQ J57 ;=57¢ JMP NIC¢N58 CMP #61¢ BEQ J61 ;=61¢ CMP #63¢ BEQ J63 ;=63¢ JMP NIC¢NIC ;nebyl to (*dn`¢;N*v%&t) pro jednotliv[ hodnoty:¢J18 ;pro PARAM=18¢J21 ;=21¢J42 ;=42¢J56 ;=56¢J57 ;=57¢J58 ;=58¢J61 ;=61¢J63 ;=63¢¢əe je to &)len% slo(it[ a nech*pete to? Vysv%tl)m...¢¢Pokud porovn*me parametr v(dy s prost@edn) hodnotou, zjist)me, (e¢a$ je roven t[to hodnot%, tak(e sko')me na n*v%&t) pro proveden) operac) p@)slu&ej)c)ch k t[to hodnot% ╱tj. n*v%&t) Jxx$.¢b$ je v%t&) ╱instrukce BCS provede skok$. Te⇦ u( budeme uva(ovat pouze pravou polovinu posloupnosti ╱lev* '*st n*s tedy ji( v+bec nezaj)m*$. Pokra'ujeme porovn*n)m s prost@edn) hodnotou v prav[ '*sti atd...¢c$ je men&) ╱BCS nesko')$. Te⇦ n*s bude zaj)mat u( jen lev* '*st posloupnosti ╱pravou si odmysl)me$. Pokra'ujeme porovn*n)m s prost@edn) hodnotou v lev[ '*sti atd...¢¢Zd* se v*m to st*le slo(it[? Douf*m alespo, (e princip je jasn`?!¢A jak` je efekt toho cel[ho?¢Klasick`m zp+sobem se prov*d) v nejhor&)m p@)pad% 8-kr*t instrukce CMP a 8-kr*t BNE, tedy celkem 16 instrukc).¢Po "inovaci" pr+zkumem zjist)me, (e v nejhor&)m p@)pad% ╱pokud PARAM=63$ program projde p@es 4 instrukce CMP, 4 instrukce BEQ a 2 BCS - to je dohromady 10 instrukc).¢Jestli se v*m zd*, (e je to zbyte'n[ usil) kv+li 6 instrukc)m, m*te pravdu. Tento p@)klad je p@ece pouze demonstra'n). V%zte v&ak, (e s rostouc)m po'tem mo(n`ch hodnot je tato metoda mnohem efektivn%j&). To ale ocen)te a( p@i programov*n) superrychl`ch rutin.¢Tento princip m+(ete s v`hodou vyu()t i u program+ v jin`ch programovac)ch jazyc)ch, nebo④ jeho s)la je ve sn)(en) celkov[ho po'tu proveden`ch operac) porovn*n).¢