Kapitola 4: Výukový program 6502 Microprocessor Assembly Language

Kapitola 4 Vyukovy Program 6502 Microprocessor Assembly Language



Kapitola 4: Výukový program 6502 Microprocessor Assembly Language

4.1 Úvod

Mikroprocesor 6502 bol vydaný v roku 1975. Používal sa ako mikroprocesor pre niektoré osobné počítače, ako napríklad Apple II, Commodore 64 a BBC Micro.







Mikroprocesor 6502 sa aj dnes vyrába vo veľkom množstve. Už to nie je centrálna procesorová jednotka, ktorá sa dnes používa v osobných počítačoch (laptopoch), ale stále sa vyrába vo veľkom množstve a používa sa v elektronických a elektrických spotrebičoch aj dnes. Aby sme pochopili modernejšie počítačové architektúry, je veľmi užitočné preskúmať starší, ale celkom úspešný mikroprocesor, ako je 6502.



Keďže je jednoduchý na porozumenie a programovanie, je to jeden z najlepších (ak nie najlepší) mikroprocesor na použitie pri výučbe jazyka symbolických inštancií. Assembler je nízkoúrovňový jazyk, ktorý možno použiť na programovanie počítača. Všimnite si, že jazyk symbolov pre jeden mikroprocesor sa líši od jazyka symbolických inštrukcií iného mikroprocesora. V tejto kapitole sa vyučuje jazyk assembleru mikroprocesora 6502. Presnejšie povedané, vyučuje sa 65C02, ale jednoducho sa označuje ako 6502.



Slávny počítač v minulosti sa nazýval commodore_64. 6502 je mikroprocesor z rodiny 6500. Počítač commodore_64 používa mikroprocesor 6510. Mikroprocesor 6510 má 6500 µP. Inštrukčná sada 6502 µP je takmer všetkými inštrukciami 6510 µP. Poznatky z tejto a nasledujúcej kapitoly sú založené na počítači commodore_64. Tieto znalosti sa používajú ako základ na vysvetlenie moderných počítačových architektúr a moderných operačných systémov v tejto časti online kariérneho kurzu.





Architektúra počítača sa týka komponentov základnej dosky počítača a vysvetlenia toho, ako toku údajov v rámci každého komponentu, najmä mikroprocesora, ako toku údajov medzi komponentmi, a tiež ako údaje interagujú. Jednotné číslo pre dáta je dátum. Efektívnym spôsobom, ako študovať počítačovú architektúru počítača, je študovať jazyk montáže základnej dosky.

Počítač commodore_64 je považovaný za počítač s 8-bitovým počítačovým slovom. To znamená, že informácie sú uložené, prenášané a manipulované vo forme osembitových binárnych kódov.



Bloková schéma základnej dosky Commodore 64
Bloková schéma základnej dosky commodore 64 je:


Obr 4.1 Bloková schéma systémovej jednotky Commodore_64

Predstavte si mikroprocesor 6510 ako mikroprocesor 6502. Celková pamäť je séria bajtov (8 bitov na bajt). Je tu pamäť s náhodným prístupom (čítanie/zápis), do ktorej je možné zapisovať alebo mazať bajty. Keď sa vypne napájanie počítača, všetky informácie v pamäti RAM (random-access memory) sa vymažú. K dispozícii je tiež pamäť iba na čítanie (ROM). Keď sa vypne napájanie počítača, informácie v ROM zostanú (nevymažú sa).

Je tu vstupno/výstupný port (obvod), ktorý je v schéme označovaný ako vstupno/výstupné zariadenia. Tento port by sa nemal zamieňať s portami, ktoré sú viditeľné na ľavom a pravom alebo prednom a zadnom vertikálnom povrchu systémovej jednotky počítača. To sú dve rozdielne veci. Pripojenia z tohto vnútorného portu k periférnym zariadeniam, ako je pevný disk (alebo disketa), klávesnica a monitor, nie sú na obrázku znázornené.

V schéme sú tri zbernice (skupiny elektrických veľmi malých vodičov). Každý vodič môže prenášať bit 1 alebo bit 0. Dátová zbernica na prenos osembitových bajtov naraz (jeden hodinový impulz) do RAM a vstupno/výstupného portu (vstupné/výstupné zariadenia) je obojsmerná. Dátová zbernica je široká osem bitov.

Všetky komponenty sú pripojené na adresovú zbernicu. Adresová zbernica je jednosmerná od mikroprocesora. Adresová zbernica má šestnásť vodičov a každý nesie jeden bit (1 alebo 0). V jednom hodinovom impulze sa odošle šestnásť bitov.

Je tam riadiaca zbernica. Niektoré z vodičov riadiacej zbernice by preniesli po jednom bite z mikroprocesora na ostatné komponenty. Niekoľko riadiacich liniek prenáša bity zo vstupno/výstupného (IO) portu do mikroprocesora.

Pamäť počítača
RAM a ROM sa považujú za jednu pamäťovú zostavu. Táto zostava je schematicky znázornená nasledovne, kde šestnástkové čísla majú predponu „$“:


Obr 4.11 Rozloženie pamäte pre počítač Commodore 64

RAM je od 0000 16 do DFFF 16 ktorý je napísaný od 0000 do $ DFFF. V jazyku assembleru 6502 µP má hexadecimálne číslo predponu „$“ a nie príponu (dolný index) 16 alebo H alebo hex. Po vypnutí počítača zmiznú všetky informácie v pamäti RAM. ROM začína od 000 $ do FFFF $. Má podprogramy, ktoré sa nevypnú, keď je počítač vypnutý. Tieto podprogramy sú bežne používané rutiny, ktoré pomáhajú pri programovaní. Používateľský program ich volá (pozri nasledujúcu kapitolu).

Priestor (bajty) od $0200 do $D000 je určený pre užívateľské programy. Priestor od 000 USD do DFFF je určený pre informácie, ktoré priamo súvisia s periférnymi zariadeniami (vstupnými/výstupnými zariadeniami). Toto je súčasť operačného systému. Operačný systém počítača commodore-64 sa teda skladá z dvoch hlavných častí: časti v ROM, ktorá sa nikdy nevypne, a časti od $ D000 do $ DFFF, ktorá sa vypne, keď sa vypne napájanie. Tieto IO (vstupné/výstupné) dáta sa musia načítať z disku pri každom zapnutí počítača. Dnes sa takéto údaje nazývajú ovládače periférnych zariadení. Periférne zariadenia začínajú od portu Input/Output Device cez pripojenia na základnej doske až po identifikovateľné porty na zvislých plochách počítača, ku ktorým je pripojený monitor, klávesnica atď., a k samotným perifériám (monitor, klávesnica atď.). .).

Pamäť pozostáva z 2 16 = 65 536 umiestnení bajtov. V hexadecimálnom tvare je to 10 000 16 = 10 000 H = 10 000 hex = miesta v hodnote 10 000 USD. Vo výpočtovej technike sa počítanie v základoch dva, desať, šestnásť atď. začína od 0 a nie od 1. Takže prvé miesto je v skutočnosti číslo miesta 0000000000000000 2 = 0 10 = 0000 16 = 0 000 USD. V jazyku assembleru 6502 µP má identifikácia umiestnenia adresy predponu $ a neexistuje žiadna prípona ani dolný index. Posledná poloha je číslo lokality 1111111111111111 2 = 65 535 10 = FFFF 16 = $ FFFF a nie 10000000000000000 2 alebo 65 536 10 alebo 10 000 16 alebo 10 000 dolárov. 10000000000000000 2 , 65,536 10 , 10 000 16 alebo 10 000 USD udáva celkový počet umiestnení bajtov.

Tu, 2 16 = 65 536 = 64 x 1 024 = 64 x 2 10 = 64 kilobajtov (kilobajtov). Prípona 64 v názve Commodore-64 znamená 64KB celkovej pamäte (RAM a ROM). Bajt má 8 bitov a 8 bitov sa dostane do jedného bajtového miesta v pamäti.

Pamäť s veľkosťou 64 kB je rozdelená na stránky. Každá strana má 0100 16 = 256 10 umiestnenie bajtov. Prvých 256 10 = prvých 0100 16 umiestnenie je strana 0. Druhá je strana 1, tretia strana 2 atď.

Na adresovanie 65 536 miest je pre každé miesto (adresu) potrebných 16 bitov. Adresová zbernica z mikroprocesora do pamäte pozostáva zo 16 riadkov; jeden riadok na jeden bit. Bit je buď 1 alebo 0.

Registre 6502 uP
Register je ako bajtové bunky pre umiestnenie bajtovej pamäte. 6502 µP má šesť registrov: päť 8-bitových registrov a jeden 16-bitový register. 16-bitový register sa nazýva Program Counter, ktorý sa označuje skratkou PC. Uchováva adresu pamäte pre ďalšiu inštrukciu. Program v assembleri pozostáva z inštrukcií, ktoré sú umiestnené v pamäti. Na adresovanie konkrétneho miesta bajtu v pamäti je potrebných šestnásť (16) rôznych bitov. Pri určitom hodinovom impulze sa tieto bity posielajú do 16-bitových adresných riadkov adresovej zbernice na čítanie inštrukcie. Všetky registre pre 6502 uP sú znázornené nasledovne:


Obr. 4.12 Registre 6502 uP

Program Counter alebo PC je možné vidieť v diagrame ako 16-bitový register. Spodných platných osem bitov je označených ako PCL pre Program Counter Low. Vyšších platných osem bitov je označených ako PCH pre Program Counter High. Inštrukcia v pamäti pre Commodore-64 môže pozostávať z jedného, ​​dvoch alebo troch bajtov. 16 bitov v PC ukazuje na ďalšiu inštrukciu, ktorá sa má vykonať v pamäti. Spomedzi obvodov v mikroprocesore sa dva z nich nazývajú aritmetická logická jednotka a dekodér inštrukcií. Ak je aktuálna inštrukcia spracovávaná v µP (mikroprocesore) dlhá jeden bajt, tieto dva obvody zvýšia PC pre ďalšiu inštrukciu o 1 jednotku. Ak je aktuálna inštrukcia, ktorá sa spracováva v µP, dlhá dva bajty, čo znamená, že zaberá dva po sebe idúce bajty v pamäti, tieto dva obvody zvýšia PC pre ďalšiu inštrukciu o 2 jednotky. Ak je aktuálna inštrukcia, ktorá sa spracováva v µP, dlhá tri bajty, čo znamená, že zaberá tri po sebe idúce bajty v pamäti, tieto dva obvody zvýšia PC pre ďalšiu inštrukciu o 3 jednotky.

Akumulátor „A“ je osembitový všeobecný register, ktorý uchováva výsledky väčšiny aritmetických a logických operácií.

Každý z registrov „X“ a „Y“ sa používa na počítanie krokov programu. Počítanie pri programovaní začína od 0. Preto sa nazývajú indexové registre. Majú niekoľko ďalších účelov.

Aj keď register Stack Pointer, „S“ má 9 bitov, čo sa považuje za osembitový register. Jeho obsah ukazuje na bajtové umiestnenie na stránke 1 pamäte RAM (Random Access Memory). Stránka 1 začína od bajtu 0100 $ (256 10 ) na bajt $01FF (511 10 ). Keď je program spustený, prechádza z jednej inštrukcie na ďalšiu po sebe idúcu inštrukciu v pamäti. Nie vždy to však platí. Sú chvíle, keď skočí z jednej oblasti pamäte do inej oblasti pamäte, aby tam pokračovalo spúšťanie pokynov za sebou. Stránka 1 v RAM sa používa ako zásobník. Zásobník je veľká oblasť pamäte RAM, ktorá má ďalšie adresy pre pokračovanie kódu, odkiaľ je skok. Kódy s inštrukciami skokov nie sú v zásobníku; sú inde v pamäti. Po vykonaní skokových inštrukcií sú však pokračovacie adresy (nie segmenty kódu) v zásobníku. Boli tam zatlačení v dôsledku pokynov na skok alebo vetvu.

Osembitový register stavu procesora P je špeciálnym druhom registra. Jednotlivé bity spolu nesúvisia ani nie sú spojené. Každý bit sa tam nazýva príznak a oceňuje sa nezávisle od ostatných. Významy vlajok sú uvedené v nasledujúcom texte podľa potreby.

Prvý a posledný bitový index pre každý register je uvedený nad každým registrom v predchádzajúcom diagrame. Počítanie bitového indexu (pozície) v registri začína od 0 vpravo.

Pamäťové stránky v binárnom, hexadecimálnom a desiatkovom formáte
Nasledujúca tabuľka zobrazuje začiatok stránok pamäte v binárnom, hexadecimálnom a desiatkovom formáte:

Každá stránka má 1 000 000 2 počet bajtov, ktorý je rovnaký ako 100 H počet bajtov, ktorý je rovnaký ako 256 10 počet bajtov. V predchádzajúcom pamäťovom diagrame sú strany označené smerom nahor od strany 0 a nie smerom nadol, ako je uvedené v tabuľke.

Binárne, hexadecimálne a desiatkové stĺpce tejto tabuľky poskytujú adresy umiestnenia bajtov pamäte v ich rôznych základoch. Všimnite si, že pre stránku nula je potrebné pri kódovaní zadať iba bity pre spodný bajt. Bity pre vyšší bajt možno vynechať, pretože sú to vždy nuly (pre stránku nula). Pre zvyšok stránok by sa mali použiť bity pre vyšší bajt.

Zvyšok tejto kapitoly vysvetľuje jazyk montáže 6502 µP pomocou všetkých predchádzajúcich informácií. Aby čitateľ rýchlo pochopil jazyk, musí sčítať a odčítať v základe šestnásť namiesto základu desať. V skutočnosti to má byť základ dva, ale výpočet v základe dva je ťažkopádny. Pamätajte, že pri sčítaní dvoch čísel do základu dva je prenos stále 1 ako v základnom desať. Ale pri odčítaní dvoch čísel v základe dva, výpožička je dve a nie desať ako v základe desať. Pri sčítaní dvoch čísel v základnej šestnástke je prenos stále 1 ako v základnej desiatke. Ale pri odčítaní dvoch čísel v základe šestnásť, výpožička je šestnásť a nie desať ako v základe desať.

4.2 Pokyny na prenos údajov

Zvážte nasledujúcu tabuľku pokynov na prenos údajov v jazyku symbolických inštrukcií pre 6502 µP:

Keď sa bajt (8 bitov) skopíruje z miesta bajtov pamäte do registra akumulátora, registra X alebo registra Y, načítava sa. Keď sa bajt skopíruje z ktoréhokoľvek z týchto registrov do miesta bajtov v pamäti, ide o prenos. Keď sa bajt skopíruje z jedného registra do druhého, stále prebieha prenos. V druhom stĺpci tabuľky šípka ukazuje smer kópie pre bajt. Zvyšné štyri stĺpce zobrazujú rôzne režimy adresovania.

Záznam v stĺpci režimu adresovania je skutočným bajtovým kódom pre zodpovedajúcu mnemotechnickú časť inštrukcie v šestnástkovej sústave. AE je napríklad skutočný bajtový kód pre LDX, ktorý má načítať bajt z pamäte do registra X v režime absolútneho adresovania, ako je AE 16 = 10101110 2 . Takže bity pre LDX v umiestnení bajtov pamäte sú 10101110.

Všimnite si, že pre mnemotechnickú časť inštrukcie LDX existujú tri možné bajty, ktoré sú A2, AE a A6, a každý je pre konkrétny režim adresovania. Keď sa bajt, ktorý sa načíta do registra X, nemá skopírovať z miesta bajtu v pamäti, hodnota musí byť napísaná (hneď za) mnemotechnickým znakom LDX v inštrukcii v šestnástkovej alebo desiatkovej sústave. V tejto kapitole sa takéto hodnoty zadávajú v šestnástkovej sústave. Toto je okamžité adresovanie, takže skutočný bajt v pamäti reprezentujúci LDX je A2 16 = 10100010 2 a nie AE 16 čo sa rovná 10101110 2 .

V tabuľke sa všetky bajty pod hlavičkami režimu adresovania nazývajú operačné kódy, čo je skrátené ako operačné kódy. Pre jednu mnemotechnickú pomôcku môže byť viac ako jeden operačný kód, v závislosti od režimu adresovania.

Poznámka: Slovo „načítanie“ v počítačovej systémovej jednotke môže mať dva významy: môže odkazovať na načítanie súboru z disku do pamäte počítača alebo môže odkazovať na prenos bajtu z miesta bajtov pamäte do registra mikroprocesora. .

Existuje viac režimov adresovania ako štyri v tabuľke pre 6502 µP.

Ak nie je uvedené inak, všetky používateľské programovacie kódy v tejto kapitole začínajú od adresy 0200 16 čo je začiatok užívateľskej oblasti v pamäti.

Pamäť M a akumulátor A

Pamäť na akumulátor

Okamžité adresovanie
Nasledujúca inštrukcia ukladá číslo FF 16 = 255 10 do akumulátora:

LDA # $ FF

„$“ sa nepoužíva len na identifikáciu adresy pamäte. Vo všeobecnosti sa používa na označenie, že nasledujúce číslo je hexadecimálne. V tomto prípade $FF nie je adresa žiadneho miesta bajtu pamäte. Je to číslo 255 10 v šestnástkovej sústave. Základ 16 alebo akýkoľvek iný ekvivalentný index nesmie byť napísaný v inštrukcii jazyka symbolických inštrukcií. „#“ označuje, že čokoľvek nasleduje, je hodnota, ktorá sa má vložiť do registra akumulátora. Hodnotu je možné zapísať aj v základnej desiatke, ale to sa v tejto kapitole nerobí. „#“ znamená okamžité oslovenie.

Mnemotechnická pomôcka má určitú podobnosť so zodpovedajúcou anglickou frázou. „LDA #$FF“ znamená načítať číslo 255 10 do akumulátora A. Keďže ide o okamžité adresovanie z predchádzajúcej tabuľky, LDA je A9 a nie AD alebo A5. A9 v binárnom formáte je 101010001. Ak je teda A9 pre LDA v pamäti v adrese $0200, $FF je v $0301 = 0300 + 1 adresa. #$FF je presne operand pre mnemotechnickú pomôcku LDA.

Absolútne adresovanie
Ak je hodnota $FF na mieste $0333 v pamäti, predchádzajúca inštrukcia je:

LDA 0333 dolárov

Všimnite si absenciu #. V tomto prípade neprítomnosť # znamená, že to, čo nasleduje, je adresa pamäte a nie hodnota záujmu (nie hodnota, ktorá sa má vložiť do akumulátora). Takže operačný kód pre LDA je tentoraz AD a nie A9 alebo A5. Operandom pre LDA je tu adresa $0333 a nie hodnota $FF. $FF je na mieste 0333 $, čo je dosť ďaleko. Inštrukcia „LDA $0333“ zaberá tri po sebe idúce miesta v pamäti a nie dve, ako to bolo na predchádzajúcom obrázku. „AD“ pre LDA je na mieste 0200 USD. Spodný bajt 0333, čo je 33, je v umiestnení $0301. Vyšší bajt $0333, čo je 03, je v umiestnení $0302. Toto je malý endianness, ktorý používa jazyk symbolických inštrukcií 6502. Jazyky symbolov rôznych mikroprocesorov sú rôzne.

Toto je príklad absolútneho adresovania. $0333 je adresa miesta, ktoré má $FF. Inštrukcia pozostáva z troch po sebe idúcich bajtov a nezahŕňa $FF ani jej skutočné umiestnenie bajtov.

Zero-Page Addressing

Predpokladajme, že hodnota $FF je v pamäťovom mieste $0050 na stránke nula. Umiestnenia bajtov pre nulovú stránku začínajú od 0 000 USD a končia na 00 FF. Toto je 256 10 miest celkovo. Každá stránka pamäte Commodore-64 má 256 10 dlhý. Všimnite si, že vyšší bajt je nula pre všetky možné miesta v priestore s nulovou stránkou v pamäti. Režim adresovania nultej strany je rovnaký ako režim absolútneho adresovania, ale vyšší bajt 00 sa do inštrukcie nezapisuje. Takže na načítanie $FF z miesta $0050 do akumulátora je inštrukcia režimu adresovania na nule:

LDA 50 dolárov

S LDA je A5 a nie A9 alebo AD, A5 16 = 10100101 2 . Pamätajte, že každý bajt v pamäti má 8 buniek a každá bunka obsahuje bit. Inštrukcia tu pozostáva z dvoch po sebe idúcich bajtov. A5 pre LDA je v umiestnení pamäte 0200 $ a adresa 50 $ bez vyššieho bajtu 00 je v umiestnení 0301 $. Absencia 00, ktorá by spotrebovala bajt z celkovej pamäte 64 kB, šetrí pamäťový priestor.

Akumulátor do pamäte

Absolútne adresovanie
Nasledujúca inštrukcia skopíruje bajtovú hodnotu, nech už je akákoľvek, z akumulátora do pamäťového miesta 1444 $:

SÚ 1444 USD

Hovorí sa, že ide o prenos z akumulátora do pamäte. Nenačítava sa. Načítanie je opačné. Bajt operačného kódu pre STA je 8D 16 = 10001101 2 . Táto inštrukcia pozostáva z troch po sebe nasledujúcich bajtov v pamäti. 8D 16 je na mieste 0200 USD. 44 16 z adresy 1444 USD sa nachádza v lokalite 0201 USD. A 14 16 je v lokalite $ 0202 – malý endianness. Skutočný bajt, ktorý sa skopíruje, nie je súčasťou inštrukcie. 8D a nie 85 pre adresovanie nultých strán (v tabuľke) sa tu používajú pre STA.

Zero Page Addressing
Nasledujúca inštrukcia skopíruje bajtovú hodnotu, nech už je akákoľvek, z akumulátora do pamäťového miesta $0050 na stránke nula:

STA 0050 dolárov

Bajt operačného kódu pre STA je tu 85 16 = 10000101 2 . Táto inštrukcia pozostáva z dvoch po sebe idúcich bajtov v pamäti. 85 16 je na mieste 0200 USD. 50 16 z adresy 0050 USD je v lokalite 0201 USD. Problém endianness tu nevzniká, pretože adresa má iba jeden bajt, ktorý je nižším bajtom. Skutočný bajt, ktorý sa skopíruje, nie je súčasťou inštrukcie. 85 a nie 8D pre adresovanie na nulovej stránke sa tu používajú pre STA.

Nemá zmysel používať okamžité adresovanie na prenos bajtu z akumulátora na miesto v pamäti. Je to preto, že skutočná hodnota ako $FF musí byť uvedená v inštrukcii v okamžitom adresovaní. Okamžité adresovanie teda nie je možné pre prenos bajtovej hodnoty z registra v µP do akéhokoľvek miesta v pamäti.

Mnemotechniky LDX, STX, LDY a STY
LDX a STX sú podobné ako LDA a STA. Ale tu sa používa register X a nie register A (akumulátor). LDY a STY sú podobné ako LDA a STA. Ale tu sa používa register Y a nie register A. Pozrite si tabuľku 4.21 pre každý operačný kód v šestnástkovej sústave, ktorý zodpovedá konkrétnej mnemotechnickej pomôcke a konkrétnemu režimu adresovania.

Prevody registrácie do registrácie
Predchádzajúce dve sady inštrukcií v tabuľke 4.21 sa zaoberajú kopírovaním pamäte/mikroprocesorového registra (prenos) a kopírovaním registra/registra (prenos). Inštrukcie TAX, TXA, TAY, TYA, TSX a TXS vykonajú kopírovanie (prenos) z registra v mikroprocesore do iného registra toho istého mikroprocesora.

Ak chcete skopírovať bajt z A do X, inštrukcia je:

DAŇ

Ak chcete skopírovať bajt z X do A, inštrukcia je:

TX

Ak chcete skopírovať bajt z A do Y, inštrukcia je:

HAND

Ak chcete skopírovať bajt z Y do A, inštrukcia je:

TYA

Pre počítač commodore 64 je zásobník 1 strany hneď po 0. strane v pamäti. Rovnako ako každá iná stránka pozostáva z 25610 10 umiestnenie bajtov, od 0100 do 01 FF. Normálne sa program vykonáva od jednej inštrukcie k ďalšej po sebe idúcej inštrukcii v pamäti. Z času na čas dôjde k skoku do iného segmentu kódu pamäte (súboru inštrukcií). Oblasť zásobníka v pamäti (RAM) má adresy nasledujúcich inštrukcií, z ktorých boli skoky (alebo vetvy) prerušené pre pokračovanie programu.

Ukazovateľ zásobníka „S“ je 9-bitový register v 6502 µP. Prvý bit (najviac vľavo) je vždy 1. Všetky adresy umiestnenia bajtov na prvej stránke začínajú 1, za ktorou nasleduje 8 rôznych bitov pre 256 10 miest. Ukazovateľ zásobníka má adresu umiestnenia na strane 1, ktorá má adresu ďalšej inštrukcie, ktorú má program vrátiť a pokračovať v nej po vykonaní aktuálneho segmentu kódu (preskočením). Keďže prvý bit zo všetkých adries zásobníka (prvá stránka) začína 1, register ukazovateľa zásobníka musí obsahovať iba zvyšných osem bitov. Koniec koncov, jeho prvý bit, ktorý je najľavejším bitom (deviaty bit sa počíta sprava), je vždy 1.

Ak chcete skopírovať bajt z S do X, inštrukcia je:

TSX

Ak chcete skopírovať bajt z X do S, inštrukcia je:

TXT

Inštrukcie register-to-register neberú žiadny operand. Pozostávajú len z mnemotechnickej pomôcky. Každá mnemotechnická pomôcka má svoj operačný kód v šestnástkovej sústave. Toto je v režime implicitného adresovania, pretože neexistuje žiadny operand (žiadna pamäťová adresa, žiadna hodnota).

Poznámka: Neexistuje žiadny prenos z X na Y alebo z Y na X (kopírovanie).

