6502 – příznaky a instrukce pro práci s nimi

Příznaky a stavový registr procesoru 6502.

Podobnou roli, jakou má v procesoru 8080 registr F, zastává u 6502 registr P.

Bit 7 6 5 4 3 2 1 0
Příznak N V 1 B D I Z C
  • N (negative) informuje o znaménku výsledku (nebo přenesených dat, viz popis instrukce LDA). Je-li kladný, je to 0, je-li záporný, je to 1
  • V (overflow) značí přetečení čísel se znaménkem (viz dál).
  • B (break) je nastaven na 1, pokud bylo přerušení vyvoláno instrukcí BRK
  • D (decimal) lze nastavit na 1, pak procesor zpracovává hodnoty v kódu BCD.
  • I (interrupt) můžeme nastavit na 1, pokud chceme zakázat přerušení
  • Z (zero) je 1, pokud byl výsledek nebo načtený bajt nulový.
  • C (carry) se nastavuje na 1, jestliže došlo k přetečení ze 7. bitu

Pojem „přenosu“ jsme si vysvětlovali v kapitole o příznacích 8080 (doporučuju přečíst, i když jde o jiný procesor). U 6502 je potřeba věnovat pozornost příznaku V, který nemusí být zcela jasný.

Některé popisy se omezují na málo říkající a nepřesný „přenos ze 6. bitu“. Jiné popisy vysvětlují, že se jedná o XOR mezi přenosem ze 6. bitu a ze 7. bitu, což je technicky možná OK, ale neříká, co to vlastně znamená. Pojďme si to vysvětlit názorněji.

Příznak V říká, jestli došlo k přetečení čísla se znaménkem. Představme si, že sečteme dvě čísla – 127 a 1 (hexadecimálně 7Fh a 01h). Výsledek je 128 (tedy 80h). Pokud bychom ale používali aritmetiku se znaménkem, tak zjistíme, že 127 + 1 = -128, a to je špatně! Příznak V nás upozorňuje, že došlo k něčemu takovému, tj. že výsledek je mimo rozsah <-128;127>.

Při sčítání FFh a 01h sice dojde k normálnímu přetečení (C), ale z hlediska čísel se znaménkem se vlastně sčítalo „-1 + 1“ a výsledek je 0, bez přetečení. V tedy bude 0.

Při sčítání 80h a FFh bude výsledek 7Fh. U čísel bez znaménka došlo k přetečení (128 + 255), u čísel se znaménkem (-128 + -1) taky. Budou tedy nastaveny příznaky C i V.

Demonstrační kód si můžete vyzkoušet opět v emulátoru. Instrukce CLC slouží k nulování příznaku C a ADC sčítá dvě čísla (6502 má pouze instrukci sčítání s příznakem C, proto je ho potřeba nejprve nulovat, ale k tomu se ještě dostaneme). Můžete si vyzkoušet chování; sledujte hlavně stav bitů V a C.

(Další podrobnosti o výpočtu příznaku V: The 6502 overflow flag explained mathematically)

Další bit v příznakovém registru, který zaslouží vysvětlení, je bit I. Pokud je tento bit roven 1, je zakázáno („zamaskováno“) přerušení a procesor nereaguje na signál, přivedený na přerušovací vstup IRQ (6502 má dva druhy přerušení, maskovatelné IRQ a nemaskovatelné NMI, ale k nim se ještě dostaneme). Příznak může na hodnotu 1 nastavit programátor instrukcí SEI, popřípadě procesor poté, co přišel požadavek na přerušení – tím se zabrání, aby bylo vyvoláno přerušení dřív, než skončila obsluha předchozího.

Příznak B označuje, že obsluha přerušení byla vyvolána instrukcí BRK, nikoli vnějším signálem IRQ. Instrukce návratu z obsluhy přerušení jej opět nuluje.

Příznak D může programátor nastavit na 1 a tím vynutit, aby procesor pracoval v režimu BCD – tedy jako by po každé operaci sčítání a odčítání prováděl dekadickou korekci.

Instrukce pro práci s příznakovým registrem

Příznakové bity nastavují různé instrukce v rámci své normální činnosti (většinou aritmetické, logické nebo instrukce přenosu dat), ale existuje i sada instrukcí pro nastavení či nulování konkrétních bitů.

CLC, SEC

Instrukce nuluje (CLC – CLear Carry) nebo nastavuje (SEC – SEt Carry) příznak C

CLD, SED

Instrukce nuluje (CLD) nebo nastavuje (SED) příznak D

CLI, SEI

Instrukce nuluje (CLI) nebo nastavuje (SEI) příznak I

CLV

Instrukce nuluje příznak V. (Vidíte správně, žádná instrukce SEV není.)

Tyto instrukce nemají žádný parametr (je tedy použit „implicitní mód“).

Příspěvek byl publikován v rubrice 6502. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *