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“).

Líbil se vám článek? Podpořte autora na Patreonu
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 *