4.3 Aritmetické operácie

Obvod, aritmetická logická jednotka v 6502 µP, môže naraz pridať iba dve osembitové čísla. Neodčítava, nenásobí a nedelí. Nasledujúca tabuľka zobrazuje operačné kódy a režimy adresovania pre aritmetické operácie:

Poznámka: Všetky mnemotechnické pomôcky pre aritmetické operácie a iné typy operácií (t. j. všetkých 6502 mnemotechnických pomôcok) zaberajú jeden bajt operačného (op) kódu. Ak pre mnemotechnickú pomôcku existuje viac ako jeden režim adresovania, pre tú istú mnemotechnickú pomôcku by existovali rôzne operačné kódy: jeden na režim adresovania. C, D a V v tabuľke sú príznaky stavového registra. Ich význam bude uvedený neskôr podľa potreby.

Pridanie nepodpísaných čísel
Pri 6502 µP sú čísla so znamienkom čísla dvojky. Čísla bez znamienka sú obyčajné kladné čísla, ktoré začínajú od nuly. Takže pre bajt s ôsmimi bitmi je najmenšie číslo bez znamienka 00000000 2 = 0 10 = 00 16 a najväčšie číslo bez znamienka je 11111111 2 = 255 10 = FF 16 . Pre dve čísla bez znamienka je doplnenie:

A+M+C→A

To znamená, že 8-bitový obsah akumulátora je pripočítaný aritmetickou logickou jednotkou do bajtu (8-bitov) z pamäte. Po pridaní A a M prejde prenos do deviateho bitu do bunky príznaku prenosu v stavovom registri. Akýkoľvek predchádzajúci bit prenosu z predchádzajúceho pridania, ktorý je stále v bunke príznaku prenosu v stavovom registri, sa tiež pridá k súčtu A a M, čím sa vytvorí A+M+C→A. Výsledok sa vloží späť do akumulátora.

Ak je pridaný úrok:

A + M

A nie je potrebné pridávať žiadne predchádzajúce prenosy, príznak prenosu musí byť vymazaný, ktorý je nastavený na 0, takže pridanie je:

A+M+0→A rovnaké ako A+M→A

Poznámka: Ak sa k A pridá M a dôjde k prenosu 1, pretože výsledok je väčší ako 255 10 = 11111111 2 = FF 16 , toto je nový prenos. Tento nový prenos 1 sa automaticky odošle do bunky s príznakom prenosu v prípade, že ho ďalší pár ôsmich bitov potrebuje na sčítanie (ďalšie A + M).

Kód na pridanie dvoch nepodpísaných osembitov
00111111 2 +00010101 2 je rovnaký ako 3F 16 + 15 16 čo je rovnaké ako 63 10 +21 10 . Výsledok je 010101002 2 čo je rovnaké ako 54 16 a 84 10 . Výsledok nepresahuje maximálny počet pre osem bitov, ktorý je 255 10 = 11111111 2 = FF 16 . Takže neexistuje žiadny výsledný prenos 1. Inak povedané, výsledný prenos je 0. Pred pridaním neexistuje žiadne predchádzajúce prenos 1. Inými slovami, predchádzajúci prenos je 0. Kód na vykonanie tohto sčítania môže byť:

CLC
LDA#$3F
ADC #15 USD

Poznámka: Počas písania jazyka symbolických inštrukcií sa na konci každej inštrukcie stlačí kláves „Enter“ na klávesnici. V tomto kóde sú tri inštrukcie. Prvá inštrukcia (CLC) vymaže príznak prenosu v prípade, že predchádzajúce pridanie má 1. CLC možno vykonať iba v režime implicitného adresovania. Mnemotechnická pomôcka pre režim implicitného adresovania neberie žiadny operand. Toto vymaže prenosovú bunku zo stavového registra P. Vymazanie znamená poskytnutie bitu 0 bunke s príznakom prenosu. Nasledujúce dve inštrukcie v kóde používajú režim okamžitého adresovania. Pri okamžitom adresovaní existuje iba jeden operand pre mnemotechnickú pomôcku, ktorým je číslo (a nie adresa pamäte ani registra). Preto pred číslom musí byť „#“. „$“ znamená, že nasledujúce číslo je hexadecimálne.

Druhá inštrukcia načíta číslo 3F 16 do akumulátora. Pre tretiu inštrukciu obvod aritmetickej logickej jednotky µP vezme predchádzajúci (vymazaný) prenos 0 (vynútený na 0) bunky s príznakom prenosu, stavového registra a pridá ho k 15 16 ako aj na hodnotu, ktorá je už v 3F 16 akumulátora a celý výsledok vloží späť do akumulátora. V tomto prípade je výsledný prenos 0. ALU (aritmetická logická jednotka) pošle (vloží) 0 do bunky s príznakom prenosu stavového registra. Stavový register procesora a stavový register znamenajú to isté. Ak dôjde k prenosu 1, ALU pošle 1 do príznaku prenosu stavového registra.

Tri riadky predchádzajúceho kódu musia byť pred vykonaním v pamäti. Operačný kód 1816 pre CLC (implicitné adresovanie) je v umiestnení 0200 bajtov. Operačný kód A9 16 pre LDA (okamžité adresovanie) je v $0201 byte umiestnení. Číslo 3F 10 je v $0202 byte umiestnení. Operačný kód 69 16 pre LDA (okamžité adresovanie) je v $0203 byte umiestnení. Číslo 15 10 je v umiestnení 0204 bajtov.

Poznámka: LDA je inštrukcia prenosu (načítanie) a nie aritmetická inštrukcia (mnemotechnická inštrukcia).

Kód na pridanie dvoch nepodpísaných šestnásťbitov
Všetky registre v 6502 µP sú v podstate osembitové registre, okrem PC (Program Counter), ktorý je 16-bitový. Dokonca aj stavový register je široký 8 bitov, hoci jeho osem bitov nepracuje spoločne. V tejto časti sa uvažuje o pridaní dvoch 16 bitov bez znamienka s prenosom z prvého páru ôsmich bitov do druhého páru ôsmich bitov. Zaujímavým prenosom je prenos z pozície ôsmeho bitu do pozície deviateho bitu.

Nech sú čísla 0010101010111111 2 = 2ABF16 16 = 10 943 10 a 0010101010010101 2 = 2A95 16 = 10 901 10 . Súčet je 0101010101010100 2 = 5554 16 = 21 844 10 .

Pridanie týchto dvoch čísel bez znamienka k základu dva je nasledovné:

Nasledujúca tabuľka zobrazuje rovnaký prídavok s prenosom 1 z ôsmeho bitu do deviatej pozície bitu, začínajúc sprava:

Pri kódovaní sa najskôr pridajú dva nižšie bajty. Potom ALU (aritmetická logická jednotka) odošle prenos 1 z pozície ôsmeho bitu do pozície deviateho bitu do bunky príznaku prenosu v stavovom registri. Výsledok 0 1 0 1 0 1 0 0 bez prenosu ide do akumulátora. Potom sa s prenosom pridá druhý pár bajtov. Mnemotechnická pomôcka ADC znamená automatické pridávanie s predchádzajúcim prenášaním. V tomto prípade sa predchádzajúci prenos, ktorý je 1, nesmie zmeniť pred druhým pridaním. Pre prvé pridanie, keďže akékoľvek predchádzajúce prenášanie nie je súčasťou tohto úplného pridania, musí byť vymazané (urobené na 0).

Pre úplné pridanie dvoch párov bajtov je prvé pridanie:

A + M + 0 -> A

Druhý dodatok je:

A + M + 1 -> A

Takže príznak prenosu musí byť vymazaný (s hodnotou 0) tesne pred prvým pridaním. Nasledujúci program, ktorého si čitateľ musí prečítať nasledujúce vysvetlenie, používa na tento súčet režim absolútneho adresovania:

CLC
LDA 0213 dolárov
ADC 0215 dolárov
; žiadne vymazanie, pretože je potrebná hodnota príznaku prenosu
STA 0217 dolárov
LDA 0214 dolárov
ADC 0216 dolárov
STA 0218 dolárov

Všimnite si, že v jazyku symbolických inštrukcií 6502 začína komentár bodkočiarka. To znamená, že pri vykonávaní programu sa ignoruje bodkočiarka a všetko napravo. Program, ktorý bol predtým napísaný, je v textovom súbore a je uložený s názvom podľa výberu programátora a s príponou „asm“. Predchádzajúci program nie je presný program, ktorý ide do pamäte na vykonanie. Zodpovedajúci program v pamäti sa nazýva preložený program, kde sú mnemotechnické pomôcky nahradené operačnými kódmi (bajtmi). Akýkoľvek komentár zostane v textovom súbore v jazyku symbolických inštrukcií a bude odstránený skôr, ako sa preložený program dostane do pamäte. V skutočnosti sú dnes na disku uložené dva súbory: súbor „.asm“ a súbor „.exe“. Súbor „.asm“ je rovnaký ako na predchádzajúcom obrázku. Súbor „.exe“ je súbor „.asm“ so všetkými komentármi odstránenými a všetky mnemotechnické pomôcky nahradené ich operačnými kódmi. Po otvorení v textovom editore je súbor „.exe“ nerozpoznateľný. Ak nie je uvedené inak, na účely tejto kapitoly sa súbor „.exe“ skopíruje do pamäte od umiestnenia $0200. Toto je ďalší význam zaťaženia.

Dve 16-bitové čísla, ktoré sa majú pridať, zaberajú štyri bajty v pamäti pre absolútne adresovanie: dva bajty na číslo (pamäť je sekvencia bajtov). Pri absolútnom adresovaní je operand operačného kódu v pamäti. Výsledok sčítania je široký dva bajty a musí sa tiež umiestniť do pamäte. To dáva dokopy 6 10 = 6 16 bajtov pre vstupy a výstupy. Vstupy nie sú z klávesnice a výstup nie je z monitora alebo tlačiarne. Vstupy sú v pamäti (RAM) a výstup (súčtový výsledok) sa v tejto situácii vráti späť do pamäte (RAM).

Pred spustením programu musí byť v pamäti najprv preložená verzia. Pri pohľade na predchádzajúci kód programu je vidieť, že pokyny bez komentára tvoria 19 10 = 13 16 bajtov. Program teda prevezme od $ 0200 bajtové umiestnenie v pamäti na $ 0 200 + $ 13 – $ 1 = $ 0212 bajtové miesta (začínajúc od $ 0200 a nie $ 0201, čo znamená – $ 1). Pridaním 6 bajtov pre vstupné a výstupné čísla sa celý program skončí na $0212 + $6 = $0218. Celková dĺžka programu je 19 16 = 25 10 .

Spodný bajt augendu by mal byť v adrese $0213 a vyšší bajt toho istého augendu by mal byť v adrese $0214 – little endianness. Podobne, nižší bajt sčítania by mal byť v adrese $0215 a vyšší bajt toho istého sčítača by mal byť v adrese $0216 – little endianness. Nižší bajt výsledku (súčet) by mal byť v adrese $0217 a vyšší bajt toho istého výsledku by mal byť v adrese $0218 – little endianness.

Operačný kód 18 16 pre CLC (implicitné adresovanie) je v byte 0200 $. Operačný kód pre „LDA $ 0213“, t.j. AD 16 pre LDA (absolútne adresovanie), je v byte umiestnení $0201. Spodný bajt augendu, ktorý je 10111111, je v mieste bajtu pamäte $0213. Pamätajte, že každý operačný kód zaberá jeden bajt. Adresa „$0213“ pre „LDA $0213“ je v bajtoch $0202 a $0203. Inštrukcia „LDA $0213“ načíta spodný bajt augendu do akumulátora.

Operačný kód pre „ADC $ 0215“, t.j. 6D 16 pre ADC (absolútne adresovanie) je v byte umiestnení $0204. Spodný bajt dodatku, ktorý je 10010101, je v umiestnení bajtu $0215. Adresa „$0215“ pre „ADC $0215“ je v bajtových umiestneniach $0205 a $0206. Inštrukcia „ADC $0215“ pridá spodný bajt sčítania k spodnému bajtu augendu, ktorý je už v akumulátore. Výsledok sa vráti späť do akumulátora. Akýkoľvek prenos po ôsmom bite sa odošle do príznaku prenosu stavového registra. Bunka s príznakom prenosu sa nesmie vymazať pred druhým pridaním vyšších bajtov. Tento prenos sa automaticky pripočíta k súčtu vyšších bajtov. V skutočnosti sa prenos 0 automaticky na začiatku pridá k súčtu nižších bajtov (ekvivalent nepridania žiadneho prenosu) kvôli CLC.

Komentár trvá ďalších 48 10 = 30 16 bajtov. Toto však zostáva iba v textovom súbore „.asm“. Do pamäte sa nedostane. Odstráni sa prekladom, ktorý vykoná assembler (program).

Pre ďalšiu inštrukciu, ktorá je „STA $ 0217“, operačný kód STA, ktorý je 8D 16 (absolútne adresovanie) je v byte umiestnení $0207. Adresa „$0217“ pre „STA $0217“ je v pamäťových miestach $0208 a $0209. Inštrukcia „STA $0217“ skopíruje osembitový obsah akumulátora do pamäťového miesta $0217.

