Obsah
1. Instrukční sada digitálních signálových procesorů řady TMS320
3. Použití registru DP při adresování operandů
4. Použití registrů AR0 a AR1 při adresování operandů
5. Aritmetické a logické operace
6. Instrukce pro manipulaci s akumulátorem
7. Násobička a instrukce pro práci s registry T a P
9. Instrukce typu load & store, práce s registry použitými při adresování
10. Operace se stavovým a řídicím registrem
1. Instrukční sada digitálních signálových procesorů řady TMS320
V první části článku o digitálních signálových procesorech řady TMS320 jsme si popsali vnitřní uspořádání čipů TMS32010, které tvoří základ dalších generací DSP vyráběných společností Texas Instruments. Dnes se seznámíme s instrukční sadou těchto DSP. V porovnání se všemi doposud popsanými mikroprocesory a mikrořadiči je instrukční sada TMS32010 v mnoha ohledech odlišná, což však nemusí být příliš překvapivé, zvláště když si uvědomíme, k čemu byly tyto čipy určeny – k rychlému provádění operací typu konvoluce či korelace s celočíselnými hodnotami popř. hodnotami uloženými ve formátu s pevnou řádovou čárkou. Nejdůležitější tedy byla implementace rychlého násobení, 32bitového akumulátoru, adresování prvků uložených v polích atd. Méně podstatné operace, které například vyžadují složité adresování, nebyly prioritou a proto je v instrukční sadě nenalezneme.
S určitou nadsázkou je možné říct, že úkolem celého TMS32010 byl pouze sběr dat a jejich posílání do násobičky, protože právě násobička na tomto DSP zabrala největší plochu čipu. Na druhou stranu právě tato v době vzniku neobyčejná architektura umožnila velký rozmach digitálního zpracování signálu, a to v mnoha oblastech (včetně zvukové syntézy atd.)
2. Formát instrukčních slov
Většina instrukcí, které jsou na DSP řady TMS32010 implementovány, má jednotnou šířku šestnáct bitů, což znamená, že je možné je načíst v jediném cyklu. Šířka sběrnice interní paměti ROM/EPROM je totiž taktéž šestnáct bitů, a i šířka externí datové sběrnice je shodná. Jedinou výjimkou jsou skoky, které jsou uloženy ve dvou po sobě jdoucích slovech (16+16 bitů), přičemž ve druhém slovu je uložen dvanáctibitový cíl skoku (nejvyšší čtyři bity jsou nulové). Podívejme se, jaké jsou formáty instrukcí a jak je rozděleno instrukční slovo do jednotlivých bitových polí.
U několika instrukcí je možné do vybraného registru načíst osmibitovou konstantu. Jedná se o instrukce LACK a LARK, jejichž instrukční slovo vypadá následovně
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | osmibitová konstanta | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
O významu operace násobení v oblasti DSP snad nejvíce vypovídá existence instrukce MPYK, která jako jediná umožňuje specifikovat konstantu o šířce třinácti bitů:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | třináctibitová konstanta | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Relativně velké množství instrukcí obsahuje adresu druhého operandu uloženou ve spodních sedmi bitech. Tato adresa je zkombinována s registrem DP:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | 0 | adresa | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Ty stejné instrukce, které dokážou využít sedmibitovou adresu operandu, mohou alternativně použít adresování s využitím registrů AR0 či AR1. Podrobnosti jsme si již řekli v předchozích kapitolách:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | 1 | 0 |INC|DEC|NAR| 0 0 |ARP| +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Další formát je použit u instrukcí LAC, ADD a SUB, protože tyto instrukce dokážou načíst operand a před jeho přivedením do ALU ho ještě posunout v prvním shifteru. Z tohoto důvodu bylo nutné do instrukčního slova vložit hodnotu posunu:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | shift | I | adresa | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Jediná instrukce SASH používá druhý shifter a její formát vypadá následovně:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | shift | I | adresa | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Poslední formát využívají skoky, u nichž je adresa skoku uložena ve spodních dvanácti bitech druhého slova (povšimněte si, že u modernějších čipů lze bez problémů využít čtyři horní nuly pro rozšíření adresy):
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | | | | | | | | | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | adresa cíle nepodmíněného či podmíněného skoku| +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
3. Použití registru DP při adresování operandů
Většina operací používá jako svůj první operand akumulátor, zatímco druhý operand je načítán z datové paměti o kapacitě 144 nebo 256 slov. V instrukčním slovu je pro adresu operandu vyhrazeno pouze sedm bitů, takže kód instrukce vypadá následovně:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | 0 | adresa | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Pro adresaci operandů v paměti dat je zapotřebí osm bitů. Z tohoto důvodu se adresa rozděluje na 1+7 bitů, přičemž první (nejvyšší) bit je uložen v registru DP (data page). U původních čipů obsahovala nultá stránka 128 slov a první stránka jen 16 slov (144–128), u čipů s větší RAM měly obě stránky shodně 128 slov:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | 0 | adresa 0..127 | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ : : : : : : : : +-----+: : : : : : : | DP |: : : : : : : +-----+: : : : : : : : : : : : : : : v v v v v v v v +---+---+---+---+---+---+---+---+ | adresa 0..255 | +---+---+---+---+---+---+---+---+
Obsah registru DP se nastavuje instrukcí LDP (z paměti je načten operand a použije se jen jeho nejnižší bit) nebo LDPK (jednobitová konstanta je přímo součástí instrukce).
4. Použití registrů AR0 a AR1 při adresování operandů
Již minule jsme si řekli, že DSP TMS32010 obsahují dva adresové registry nazvané AR0 a AR1, přičemž vždy jeden z těchto registrů je aktivní (jeho index je uložen v jednobitovém registru ARP). Tyto adresové registry mají hned několik využití, protože je lze použít jak pro klasické adresování operandů uložených v RAM (kapacita 144 nebo 256 slov), tak i pro průchody polem (zde se využije možnost autoinkrementace a autodekrementace), popř. pro realizaci počítaných programových smyček realizovaných instrukcí BANZ. Podívejme se na některé možnosti poskytované assemblerem při volání instrukce ADD (* značí nepřímé adresování):
ADD * ; načtení z adresy, na níž ukazuje vybraný AR0/1 ADD *, 4 ; načtení z adresy, na níž ukazuje vybraný AR0/1 ; posun načítané hodnoty o 4 bity doleva ADD *+, 4 ; načtení z adresy, na níž ukazuje vybraný AR0/1 ; posun načítané hodnoty o 4 bity doleva ; autoinkrementace vybraného registru AR0/1 ADD *-, 4 ; načtení z adresy, na níž ukazuje vybraný AR0/1 ; posun načítané hodnoty o 4 bity doleva ; autodekrementace vybraného registru AR0/1 ADD *-, 4, 0 ; načtení z adresy, na níž ukazuje vybraný AR0/1 ; posun načítané hodnoty o 4 bity doleva ; autodekrementace vybraného registru AR0/1 ; do ARP je uložena nula (aktivní se tedy stane AR0) ADD *-, 4, 1 ; načtení z adresy, na níž ukazuje vybraný AR0/1 ; posun načítané hodnoty o 4 bity doleva ; autodekrementace vybraného registru AR0/1 ; do ARP je uložena jednička (aktivní se tedy stane AR1)
Podobný způsob adresování (většinou bez bitových posunů) podporují i mnohé další instrukce, takže sice na první pohled malý instrukční soubor s pouhými šedesáti instrukcemi je ve skutečnosti poměrně všestranný (i když ne tak univerzální jako instrukční sady s dvouadresovým či tříadresovým kódem).
V instrukčním slovu se při použití adresních registrů v sedmém bitu nachází 1 a bity 5, 4, 3 a 0 mají speciální význam:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | 1 | 0 |INC|DEC|NAR| 0 0 |ARP| +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Bit | Význam |
---|---|
INC | pokud je 1, vybraný AR se inkrementuje po provedení operace |
DEC | pokud je 1, vybraný AR se dekrementuje po provedení operace |
NAR | povolení či zákaz změny registru ARP podle bitu 0 |
ARP | změna ARP na 0 (výběr AR0) či 1 (výběr AR1), lze maskovat bitem NAR |
Poznámka: specifikace popisuje chování bitů INC a DEC pro kombinace bitové 00 (vybraný AR se nezmění), 10 (inkrementace) a 01 (dekrementace). Teoreticky by kombinace 11 měla být stejná jako 00, assemblery však tuto kombinaci nevygenerují.
5. Aritmetické a logické operace
V této kapitole jsou zmíněny všechny aritmetické a logické operace prováděné v aritmeticko-logické jednotce (nikoli tedy v samostatně pracující násobičce). Všechny dále zmíněné instrukce jako jeden svůj zdrojový operand vždy načítají akumulátor, druhým operandem je šestnáctibitová hodnota načtená z paměti dat (RAM). Tato hodnota je buď posunuta a následně využita jako 32bitová hodnota (první shifter), popř. je použita a načtena přímo nebo je znaménkově rozšířena na 32 bitů. Výsledek je ve všech případech uložen zpět do akumulátoru, který je umístěn na výstupu z aritmeticko-logické jednotky:
# | Instrukce | Délka | Počet cyklů | Operandy | Význam |
---|---|---|---|---|---|
1 | ABS | 1 | 1 | × | výpočet absolutní hodnoty s uložením zpět do akumulátoru |
2 | ADD | 1 | 1 | shift, adresa | přičtení posunuté hodnoty k akumulátoru |
3 | ADDH | 1 | 1 | adresa | přičtení hodnoty k horním 16 bitům akumulátoru |
4 | ADDS | 1 | 1 | adresa | přičtení hodnoty k akumulátoru (operand není znaménkově rozšířen) |
5 | SUB | 1 | 1 | shift, adresa | odečtení posunuté hodnoty od akumulátoru |
6 | SUBC | 1 | 1 | adresa | posun popř. i rozdíl (použito jako jeden krok při dělení) |
7 | SUBH | 1 | 1 | adresa | odečtení hodnoty od horních 16 bitů akumulátoru |
8 | SUBS | 1 | 1 | adresa | odečtení hodnoty od akumulátoru (operand není znaménkově rozšířen) |
9 | AND | 1 | 1 | adresa | logický součin bit po bitu (použije se jen na 16 bitů) |
10 | OR | 1 | 1 | adresa | logický součet bit po bitu (použije se jen na 16 bitů) |
11 | XOR | 1 | 1 | adresa | logická nonekvivalence bit po bitu (použije se jen na 16 bitů) |
Nejsložitější je instrukce SUBC, protože ta je navržena takovým způsobem, aby mohla být použita pro celočíselné dělení dvou čísel bez znaménka. Na začátku je nutné do spodní poloviny akumulátoru uložit dělenec, na zadané adrese je uložen dělitel a po provedení šestnácti instrukcí SUBC bude v horních šestnácti bitech akumulátoru uložen zbytek po dělení a ve spodních šestnácti bitech pak podíl. Celý podprogram pro dělení dvou šestnáctibitových čísel může být implementován takto:
LARP AR0 ; další operace budou používat adresový registr AR0 LARK AR0, 15 ; načtení konstanty 15 (počitadla iterací) OPAK SUBC dělitel ; jedna iterace celočíselného dělení BANZ OPAK ; opakování smyčky
6. Instrukce pro manipulaci s akumulátorem
Poměrně rozsáhlá skupina instrukcí pracuje s akumulátorem připojeným na vstup i na výstup ALU. Vybrané instrukce navíc používají již popsané shiftery, z nichž jeden je umístěný na vstupu ALU, druhý naopak na jeho výstupu:
# | Instrukce | Délka | Počet cyklů | Operandy | Význam |
---|---|---|---|---|---|
1 | LAC | 1 | 1 | shift, adresa | načtení operandu, jeho posun v prvním shifteru a uložení do akumulátoru |
2 | LACK | 1 | 1 | konstanta | do akumulátoru je načtena osmibitová konstanta (ta je znaménkově rozšířena) |
3 | SACH | 1 | 1 | shift, adresa | horní polovina akumulátoru je posunuta ve druhém shifteru a uložena na zadanou adresu |
4 | SACL | 1 | 1 | adresa | spodní polovina akumulátoru (16 bitů) je uložena na zadanou adresu |
5 | ZAC | 1 | 1 | × | vynulování celého akumulátoru |
6 | ZALH | 1 | 1 | × | vynulování akumulátoru a načtení hodnoty do jeho horní poloviny (16 bitů) |
7 | ZALS | 1 | 1 | × | vynulování akumulátoru a načtení hodnoty do jeho spodní poloviny (16 bitů) |
Povšimněte si, jakým způsobem se museli tvůrci procesorů TMS32010 vyrovnat s faktem, že akumulátor je 32bitový, zatímco datová paměť (144 nebo 256 slov) obsahuje šestnáctibitové operandy a tudíž i datová sběrnice je šestnáctibitová.
7. Násobička a instrukce pro práci s registry T a P
Minule jsme si řekli, že TMS32010 obsahuje výkonnou násobičku, která dokáže vynásobit dva šestnáctibitové operandy s 32bitovým výsledkem, který je dále zpracován v ALU. Před násobičkou je umístěn registr T (temporary) s šířkou šestnácti bitů, do kterého se ukládá jeden z činitelů instrukcemi LT, LTA a LTD. Druhý činitel je načten buď z datové paměti (16 bitů, instrukce MPY), nebo je možné použít konstantu o šířce třinácti bitů, která je uložena přímo v kódu instrukce (MPYK). Součin se ukládá do registru P (product) a pomocí instrukcí PAC, APAC a SPAC se buď může výsledek uložit do akumulátoru nebo se může provést operace acc+P či acc-P.
# | Instrukce | Délka | Počet cyklů | Operandy | Význam |
---|---|---|---|---|---|
1 | LT | 1 | 1 | adresa | načtení registru T z paměti |
2 | LTA | 1 | 1 | adresa | kombinace instrukcí LT+APAC (načtení + součet) |
3 | LTD | 1 | 1 | adresa | kombinace instrukcí LT+APAC+DMOV |
4 | PAC | 1 | 1 | × | uložení obsahu registru P do akumulátoru |
5 | APAC | 1 | 1 | × | přičtení obsahu registru P k akumulátoru |
6 | SPAC | 1 | 1 | × | odečtení obsahu registru P od akumulátoru |
7 | MPY | 1 | 1 | adresa | provedení operace P=T×(adresa) |
8 | MPYK | 1 | 1 | konstanta | provedení operace P=T konstanta |
Obrázek 1: Násobička v blokovém schématu TSM32010.
Poznámka: povšimněte si, že samotné násobení lze provést v jediném taktu a že ho lze snadno použít v operacích typu „multiply accumulate“ (korelace, konvoluce atd.).
8. Skokové instrukce
Na DSP samozřejmě nalezneme instrukci nepodmíněného skoku a taktéž několik skoků s podmínkou. Povšimněte si, že šest podmíněných skoků pouze porovnává hodnotu akumulátoru s nulou, není tedy nutné používat klasické příznakové bity. Jedinou instrukcí pracující s příznakovým bitem, je podmíněný skok BV. Skok BIOZ slouží pro testování pinu BIO (je negovaný), nejsložitější je pak instrukce BANZ, která testuje nulovost vybraného adresního registru a provede skok ve chvíli, kdy je registr nenulový (tento registr je navíc vždy dekrementován, což je ideální pro různé typy programových smyček):
# | Instrukce | Délka | Počet cyklů | Operandy | Význam |
---|---|---|---|---|---|
1 | B | 2 | 2 | adresa | nepodmíněný skok |
2 | BANZ | 2 | 2 | adresa | skok za podmínky AR0!=0 nebo AR1!=0 + dekrementace obsahu registru |
3 | BGEZ | 2 | 2 | adresa | skok za podmínky add ≥ 0 |
4 | BGZ | 2 | 2 | adresa | skok za podmínky add > 0 |
5 | BLEZ | 2 | 2 | adresa | skok za podmínky add ≤ 0 |
6 | BLZ | 2 | 2 | adresa | skok za podmínky add < 0 |
7 | BZ | 2 | 2 | adresa | skok za podmínky add = 0 |
8 | BNZ | 2 | 2 | adresa | skok za podmínky add ≠ 0 |
9 | BV | 2 | 2 | adresa | skok pokud došlo v předešlé operaci k přetečení |
10 | BIOZ | 2 | 2 | adresa | test vstupního pinu BIO a skok za podmínky, že je nulový |
TMS32010 obsahuje i základní podporu pro volání podprogramů (ovšem jen do čtyř úrovní). Zajímavá je především instrukce CALA, která využívá adresu uloženou v akumulátoru. Takto lze realizovat například některé konstrukce typu switch-case, „počítané goto“ atd.:
# | Instrukce | Délka | Počet cyklů | Operandy | Význam |
---|---|---|---|---|---|
1 | CALA | 1 | 2 | × | skok na adresu subrutiny uloženou v akumulátoru |
2 | CALL | 2 | 2 | adresa | skok na adresu subrutiny uloženou v dalším slovu |
3 | RET | 1 | 2 | × | návrat ze subrutiny |
Poznámka: povšimněte si, že všechny skokové instrukce (které musí manipulovat s obsahem registru PC) trvají dva cykly, nehledě na jejich skutečnou délku.
9. Instrukce typu load & store, práce s registry použitými při adresování
S registry DP, ARP, AR0 a AR1 jsme se již seznámili ve třetí a ve čtvrté kapitole. V následující tabulce jsou uvedeny instrukce, které dokážou tyto registry načíst či uložit. Zmíněna je i instrukce MAR, která se chová podobně jako ADD (čtvrtá kapitola), ovšem jejím výsledkem je pouze inkrementace/dekrementace jednoho z registrů AR0 či AR1, popř. i změna obsahu registru ARP. Pokud je u této instrukce použita přímá adresa, chová se tato instrukce jako NOP:
# | Instrukce | Délka | Počet cyklů | Operandy | Význam |
---|---|---|---|---|---|
1 | LAR | 1 | 1 | registr,adresa | načtení registru AR0/AR1 |
2 | LARK | 1 | 1 | registr,konstanta | načtení registru AR0/AR1 |
3 | LARP | 1 | 1 | registr | změna obsahu ARP (0 nebo 1) |
4 | LDP | 1 | 1 | adresa | načtení registru DP |
5 | LDPK | 1 | 1 | konstanta | uložení 0 nebo 1 do registru DP |
6 | MAR | 1 | 1 | adresa | úprava ARP, AR0 či AR1, viz též kapitolu číslo 4 |
7 | SAR | 1 | 1 | registr,adresa | uložení AR0/AR1 do RAM |
10. Operace se stavovým a řídicím registrem
Další skupina instrukcí nějakým způsobem pracuje s řídicím registrem, popř. s jeho vybraným bitem. Největší vliv má bit OVM, jehož hodnota určuje, zda se budou výpočty provádět s přetečením (jak je zvykem na běžných mikrořadičích a mikroprocesorech) nebo se saturací (což je naopak obvyklé v DSP algoritmech):
# | Instrukce | Délka | Počet cyklů | Operandy | Význam |
---|---|---|---|---|---|
1 | DINT | 1 | 1 | × | zákaz maskovatelných přerušení (nastaví bit INTM na 1) |
2 | EINT | 1 | 1 | × | povolení maskovatelných přerušení (nastaví bit INTM na 0) |
3 | ROVM | 1 | 1 | × | zákaz režimu výpočtů s přetečením (nastaví bit OVM na 0) |
4 | SOVM | 1 | 1 | × | povolení režimu výpočtů s přetečením (nastaví bit OVM na 1) |
5 | LST | 1 | 1 | adresa | načtení stavového registru z datové RAM |
6 | SST | 1 | 1 | adresa | uložení stavového registru do datové RAM |
Obrázek 2: Zdrojový rastrový obrázek (známá fotografie Lenny), který tvoří zdroj pro jednoduchý konvoluční (FIR) filtr, jenž zvyšuje hodnoty pixelů o pevně zadanou konstantu (offset).
Obrázek 3: Pokud je pro přičtení offsetu použita operace součtu se zanedbáním přenosu (carry), tj. když se počítá systémem „modulo N“, dochází při překročení maximální hodnoty pixelu (čistě bílá barva) k jasně viditelným chybám.
Obrázek 4: Při použití operace součtu se saturací sice taktéž dojde ke ztrátě informace (vzniknou oblasti s pixely majícími hodnotu 255), ovšem viditelná chyba je mnohem menší, než na předchozím obrázku.
11. Ostatní instrukce
Z instrukčního souboru DSP TMS32010 si zbývá popsat pouhých osm instrukcí. Tyto instrukce je možné rozdělit do tří oblastí – uložení akumulátoru na zásobník či naopak obnova akumulátoru ze zásobníku, instrukce NOP, která pouze zvyšuje obsah registru PC a konečně pětice instrukcí určených pro přenosy dat mezi RAM a ROM/PROM, práci s externími porty atd. Podívejme se na následující tabulku:
# | Instrukce | Délka | Počet cyklů | Operandy | Význam |
---|---|---|---|---|---|
1 | PUSH | 1 | 2 | × | uložení spodních šestnácti bitů akumulátoru na zásobník |
2 | POP | 1 | 2 | × | obnova spodních šestnácti bitů akumulátoru ze zásobníku |
3 | NOP | 1 | 1 | × | pouze zvýší obsah registru PC |
4 | IN | 1 | 2 | adresa | přečtení úrovně na vstupním portu, uložení do paměti |
5 | OUT | 1 | 2 | adresa | změna úrovní na výstupním portu |
5 | DMOV | 1 | 1 | adresa | přesun dat ze zadané adresy na nejbližší vyšší adresu |
7 | TBLR | 1 | 3 | adresa | přesun dat z paměti programu do RAM |
8 | TBLW | 1 | 3 | adresa | přesun dat z RAM do paměti programu |
Poznámky:
- Povšimněte si, že operace se zásobníkem jsou provedeny ve dvou taktech, tedy pomaleji, než například vynásobení dvou čísel.
- Instrukce DMOV se typicky používá s adresními režimy používajícími registr AR0 či AR1
- Instrukce DMOV se používá pro implementaci zpoždění ve zpracovávaném signálu (z-1)
- Instrukce TBLR a TBLW jsou zvláštní tím, že pro adresaci hodnoty v paměti programu používají spodních dvanáct bitů akumulátoru. Navíc se pro adresaci ve skutečnosti používá PC, který je před provedením instrukce uložen na zásobník a po provedení instrukce zase obnoven. To znamená, že tyto dvě instrukce potřebují mít alespoň jedno volné místo na zásobníku (s kapacitou čtyř prvků).
Blokový přesun dat může vypadat například takto:
MOVTBL TBLR *- ; přesun jednoho slova na adresu uloženou v AR0/AR1 SUB ONE ; odečtení jedničky od akumulátoru (ten obsahuje adresu zdrojových dat v ROM) BANZ MOVTBL ; test na nulovost registru AR0/AR1, skok a dekrementace, pokud se nedosáhlo nuly
12. Odkazy na Internetu
- Digital Signal Processors (stránky TI)
http://www.ti.com/lsds/ti/processors/dsp/overview.page - Introduction to DSP
http://www.ti.com/lit/wp/spry281/spry281.pdf - The Evolution of TMS (Family of DSPs)
http://www.slideshare.net/moto_modx/theevo1 - Datasheet k TMS32010
http://www.datasheetarchive.com/dlmain/49326c32a52050140abffe6f0ac4894aa09889/M/TMS32010 - 1979: Single Chip Digital Signal Processor Introduced
http://www.computerhistory.org/siliconengine/single-chip-digital-signal-processor-introduced/ - The TMS32010. The DSP chip that changed the destiny of a semiconductor giant
http://www.tihaa.org/historian/TMS32010–12.pdf - Texas Instruments TMS320 (Wikipedia)
https://en.wikipedia.org/wiki/Texas_Instruments_TMS320 - Great Microprocessors of the Past and Present: Part IX: Signetics 8×300, Early cambrian DSP ancestor (1978):
http://www.cpushack.com/CPU/cpu2.html#Sec2Part9 - Great Microprocessors of the Past and Present (V 13.4.0)
http://jbayko.sasktelwebsite.net/cpu.html - Introduction to DSP – DSP processors:
http://www.bores.com/courses/intro/chips/index.htm - The Scientist and Engineer's Guide to Digital Signal Processing:
http://www.dspguide.com/ - Digital signal processor (Wikipedia EN)
http://en.wikipedia.org/wiki/Digital_signal_processor - Digitální signálový procesor (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Digitální_signálový_procesor - Digital Signal Processing FAQs
http://dspguru.com/dsp/faqs - Reprezentace numerických hodnot ve formátech FX a FP
http://www.root.cz/clanky/fixed-point-arithmetic/ - IEEE 754 a její příbuzenstvo: FP formáty
http://www.root.cz/clanky/norma-ieee-754-a-pribuzni-formaty-plovouci-radove-tecky/ - Čtyři základní způsoby uložení čísel pomocí FX formátů
http://www.root.cz/clanky/binarni-reprezentace-numerickych-hodnot-v-fx-formatu/ - Základní aritmetické operace prováděné v FX formátu
http://www.root.cz/clanky/zakladni-aritmeticke-operace-provadene-ve-formatu-fx/ - Aritmetické operace s hodnotami uloženými ve formátu FP
http://www.root.cz/clanky/aritmeticke-operace-s-hodnotami-ve-formatu-plovouci-radove-carky/ - FIR Filter FAQ
http://dspguru.com/dsp/faqs/fir - Finite impulse response (Wikipedia)
http://en.wikipedia.org/wiki/Finite_impulse_response - DSPRelated
http://www.dsprelated.com/ - Addressing mode (Wikipedia)
https://en.wikipedia.org/wiki/Addressing_mode - Orthogonal instruction set
https://en.wikipedia.org/wiki/Orthogonal_instruction_set - TI 16-bit and 32-bit microcontrollers
http://www.ti.com/lsds/ti/microcontrollers16-bit32-bit/overview.page - TMS 32010 Assembly Language Programmer's Guide (kniha na Amazonu)
https://www.amazon.com/32010-Assembly-Language-Programmers-Guide/dp/0904047423