Narsil č. 09

Motorola 68000 (8. část)

↑

MOTOROLA 68000 (8. část)

------------------------

POZOR!!!! Místo znaku čtverce (je vedle Backspace), který se v asembleru běžně používá, jsme z důvodu jeho použití při editaci textů pro Narsil museli použít jako náhradu znak @)

JMP, Skoč

Syntaxe: JMP <ea>

Skočí na adresu, která může být zadána přímo, ale také relativně 20(pc), nebo dokonce pomocí adresových registrů, jako např. JMP (a0). Program koná témeř stejnou funkci jako JSR s tím rozdílem, že neukládá na zásobník (stackpointer, A7) zpáteční adresu.

Dalšími neméně důležitými a pro výpočty 3D prostorů naprosto nutnými instrukcemi jsou příkazy pro násobení a dělení. Pozor! Všechny tyto instrukce jsou z hlediska výpočtového času velmi náročné, proto jejich použití vždy snižte na minimum.

DIVS, děl se znaménkem

Syntaxe: DIVS <ea>,Dn

Výsledek je uložen v datovém registru. Dělení probíhá následujícím způsobem: Dn=Dn/<ea>. Výsledek je uložen do spodního slova datového registru a zbytek do horního slova. Je-li výsledek záporný, je zbytek také záporný, příznakový bit N(negativ) se nastaví na 1. Dojde-li k dělení nulou, vyvolá se trap. Velikost datového registru při dělení je 32 bitů, velikost efektivní adresy je 16-bitů.

DIVU, děl bez znaménka

Syntaxe: DIVU <ea>,Dn

Chová se stejně jako DIVS, ale není počítáno se znaménkem, to znamená, že číslo má rozsah od 0 do 2

32-1 a číslo, kterým se bude dělit, rozsah od 0-65535. (u DIVS má rozsah -32767 do 32767)

MULS, násobení se znaménkem

Syntaxe: MULS <ea>,Dn

Provede vynásobení (pro matematiky součin) dvou 16 bitových čísel a výsledek uloží jako 32-bitové číslo do datového registru. Jestliže je výsledek záporný, nastaví se bit N, označující negaci.

MULU, násobení bez znaménka

Syntaxe: MULU <ea>,Dn

Opět velmi podobné MULS s tím rozdílem, že násobená čísla jsou v rozsahu 0-65535. (MULS má rozsah -32767 až 32767).

NEG, negování

Syntaxe: NEG.s <ea>

Neguje vybraný operand, tzn., že operand odečte od nuly a výsledek je opět uložen do operandu. Praktické využití spočívá např. při výpočtu absolutní hodnoty.

NEGX, negování s příznakem X

Syntaxe: NEG.S <ea>

Neguje také vybraný operand, ale používá pro rozdíl ještě navíc rozšiřující bit X.

NOP, prázdná instrukce

Syntaxe: NOP

Tato instrukce neprovádí žádný případ. U počítačů ST a Amiga, které měly ještě přesně dané procesorové takty (8 Mhz, 7.14 Mhz) se používaly pro přesné časové smyčky, protože jedna instrukce NOP trvá vždy 4 procesorové takty.

RESET, reset vnějších zařízení

Syntaxe: RESET

Provede zaktivování vodiče RESET. Na ST prostě fatální situace, v žádném případě tento příkaz nepoužívejte.

RTE, návrat z přerušení a nastavení SR

Syntaxe: RTE

Hodnota status registru a čítače programu se nastaví na původní hodnoty, tj. dojde k návratu do hlavního programu.

RTR, návrat z přerušení a nastavení příznakových bitů

Syntaxe: RTR

Hodnota čítače programu a příznakových bytů je nastavena na původní hodnotu, a to tak, že si je vybere ze zásobníku.

Scc, nastav podle podmínky.

Syntaxe: Scc <ea>

Podmínky, které můžete pro tento příkaz použít, jsou totožné s příkazy DBcc a Bcc. Narozdíl od těchto instrukcí je však jedinou zadávanou hodnotou efektivní adresa. Jestliže je podmínka platná, jsou všechny bity této adresy (nějakého registru CPU) nastaveny na 1, tzn. že byte má hodnotu 255. Není-li tato podmínka splněna, jsou bity nastaveny na 0. Vyjímku tvoří SF a ST, první vždy naplní byte nulami a druhý jedničkami.

STOP, naplnit stavový registr a zastavit CPU

Syntaxe: STOP @xxxx

Naplní stavový registr procesoru zadanou hodnotou a zastaví běh procesoru. Tento běh může obnovit pouze nějaké přerušení, které ovšem musí mít pochopitelně vyšší prioritu než je hodnota stavového registru, další možností je vyvolání trapu, k němuž však musí dojít během provádění funkce STOP, a poslední možností je RESET zařízení.

Použít se dá například při časových smyčkách, kdy chceme, aby procesor určitou dobu (do přerušení) čekal a poté pokračoval.

SWAP, prohoď spodní a horní polovinu registru.

Syntaxe: SWAP Dn

Tato instrukce vymění bity registru 0-15 s bity 16-31. Výhodné například po dělení, kdy potřebujeme ve spodní polovině zbytek, mnohem rychlejší než ROL.L @16,Dn.

TAS, testuj a nastav operand.

Syntaxe: TAS <ea>

Určená adresa se otestuje, naplní se příznakové bity a nastaví se její 7. bit na 1. Pochopitelně můžete také pracovat s datovými registry. Příručka píše, že instrukce je nezbytná při synchronizaci spolupráce více procesorů (např. na STE; DMA replay a Blitter).

Poslední ucelená série instrukcí v tomto seriálu, a nebojím se říci, také poslední sada instrukcí procesoru MC 68000, o které jsme se ještě nezmínili, se týká počítání s BCD čísly. Jejich definice je velmi prostá, BCD číslo má každý řád kódován do 4 bitů, tzn. chceme-li pomocí BCD kódu zapsat číslo 45, napíšeme prostě do registru $45, z čehož vyplývá, že BCD kód pracuje v podstatě v desítkové soustavě (tuto možnost už měl procesor 6502).

POZOR! Všechny tyto instrukce pracují s délkou operandu vždy jen jeden byte. Při výpočtech nesmím být v registrech použity hexadecimální tvary čísel jako např. 1F, 5A apod., pro korektní výpočet používejte pouze číslice 0-9.

ABCD, sečítej decimálně (desítkově) s rozšířením.

Syntaxe: ABCD Dy, Dx

ABCD -(Ay), -(Ax)

Hodnota registru Dy a X bitu je přičtena k Dx, dojde-li k překročení hodnoty dvojmístného čísla $99, nastaví se X bit, tzn. že při další operaci bude opět přičten.

SBCD, odečítej decimálně (desítkově) s rozšířením.

Syntaxe: SBCD Dy, Dx

SBCD -(Ay), -(Ax)

Hodnota registru Dy a X bitu je odečtena od Dx. Jeli výsledek menší než nula, nastaví se X bit, který bude při příšti operaci opět použit.

NBCD, neguj decimálně (desítkově) s rozšířením

Syntaxe: NBCD <ea>

Od 0 je odečtena <ea> (Dn) a rozšiřující bit. Nakonec je výsledek uložen na <ea>.

A tak jsme dorazili ten výčet všech instrukcí. Doufám, že to nějak využijete, příště se ještě podíváme na nastavování příznaků u jednotlivých instrukcí a popříště snad na jejich délku trvání.

HEAD