Vyšší bajt augendu, ktorý je 00101010, je v pamäťovom mieste $0214 a vyšší bajt augendu, ktorý je 00101010, je v mieste bajtu $02 16 . Operačný kód pre „LDA $0214“, čo je AD16 pre LDA (absolútne adresovanie), je v byte 020A. Adresa „$0214“ pre „LDA $0214“ je na miestach $020B a $020C. Inštrukcia „LDA $0214“ načíta vyšší bajt augendu do akumulátora a vymaže všetko, čo je v akumulátore.

Operačný kód pre „ADC $ 0216“, čo je 6D 16 pre ADC (absolútne adresovanie) je v byte umiestnení $020D. Adresa „$0216“ „ADC 0216“ je v bajtových umiestneniach $020E a $020F. Inštrukcia „ADC $0216“ pridáva vyšší bajt sčítania k vyššiemu bajtu augendu, ktorý je už v akumulátore. Výsledok sa vloží späť do akumulátora. Ak existuje prenos 1, pre toto druhé pridanie sa automaticky umiestni do prenosovej bunky stavového registra. Hoci prenos za šestnásty bit (vľavo) nie je pre tento problém potrebný, je pekné skontrolovať, či došlo k prenosu 1 tak, že skontrolujete, či sa príznak prenosu stal 1.

Pre ďalšiu a poslednú inštrukciu, ktorá je „STA $0218“, je operačný kód STA, ktorý je 8D16 (absolútne adresovanie) v byte umiestnení $0210. Adresa „$0218“ pre „STA $0218“ je v pamäťových miestach $0211 a $0212. Inštrukcia „STA $0218“ skopíruje osembitový obsah akumulátora do pamäťového miesta $0218. Výsledkom sčítania dvoch šestnásťbitových čísel je 0101010101010100, pričom dolný bajt 01010100 je v pamäťovom mieste 0217 $ a vyšší bajt 01010101 v pamäťovom mieste 0218 $ – malý endianness.

Odčítanie
Pri 6502 µP sú čísla so znamienkom čísla dvojky. Číslo doplnku dvojky môže byť osem bitov, šestnásť bitov alebo ľubovoľný násobok ôsmich bitov. S dvojkovým doplnkom je prvý bit zľava znamienkový bit. Pre kladné číslo je tento prvý bit 0 na označenie znamienka. Zvyšné bity tvoria číslo normálnym spôsobom. Ak chcete získať dvojkový doplnok záporného čísla, invertujte všetky bity pre zodpovedajúce kladné číslo a potom pridajte 1 k výsledku z pravého konca.

Na odčítanie jedného kladného čísla od iného kladného čísla sa subtrahend prevedie na záporné číslo s dvojkovým doplnkom. Potom sa normálnym spôsobom pridá mínus a nové záporné číslo. Osembitové odčítanie sa teda stáva:

Kde sa predpokladá, že prenášanie je 1. Výsledkom v akumulátore je rozdiel v dvoch doplnkoch. Takže na odčítanie dvoch čísel musí byť nastavený príznak prenosu (na 1).

Pri odčítaní dvoch šestnásťbitových čísel sa odčítanie vykoná dvakrát ako pri sčítaní dvoch šestnásťbitových čísel. Keďže odčítanie je formou sčítania s 6502 µP, pri odčítaní dvoch šestnásťbitových čísel sa príznak prenosu nastaví iba raz pre prvé odčítanie. Pri druhom odčítaní sa akékoľvek nastavenie príznaku prenosu vykoná automaticky.

Programovanie odčítania pre osembitové čísla alebo šestnásťbitové čísla sa vykonáva podobne ako pri programovaní sčítania. Príznak prenosu však musí byť nastavený hneď na začiatku. Mnemotechnická pomôcka, ako to urobiť, je:

Odčítanie so šestnásťbitovými kladnými číslami
Zvážte odčítanie s nasledujúcimi číslami:

Toto odčítanie nezahŕňa dvojkový doplnok. Keďže odčítanie v 6502 µP sa vykonáva v dvojkom doplnku, odčítanie v základni dva sa vykonáva takto:

Výsledok doplnku dvoch je rovnaký ako výsledok, ktorý sa získa z bežného odčítania. Všimnite si však, že 1, ktorá prejde na pozíciu sedemnásteho bitu sprava, sa ignoruje. Minuend a subtrahend sú rozdelené na dva osminové bity. Dvojitý doplnok 10010110 dolného bajtu subtrahendu sa určuje nezávisle od jeho vyššieho bajtu a akéhokoľvek prenosu. Dvojitý doplnok 11101011 vyššieho bajtu subtrahendu sa určuje nezávisle od jeho dolného bajtu a akéhokoľvek prenosu.

16-bitov menovky je už v dvojkom doplnku, začína sa 0 zľava. Nepotrebuje teda žiadne úpravy v bitoch. Pri 6502 µP sa dolný bajt menovky bez akejkoľvek úpravy pridá k spodnému bajtu dvojkového doplnku subtrahendu. Spodný bajt menovky nie je konvertovaný v dvojkom doplnku, pretože šestnásť bitov celej menovky musí byť už v dvojkom doplnku (s nulou ako prvým bitom vľavo). V tomto prvom pridaní je pridaný povinný prenos 1 kvôli inštrukcii 1=0 SEC.

Pri aktuálnom efektívnom odčítaní je prenos 1 (sčítania) z ôsmeho bitu na deviaty bit (sprava). Pretože toto je efektívne odčítanie, akýkoľvek bit, ktorý má byť v príznaku prenosu v stavovom registri, je doplnený (invertovaný). Takže prenos 1 sa v C príznaku stane 0. V druhej operácii sa vyšší bajt minuendu pridá k doplnkovému bajtu vyšších dvoch subtrahendu. Automaticky doplnený bit príznaku prenosu stavového registra (v tomto prípade je 0) sa tiež pridá (k vyšším bajtom). Akákoľvek 1, ktorá presahuje šestnásty bit sprava, sa ignoruje.

Ďalšia vec je nakódovať celú túto schému takto:

SEC
LDA 0213 dolárov
SBC 0215 dolárov
; žiadne vymazanie, pretože je potrebná hodnota invertovaného príznaku prenosu
STA 0217 dolárov
LDA 0214 dolárov
0216 SBC
STA 0218 dolárov

Pamätajte, že v jazyku symbolických inštrukcií 6502 bodkočiarka začína komentár, ktorý nie je zahrnutý do preloženej verzie programu v pamäti. Dve 16-bitové čísla na odčítanie zaberajú štyri bajty pamäte s absolútnym adresovaním; dva na číslo (pamäť je séria bajtov). Tieto vstupy nepochádzajú z klávesnice. Výsledkom súčtu sú dva bajty a musí sa tiež umiestniť do pamäte na iné miesto. Tento výstup nejde na monitor alebo tlačiareň; ide do pamäte. To dáva dokopy 6 10 = 6 16 bajtov pre vstupy a výstupy, ktoré sa majú umiestniť do pamäte (RAM).

Pred spustením programu musí byť najprv v pamäti. Pri pohľade na kód programu je vidieť, že pokyny bez komentára tvoria 19 10 = 13 16 bajtov. Keďže všetky programy v tejto kapitole začínajú od miesta pamäte $0200, program prevezme z miesta bajtu $0200 v pamäti do miesta bajtu $0200 + $13 – $1 = $0212 (začínajúc od $0200 a nie $0201). Tento rozsah nezahŕňa oblasť pre vstupné a výstupné bajty. Dve vstupné čísla zaberajú 4 bajty a jedno výstupné číslo 2 bajty. Pridaním 6 bajtov pre vstupné a výstupné čísla vznikne rozsah pre program, ktorý končí na $0212 + $6 = $0218. Celková dĺžka programu je 19 16 = 25 10 .

Spodný bajt menovky by mal byť v adrese $0213 a vyšší bajt tej istej menovky by mal byť v adrese 0214 $ – little endianness. Podobne by mal byť nižší bajt subtrahendu v adrese $0215 a vyšší bajt toho istého subtrahendu by mal byť v adrese $0216 – little endianness. Nižší bajt výsledku (rozdiel) by mal byť v adrese $0217 a vyšší bajt toho istého výsledku by mal byť v adrese $0218 – little endianness.

Operačný kód 38 16 pre SEC (implicitné adresovanie) je v adrese 0200 USD. Predpokladá sa, že všetky programy v tejto kapitole začínajú na pamäťovom mieste $0200, čím sa zrušia všetky programy, ktoré by tam boli; ak nie je uvedené inak. Operačný kód pre „LDA $ 0213“, t.j. AD 16 , pre LDA (absolútne adresovanie) je v umiestnení bajtov $ 0201. Spodný bajt menovky, ktorý je 10111111, je v mieste bajtu pamäte $0213. Pamätajte, že každý operačný kód zaberá jeden bajt. Adresa „$0213“ pre „LDA $0213“ je v bajtoch $0202 a $0203. Inštrukcia „LDA $0213“ načíta spodný bajt minuendu do akumulátora.

Operačný kód pre „SBC $ 0215“, t.j. ED 16 , pre SBC (absolútne adresovanie) je v umiestnení bajtov $ 0204. Spodný bajt subtrahendu, ktorý je 01101010, je v umiestnení bajtov $ 0215. Adresa „$0215“ pre „ADC $0215“ je v bajtových umiestneniach $0205 a $0206. Inštrukcia „SBC $0215“ odpočítava spodný bajt subtrahendu od spodného bajtu minuendu, ktorý je už v akumulátore. Toto je odčítanie dvoch doplnkov. Výsledok sa vráti späť do akumulátora. Doplnok (inverzia) akéhokoľvek prenosu po ôsmom bite sa odošle do príznaku prenosu stavového registra. Tento príznak prenosu nesmie byť vymazaný pred druhým odčítaním s vyššími bajtmi. Tento prenos sa automaticky pripočíta k odčítaniu vyšších bajtov.

Komentár trvá ďalších 57 10 = 3916 16 bajtov. Toto však zostáva iba v textovom súbore „.asm“. Do pamäte sa nedostane. Odstráni sa prekladom, ktorý vykoná assembler (program).

Pre ďalšiu inštrukciu, ktorá je „STA $ 0217“, operačný kód STA, t.j. 8D 16 (absolútne adresovanie), je v umiestnení 0207 bajtov. Adresa „$0217“ pre „STA $0217“ je v pamäťových miestach $0208 a $0209. Inštrukcia „STA $0217“ skopíruje osembitový obsah akumulátora do pamäťového miesta $0217.

Vyšší bajt menštruácie, ktorý je 00101010, je v pamäťovom mieste $0214 a vyšší bajt subtrahendu, ktorý je 00010101, je v umiestnení bajtu $0216. Operačný kód pre „LDA $ 0214“, t.j. AD 16 pre LDA (absolútne adresovanie) je v byte $020A. Adresa „$0214“ pre „LDA $0214“ je na miestach $020B a $020C. Inštrukcia „LDA $0214“ načíta do akumulátora vyšší bajt minuendu a vymaže všetko, čo je v akumulátore.

Operačný kód pre „SBC $ 0216“, t.j. ED 16 pre SBC (absolútne adresovanie) je v byte umiestnení $020D. Adresa „$0216“ pre „SBC $0216“ je v bajtových umiestneniach $020E a $020F. Inštrukcia „SBC $0216“ odpočítava vyšší bajt subtrahendu od vyššieho bajtu minuendu (dvojkový doplnok), ktorý je už v akumulátore. Výsledok sa vloží späť do akumulátora. Ak existuje prenos 1 pre toto druhé odčítanie, jeho doplnok sa automaticky umiestni do prenosovej bunky stavového registra. Hoci prenos za šestnásty bit (vľavo) nie je pre tento problém potrebný, je pekné skontrolovať, či dôjde k prenosu doplnku kontrolou príznaku prenosu.

Pre ďalšiu a poslednú inštrukciu, ktorou je „STA $0218“, operačný kód STA, t.j. 8D 16 (absolútne adresovanie), je v umiestnení 0210 bajtov. Adresa „$0218“ pre „STA $0218“ je v pamäťových miestach $0211 a $0212. Inštrukcia „STA $0218“ skopíruje osembitový obsah akumulátora do pamäťového miesta $0218. Výsledkom odčítania s dvoma šestnásťbitovými číslami je 0001010101010101 s nižším bytom 01010101 v pamäťovom mieste $0217 a vyšším byte 00010101 v pamäťovom mieste $0218 – malá endianness.

6502 µP má obvody iba na sčítanie a nepriamo na odčítanie dvoch doplnkov. Nemá obvody na násobenie a delenie. Na násobenie a delenie by sa mal napísať program v jazyku symbolických inštancií s podrobnosťami, vrátane presunu čiastkových produktov a čiastkových dividend.

4.4 Logické operácie

