6502 – sčítání a násobení

Několik užitečných algoritmů pro vaše procesory 6502.

16bitový součet

U procesoru 8080 není sčítání 16bitových čísel problém – procesor má dostatek registrů a má k tomu i speciální instrukci DAD. U 6502 nemáme ani instrukci, ani registry. Proto se musí sčítání dvoubajtových čísel řešit algoritmem. Naštěstí není příliš složitý, využívá jen instrukci ADC.

Všimněte si, že obě čísla (P1 a P2) jsou uloženy v zero page (na adresách 60h a 62h) a do zero page se ukládá i součet (R, 64h). Nejprve se nuluje příznak přenosu, pak se sečtou dva nižší bajty a poté dva vyšší. Případný přenos z nižšího do vyššího bajtu zařídí příznak C.

Odčítání je pak naprosto analogické, jen na začátku je potřeba příznak C nastavit na 1, nikoli nulovat.

Násobení

Vzpomínáte, jak jsme u procesoru 8080 násobili dvě osmibitová čísla? Můžeme podobný postup použít i u 6502? Tak v zásadě ano, ale se stejnými výhradami jako u sčítání: Nejsou registry.

Algoritmus rovněž využívá rotace do vyššího bajtu, jako u 8080, ale protože 6502 jaksi nemá nic jako „vyšší bajt“, jedná se zas o místo v paměti. A protože k paměti se nepřistupuje žádnou 16bitovou operací, není nezbytně nutné, aby „vyšší bajt“ byl hned za „nižším bajtem“. A protože není 16bitové sčítání, viz výše, je nahrazeno rovněž algoritmem.

Výsledek násobení je v registrech X (vyšší bajt) a A (nižší bajt).

Všimněte si, že násobení dvojkou je zařízeno jako „šestnáctibitový shift“ – pomocí ASL a ROL.

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.

10 komentáře u 6502 – sčítání a násobení

  1. andrej napsal:

    nazvy „premennych“ O1 a O2 su velmi nestastne zvolene.

  2. odpad napsal:

    Nějak se mi nezdá u příkladu 16bitového sčítání kompilovaný kód vzhledem k zero-page – zejména pokud je na zámerné užití ZP v textu poukazováno.

    • Martin Malý napsal:

      Ajo. To je problém mého assembleru – proměnná je definovaná až ZA kódem, takže při překladu nelze rozhodnout, že to je ZP.Upravím, díky.

      • odpad napsal:

        … a ještě bych se přimlouval k „víc 6502“ stylu zápisu – tedy hexa hodnoty psát jako $1234 a ne jako u 8080/Z80 1234h 😉

        • Martin Malý napsal:

          $1234 funguje i u Z80. 🙂 Přemýšlel jsem nad tím, jakou formu zvolit, už na začátku seriálu a rozhodl jsem se přidržet jednotné konvence s H na konci. Ale můžu to v nějaké další lekci zmínit a rozvést…

          • odpad napsal:

            Jasně, já jsem začínal na 6502 a proto používám právě prefix $ místo přípony H i u 8080. Zápis s $ se mi i víc líbí – tak nějak „rychleji“ vidím, že dále psaná hodhota je hexa, resp. hodnota bez prefixu je určitě decimální. U článků o Z80 jsem prostě to H musel „vytrpět“ protože tam prostě patří, ale u 6502 mi to vadí na oči 🙂 … ale chápu úhel pohledu se snahou o konzistenci kódů, byť pro různé šváby.

          • Martin Malý napsal:

            Já začínal na Z80 a používal jsem $. Ale spor o to, jestli psát $1234 nebo 1234h je podobně akademický jako „psát složené závorky na stejný řádek, nebo na nový?“ Už jsem jednu možnost vybral, a teď je potřeba v započaté chybě důsledně pokračovat 🙂

          • odpad napsal:

            OK 😉

          • Martin Malý napsal:

            Ono to mělo nějaký důvod, a vím, že jsem těm úvahám dal cca jedno odpoledne… ale už si nevybavím, co byl ten hlavní argument 🙂

Napsat komentář

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