home *** CD-ROM | disk | FTP | other *** search
/ Flop Magazin 35 / Flop_Magazin_35_1995_03_Raster_cs_Side_A.atr / asmcmp.cap < prev    next >
Text File  |  2023-02-26  |  5KB  |  1 lines

  1. ¢Posloupnosti podm)nek¢Radek ③t%rba, RASTER¢¢Spousta podm)nek za sebou se ve strojov[m kdu 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 kdu 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@. kd 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. Kdy 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).¢