V 6502 µP je mnemotechnická pomôcka pre OR ORA a mnemotechnická pomôcka pre exkluzívny OR je EOR. Všimnite si, že logické operácie nemajú implicitné adresovanie. Implicitné adresovanie nevyžaduje žiadny operand. Každý z logických operátorov musí mať dva operandy. Prvý je v akumulátore a druhý je v pamäti alebo v inštrukcii. Výsledok (8 bitov) sa vráti späť do akumulátora. Prvý v akumulátore sa tam buď vloží okamžitou inštrukciou alebo sa skopíruje z pamäte s absolútnym adresovaním. V tejto časti sa na ilustráciu používa iba adresovanie nultých strán. Všetky tieto logické operátory sú bitové operátory.

A
Nasledujúca tabuľka znázorňuje bitový operátor AND v binárnom, hexadecimálnom a desiatkovom formáte:

Všetky programy v tejto kapitole by mali začínať na mieste bajtu pamäte $0200. Programy v tejto časti sú však na stránke nula, s cieľom ilustrovať použitie stránky nula bez vyššieho bajtu 00000000 2 . Predchádzajúce AND môže byť kódované nasledovne:

LDA # $ 9A ; nie z pamäte – okamžité adresovanie
AND #$CD ; nie z pamäte – okamžité adresovanie
STA 30 dolárov; obchoduje 88 dolárov za 0030 dolárov s nulovou základňou

ALEBO
Nasledujúca tabuľka znázorňuje bitové OR v binárnom, hexadecimálnom a desiatkovom formáte:

LDA # $ 9A ; nie z pamäte – okamžité adresovanie
ORA #$CD ; nie z pamäte – okamžité adresovanie
STA 30 dolárov; ukladá $CF na 0030 $

ZADARMO
Nasledujúca tabuľka znázorňuje bitový XOR v binárnom, hexadecimálnom a desiatkovom formáte:

LDA # $ 9A ; nie z pamäte – okamžité adresovanie
EOR #$CD ; nie z pamäte – okamžité adresovanie
STA 30 dolárov; obchoduje 57 dolárov za 0030 dolárov s nulovým základom

4.5 Operácie posúvania a otáčania

Mnemotechnické pomôcky a operačné kódy pre operátory posunu a rotácie sú:

ASL: Posuňte doľava o jeden bit akumulátora alebo pamäťového miesta vložením 0 do prázdnej bunky úplne vpravo.

LSR: Posunutie doprava o jeden bit akumulátora alebo pamäťového miesta vložením 0 do prázdnej bunky úplne vľavo.
ROL: Otočte o jeden bit doľava od miesta akumulátora alebo pamäte a vložte bit, ktorý vypadol vľavo, do prázdnej bunky úplne vpravo.
ROR: Otočte o jeden bit vpravo od miesta akumulátora alebo pamäte a vložte bit, ktorý vypadol vpravo, do prázdnej bunky úplne vľavo.

Ak chcete vykonať posun alebo otočenie s akumulátorom, pokyn je približne takýto:

LSR A

Toto používa iný režim adresovania nazývaný režim adresovania akumulátora.

Ak chcete vykonať posun alebo rotáciu s umiestnením bajtovej pamäte, inštrukcia je približne takáto:

ROR $ 2BCD

Kde 2BCD je miesto v pamäti.

Všimnite si, že neexistuje žiadny okamžitý alebo implicitný režim adresovania na posúvanie alebo otáčanie. Neexistuje žiadny režim okamžitého adresovania, pretože nemá zmysel posúvať alebo otáčať číslo, ktoré zostáva len v inštrukcii. Neexistuje žiadny implicitný režim adresovania, pretože dizajnéri 6502 µP chcú, aby sa posunul alebo otočil iba obsah akumulátora (register A) alebo umiestnenie bajtu v pamäti.

4.6 Režim relatívneho adresovania

Mikroprocesor vždy zvýši (o 1, 2 alebo 3 jednotky) programové počítadlo (PC), aby ukázal na ďalšiu inštrukciu, ktorá sa má vykonať. 6502 µP má inštrukciu, ktorej mnemotechnická pomôcka je BVS, čo znamená vetva pri súprave pretečenia. PC sa skladá z dvoch bajtov. Táto inštrukcia spôsobí, že PC bude mať inú pamäťovú adresu pre ďalšiu inštrukciu, ktorá sa má vykonať, čo nie je výsledkom normálneho prírastku. Robí to pridaním alebo odčítaním hodnoty, nazývanej offset, k obsahu PC. Počítač potom ukazuje na iné (rozvetvené) pamäťové miesto, aby odtiaľ mohol pokračovať vo vykonávaní. Offset je celé číslo od -128 10 na +127 10 (dva doplnok). Takže posun môže spôsobiť skok v pamäti. Či je v pamäti pozitívna alebo pozadu, alebo či je negatívna.

Inštrukcia BVS preberá iba jeden operand, ktorým je offset. BVS používa relatívne adresovanie. Zvážte nasledujúci pokyn:

BVS $ 7F

V základni dva, 7F H je 01111111 2 = 127 10 . Predpokladajme, že obsah v PC pre ďalšiu inštrukciu je 0300 USD. Inštrukcia BVS spôsobí, že $ 7F (kladné číslo už v dvoch doplnkoch) sa pridá k $ 0300, čím získate $ 037 F. Takže namiesto ďalšej inštrukcie, ktorá sa má vykonať na pamäťovom mieste 0300 $, je to na pamäťovom mieste 037F (približne polovičný rozdiel stránky).

Existujú aj iné vetvené inštrukcie, ale BVS je veľmi dobrý na ilustráciu relatívneho adresovania. Relatívne adresovanie sa zaoberá pokynmi pobočky.

4.7 Indexované adresovanie a nepriame adresovanie oddelene

Tieto režimy adresovania umožňujú 6502 µP spracovať enormné množstvo údajov v krátkych časových úsekoch so zníženým počtom inštrukcií. Existuje 64 kB miest pre celú pamäť Comodore-64. Takže na prístup k ľubovoľnému umiestneniu bajtov s veľkosťou 16 bitov sú potrebné dva bajty. Jedinou výnimkou z potreby dvoch bajtov je stránka nula, kde sa vynechá vyšší bajt $00, aby sa ušetrilo miesto, ktoré zaberá inštrukcia v pamäti. V režime nenulovej adresy sú vyššie aj nižšie bajty 16-bitovej adresy pamäte väčšinou nejako označené.

Základné indexované adresovanie

Absolútne indexové adresovanie
Pamätajte, že register X alebo Y sa nazýva indexový register. Zvážte nasledujúci pokyn:

LDA 453 USD, X

Predpokladajme, že hodnota 6 H je v registri X. Všimnite si, že 6 nie je nikde v inštrukcii napísané. Táto inštrukcia pridáva hodnotu 6H k C453 H ktorý je súčasťou napísanej inštrukcie v textovom súbore, ktorý sa má ešte zostaviť – C453 H + 6 H = C459 H . LDA znamená načítať bajt do akumulátora. Bajt, ktorý sa má načítať do akumulátora, pochádza z adresy $ C459. C459 $, čo je súčet 453 $ C453, ktorý je zadaný s inštrukciou a 6 H ktorá sa nachádza v registri X sa stáva efektívnou adresou, z ktorej pochádza bajt, ktorý sa má načítať do akumulátora. Ak 6 H bol v registri Y, Y sa napíše namiesto X v inštrukcii.

V príkaze napísanej inštrukcie je $ C453 známy ako základná adresa a 6 H v registri X alebo Y je známy ako počítacia alebo indexová časť pre efektívnu adresu. Základná adresa sa môže vzťahovať na akúkoľvek bajtovú adresu v pamäti a ďalších 256 10 adresy môžu byť prístupné za predpokladu, že začatý index (alebo počet) v registri X alebo Y je 0. Pamätajte, že jeden bajt môže poskytnúť súvislý rozsah až 256 10 čísla (t.j. 00000000 2 na 11111111 2 ).

Absolútne adresovanie teda pridáva všetko, čo už bolo vložené (bolo vložené inou inštrukciou) do registra X alebo Y k 16 adresám, ktoré sú napísané s inštrukciou, aby sa získala efektívna adresa. V typovanej inštrukcii sú dva indexové registre odlíšené X alebo Y, ktoré sú napísané za čiarkou. Zadáva sa buď X alebo Y; nie oboje.

Potom, čo je celý program napísaný v textovom editore a uložený s príponou „.asm“, assembler, čo je ďalší program, musí preložiť napísaný program do toho, čo je (načítané) v pamäti. Predchádzajúca inštrukcia, ktorá je „LDA $ C453,X“, zaberá tri bajtové miesta v pamäti a nie päť.

Pamätajte, že mnemotechnická pomôcka, ako je LDA, môže mať viac ako jeden operačný kód (rôzne bajty). Operačný kód pre inštrukciu, ktorá používa register X, sa líši od operačného kódu, ktorý používa register Y. Assembler vie, aký operačný kód použiť na základe napísanej inštrukcie. Jednobajtový operačný kód pre „LDA $ C453,X“ sa líši od jednobajtového operačného kódu pre „LDA $ C453,Y“. V skutočnosti je operačný kód pre LDA v „LDA $ C453,X“ BD a operačný kód pre LDA v „LDA $ C453,9“ je BD.

Ak je operačný kód pre LDA v umiestnení 0200 bajtov. Potom 16-bitová adresa $C453 zaberie ďalšie bajtové miesta v pamäti, ktoré sú $0201 a $0202. Konkrétny bajt operačného kódu označuje, či ide o register X alebo register Y. A tak zostavená jazyková inštrukcia, ktorá je „LDA $ C453,X“ alebo „LDA $ C453,Y“, zaberá v pamäti tri po sebe idúce bajty, a nie štyri alebo päť.

Zero-Page Indexed Addressing
Adresovanie indexu na nulovej stránke je ako adresovanie absolútneho indexu, ktoré bolo opísané vyššie, ale cieľový bajt musí byť iba na stránke nula (od $0000 do $00FF). Teraz, keď sa zaoberáme nulovou stránkou, vyšší bajt, ktorý je vždy 00 H pamäťovým miestam sa zvyčajne vyhýba. Normálne sa teda uvádza, že stránka nula začína od 00 USD do FF. Takže predchádzajúca inštrukcia „LDA $ C453,X“ je:

LDA 53,X USD

$C4, vyšší bajt, ktorý odkazuje na stránku nad nulou stránky, nemožno v tejto inštrukcii použiť, pretože vkladá očakávaný cieľový bajt, ktorý sa má načítať, do akumulovaného bajtu mimo a nad nulu stránky.

Keď sa hodnota zadaná v inštrukcii pripočíta k hodnote v registri indexu, súčet by nemal dať výsledok nad nulou stránky (FF H ). Takže neprichádza do úvahy mať inštrukciu ako „LDA $ FF, X“ a hodnotu ako FF H v indexovom registri, pretože FF H + FF H = 200 H čo je prvý bajt (0 200 $) umiestnenie stránky 2 (tretia stránka) v pamäti, je veľká vzdialenosť od stránky 0. Takže pri indexovanom adresovaní s nulovou stránkou musí efektívna adresa ležať na nule stránky.

Nepriame adresovanie

Absolútne adresovanie skokov
Pred diskusiou o absolútnom nepriamom adresovaní je dobré sa najprv pozrieť na absolútne adresovanie JMP. Predpokladajme, že adresa, ktorá má hodnotu úroku (cieľový bajt) je 8765 USD. Ide o 16-bitov pozostávajúcu z dvoch bajtov: vyšší bajt je 87 H a spodný bajt, ktorý je 65 H . Takže dva bajty za 8765 $ sa vložia do počítača (počítadlo programov) pre ďalšiu inštrukciu. Čo je napísané v programe (súbore) v assembleri je:

8765 JMP

Vykonávajúci program v pamäti skočí z akejkoľvek adresy, na ktorú pristupoval, na 8765 USD. Mnemotechnická pomôcka JMP má tri operačné kódy, ktorými sú 4C, 6C a 7C. Operačný kód pre toto absolútne adresovanie je 4C. Operačný kód pre absolútne nepriame adresovanie JMP je 6C (pozrite si nasledujúce obrázky).

Absolútne nepriame adresovanie
Používa sa len s inštrukciou skoku (JMP). Predpokladajme, že adresa, ktorá má bajt záujmu (cieľový bajt), je 8765 USD. Ide o 16-bitov pozostávajúcu z dvoch bajtov: vyšší bajt je 87 H a spodný bajt, ktorý je 65 H . Pri absolútnom nepriamom adresovaní sú tieto dva bajty v skutočnosti umiestnené na dvoch po sebe idúcich bajtových miestach inde v pamäti.

Predpokladajme, že sa nachádzajú v pamäťových miestach $0210 a $0211. Potom dolný bajt adresy záujmu, ktorá je 65 H je v adrese $0210 a vyšší bajt, ktorý je 87 H je na adrese $0211. To znamená, že nižší bajt záujmu ide na nižšiu po sebe idúcu adresu a vyšší bajt pamäte ide na vyššiu po sebe idúcu adresu – malá endianness.

16-bitová adresa môže odkazovať na dve po sebe idúce adresy v pamäti. V tomto svetle adresa $0210 odkazuje na adresy $0210 a $0211. Dvojica adries $0210 a $0211 obsahuje konečnú adresu (16-bitov z dvoch bajtov) cieľového bajtu, pričom spodný bajt je 65 H v $ 0210 a vyšší bajt 87 H za 0211 dolárov. Takže inštrukcia skoku, ktorá je napísaná, je:

JMP (0210 USD)

Mnemotechnická pomôcka JMP má tri operačné kódy, ktorými sú 4C, 6C a 7C. Operačný kód pre absolútne nepriame adresovanie je 6C. V textovom súbore je napísané „JMP (0210 $)“. Kvôli zátvorkám používa assembler (prekladač) operačný kód 6C pre JMP a nie 4C alebo 7C.

Pri absolútnom nepriamom adresovaní existujú v skutočnosti tri pamäťové oblasti. Prvá oblasť môže pozostávať z umiestnení bajtov $0200, $0201 a $0202. Toto má tri bajty pre inštrukciu „JMP (0210 $)“. Druhý región, ktorý nie je nevyhnutne vedľa prvého, pozostáva z dvoch po sebe idúcich bajtových umiestnení $0210 a $0211. Je to spodný bajt (0210 USD), ktorý je napísaný v inštrukcii programu v jazyku symbolických inštrukcií. Ak je adresa záujmu 8765 USD, spodný bajt 65 H je v umiestnení bajtu $ 0210 a vyšší bajt z 87 H je na $0211 byte umiestnení. Tretia oblasť pozostáva len z jedného bajtového umiestnenia. Je to adresa 8765 $ pre cieľový bajt (posledný bajt záujmu). Dvojica po sebe idúcich adries, $0210 a $0211, obsahuje ukazovateľ $8765, ktorý je adresou záujmu. Po výpočtovej interpretácii je to 8 765 USD, ktoré ide do PC (Program Counter) na prístup k cieľovému bajtu.

Nepriame adresovanie s nulovou stránkou
Toto adresovanie je rovnaké ako absolútne nepriame adresovanie, ale ukazovateľ musí byť na stránke nula. Dolná bajtová adresa oblasti ukazovateľa je to, čo je v zadanej inštrukcii takto:

JMP (50 USD)

Vyšší bajt ukazovateľa je v umiestnení bajtov $ 51. Efektívna adresa (špicatá) nemusí byť na stránke nula.

Takže pri indexovom adresovaní sa hodnota v indexovom registri pridá k základnej adrese, ktorá je uvedená v inštrukcii, aby mala efektívnu adresu. Nepriame adresovanie používa ukazovateľ.

4.8 Indexované nepriame adresovanie

Absolútne indexované nepriame adresovanie
Tento režim adresovania sa používa len s inštrukciou JMP.
Pri absolútnom nepriamom adresovaní existuje pointovaná hodnota (bajt) s vlastnými dvoma po sebe nasledujúcimi bajtovými adresami. Tieto dve po sebe idúce adresy tvoria ukazovateľ, ktorý sa nachádza v oblasti ukazovateľa dvoch po sebe idúcich bajtov v pamäti. Dolný bajt oblasti ukazovateľa je to, čo je napísané v inštrukcii v zátvorkách. Ukazovateľ je adresa označenej hodnoty. V predchádzajúcej situácii je 8 765 USD adresa označenej hodnoty. $0210 (nasleduje $0211) je adresa, ktorej obsah je $8765, čo je ukazovateľ. V režime absolútneho nepriameho adresovania je to (0210 $) to, čo sa zadáva do programu (textového súboru) vrátane zátvoriek.

Na druhej strane v režime absolútneho indexovaného nepriameho adresovania sa nižší bajt adresy pre oblasť ukazovateľa vytvorí pridaním hodnoty v registri X k zadanej adrese. Napríklad, ak je ukazovateľ v umiestnení adresy $0210, zadaná inštrukcia môže byť niečo takéto:

JMP (020 USD, X)

Kde má register X hodnotu 6 H . 020A H + 6 H = 0210 H . Register Y sa v tomto režime adresovania nepoužíva.

Nepriame adresovanie indexované nulovou stránkou
Tento režim adresovania používa register X a nie register Y. V tomto režime adresovania je stále v jeho dvojbajtovej oblasti ukazovateľa adresy smerovaná hodnota a ukazovateľ. Na stránke nula musia byť dva po sebe idúce bajty pre ukazovateľ. Adresa, ktorá je napísaná v inštrukcii, je jednobajtová adresa. Táto hodnota sa pripočíta k hodnote v registri X a akýkoľvek prenos sa zahodí. Výsledok ukazuje na oblasť ukazovateľa na stránke 0. Napríklad, ak je adresa záujmu (ukázaná) 8765 $ a nachádza sa v bajtových umiestneniach $50 a $51 na stránke 0 a hodnota v registri X je $30, zadaná inštrukcia je asi takáto:

LDA (20,X USD)

Pretože 20 $ + 30 $ = 50 $.

Nepriame indexované adresovanie
Tento režim adresovania používa register Y a nie register X. V tomto režime adresovania stále existuje smerovaná hodnota a oblasť ukazovateľa, ale obsah oblasti ukazovateľa funguje odlišne. Na stránke nula pre oblasť ukazovateľa musia byť dva po sebe idúce bajty. Spodná adresa oblasti ukazovateľa je napísaná v inštrukcii. Toto číslo (pár bajtov), ​​ktoré sa nachádza v oblasti ukazovateľa, sa pripočíta k hodnote v registri Y, aby sa získal skutočný ukazovateľ. Napríklad nech je adresa záujmu (ukázaná) $ 8765, hodnota 6H je v registri Y a číslo (dva bajty) je na adrese 50 H a 51 H . Dva bajty spolu sú $ 875 F, pretože $ 875 F + $ 6 = $ 8765. Zadaná inštrukcia je asi takáto:

LDA (50 USD), Y

4.9 Pokyny na zvýšenie, zníženie a testovanie BIT

Nasledujúca tabuľka zobrazuje operácie pokynov na zvýšenie a zníženie:

INA a DEA zvyšujú a znižujú hodnotu akumulátora. Hovorí sa tomu adresovanie akumulátora. INX, DEX, INY a DEY sú pre registre X a Y. Neberú žiadny operand. Používajú teda režim implicitného adresovania. Inkrementácia znamená pridanie 1 do bajtu registra alebo pamäte. Dekrementácia znamená odčítanie 1 z bajtu registra alebo pamäte.

INC a DEC zvyšujú a znižujú bajt pamäte (a nie register). Použitie adresovania nulovej stránky namiesto absolútneho adresovania má za cieľ šetriť pamäť pre inštrukciu. Adresovanie nulovej stránky je o jeden bajt menšie ako absolútne adresovanie pre inštrukciu v pamäti. Režim adresovania nulovej strany však ovplyvňuje iba nulovú stranu.

Inštrukcia BIT testuje bity bajtu v pamäti s 8 bitmi v akumulátore, ale nemení ani jeden. Nastavené sú len niektoré príznaky registra stavu procesora „P“. Bity špecifikovaného miesta v pamäti sú logicky spojené s bitmi akumulátora. Potom sa nastavia nasledujúce stavové bity:

  • N, čo je bit 7 a posledný bit (vľavo) stavového registra, prijíma bit 7 pamäťového miesta pred AND.
  • V, čo je bit 6 stavového registra, prijíma bit 6 pamäťového miesta pred AND.
  • Príznak Z stavového registra je nastavený (vyrobený na 1), ak je výsledok AND nula (00000000 2 ). V opačnom prípade sa vymaže (nastaví sa 0).

4.10 Porovnanie pokynov

Mnemotechniky porovnávacej inštrukcie pre 6502 µP sú CMP, CPX a CPY. Po každom porovnaní sú ovplyvnené príznaky N, Z a C registra stavu procesora „P“. Príznak N sa nastaví (nastaví sa 1), keď je výsledkom záporné číslo. Príznak Z je nastavený (vyrobený na 1), keď je výsledkom nula (000000002). Príznak C sa nastaví (nastaví sa 1), keď dôjde k prenosu z ôsmeho na deviaty bit. Nasledujúca tabuľka poskytuje podrobnú ilustráciu

Znamená „väčšie ako“. Preto by porovnávacia tabuľka mala byť samovysvetľujúca.

4.11 Pokyny pre skok a odbočenie

Nasledujúca tabuľka sumarizuje pokyny na skok a vetvenie:

Inštrukcia JMP využíva absolútne a nepriame adresovanie. Zvyšok pokynov v tabuľke sú pokyny pre pobočky. Používajú iba relatívne adresovanie s 6502 µP. Vďaka tomu sa tabuľka stáva samovysvetľujúcou, ak sa číta zľava doprava a zhora nadol.

Upozorňujeme, že vetvy možno použiť iba na adresy v rozsahu -128 až +127 bajtov od danej adresy. Toto je relatívne oslovovanie. Pre inštrukcie JMP aj vetvy je priamo ovplyvnené počítadlo programov (PC). 6502 µP neumožňuje vetveniam na absolútnu adresu, hoci skok môže robiť absolútne adresovanie. Pokyn ŽMP nie je odborovým pokynom.

Poznámka: Relatívne adresovanie sa používa iba s inštrukciami vetvenia.

4.12 Oblasť zásobníka

Podprogram je ako jeden z predchádzajúcich krátkych programov na sčítanie alebo odčítanie dvoch čísel. Oblasť zásobníka v pamäti začína od 0100 USD do 01FF vrátane. Táto oblasť sa jednoducho nazýva zásobník. Keď mikroprocesor vykoná skok na inštrukciu podprogramu (JSR – pozrite si nasledujúcu diskusiu), potrebuje vedieť, kam sa má po dokončení vrátiť. 6502 µP uchováva tieto informácie (návratová adresa) v nízkej pamäti od $0100 do $01FF (oblasť zásobníka) a používa obsah registra ukazovateľa zásobníka, ktorý je v mikroprocesore „S“ ako ukazovateľ (9 bitov) na poslednú vrátenú adresu. ktorý je uložený na stránke 1 (0100 $ až $01FF) pamäte. Zásobník rastie z $01FF a umožňuje vnoriť podprogramy až do hĺbky 128 úrovní.

Ďalším využitím ukazovateľa zásobníka je spracovanie prerušení. 6502 µP má kolíky označené ako IRQ a NMI. Je možné, že sa na tieto kolíky privedú malé elektrické signály, ktoré spôsobia, že 6502 µP prestane vykonávať jeden program a začne vykonávať iný. V tomto prípade sa prvý program preruší. Podobne ako podprogramy môžu byť segmenty kódu prerušenia vnorené. Spracovanie prerušenia je popísané v ďalšej kapitole.

Poznámka : Ukazovateľ zásobníka má 8 bitov pre nižšiu bajtovú adresu pri adresovaní miest od $ 0100 do $ 01FF. Vyšší bajt 00000001 2 sa predpokladá.

Nasledujúca tabuľka obsahuje pokyny, ktoré spájajú ukazovateľ zásobníka „S“ s registrami A, X, Y a P s oblasťou zásobníka v pamäti:

4.13 Volanie a návrat podprogramu

Podprogram je súbor inštrukcií, ktoré dosahujú konkrétny cieľ. Predchádzajúci program sčítania alebo odčítania je veľmi krátky podprogram. Podprogramy sa niekedy nazývajú len rutiny. Inštrukcia na zavolanie podprogramu je:

JSR: Prejsť na podprogram

Inštrukcia na návrat z podprogramu je:

RTS: Návrat z podprogramu

Mikroprocesor má tendenciu nepretržite vykonávať inštrukcie v pamäti, jednu za druhou. Predpokladajme, že mikroprocesor práve vykonáva segment kódu a narazí na inštrukciu skoku (JMP) na vykonanie segmentu kódu, ktorý je zakódovaný za tým, čo už mohol byť vykonaný. Spustí tento segment kódu za a pokračuje vo vykonávaní všetkých segmentov kódu (inštrukcií) nasledujúcich za segmentom kódu, kým znova nespustí aktuálny segment kódu a pokračuje nižšie. JMP neposunie ďalšiu inštrukciu do zásobníka.

Na rozdiel od JMP, JSR tlačí adresu nasledujúcej inštrukcie po sebe z PC (počítadla programu) do zásobníka. Pozícia zásobníka tejto adresy je umiestnená v ukazovateli zásobníka „S“. Keď sa v podprograme stretne (vykoná) inštrukcia RTS, adresa, ktorá je vložená do zásobníka, stiahne zásobník a program pokračuje na tejto stiahnutej adrese, ktorá je ďalšou adresou inštrukcie tesne pred volaním podprogramu. Posledná adresa, ktorá sa odstráni zo zásobníka, sa odošle do programového počítadla. Nasledujúca tabuľka uvádza technické podrobnosti o pokynoch JSR a RTS:

Pozrite si nasledujúci obrázok pre použitie JSR a RTS:

4.14 Príklad odpočítavacej slučky

Nasledujúci podprogram odpočítava od $FF do $00 (celkom 256 10 počíta):

spustiť LDX #$FF ; zaťaženie X s $FF = 255
slučka DEX ; X = X – 1
BNE slučka ; ak X nie je nula, potom goto loop
RTS; vrátiť

Každý riadok má komentár. Komentáre sa nikdy neuložia do pamäte na vykonanie. Assembler (prekladač), ktorý konvertuje program na to, čo je v pamäti na vykonanie (spustenie), vždy odstráni komentáre. Komentár začína „;“ . „Štart“ a „slučka“ v tomto programe sa nazývajú štítky. Štítok identifikuje (názov) adresy inštrukcie. Ak je inštrukcia jednobajtová inštrukcia (implicitné adresovanie), návestie je adresa tejto inštrukcie. Ak je inštrukcia viacbajtová inštrukcia, označenie identifikuje prvý bajt pre viacbajtovú inštrukciu. Prvá inštrukcia pre tento program pozostáva z dvoch bajtov. Za predpokladu, že začína na adrese 0300 USD, adresu 0300 USD možno v programe nahradiť výrazom „štart“. Druhá inštrukcia (DEX) je jednobajtová inštrukcia a mala by byť na adrese $0302. To znamená, že adresa $0302 môže byť v programe nahradená výrazom „loop“, čo je v skutočnosti tak v „slučke BNE“.

„BNE slučka“ znamená vetvu na danú adresu, keď je príznak Z stavového registra 0. Keď je hodnota v registri A alebo X alebo Y 00000000 2 , kvôli poslednej operácii je príznak Z 1 (nastavený). Takže, kým je 0 (nie 1), druhá a tretia inštrukcia v programe sa opakujú v tomto poradí. V každej opakovanej sekvencii sa hodnota (celé číslo) v registri X zníži o 1. DEX znamená X = X – 1. Keď je hodnota v registri X $00 = 00000000 2 , Z sa zmení na 1. V tomto bode sa už tieto dve inštrukcie neopakujú. Posledná RTS inštrukcia v programe, ktorá je jednobajtovou inštrukciou (implicitné adresovanie), sa vracia z podprogramu. Účinok tejto inštrukcie je vytvoriť adresu programového počítadla v zásobníku pre kód, ktorý sa má vykonať pred volaním podprogramu, a vrátiť sa späť k programovému počítadlu (PC). Táto adresa je adresou inštrukcie, ktorá sa má vykonať pred volaním podprogramu.

Poznámka: Pri písaní programu v assembleri pre 6502 µP musí na začiatku riadku začínať iba označenie; akýkoľvek iný riadkový kód musí byť posunutý aspoň o jedno miesto doprava.

Volanie podprogramu
Ignorovaním pamäťového priestoru, ktorý zaberajú predchádzajúce označenia, program zaberie 6 bajtov po sebe idúcich miest v pamäti (RAM) od 0300 do 0305 $. V tomto prípade je program:

LDX #$FF ; zaťaženie X s $FF = 255
DEX ; X = X – 1
BNE 0302 USD; ak X nie je nula, potom goto loop
RTS; vrátiť

Počnúc od adresy $0200 v pamäti môže byť volaním podprogramu. Inštrukcia hovoru je:

JSR štart ; začiatok je adresa 0300 USD, t.j. JSR 0300 USD

Podprogram a jeho volanie, ktoré sú správne zapísané v súbore textového editora, sú:

spustiť LDX #$FF; zaťaženie X s $FF = 255
slučka DEX ; X = X – 1

BNE slučka ; ak X nie je nula, potom goto loop
RTS; vrátiť

Začiatok JSR: prejdite na rutinu začínajúcu na 0300 USD

Teraz môže byť v jednom dlhom programe veľa podprogramov. Všetky nemôžu mať názov „štart“. Mali by mať iné mená. V skutočnosti žiadny z nich nemusí mať názov „štart“. „Štart“ sa tu používa z vyučovacích dôvodov.

4.15 Preklad programu

Preklad programu alebo jeho zostavenie znamená to isté. Zvážte nasledujúci program:

spustiť LDX #$FF: načítať X s $FF = 255
slučka DEX : X = X – 1
BNE loop: ak X nie je nula, potom goto loop
RTS: návrat
Začiatok JSR: prejdite na rutinu začínajúcu na 0300 USD

Toto je program, ktorý bol predtým napísaný. Pozostáva z podprogramu, štartu a volania podprogramu. Program odpočítava od 255 10 na 0 10 . Program začína na počiatočnej adrese používateľa 0200 $ (RAM). Program sa napíše v textovom editore a uloží sa na disk. Má názov ako „sample.asm“, kde „sample“ je názov podľa výberu programátora, ale s názvom súboru musí byť spojená prípona „.asm“ pre jazyk assembleru.

Zostavený program vytvára iný program, ktorý sa nazýva assembler. Zostavovač dodáva výrobca 6502 µP alebo tretia strana. Assembler reprodukuje program takým spôsobom, že je v pamäti (RAM), keď sa vykonáva (spúšťa).

Predpokladajme, že inštrukcia JSR začína na adrese $0200 a podprogram začína na adrese $0300. Assembler odstráni všetky komentáre a biele miesta. Komentáre a biele miesta mrhajú pamäťou, ktorej je vždy málo. Príkladom medzery je prípadný prázdny riadok medzi predchádzajúcim segmentom kódu podprogramu a volaním podprogramu. Zostavený súbor je stále uložený na disku a má názov niečo ako „sample.exe“. „Vzorka“ je názov podľa výberu programátora, ale mala by tam byť prípona „.exe“, ktorá označuje, že ide o spustiteľný súbor.

Zostavený program možno zdokumentovať nasledovne:

Výroba takéhoto dokumentu je vraj ručná montáž. Upozorňujeme, že komentáre v tomto dokumente sa nezobrazujú v pamäti (na vykonanie). Stĺpec adresy v tabuľke označuje počiatočné adresy inštrukcií v pamäti. Všimnite si, že „JSR start“, čo je „JSR $0300“, o ktorom sa očakáva, že bude kódovaný ako „20 03 00“, je v skutočnosti zakódovaný ako „20 00 03“, pričom spodná adresa bajtu pamäte zaberá spodný bajt v pamäti a adresa vyššieho bajtu v pamäti zaberá vyšší bajt v pamäti – malá endianness. Operačný kód pre JSR je 20 16 .

Všimnite si, že posun k inštrukcii vetvy, ako je BNE, je číslo dvojkového doplnku v rozsahu 128 10 na + 127 10 . Takže „BNE slučka“ znamená „BNE -1 10 “, čo je v skutočnosti „D0 FF“ v kódovej forme FF 16 je -1 v dvojkovom doplnku, ktorý je zapísaný ako = 11111111 v základe dva. Program assembler nahrádza označenia a polia skutočnými hexadecimálnymi číslami (hexadecimálne čísla sú binárne čísla, ktoré sú zoskupené do štyroch bitov). Skutočné adresy, na ktorých každá inštrukcia začína, sú skutočne zahrnuté.

Poznámka: Inštrukcia „JSR start“ je nahradená kratšími inštrukciami, ktoré posielajú aktuálny obsah (vysoké a nízke bajty) programového počítadla do zásobníka s ukazovateľom zásobníka, ktorý je dvakrát znížený (raz pre vysoký bajt a raz pre nízky bajt) a potom znovu načíta PC s adresou $0300. Ukazovateľ zásobníka teraz ukazuje na $00FD za predpokladu, že je inicializovaný na $01FF.

Inštrukcia RTS je tiež nahradená množstvom kratších inštrukcií, ktoré dvakrát zvýšia ukazovateľ zásobníka „S“ (raz pre nízky bajt a raz pre vysoký bajt) a vytiahnu zodpovedajúce dva bajty adresy z ukazovateľa zásobníka do počítača. ďalší pokyn.

Poznámka: Text menovky by nemal mať viac ako 8 znakov.

„Slučka BNE“ používa relatívne adresovanie. Znamená to pridať -3 10 na ďalší obsah programového počítadla 0305 USD. Bajty pre 'BNE loop' sú 'D0 FD', kde FD je dvojkový doplnok -3 10 .

Poznámka: Táto kapitola neuvádza všetky pokyny pre 6502 µP. Všetky pokyny a ich podrobnosti nájdete v dokumente s názvom „Rodina 8-bitových mikroprocesorov SY6500“. Pre tento dokument existuje súbor PDF s názvom „6502.pdf“, ktorý je voľne dostupný na internete. 6502 uP, ktorý je opísaný v tomto dokumente, je 65C02.

4.16 Prerušenia

Signály akéhokoľvek zariadenia, ktoré je pripojené k vonkajším (vertikálnym povrchovým) portom Commodore 64, musia prejsť buď cez obvody CIA 1 alebo CIA 2 (IC) predtým, ako sa dostanú k mikroprocesoru 6502. Signály z dátovej zbernice 6502 µP musia prejsť buď cez čip CIA 1 alebo CIA 2, kým sa dostanú k akémukoľvek externému zariadeniu. CIA je skratka pre Complex Interface Adapter. Na obr. 4.1 „Bloková schéma základnej dosky Commodore_64“ predstavujú blokové vstupné/výstupné zariadenia CIA 1 a CIA 2. Keď je program spustený, možno ho pred pokračovaním prerušiť, aby sa spustil nejaký iný kus kódu. Dochádza k hardvérovému a softvérovému prerušeniu. Pre hardvérové ​​prerušenie sú k dispozícii dva kolíky vstupného signálu na 6502 µP. Názvy týchto pinov sú IRQ a NMI . Toto nie sú dátové linky µP. Dátové čiary pre uP sú D7, D6, D5, D4, D3, D2, D1 a DO; s D0 pre najmenej významný bit a D7 pre najvýznamnejší bit.

IRQ znamená Interrupt ReQuest „active“ low. Toto vstupné vedenie do µP je normálne vysoké, približne 5 voltov. Keď klesne na približne 0 voltov, ide o požiadavku na prerušenie, ktorá signalizuje µP. Hneď ako je žiadosť schválená, linka sa vráti späť vysoko. Udelenie požiadavky na prerušenie znamená, že µP sa rozvetvuje na kód (podprogram), ktorý obsluhuje prerušenie.

NMI znamená Non-Maskable Interrupt “active” low. Kým kód pre IRQ sa vykonáva NMI môže ísť nízko. V tomto prípade, NMI sa spracuje (spustí sa jeho vlastný kód). Potom kód pre IRQ pokračuje. Po kóde pre IRQ skončí, hlavný programový kód pokračuje. teda NMI preruší IRQ psovod. Signál pre NMI môže byť stále pridelený µP, aj keď je µP nečinný a nič nepracuje alebo nie je spustený hlavný program.

Poznámka: Je to vlastne prechod z vysokej na nízku, of NMI , to je NMI signál – o tom neskôr. IRQ zvyčajne pochádza zo CIA 1 a NMI zvyčajne pochádza zo CIA 2. NMI , čo je skratka pre Non-Maskable Interrupt, možno považovať za nezastaviteľné prerušenie.

Spracovanie prerušení
Či je žiadosť od IRQ alebo NMI , musí sa dokončiť aktuálny pokyn. 6502 má len registre A, X a Y. Kým je podprogram v prevádzke, môže používať tieto tri registre spolu. Obsluha prerušení je stále podprogram, aj keď sa tak nevidí. Po dokončení aktuálnej inštrukcie sa obsah registrov A, X a Y pre 65C02 µP uloží do zásobníka. Do zásobníka sa odošle aj adresa ďalšej inštrukcie programového počítadla. µP sa potom rozvetví na kód prerušenia. Potom sa obsah registrov A, X a Y obnoví zo zásobníka v opačnom poradí, ako boli odoslané.

Príklad kódovania prerušenia
Pre jednoduchosť predpokladajme, že rutina pre µP IRQ prerušenie je len sčítať čísla $01 a $02 a uložiť výsledok $03 na pamäťovú adresu $0400. Kód je:

ISR PHA
PHX
PHY
;
LDA # 01 USD
ADC # 02 USD
STÁLI 0400 USD
;
PLY
PLX
CHKO
RTI

ISR je označenie a identifikuje adresu pamäte, kde je inštrukcia PHA. ISR znamená Rutina prerušenia služby. PHA, PHX a PHY posielajú obsah registrov A, X a Y do zásobníka s nádejou, že ich bude potrebovať akýkoľvek kód (program), ktorý je spustený tesne pred prerušením. Nasledujúce tri inštrukcie tvoria jadro obsluhy prerušení. Inštrukcie PLY, PLX a PLA musia byť v tomto poradí a prinesú späť obsah registrov Y, X a A. Posledná inštrukcia, ktorou je RTI, (bez operandu) vracia pokračovanie vykonávania akéhokoľvek kódu (programu), ktorý sa vykonáva pred prerušením. RTI vytiahne adresu ďalšej inštrukcie kódu, ktorý sa vykonáva, zo zásobníka späť do programového počítadla. RTI znamená Návrat z prerušenia. Tým sa manipulácia s prerušením (podprogram) skončila.

Softvérové ​​prerušenie
Hlavným spôsobom, ako získať softvérové ​​prerušenie pre 6502 µP, je použitie implicitnej adresy inštrukcie BRK. Predpokladajme, že hlavný program beží a narazí na inštrukciu BRK. Od tohto bodu by mala byť adresa ďalšej inštrukcie v PC odoslaná do zásobníka po dokončení aktuálnej inštrukcie. Podprogram na spracovanie softvérovej inštrukcie by sa mal nazývať „next“. Tento podprogram prerušenia by mal presunúť obsah registrov A, X a Y do zásobníka. Po vykonaní jadra podprogramu by sa obsah registrov A, X a Y mal stiahnuť späť zo zásobníka do ich registrov dokončením podprogramu. Posledný príkaz v rutine je RTI. Obsah PC sa tiež automaticky stiahne späť zo zásobníka do počítača kvôli RTI.

Porovnanie a kontrast medzi podprogramom a prerušením servisného programu
Nasledujúca tabuľka porovnáva a porovnáva podprogram a rutinu služby prerušenia:

4.17 Súhrn 6502 hlavných režimov adresovania

Každá inštrukcia pre 6502 je jeden bajt, za ktorým nasleduje nula alebo viac operandov.

Režim okamžitého adresovania
V režime okamžitého adresovania je za operandom hodnota a nie adresa pamäte. Pred hodnotou musí byť #. Ak je hodnota v šestnástkovej sústave, za „#“ musí nasledovať „$“. Okamžité adresovacie inštrukcie pre 65C02 sú: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Čitateľ by si mal prečítať dokumentáciu k 65C02 µP, aby vedel, ako používať tu uvedené pokyny, ktoré nie sú vysvetlené v tejto kapitole. Príklad pokynu je:

LDA # 77 USD

Režim absolútneho adresovania
V režime absolútneho adresovania existuje jeden operand. Tento operand je adresa hodnoty v pamäti (zvyčajne v šestnástkovej sústave alebo návesti). Je ich 64 tis 10 = 65 536 10 adresy pamäte pre 6502 µP. Typicky je jednobajtová hodnota na jednej z týchto adries. Absolútne adresovacie inštrukcie pre 65C02 sú: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB. Čitateľ by si mal prečítať dokumentáciu pre 65C02 µP, aby vedel, ako používať pokyny, ktoré sú tu uvedené, ako aj pre ostatné režimy adresovania, ktoré nie sú vysvetlené v tejto kapitole. Príklad pokynu je:

SÚ 1234 USD

Implicitný režim adresovania
V režime implikovaného adresovania neexistuje žiadny operand. Akýkoľvek zahrnutý µP register je zahrnutý inštrukciou. Implicitné adresné inštrukcie pre 65C02 sú: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, TAX, TAY, TSX, TXA, TXS, TYA. Príklad pokynu je:

DEX : Zníženie registra X o jednu jednotku.

Režim relatívneho adresovania
Režim relatívneho adresovania sa zaoberá iba pokynmi vetvy. V režime relatívneho adresovania existuje iba jeden operand. Je to hodnota od -128 10 na +127 10 . Táto hodnota sa nazýva offset. Na základe znamienka sa táto hodnota pripočíta alebo odčíta od nasledujúcej inštrukcie programového čítača, čím sa získa adresa zamýšľanej ďalšej inštrukcie. Inštrukcie režimu relatívnej adresy sú: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Príklady pokynov sú:

BNE $7F : (vetva, ak Z = 0 v stavovom registri, P)

Čo pridá 127 k aktuálnemu počítadlu programu (adresa, ktorá sa má vykonať) a spustí sa vykonávanie inštrukcie na tejto adrese. Podobne:

BEQ $F9 : (vetva, ak Z = : v registri stavu, P)

Čo pridá -7 k aktuálnemu programovému počítadlu a spustí vykonávanie na novej adrese programového počítadla. Operand je číslo dvojkového doplnku.

Absolútne indexované adresovanie
Pri absolútnom indexovom adresovaní sa obsah registra X alebo Y pridáva k danej absolútnej adrese (kdekoľvek od $ 0000 do $ FFFF, t. j. od 0 10 na 65536 10 ), aby ste mali skutočnú adresu. Táto daná absolútna adresa sa nazýva základná adresa. Ak sa použije register X, inštrukcia na zostavenie je približne takáto:

LDA 453 USD, X

Ak sa použije register Y, je to niečo ako:

LDA 453 USD, Y

Hodnota pre register X alebo Y sa nazýva počet alebo hodnota indexu a môže byť kdekoľvek od 00 $ (0 10 ) na FF $ (250 10 ). Nenazýva sa ofset.

Inštrukcie absolútneho indexového adresovania sú: ADC, AND, ASL (iba X), BIT (s akumulátorom a pamäťou, iba s X), CMP, DEC (iba pamäť a X), EOR, INC (iba pamäť a X), LDA , LDX, LDY, LSR (iba X), ORA, ROL (iba X), ROR (iba X), SBC, STA, STZ (iba X).

Absolútne nepriame adresovanie
Používa sa len s inštrukciou skoku. Vďaka tomu má daná absolútna adresa adresu ukazovateľa. Adresa ukazovateľa pozostáva z dvoch bajtov. Dvojbajtový ukazovateľ ukazuje na cieľovú hodnotu bajtu v pamäti (je to adresa). Inštrukcia v jazyku assembleru je teda:

JMP (3 456 dolárov)

So zátvorkami a $13 je v umiestnení adresy $3456, zatiaľ čo $EB je v umiestnení adresy $3457 (= $3456 + 1). Potom je cieľová adresa $13EB a $13EB je ukazovateľ. Absolútnych 3456 $ je v inštrukcii v zátvorkách, kde 34 je nižší bajt a 56 je vyšší bajt.

4.18 Vytvorenie reťazca pomocou jazyka assembleru 6502 µP

Ako je ukázané v nasledujúcej kapitole, po vytvorení súboru v pamäti je možné súbor uložiť na disk. Súbor je potrebné pomenovať. Názov je príkladom reťazca. Existuje mnoho ďalších príkladov reťazcov v programovaní.

Existujú dva hlavné spôsoby vytvorenia reťazca ASCII kódov. V oboch prípadoch všetky ASCII kódy (znaky) zaberajú po sebe idúce bajtové miesta v pamäti. Jedným zo spôsobov je tejto sekvencii bajtov predchádza celý bajt, ktorý predstavuje dĺžku (počet znakov) v sekvencii (reťazci). V opačnom prípade za sekvenciou znakov nasleduje (bezprostredne nasleduje) bajt Null, ktorý je 00 16 , t.j. 00 USD. Dĺžka reťazca (počet znakov) sa týmto iným spôsobom neuvádza. Znak Null sa nepoužíva prvým spôsobom.

Zvážte napríklad „Milujem ťa!“ reťazec bez úvodzoviek. Dĺžka je tu 11; medzera sa počíta ako jeden ASCII bajt (znak). Predpokladajme, že reťazec musí byť umiestnený v pamäti s prvým znakom na adrese $0300.

Nasledujúca tabuľka zobrazuje nastavenie pamäte reťazca, keď je prvý bajt 11 10 = 0B 16 :

Nasledujúca tabuľka zobrazuje nastavenie pamäte reťazca, keď je prvý bajt „I“ a posledný bajt je nula (00 USD):

Na začatie vytvárania reťazca môžete použiť nasledujúcu inštrukciu:

STOJIA 0300 USD

Predpokladajme, že prvý bajt je v akumulátore, ktorý sa má odoslať na adresu 0300 $. Táto inštrukcia platí pre oba prípady (oba typy reťazcov).

Po vložení všetkých znakov do pamäťových buniek jeden po druhom je možné reťazec prečítať pomocou slučky. V prvom prípade sa načíta počet znakov po dĺžke. V druhom prípade sa znaky čítajú od „I“, kým sa nesplní znak Null, ktorý je „Null“.

4.19 Vytvorenie poľa s jazykom zostavy 6502 µP

Pole jednobajtových celých čísel pozostáva z po sebe idúcich miest bajtov pamäte s celými číslami. Potom je tu ukazovateľ, ktorý ukazuje na umiestnenie prvého celého čísla. Pole celých čísel sa teda skladá z dvoch častí: ukazovateľa a série umiestnení.

Pre pole reťazcov môže byť každý reťazec na inom mieste v pamäti. Potom existujú po sebe idúce pamäťové miesta s ukazovateľmi, kde každý ukazovateľ ukazuje na prvé umiestnenie každého reťazca. Ukazovateľ v tomto prípade pozostáva z dvoch bajtov. Ak reťazec začína svojou dĺžkou, zodpovedajúci ukazovateľ ukazuje na umiestnenie tejto dĺžky. Ak reťazec nezačína svojou dĺžkou, ale končí znakom null, zodpovedajúci ukazovateľ ukazuje na umiestnenie prvého znaku reťazca. A existuje ukazovateľ, ktorý ukazuje na nižšiu bajtovú adresu prvého ukazovateľa po sebe idúcich ukazovateľov. Pole reťazcov sa teda skladá z troch častí: reťazcov na rôznych miestach v pamäti, zodpovedajúcich po sebe idúcich ukazovateľov a ukazovateľa na prvý ukazovateľ z po sebe nasledujúcich ukazovateľov.

4.20 Problémy

Čitateľovi sa odporúča, aby pred prechodom na ďalšiu kapitolu vyriešil všetky problémy v kapitole.

  1. Napíšte program v assembleri, ktorý začína na 0200 $ za 6502 µP a pridá čísla bez znamienka 2A94 H (pridať) k 2ABF H (augend). Nech sú vstupy a výstupy v pamäti. Zostavený programový dokument tiež vytvorte ručne.
  2. Napíšte program v assembleri, ktorý začína na 0200 dolároch pre 6502 µP a odpočítava čísla 1569 bez znamienka H (subtrahend) od 2ABF H (na konci). Nech sú vstupy a výstupy v pamäti. Zostavený programový dokument tiež vytvorte ručne.
  3. Napíšte program v assembleri pre 6502 µP, ktorý počíta od 00 do 09 USD pomocou slučky. Program by mal začínať na 0200 dolároch. Zostavený programový dokument tiež vytvorte ručne.
  4. Napíšte program v assembleri, ktorý začína na 0200 $ za 6502 µP. Program má dva podprogramy. Prvý podprogram pridáva čísla 0203 bez znamienka H (augend) a 0102H (add). Druhý podprogram pridáva súčet z prvého podprogramu, ktorý je 0305H až 0006 H (augend). Konečný výsledok sa uloží do pamäte. Zavolajte prvý podprogram, ktorý je FSTSUB a druhý podprogram, ktorý je SECSUB. Nech sú vstupy a výstupy v pamäti. Tiež vytvorte zostavený programový dokument pre celý program ručne.
  5. Vzhľadom na to, že an IRQ handler pridá 02 až 01 $ na akumulátore ako základnú manipuláciu NMI sa vydáva a jadro manipulácie pre NMI pridá 05 až 04 USD na akumulátor, napíšte jazyk symbolov pre oboch manipulátorov vrátane ich hovorov. Výzva k IRQ handler by mal byť na adrese $0200. The IRQ handler by mal začínať na adrese $0300. The NMI handler by mal začínať na adrese $0400. Výsledok IRQ handler by mal byť umiestnený na adrese $0500 a výsledok NMI handler by mal byť umiestnený na adrese $0501.
  6. Stručne vysvetlite, ako sa inštrukcia BRK používa na vytvorenie softvérového prerušenia v počítači 65C02.
  7. Vytvorte tabuľku, ktorá porovnáva a porovnáva normálny podprogram s obslužnou rutinou prerušenia.
  8. Stručne vysvetlite hlavné režimy adresovania 65C02 µP na príkladoch inštrukcií v jazyku symbolických inštrukcií.
  9. a) Napíšte program strojového jazyka 6502, do ktorého vložíte „Milujem ťa!“ reťazec ASCII kódov v pamäti, začínajúci od adresy $0300 s dĺžkou reťazca. Program by mal začínať na adrese 0200 USD. Získajte každý znak z akumulátora jeden po druhom, za predpokladu, že sú tam poslané nejakým podprogramom. Program zostavte aj ručne. (Ak potrebujete poznať ASCII kódy pre „Milujem ťa!“. Tu sú: „Ja“:49 16 , priestor: 20 16 , 'l': 6C 16 , „o“: 6F 16 , ‘v’:76 16 , 'e':65, 'y':79 16 , 'v':75 16 , a „!“:21 16 (Poznámka: každý kód zaberá 1 bajt).
    b) Napíšte program strojového jazyka 6502, do ktorého vložíte „Milujem ťa!“ reťazec ASCII kódov v pamäti, začínajúci od adresy $0300 bez dĺžky reťazca, ale končiaci na 00 16 . Program by mal začínať na adrese 0200 USD. Získajte každý znak z akumulátora za predpokladu, že ho tam posiela jeden po druhom nejaký podprogram. Program tiež zostavte ručne.