4. peatükk: 6502 Microprocessor Assembly Language Tutorial

4 Peatukk 6502 Microprocessor Assembly Language Tutorial



4. peatükk: 6502 Microprocessor Assembly Language Tutorial

4.1 Sissejuhatus

Mikroprotsessor 6502 ilmus 1975. aastal. Seda kasutati mikroprotsessorina mõnede personaalarvutite jaoks, nagu Apple II, Commodore 64 ja BBC Micro.







Mikroprotsessorit 6502 toodetakse suurel hulgal ka tänapäeval. See ei ole tänapäeval enam personaalarvutites (sülearvutites) kasutatav keskprotsessor, kuid seda toodetakse endiselt suurel hulgal ning kasutatakse elektroonika- ja elektriseadmetes. Moodsamate arvutiarhitektuuride mõistmiseks on väga kasulik uurida vanemat, kuid üsna edukat mikroprotsessorit, näiteks 6502.



Kuna seda on lihtne mõista ja programmeerida, on see üks parimaid (kui mitte kõige paremaid) mikroprotsessoreid, mida kasutada assemblerkeele õpetamiseks. Assembly keel on madala taseme keel, mida saab kasutada arvuti programmeerimiseks. Pange tähele, et ühe mikroprotsessori montaažikeel erineb teise mikroprotsessori montaažikeelest. Selles peatükis õpetatakse 6502 mikroprotsessori montaaži keelt. Täpsemalt õpetatakse 65C02, kuid seda nimetatakse lihtsalt 6502-ks.



Minevikus tuntud arvutit kutsuti commodore_64-ks. 6502 on 6500 perekonna mikroprotsessor. Commodore_64 arvuti kasutab 6510 mikroprotsessorit. 6510 mikroprotsessor on 6500 µP. 6502 µP juhiste komplekt on peaaegu kõik 6510 µP juhised. Selle ja järgmise peatüki teadmised põhinevad arvutil commodore_64. Neid teadmisi kasutatakse veebipõhise karjäärikursuse selles osas kaasaegse arvutiarhitektuuri ja kaasaegsete operatsioonisüsteemide selgitamisel.





Arvuti arhitektuur viitab arvuti emaplaadi komponentidele ja selgitusele, kuidas andmed liiguvad igas komponendis, eriti mikroprotsessoris, kuidas andmed komponentide vahel liiguvad ja kuidas andmed omavahel suhtlevad. Andmete ainsus on datum. Tõhus viis arvuti arvutiarhitektuuri uurimiseks on uurida emaplaadi montaažikeelt.

Commodore_64 arvuti on väidetavalt 8-bitise arvutisõnaga arvuti. See tähendab, et teavet salvestatakse, edastatakse ja manipuleeritakse kaheksabitiste binaarkoodide kujul.



Commodore 64 emaplaadi plokkskeem
Commodore 64 emaplaadi plokkskeem on järgmine:


Joonis 4.1 Commodore_64 süsteemiüksuse plokkskeem

Kujutage ette 6510 mikroprotsessorit 6502 mikroprotsessorina. Kogumälu on baitide jada (8 bitti baidi kohta). Seal on suvapöördus (lugemine/kirjutus) mälu, kuhu saab baite kirjutada või kustutada. Kui arvuti toide välja lülitatakse, kustutatakse kogu muutmälus (RAM) olev teave. Samuti on olemas kirjutuskaitstud mälu (ROM). Kui arvuti toide välja lülitatakse, jääb ROM-i teave alles (ei kustutata).

Seal on sisend-/väljundport (ahel), mida diagrammil nimetatakse sisend-/väljundseadmeteks. Seda porti ei tohiks segi ajada portidega, mis on nähtavad arvutisüsteemiüksuse vasakul ja paremal või esi- ja tagaküljel. Need on kaks erinevat asja. Skeemil ei ole näidatud ühendusi sellest sisemisest pordist välisseadmetega, nagu kõvaketas (või diskett), klaviatuur ja monitor.

Diagrammil on kolm siini (väga väikeste elektrijuhtmete rühmad). Iga juhe võib edastada bitti 1 või bitti 0. Andmesiin, mis on ette nähtud kaheksabitise baidi korraga (üks taktimpulss) edastamiseks RAM-i ja sisend/väljundporti (sisend/väljundseadmed) on kahesuunaline. Andmesiini laius on kaheksa bitti.

Kõik komponendid on ühendatud aadressi siiniga. Aadressisiin on mikroprotsessorist ühesuunaline. Aadressi siini jaoks on kuusteist juhti ja igaüks kannab ühte bitti (1 või 0). Ühe taktimpulsiga saadetakse kuusteist bitti.

Seal on juhtbuss. Mõned juhtsiini juhid kannaksid mikroprotsessorist teistele komponentidele üle ühe biti. Mõned juhtliinid kannavad bitte sisendi/väljundi (IO) pordist mikroprotsessorisse.

Arvuti mälu
RAM-i ja ROM-i peetakse üheks mälusõlmeks. See koost on skemaatiliselt kujutatud järgmiselt, kus kuueteistkümnendsüsteemi numbritel on eesliide '$'.


Joonis 4.11 Commodore 64 arvuti mälu paigutus

RAM on alates 0000 16 DFFF-ile 16 mis on kirjutatud vahemikus $ 0000 kuni $ DFFF. Koostekeeles 6502 µP lisatakse kuueteistkümnendsüsteemi numbrile eesliide '$', mitte aga järelliite (allindeksiga) 16 või H või kuueteistkümnend. Kogu RAM-is olev teave kustub, kui arvuti välja lülitatakse. ROM algab $E000 kuni $FFFF. Sellel on alamprogrammid, mis ei lülitu välja, kui arvuti välja lülitatakse. Need alamprogrammid on tavaliselt kasutatavad rutiinid, mis abistavad programmeerimist. Kasutajaprogramm kutsub neid välja (vt järgmist peatükki).

Ruum (baitid) vahemikus $ 0200 kuni $ 000 on mõeldud kasutajaprogrammide jaoks. Ruum vahemikus $ D000 kuni $ DFFF on mõeldud teabe jaoks, mis on otseselt seotud välisseadmetega (sisend-/väljundseadmed). See on osa operatsioonisüsteemist. Seega koosneb commodore-64 arvuti operatsioonisüsteem kahest põhiosast: ROM-is olev osa, mis kunagi ei kustu, ja osa $000 kuni $DFFF, mis kustub toite väljalülitamisel. Need IO (input/output) andmed tuleb kettalt laadida iga kord, kui arvuti sisse lülitatakse. Tänapäeval nimetatakse selliseid andmeid välisseadmete draiveriteks. Välisseadmed algavad sisend/väljundseadme pordist emaplaadi ühenduste kaudu arvuti vertikaalsetel pindadel olevate tuvastatavate portideni, millega monitor, klaviatuur jne on ühendatud ning välisseadmete endi külge (monitor, klaviatuur jne). .).

Mälu koosneb 2-st 16 = 65 536 baiti asukohti. Kuueteistkümnendsüsteemis on need 10 000 16 = 10 000 H = 10 000 hex = $10000 asukohad. Arvutamises algab kahe, kümne, kuueteistkümne jne alusel loendamine nullist, mitte 1-st. Seega on esimene asukoht tegelikult asukoha number 0000000000000000 2 = 0 10 = 0000 16 = 0000 dollarit. 6502 µP koostekeeles on aadressi asukoha identifitseerimise eesliide $ ja järelliidet ega alamindeksit pole. Viimane asukoht on asukoha number 1111111111111111 2 = 65 535 10 = FFFF 16 = FFFF $ ja mitte 10000000000000000 2 või 65 536 10 või 10 000 16 või 10 000 dollarit. 10000000000000000 2 , 65 536 10 , 10 000 16 või $10000 annab baitide asukohtade koguarvu.

Siin, 2 16 = 65 536 = 64 x 1024 = 64 x 2 10 = 64 kilobaiti (kilobaiti). Commodore-64 nimes olev järelliide 64 tähendab 64KB kogumälu (RAM ja ROM). Bait on 8 bitti ja 8 bitti lähevad mälus ühte baidi asukohta.

64 kilobaiti mälu on jagatud lehtedeks. Igal lehel on 0100 16 = 256 10 baitide asukohad. Esimene 256 10 = esimene 0100 16 asukohad on lehekülg 0. Teine on leht 1, kolmas on leht 2 jne.

65 536 asukoha adresseerimiseks on iga asukoha (aadressi) jaoks vaja 16 bitti. Niisiis koosneb aadressisiin mikroprotsessorist mällu 16 reast; üks rida ühe biti kohta. Bitt on kas 1 või 0.

6502 µP registrid
Register on nagu baitmälu asukoha baitlahtrid. 6502 µP-l on kuus registrit: viis 8-bitist registrit ja üks 16-bitine register. 16-bitist registrit nimetatakse programmiloenduriks, mis on lühendatud kui PC. See hoiab mäluaadressi järgmise käsu jaoks. Assamblee keele programm koosneb mällu paigutatavatest käskudest. Teatud baitide asukoha aadressimiseks mälus on vaja kuusteist (16) erinevat bitti. Konkreetse taktimpulsi korral saadetakse need bitid aadressi siini 16-bitistele aadressiridadele käsu lugemiseks. Kõik 6502 µP registrid on kujutatud järgmiselt:


Joonis 4.12 6502 µP registrid

Programmiloendurit või arvutit võib diagrammil näha 16-bitise registrina. Madalamad olulised kaheksa bitti on märgistatud kui PCL programmi loenduri madalaks. Kõrgema tähendusega kaheksa bitti tähistatakse programmi loenduri kõrge väärtuse PCH-na. Commodore-64 mälus olev käsk võib koosneda ühest, kahest või kolmest baidist. 16 bitti arvutis osutavad järgmisele käivitatavale käsule mälus. Mikroprotsessori ahelate hulgas nimetatakse kahte neist aritmeetiliseks loogikaüksuseks ja käsudekooderiks. Kui praegune µP-s (mikroprotsessoris) töödeldav käsk on ühe baidi pikkune, suurendavad need kaks vooluahelat järgmise käsu arvutit 1 ühiku võrra. Kui praegune µP-s töödeldav käsk on kahe baiti pikkune, mis tähendab, et see hõivab mälus kaks järjestikust baiti, suurendavad need kaks vooluringi arvutit järgmise käsu jaoks 2 ühiku võrra. Kui praegune µP-s töödeldav käsk on kolm baiti pikk, mis tähendab, et see hõivab mälus kolm järjestikust baiti, suurendavad need kaks vooluahelat järgmise käsu arvutit 3 ühiku võrra.

Akumulaator “A” on kaheksabitine üldotstarbeline register, mis salvestab enamiku aritmeetiliste ja loogiliste toimingute tulemused.

'X' ja 'Y' registreid kasutatakse programmi sammude loendamiseks. Programmeerimises algab loendamine nullist. Seega nimetatakse neid indeksregistriteks. Neil on veel mõned eesmärgid.

Kuigi Stack Pointer registris on 'S' 9 bitti, mida peetakse kaheksabitiseks registriks. Selle sisu osutab baitide asukohale muutmälu (RAM) 1. leheküljel. Leht 1 algab baidist $0100 (256 10 ) baidiks $01FF (511 10 ). Kui programm töötab, liigub see mälus ühelt käsult järgmisele käsule. See ei ole aga alati nii. Mõnikord hüppab see ühest mälupiirkonnast teise, et jätkata seal olevate juhiste järjestikust käitamist. RAM-i lehekülge 1 kasutatakse virnana. Pinn on suur RAM-i mäluala, millel on järgmised koodi jätkamise aadressid, kust on hüpe. Hüppejuhistega koode pole virnas; need on mujal mälus. Kuid pärast hüppekäskude täitmist on jätkuaadressid (mitte koodilõigud) virnas. Sinna lükati nad hüppe- või harujuhiste tulemusena.

P kaheksabitine protsessori olekuregister on registri eriliik. Üksikud bitid ei ole üksteisega seotud ega ühendatud. Igat sealset bitti nimetatakse lipuks ja seda hinnatakse teistest sõltumatult. Lippude tähendused on toodud järgnevalt vastavalt vajadusele.

Iga registri esimene ja viimane bitindeks on näidatud eelmises diagrammis iga registri kohal. Bitiindeksi (positsiooni) loendamine registris algab paremalt nullist.

Mäluleheküljed kahend-, kuueteistkümnend- ja kümnendsüsteemis
Järgmine tabel näitab mälulehtede algust kahend-, kuueteistkümnend- ja kümnendsüsteemis:

Igal lehel on 1 000 0000 2 baitide arv, mis on sama kui 100 H baitide arv, mis on sama kui 256 10 baitide arv. Eelmises mäludiagrammis on leheküljed näidatud leheküljelt 0 ülespoole ja mitte allapoole, nagu tabelis näidatud.

Selle tabeli kahend-, kuueteistkümnend- ja kümnendveerud annavad mälubaitide asukoha aadressid nende erinevates alustes. Pange tähele, et lehekülje nulli jaoks on kodeerimisel sisestamiseks vaja ainult alumise baidi bitte. Kõrgema baidi bitid võib ära jätta, kuna need on alati nullid (null lehekülje puhul). Ülejäänud lehtede puhul tuleks kasutada kõrgema baidi bitte.

Selle peatüki ülejäänud osas selgitatakse 6502 µP koostekeelt, kasutades kogu eelnevat teavet. Keele kiireks mõistmiseks peab lugeja liitma ja lahutama kümne baasi asemel kuueteistkümnes. Tegelikult peaks see olema teine ​​alus, kuid teise baasi arvutamine on tülikas. Pidage meeles, et kahe arvu lisamisel kahele alusele on kandmine endiselt 1, nagu ka kümnes. Kuid kui lahutada kaks arvu kahest alusest, on laen kaks, mitte kümme nagu kümnes. Kahe numbri liitmisel kuueteistkümnes baasis on kandenumber ikkagi 1 nagu kümnes. Kuid kui lahutada kaks arvu kuueteistkümne baasist, on laenatud kuusteist, mitte kümme nagu kümnes.

4.2 Andmeedastusjuhised

Vaadake järgmist tabelit 6502 µP montaažikeele andmeedastusjuhiste kohta:

Kui bait (8-bitine) kopeeritakse mälubaitide asukohast akumulaatoriregistrisse, X-registrisse või Y-registrisse, toimub laadimine. Kui bait kopeeritakse mõnest neist registritest mälubaitide asukohta, on see ülekandmine. Kui bait kopeeritakse ühest registrist teise, on see ikkagi ülekandmine. Tabeli teises veerus näitab nool baidi kopeerimise suunda. Ülejäänud neli veergu näitavad erinevaid adresseerimisrežiime.

Kirje adresseerimisrežiimi veerus on käsu vastava mnemoonilise osa tegelik baidikood kuueteistkümnendsüsteemis. Näiteks AE on LDX tegelik baidikood, mis laadib baiti mälust X-registrisse absoluutses adresseerimisrežiimis nagu AE. 16 = 10101110 2 . Seega on LDX-i bitid mälubaitide asukohas 10101110.

Pange tähele, et käsu LDX-i mnemoonilise osa jaoks on kolm võimalikku baiti, mis on A2, AE ja A6 ning igaüks neist on mõeldud konkreetse adresseerimisrežiimi jaoks. Kui X-registrisse laetavat baiti ei taheta mälubaitide asukohast kopeerida, tuleb väärtus sisestada käsus oleva LDX-mnemoonikaga (vahetult pärast seda) kuueteistkümnend- või kümnendsüsteemis. Selles peatükis on sellised väärtused kirjutatud kuueteistkümnendsüsteemis. See on kohene adresseerimine, seega on LDX-i tähistav mälu tegelik bait A2 16 = 10100010 2 ja mitte AE 16 mis võrdub 10101110 2 .

Tabelis nimetatakse kõiki adresseerimisrežiimi pealkirjade all olevaid baite operatsioonikoodideks, mida lühendatakse opkoodideks. Sõltuvalt adresseerimisrežiimist võib ühe märgusõna jaoks olla rohkem kui üks opkood.

Märge: Sõnal 'laadimine' arvutisüsteemiüksuses võib olla kaks tähendust: see võib viidata faili laadimisele kettalt arvuti mällu või võib viidata baidi ülekandmisele mälubaidi asukohast mikroprotsessori registrisse. .

6502 µP jaoks on rohkem adresseerimisrežiime kui tabelis toodud neli.

Kui pole öeldud teisiti, algab kogu selle peatüki kasutaja programmeerimiskood aadressilt 0200 16 mis on mälus kasutajaala algus.

Mälu M ja aku A

Mälust akumulaatorisse

Kohene adresseerimine
Järgmine juhend salvestab numbri FF 16 = 255 10 akumulaatorisse:

LDA #$FF

'$' ei kasutata ainult mäluaadressi tuvastamiseks. Üldiselt kasutatakse seda näitamaks, et järgmine number, mis järgneb, on kuueteistkümnendsüsteem. Sel juhul ei ole $FF ühegi mälubaidi asukoha aadress. See on number 255 10 kuueteistkümnendsüsteemis. Alus 16 või mõni muu sellega samaväärne alaindeks ei tohi olla koostekeele juhendis kirjutatud. '#' näitab, et kõik, mis järgneb, on akumulaatoriregistrisse sisestatav väärtus. Väärtuse võib kirjutada ka kümne alusena, kuid seda selles peatükis ei tehta. '#' tähendab viivitamatut adresseerimist.

Mnemoonikul on mõningane sarnasus sellele vastava ingliskeelse fraasiga. 'LDA #$FF' tähendab, et laadige number 255 10 akumulaatorisse A. Kuna see on vahetu adresseerimine eelmisest tabelist, on LDA A9, mitte AD või A5. A9 kahendkoodis on 101010001. Seega, kui LDA jaoks mõeldud A9 on mälus $0200 aadressis, siis $FF on $0301 = 0300 + 1 aadress. #$FF on täpselt LDA mnemoonika operaand.

Absoluutne adresseerimine
Kui $FF väärtus on mälus asukohas $0333, on eelmine juhis järgmine:

LDA 0333 dollarit

Pange tähele # puudumist. Sel juhul tähendab # puudumine, et järgneb mäluaadress, mitte huvipakkuv väärtus (mitte akumulaatorisse sisestatav väärtus). Seega on LDA opkood seekord AD, mitte A9 või A5. LDA operandiks on siin $0333 aadress, mitte $FF väärtus. $FF asub asukohas $0333, mis on üsna kaugel. Käsk “LDA $ 0333” hõivab mälus kolm järjestikust asukohta, mitte kaks, nagu eelmisel joonisel. LDA „AD” on asukohas 0200 $. Alumine bait 0333, mis on 33, asub asukohas $ 0301. $0333 kõrgem bait, mis on 03, asub asukohas $0302. See on väike endiaalsus, mida kasutab 6502 montaažikeel. Erinevate mikroprotsessorite montaažikeeled on erinevad.

See on näide absoluutsest adresseerimisest. $0333 on selle asukoha aadress, millel on $FF. Käsk koosneb kolmest järjestikusest baidist ega sisalda $FF-i ega selle tegelikku baidi asukohta.

Nulllehe adresseerimine

Oletame, et $FF väärtus on leheküljel null mälukohas $0050. Nulllehe baitide asukohad algavad $0000-st ja lõpevad $00FF-iga. Neid on 256 10 asukohti kokku. Commodore-64 mälu iga lehekülg on 256 10 pikk. Pange tähele, et kõrgem bait on null kõigi võimalike asukohtade puhul mälu null-leheküljelises ruumis. Nulllehekülje adresseerimisrežiim on sama, mis absoluutne adresseerimisrežiim, kuid kõrgemat baiti 00 ei sisestata käsusse. Seega, et laadida $FF asukohast $0050 akumulaatorisse, on nulllehekülje adresseerimisrežiimi juhis järgmine:

LDA 50 dollarit

Kui LDA on A5, mitte A9 või AD, siis A5 16 = 10100101 2 . Pidage meeles, et iga bait mälus koosneb 8 lahtrist ja igas lahtris on natuke. Siinne käsk koosneb kahest järjestikusest baidist. LDA jaoks mõeldud A5 on $0200 mälukohas ja $50 aadress, ilma suurema baidi 00ta, on asukohas $0301. 00 puudumine, mis oleks tarbinud baiti kogu 64K mälus, säästab mäluruumi.

Aku mäluks

Absoluutne adresseerimine
Järgmine juhend kopeerib baidi väärtuse, olenemata sellest, akumulaatorist mälukohta 1444 $:

Need on 1444 dollarit

Väidetavalt kandub see akumulaatorist mällu. See ei laadi. Laadimine on vastupidine. STA opkoodi bait on 8D 16 = 10001101 2 . See käsk koosneb kolmest järjestikusest mälus olevast baidist. 8D 16 asub $0200 asukohas. 44 16 $1444 aadressist asub asukohas $0201. Ja 14 16 on $0202 asukohas – vähe endiannessi. Tegelik kopeeritud bait ei kuulu juhiste hulka. STA jaoks kasutatakse siin 8D, mitte 85 nulllehekülje adresseerimiseks (tabelis).

Null lehe adresseerimine
Järgmine juhend kopeerib baidi väärtuse, olenemata sellest, akumulaatorist 0050 dollari suurusesse mälukohta leheküljel null:

STA $ 0050

STA opkoodi bait on siin 85 16 = 10000101 2 . See käsk koosneb kahest järjestikusest mälus olevast baidist. 85 16 asub asukohas $0200. 50 16 $0050 aadressist asub asukohas $0201. Endisuse küsimust siin ei kerki, sest aadressil on ainult üks bait, mis on alumine bait. Tegelik kopeeritud bait ei kuulu juhiste hulka. Siin kasutatakse STA jaoks 85 ja mitte 8D nulllehekülje adresseerimiseks.

Vahetut adresseerimist ei ole mõtet kasutada baidi ülekandmiseks akumulaatorist mõnda asukohta mälus. Selle põhjuseks on asjaolu, et tegelik väärtus, nagu $FF, tuleb kohese adresseerimise juhendis ära tuua. Seega ei ole vahetu adresseerimine võimalik baitide väärtuse ülekandmiseks µP registrist mis tahes mälukohta.

LDX, STX, LDY ja STY Mnemoonika
LDX ja STX on sarnased vastavalt LDA ja STA-ga. Kuid siin kasutatakse X-registrit, mitte A (akumulaatori) registrit. LDY ja STY on sarnased vastavalt LDA ja STA-ga. Kuid siin kasutatakse Y-registrit, mitte A-registrit. Vaadake tabelist 4.21 iga kuueteistkümnendsüsteemis opkoodi, mis vastab konkreetsele mnemoonikale ja konkreetsele adresseerimisrežiimile.

Registreeri-registrisse ülekanded
Tabelis 4.21 olevad kaks eelmist juhiste komplekti käsitlevad mälu/mikroprotsessor-registri kopeerimist (edastus) ja registri/registri kopeerimist (edastus). TAX, TXA, TAY, TYA, TSX ja TXS käsud kopeerivad (edastavad) mikroprotsessoris olevast registrist sama mikroprotsessori teise registrisse.

Baiti kopeerimiseks A-st X-sse on juhised järgmised:

MAKS

Baiti kopeerimiseks X-st A-sse on järgmine juhend:

TX

Baiti kopeerimiseks A-st Y-sse on juhised järgmised:

KÄSI

Baidi kopeerimiseks Y-st A-sse on järgmine juhend:

TYA

Commodore 64 arvuti puhul on virn 1. leht vahetult pärast lehekülge 0 mälus. Nagu iga teine ​​leht, koosneb see 25610-st 10 baitide asukohad, 0100 $ kuni 01FF $. Tavaliselt täidab programm mälus ühest käsust järgmise järjestikuse käsuni. Aeg-ajalt hüppatakse mõne teise mälukoodi (juhiste komplekti) segmendi juurde. Mälu pinualal (RAM) on järgmised käsu aadressid, kust hüpped (või hargnemised) programmi jätkamiseks pooleli jäid.

Pinu osuti 'S' on 9-bitine register 6502 µP. Esimene bitt (vasakpoolseim) on alati 1. Kõik baitide asukoha aadressid esimesel lehel algavad 1-ga, millele järgneb 8 erinevat bitti 256 jaoks 10 asukohad. Pinukursoril on 1. leheküljel oleva asukoha aadress, millel on järgmise käsu aadress, mille programm peab tagastama ja jätkama pärast praeguse (hüpatud) koodilõigu täitmist. Kuna pinu kõigi aadresside esimene bitt (esimene lehekülg) algab 1-ga, peab pinu osuti register sisaldama ainult ülejäänud kaheksa bitti. Lõppude lõpuks on selle esimene bitt, mis on kõige vasakpoolsem bitt (paremalt lugedes üheksas bitt), alati 1.

Baiti kopeerimiseks S-st X-i toimib järgmine juhend:

TSX

Baiti kopeerimiseks X-st S-sse on järgmine juhend:

TXT

Registrist registrisse juhised ei võta ühtegi operandi. Need koosnevad ainult mnemoonikast. Igal mnemoonial on oma opkood kuueteistkümnendsüsteemis. See on kaudses adresseerimisrežiimis, kuna puudub operandi (pole mäluaadressi, pole väärtust).

Märge: X-st Y-le ega Y-st X-le ülekandmist (kopeerimist) ei toimu.

4.3 Aritmeetilised tehted

Ahel, aritmeetiline loogikaühik 6502 µP-s, suudab korraga lisada ainult kaks kaheksabitist numbrit. See ei lahuta, ei korruta ega jaga. Järgmine tabel näitab aritmeetiliste toimingute opkoode ja adresseerimisrežiime.

Märge: Kõik aritmeetiliste ja muud tüüpi tehtete mnemoonikud (st kõik 6502 mnemoonika) võtavad ühe baidi operatsiooni (op) koodi. Kui märgusõna jaoks on rohkem kui üks adresseerimisrežiim, on sama mnemoonika jaoks erinevad opkoodid: üks adresseerimisrežiimi kohta. C, D ja V tabelis on olekuregistri lipud. Nende tähendused antakse hiljem, kui vajadus tekib.

Allkirjata numbrite lisamine
6502 µP puhul on märgiga numbrid kahe komplementarvud. Märgita arvud on tavalised positiivsed arvud, mis algavad nullist. Seega on kaheksabitise baidi väikseim märgita arv 00000000 2 = 0 10 = 00 16 ja suurim märgita number on 11111111 2 = 255 10 = FF 16 . Kahe märgita numbri puhul on liitmine järgmine:

A+M+C→A

See tähendab, et akumulaatori 8-bitise sisu lisab aritmeetiline loogikaüksus mälust ühele baidile (8 bitti). Pärast A ja M lisamist läheb üheksanda biti kandmine olekuregistri kandelipu lahtrisse. A ja M summale liidetakse ka kõik eelmisest liitmisest pärit eelnev kandebitt, mis on endiselt olekuregistris kandelipu lahtris, moodustades A+M+C→A. Tulemus pannakse tagasi akumulaatorisse.

Kui huvipakkuv lisamine on:

A + M

Ja eelnevat kandmist pole vaja lisada, tuleb tühjendada kandelipp, milleks tehakse 0, nii et lisamine on:

A+M+0→A sama, mis A+M→A

Märge: Kui A-le lisatakse M ja 1 kantakse, kuna tulemus on suurem kui 255 10 = 11111111 2 = FF 16 , see on uus kandevahend. See uus kande 1 saadetakse automaatselt kandelipu lahtrisse juhuks, kui seda on vaja järgmise kaheksabitise paari summeerimiseks (veel üks A + M).

Kood kahe allkirjastamata kaheksabitise lisamiseks
00111111 2 +00010101 2 on sama mis 3F 16 + 15 16 mis on sama mis 63 10 +21 10 . Tulemuseks on 010101002 2 mis on sama mis 54 16 ja 84 10 . Tulemus ei ületa kaheksa biti maksimaalset arvu, mis on 255 10 = 11111111 2 = FF 16 . Seega ei ole tulemuseks 1-i kandmist. Teisisõnu on tulemuseks 0. Enne liitmist pole 1-st varasemat kandmist. Teisisõnu, eelmine kandmine on 0. Selle lisamise kood võib olla:

CLC
LDA #$3F
ADC # $ 15

Märge: Montaažikeele tippimisel vajutatakse iga juhise lõpus klaviatuuri sisestusklahvi. Selles koodis on kolm juhist. Esimene käsk (CLC) kustutab ülekandelipu juhul, kui eelmisel lisamisel on 1. CLC-d saab teha ainult kaudses adresseerimisrežiimis. Kaudse adresseerimisrežiimi mnemoonika ei kasuta operandi. See kustutab P olekuregistri kandelahtri. Kustutamine tähendab biti 0 andmist kandelipu lahtrile. Koodi kaks järgmist juhist kasutavad vahetu adresseerimise režiimi. Vahetu adresseerimise korral on mnemoonika jaoks ainult üks operand, mis on arv (ja mitte mälu ega registri aadress). Ja nii, numbrile peab eelnema '#'. '$' tähendab, et järgnev arv on kuueteistkümnendsüsteem.

Teine käsk laadib numbri 3F 16 akumulaatorisse. Kolmanda käsu jaoks võtab µP aritmeetilise loogikaühiku ahel olekuregistri ülekandelipu lahtri 0 (sunnitud 0-ks) eelmise (tühjendatud) ülekande ja lisab selle 15-le. 16 samuti väärtusele, mis on juba 3F-is 16 akumulaatorisse ja paneb kogu tulemuse tagasi akumulaatorisse. Sel juhul on tulemuseks 0. ALU (Aritmeetiline loogikaüksus) saadab (paneb) 0 olekuregistri ülekandelipu lahtrisse. Protsessori olekuregister ja olekuregister tähendavad sama asja. Kui tulemuseks on 1 kandmine, saadab ALU olekuregistri kandelipule 1.

Eelmise koodi kolm rida peavad enne nende käivitamist mälus olema. CLC (implied addressing) opkood 1816 asub $0200 baidi asukohas. Opkood A9 16 LDA jaoks (viivitamatu adresseerimine) on $0201 baidi asukohas. Number 3F 10 on $0202 baidi asukohas. Opkood 69 16 LDA jaoks (viivitamatu adresseerimine) on $0203 baidi asukohas. Number 15 10 on $0204 baidi asukohas.

Märge: LDA on ülekande (laadimise) käsk, mitte aritmeetiline käsk (mnemoonika).

Kood kahe allkirjastamata kuueteistbitise lisamiseks
Kõik 6502 µP registrid on põhiliselt kaheksabitised registrid, välja arvatud arvuti (programmiloendur), mis on 16-bitine. Isegi olekuregister on 8 bitti lai, kuigi selle kaheksa bitti koos ei tööta. Selles jaotises vaadeldakse kahe 16 märgita biti lisamist, mille ülekandmine esimesest kaheksabitisest paarist teise kaheksabitise paarini. Siin on huvipakkuv kandmine kaheksandast bitipositsioonist üheksanda biti positsioonile.

Olgu numbrid 0010101010111111 2 = 2ABF16 16 = 10 943 10 ja 0010101010010101 2 = 2A95 16 = 10 901 10 . Summa on 0101010101010100 2 = 5554 16 = 21 844 10 .

Nende kahe märgita numbri lisamine teise alusesse on järgmine:

Järgmine tabel näitab sama lisamist 1 kandmisega kaheksandast bitist üheksanda biti positsioonile, alustades paremalt:

Selle kodeerimisel lisatakse kõigepealt kaks alumist baiti. Seejärel saadab ALU (aritmeetiline loogikaüksus) 1 ülekande kaheksandast bitipositsioonist üheksanda biti positsioonile olekuregistri kandelipu lahtrisse. Tulemus 0 1 0 1 0 1 0 0 ilma kandeta läheb akumulaatorisse. Seejärel lisatakse ülekandega teine ​​baitide paar. ADC mnemoonika tähendab automaatset lisamist eelmise ülekandega. Sel juhul ei tohi eelmist kannet, mis on 1, muuta enne teist lisamist. Esimese lisamise puhul, kuna eelnev kandmine ei ole selle täieliku lisamise osa, tuleb see kustutada (muuta nulliks).

Kahe baitide paari täielikuks lisamiseks on esimene lisamine järgmine:

A + M + 0 -> A

Teine täiendus on:

A + M + 1 -> A

Seega tuleb kandelipp tühjendada (antud väärtuseks 0) vahetult enne esimest lisamist. Järgmine programm, mille seletust lugeja peab lugema, kasutab selleks summeerimiseks absoluutset adresseerimisrežiimi:

CLC
LDA 0213 dollarit
ADC 0215 dollarit
; tühjendamist ei toimu, kuna on vaja ülekandelipu väärtust
STA 0217 dollarit
LDA 0214 dollarit
ADC 0216 dollarit
STA 0218 dollarit

Pange tähele, et 6502 montaažikeele puhul alustab kommentaari semikoolon. See tähendab, et programmi täitmisel eiratakse semikoolonit ja kõike sellest paremal olevat. Varem kirjutatud programm on tekstifailis, salvestatakse programmeerija poolt valitud nime ja laiendiga.asm. Eelmine programm ei ole täpne programm, mis täitmiseks mällu läheb. Mälus olevat vastavat programmi nimetatakse tõlgitud programmiks, kus mnemoonika asendatakse opkoodidega (baitidega). Kõik kommentaarid jäävad montaažikeele tekstifaili ja eemaldatakse enne tõlgitud programmi mällu jõudmist. Tegelikult on tänapäeval kettale salvestatud kaks faili: '.asm' fail ja '.exe' fail. „.asm” fail on sama, mis on näidatud eelmisel joonisel. Fail „.exe” on „.asm”-fail, millest on eemaldatud kõik kommentaarid ja kõik märgukirjad on asendatud nende opkoodidega. Tekstiredaktoris avatuna on .exe-fail tundmatu. Kui pole öeldud teisiti, kopeeritakse selle peatüki jaoks fail “.exe” mällu alates asukohast $ 0200. See on laadimise teine ​​tähendus.

Kaks lisatavat 16-bitist numbrit hõivavad absoluutseks adresseerimiseks mälus neli baiti: kaks baiti numbri kohta (mälu on baitide jada). Absoluutse adresseerimise korral on opkoodi operand mälus. Summeerimise tulemus on kahe baiti lai ja see tuleb samuti mällu salvestada. See annab kokku 6 10 = 6 16 baite sisendite ja väljundite jaoks. Sisendid ei pärine klaviatuurilt ja väljund ei tule monitorist ega printerist. Sisendid on mälus (RAM) ja väljund (summeerimistulemus) läheb sellises olukorras tagasi mällu (RAM).

Enne programmi käivitamist peab tõlgitud versioon olema esmalt mälus. Eelmist programmikoodi vaadates on näha, et ilma kommentaarita juhised moodustavad 19 10 = 13 16 baiti. Seega võtab programm 0200 $ baidi asukohast mälus $ 0200 + $ 13 – $ 1 = $ 0212 baiti asukohta (alates $ 0200 ja mitte $ 0201, mis tähendab - $ 1). Lisades 6 baiti sisend- ja väljundnumbrite jaoks, lõpeb kogu programm $ 0212 + $ 6 = $ 0218. Programmi kogupikkus on 19 16 = 25 10 .

Augendi alumine bait peaks olema $ 0213 aadressis ja sama augendi kõrgem bait peaks olema $ 0214 aadressil – vähe endiannessi. Samamoodi peaks addendi alumine bait asuma $ 0215 aadressis ja sama addendi kõrgem bait peaks olema $ 0216 aadressil – vähe lõppu. Tulemuse (summa) madalam bait peaks olema $0217 aadressis ja sama tulemuse kõrgem bait peaks olema $0218 aadressis – vähe endiaalsust.

Opkood 18 16 CLC (implied addressing) jaoks on baidi asukohas 0200 $. Opkood “LDA $0213”, st AD 16 LDA (absoluutne adresseerimine) jaoks on baitide asukohas $0201. Augendi alumine bait, mis on 10111111, asub mälubaitide asukohas $0213. Pidage meeles, et iga opkood võtab enda alla ühe baidi. 'LDA $0213' aadress '$0213' on $0202 ja $0203 baitide asukohtades. Käsk “LDA $0213” laadib akumulaatorisse augendi alumise baidi.

Opkood “ADC $0215”, st 6D 16 ADC jaoks (absoluutne adresseerimine) on baitide asukohas $0204. Addendi alumine bait, mis on 10010101, asub 0215 $ baidi asukohas. ADC $0215 aadress '$0215' on $0205 ja $0206 baitide asukohtades. Käsk “ADC $0215” lisab lisamise alumise baidi juba akumulaatoris oleva augendi alumisele baidile. Tulemus asetatakse tagasi akumulaatorisse. Igasugune edastus pärast kaheksandat bitti saadetakse olekuregistri kandelipule. Kandelipu lahtrit ei tohi enne kõrgemate baitide teist lisamist tühjendada. See kandmine lisatakse automaatselt kõrgemate baitide summale. Tegelikult lisatakse CLC tõttu alumiste baitide summale automaatselt alguses kandev 0 (võrdub ülekande puudumisega).

Kommentaar võtab järgmised 48 10 = 30 16 baiti. See jääb aga ainult tekstifaili '.asm'. Mällu see ei jõua. Selle eemaldab tõlge, mille teeb koostaja (programm).

Järgmise juhise jaoks, milleks on “STA $0217”, on STA opkood, mis on 8D 16 (absoluutne adresseerimine) asub $0207 baidi asukohas. 'STA $0217' aadress '$0217' asub mälukohtades $0208 ja $0209. Käsk “STA $0217” kopeerib akumulaatori kaheksabitise sisu mälukohta $0217.

Augendi kõrgem bait, mis on 00101010, asub mälu asukohas $0214 ja addendi kõrgem bait, mis on 00101010, asub $02 baidi asukohas 16 . Opkood “LDA $0214”, mis on AD16 jaoks LDA (absoluutne adresseerimine), asub $020A baidi asukohas. LDA $0214 aadress '$0214' asub $020B ja $020C asukohtades. Käsk “LDA $0214” laadib akumulaatorisse augendi kõrgema baidi, kustutades kõik, mis akumulaatoris on.

Opkood 'ADC $0216', mis on 6D 16 ADC jaoks (absoluutne adresseerimine) on baitide asukohas $020D. ADC 0216 aadress '$0216' on $020E ja $020F baitide asukohtades. Käsk “ADC $0216” lisab addendi kõrgema baidi juba akumulaatoris oleva augendi kõrgemale baidile. Tulemus asetatakse tagasi akumulaatorisse. Kui on kandev 1, siis selle teise lisamise korral paigutatakse see automaatselt olekuregistri kandelahtrisse. Ehkki selle probleemi jaoks pole ülekandmine kuueteistkümnendast bitist (vasakul) nõutav, on tore kontrollida, kas kande 1 toimus, kontrollides, kas kandelipp sai 1.

Järgmise ja viimase käsu puhul, milleks on “STA $0218”, asub STA opkood, mis on 8D16 (absoluutne adresseerimine), baitide asukohas $0210. 'STA $0218' aadress '$0218' asub mälukohtades $0211 ja $0212. Käsk “STA $0218” kopeerib akumulaatori kaheksabitise sisu mälukohta $0218. Kahe kuueteistkümnebitise numbri liitmise tulemus on 0101010101010100, kusjuures alumine bait 01010100 on mälukohas 0217 $ ja kõrgem bait 01010101 mälukohas $ 0218 – vähe endiaalsust.

Lahutamine
6502 µP puhul on märgiga numbrid kahe komplementarvud. Kahe komplementarv võib olla kaheksabitine, kuueteistkümnebitine või kaheksa biti kordne. Kahe täiendi korral on esimene bitt vasakult märgibitt. Positiivse arvu korral on see esimene bitt märgi tähistamiseks 0. Ülejäänud bitid moodustavad arvu tavapärasel viisil. Negatiivse arvu kahe täiendi saamiseks pöörake kõik vastava positiivse arvu bitid ümber ja lisage tulemusele parempoolsest otsast 1.

Ühe positiivse arvu lahutamiseks teisest positiivsest arvust teisendatakse alamosa kahekomplemendi negatiivseks arvuks. Seejärel lisatakse minuend ja uus negatiivne arv tavapärasel viisil. Seega muutub kaheksabitine lahutamine:

Kus kannet eeldatakse kui 1. Tulemus akumulaatoris on kahe täiendi erinevus. Seega tuleb kahe arvu lahutamiseks määrata kandelipp (muuta 1-ks).

Kahe kuueteistkümnebitise arvu lahutamisel tehakse lahutamine kaks korda nagu kahe kuueteistkümnebitise arvu liitmisel. Kuna lahutamine on 6502 µP liitmise vorm, määratakse kahe kuueteistkümnebitise arvu lahutamisel kandelipp esimese lahutamise jaoks ainult üks kord. Teise lahutamise korral tehakse ülekandelipu mis tahes seadistus automaatselt.

Kaheksabitiste arvude või kuueteistkümnebitiste arvude lahutamise programmeerimine toimub sarnaselt liitmise programmeerimisega. Kandelipp tuleb aga paika panna kohe alguses. Selle mnemoonika on järgmine:

Kuueteistbitiste positiivsete numbritega lahutamine
Mõelge lahutamisele järgmiste arvudega:

See lahutamine ei hõlma kahe täiendit. Kuna 6502 µP lahutamine toimub kahe komplemendis, tehakse kahe aluse lahutamine järgmiselt:

Nende kahe komplemendi tulemus on sama, mis saadakse tavalisest lahutamisest. Kuid pange tähele, et 1, mis läheb paremalt seitsmeteistkümnendale bitipositsioonile, eiratakse. Minuend ja alamosa jagunevad kumbki kaheks kaheksaks bitiks. Alamosa madalama baidi kahe komplement 10010110 määratakse sõltumatult selle kõrgemast baidist ja ülekandest. Alamosa kõrgema baidi kahe komplement 11101011 määratakse sõltumatult selle alumisest baidist ja ülekandest.

Minuendi 16-bitised on juba kahes täienduses, alustades 0-st vasakult. Seega ei vaja see bittide kaupa reguleerimist. 6502 µP puhul lisatakse minuendi alumine bait ilma muudatusteta alamlahendi kahe komplemendi alumisele baidile. Minuendi alumist baiti ei teisendata kahe komplemendiks, sest terve minuendi kuusteist bitti peavad olema juba kahe komplemendis (vasakul esimeseks bitiks on 0). Selle esimese lisamise korral lisatakse 1 = 0 SEC juhise tõttu kohustuslik edasikandmine.

Praeguses efektiivses lahutamises toimub 1 (liitmise) kande kaheksandast bitist üheksanda bitini (paremalt). Kuna see on tegelikult lahutamine, täiendatakse (pööratakse) mis tahes bitti, mis peaks olema olekuregistri ülekandelipus. Seega muutub 1 kandmine C-lipus nulliks. Teises toimingus lisatakse minuendi kõrgem bait alamlahendi kahe kõrgema komplementbaidile. Samuti lisatakse (kõrgematele baitidele) automaatselt täiendatud olekuregistri ülekandelipu bitt (antud juhul on see 0). Iga 1, mis läheb paremalt kuueteistkümnendast bitist kaugemale, ignoreeritakse.

Järgmine asi on lihtsalt kogu see skeem järgmiselt kodeerida:

SEC
LDA 0213 dollarit
SBC 0215 dollarit
; tühjendamata, kuna vaja on ümberpööratud ülekandelipu väärtust
STA 0217 dollarit
LDA 0214 dollarit
SBC 0216 dollarit
STA 0218 dollarit

Pidage meeles, et koostekeelega 6502 alustab semikoolon kommentaari, mis ei sisaldu mällu tõlgitud programmi versioonis. Kaks 16-bitist arvu lahutamiseks võtavad absoluutse adresseerimisega mälust neli baiti; kaks numbri kohta (mälu on baitide jada). Need sisendid ei tule klaviatuurilt. Summeerimise tulemuseks on kaks baiti ja see tuleb samuti mällu paigutada teise kohta. See väljund ei lähe monitorile ega printerile; see läheb mällu. See annab kokku 6 10 = 6 16 baite sisendite ja väljundi jaoks, mis paigutatakse mällu (RAM).

Enne programmi käivitamist peab see olema mälus. Programmikoodi vaadates on näha, et ilma kommentaarita juhised moodustavad 19 10 = 13 16 baiti. Kuna kõik selles peatükis olevad programmid algavad mälukohast $0200, liigub programm $0200 baidi asukohast mälus $0200 + $13 – $1 = $0212 baidi asukohani (alates $0200 ja mitte $0201). See vahemik ei sisalda sisend- ja väljundbaitide piirkonda. Kaks sisendnumbrit võtavad 4 baiti ja üks väljundnumber 2 baiti. Sisend- ja väljundnumbrite 6 baiti lisamine muudab programmi vahemiku, mis lõpeb $ 0212 + $ 6 = $ 0218. Programmi kogupikkus on 19 16 = 25 10 .

Minuendi alumine bait peaks olema $0213 aadressis ja sama minuendi kõrgem bait peaks olema $0214 aadressis – vähe endiaalsust. Samamoodi peaks alamjaotuse alumine bait olema aadressis $ 0215 ja sama alamlahendi kõrgem bait peaks olema aadressis $ 0216 – vähe lõppu. Tulemuse madalam bait (erinevus) peaks olema $0217 aadressis ja sama tulemuse kõrgem bait peaks olema $0218 aadressis – vähe endiaalsust.

Opkood 38 16 SEC (implied addressing) jaoks on aadressis 0200 $. Eeldatakse, et kõik selles peatükis olevad programmid algavad mälukohast $0200, tühistades kõik programmid, mis seal oleksid olnud; kui pole öeldud teisiti. Opkood “LDA $0213”, st AD 16 , LDA (absoluutne adresseerimine) on $0201 baidi asukohas. Minuendi alumine bait, mis on 10111111, asub mälubaitide asukohas $0213. Pidage meeles, et iga opkood võtab enda alla ühe baidi. 'LDA $0213' aadress '$0213' on $0202 ja $0203 baitide asukohtades. Käsk “LDA $0213” laadib akumulaatorisse minuendi alumise baidi.

Opkood 'SBC $0215', st ED 16 , SBC (absoluutne adresseerimine) on $0204 baidi asukohas. Alamosa alumine bait, mis on 01101010, asub $0215 baidi asukohas. ADC $0215 aadress '$0215' on $0205 ja $0206 baitide asukohtades. Käsk “SBC $0215” lahutab alamosa alumise baidi juba akumulaatoris oleva minuendi alumisest baidist. See on kahe komplemendi lahutamine. Tulemus asetatakse tagasi akumulaatorisse. Mis tahes ülekande komplement (inversioon) pärast kaheksandat bitti saadetakse olekuregistri kandelipule. Seda kandelippu ei tohi tühjendada enne teist lahutamist suuremate baitidega. See kandmine lisatakse automaatselt kõrgemate baitide lahutamisele.

Kommentaar võtab järgmised 57 10 = 3916 16 baiti. See jääb aga ainult tekstifaili '.asm'. Mällu see ei jõua. Selle eemaldab tõlge, mille teeb koostaja (programm).

Järgmise juhise jaoks, mis on “STA $0217”, on STA opkood, st 8D 16 (absoluutne adresseerimine), asub $0207 baidi asukohas. 'STA $0217' aadress '$0217' asub mälukohtades $0208 ja $0209. Käsk “STA $0217” kopeerib akumulaatori kaheksabitise sisu mälukohta $0217.

Minuendi kõrgem bait, mis on 00101010, asub mälukohas $0214 ja alamlahendi kõrgem bait, mis on 00010101, asub $0216 baidi asukohas. Opkood “LDA $0214”, st AD 16 LDA (absoluutne adresseerimine) jaoks on $020A baidi asukohas. LDA $0214 aadress '$0214' asub $020B ja $020C asukohtades. Käsk “LDA $0214” laadib akumulaatorisse minuendi kõrgema baidi, kustutades kõik, mis akumulaatoris on.

Opkood 'SBC $0216', st ED 16 SBC (absoluutne adresseerimine) jaoks on $020D baidi asukohas. SBC $0216 aadress '$0216' on $020E ja $020F baitide asukohtades. Käsk 'SBC $0216' lahutab alamosa kõrgema baidi juba akumulaatoris olevast minuendi kõrgemast baidist (kahe täiendist). Tulemus asetatakse tagasi akumulaatorisse. Kui selle teise lahutamise jaoks on kandev 1, paigutatakse selle komplement automaatselt olekuregistri kandelahtrisse. Kuigi selle probleemi lahendamiseks ei nõuta ülekandmist kuueteistkümnendast bitist (vasakul) kaugemale, on tore kontrollida, kas komplemendi kandmine toimub, kontrollides kandelippu.

Järgmise ja viimase juhise jaoks, milleks on “STA $0218”, on STA opkood, st 8D 16 (absoluutne adresseerimine), asub $0210 baidi asukohas. 'STA $0218' aadress '$0218' asub mälukohtades $0211 ja $0212. Käsk “STA $0218” kopeerib akumulaatori kaheksabitise sisu mälukohta $0218. Kahe kuueteistkümnebitise arvuga lahutamise tulemus on 0001010101010101, mille alumine bait on 01010101 mälukohas $0217 ja kõrgem bait 00010101 mälukohas $0218 – vähe lõputust.

6502 µP-l on vooluring ainult liitmiseks ja kaudselt kahe komplemendi lahutamiseks. Sellel pole korrutamise ja jagamise skeemi. Korrutamise ja jagamise tegemiseks tuleks kirjutada assemblerkeele programm detailidega, sh osakorrutite nihutamine ja osadividendid.

4.4 Loogilised toimingud

6502 µP puhul on OR märgusõnaks ORA ja eksklusiivse VÕI märgusõnaks EOR. Pange tähele, et loogilistel operatsioonidel puudub kaudne adresseerimine. Kaudne adresseerimine ei võta operandi. Iga loogiline operaator peab võtma kaks operandi. Esimene on akumulaatoris ja teine ​​on mälus või juhises. Tulemus (8-bitine) on tagasi akumulaatorisse. Esimene akumulaatoris pannakse sinna kas kohese käsuga või kopeeritakse mälust absoluutse adresseerimisega. Selles jaotises kasutatakse illustratsiooniks ainult null-lehekülje aadressi. Need loogilised operaatorid on kõik Bitwise operaatorid.

JA
Järgmine tabel illustreerib bitipõhist JA binaarset, kuueteistkümnendsüsteemi ja kümnendsüsteemi.

Kõik selle peatüki programmid peaksid algama mälubaitide asukohast 0200 $. Selle jaotise programmid on aga nullleheküljel, eesmärgiga illustreerida lehekülje nulli kasutamist ilma suurema baidita 00000000 2 . Eelmise AND-i võib kodeerida järgmiselt:

LDA #$9A ; mitte mälu järgi – kohene adresseerimine
JA #$CD ; mitte mälu järgi – kohene adresseerimine
STA $ 30 ; kauplustes 88 dollarit nullipõhiselt 0030 dollariga

VÕI
Järgmine tabel illustreerib bitipõhist VÕI kahend-, kuueteistkümnend- ja kümnendsüsteemis:

LDA #$9A ; mitte mälu järgi – kohene adresseerimine
ORA #$CD ; mitte mälu järgi – kohene adresseerimine
STA $ 30 ; kauplustes $CF nullipõhiselt $0030

TASUTA
Järgmine tabel illustreerib bitipõhist XOR-i kahend-, kuueteistkümnend- ja kümnendsüsteemis:

LDA #$9A ; mitte mälu järgi – kohene adresseerimine
EOR #$CD ; mitte mälu järgi – kohene adresseerimine
STA $ 30 ; kauplustes 57 dollarit nullipõhiselt 0030 dollariga

4.5 Nihutamise ja pööramise toimingud

Nihutamise ja pööramise operaatorite mnemoonika ja opkoodid on järgmised:

ASL: nihutage akumulaatorist või mäluasukohast ühe biti võrra vasakule, sisestades 0 vabasse parempoolsemasse lahtrisse.

LSR: nihutage akumulaatori või mälu asukoha biti võrra paremale, sisestades 0 vabasse vasakpoolsemasse lahtrisse.
ROL: pöörake akumulaatorist või mälukohast üks bitt vasakule, sisestades vasakult väljalangenud biti vabasse parempoolsemasse lahtrisse.
ROR: pöörake akumulaatorist või mälukohast üks bitt paremale, sisestades paremalt väljalangenud biti kõige vabamasse vasakpoolsemasse lahtrisse.

Akuga nihutamiseks või pööramiseks on juhised umbes sellised:

LSR A

See kasutab teist adresseerimisrežiimi, mida nimetatakse akumulaatori adresseerimisrežiimiks.

Baitimälu asukohaga nihutamiseks või pööramiseks on juhis umbes selline:

ROR $ 2BCD

Kus 2BCD on mälukoht.

Pange tähele, et nihutamiseks või pööramiseks pole vahetut ega kaudset adresseerimisrežiimi. Vahetu adresseerimisrežiim puudub, sest pole mõtet nihutada või pöörata numbrit, mis jääb ainult käsusse. Puudub kaudne adresseerimisrežiim, kuna 6502 µP disainerid soovivad, et nihutaks või pöörataks ainult akumulaatori (A-registri) sisu või mälubaitide asukohta.

4.6 Suhteline adresseerimisrežiim

Mikroprotsessor suurendab alati (1, 2 või 3 ühiku võrra) programmiloendurit (PC), et osutada järgmisele täidetavale käsule. 6502 µP-l on käsk, mille mnemoonika on BVS, mis tähendab ülevoolukomplekti haru. Arvuti koosneb kahest baidist. See käsk põhjustab arvutil erineva mäluaadressi järgmise käsu täitmiseks, mis ei tulene tavalisest juurdekasvust. See teeb seda, lisades või lahutades arvuti sisule väärtuse, mida nimetatakse nihkeks. Ja nii, arvuti osutab seejärel teisele (hargnenud) mälukohale, et arvuti saaks sealt täitmist jätkata. Nihe on täisarv alates -128 10 kuni +127 10 (kahe täiendus). Seega võib nihe mälus hüppe edasi viia. Kui see on positiivne või mälus maha jäänud või kui see on negatiivne.

BVS-käsk võtab ainult ühe operandi, mis on nihe. BVS kasutab suhtelist adresseerimist. Kaaluge järgmist juhist:

BVS $ 7F

Teises baasis 7F H on 01111111 2 = 127 10 . Oletame, et järgmise juhise arvuti sisu on 0300 dollarit. BVS-i juhis põhjustab $ 7F (positiivne arv juba kahe täienduses) lisamise $ 0300-le, et saada $ 037 F. Nii et järgmise käsu asemel, mis tuleb täita mälukohas $0300, asub see mälukohas $037F (ligikaudu poole lehekülje erinevus).

On ka teisi harujuhiseid, kuid BVS on väga hea kasutada suhtelise adresseerimise illustreerimiseks. Suhteline adresseerimine tegeleb harujuhistega.

4.7 Indekseeritud adresseerimine ja kaudne adresseerimine eraldi

Need adresseerimisrežiimid võimaldavad 6502 µP-l töödelda lühikese aja jooksul tohutuid andmemahtusid, vähendades käskude arvu. Kogu Comodore-64 mälu jaoks on 64 KB asukohad. Seega, et pääseda juurde mis tahes 16-bitise baidi asukohale, on vaja teha kaks baiti. Ainus erand kahe baidi vajadusest on lehekülg null, kus kõrgem bait $00 jäetakse välja, et säästa ruumi, mille käsk mälus võtab. Mitte-lehe-null-aadressirežiimi puhul on 16-bitise mäluaadressi kõrgemad ja madalamad baidid enamasti kuidagi näidatud.

Põhiline indekseeritud adresseerimine

Absoluutne indeksaadress
Pidage meeles, et X- või Y-registrit nimetatakse indeksiregistriks. Kaaluge järgmist juhist:

LDA $ C453,X

Oletame, et väärtus 6 H on X registris. Pange tähele, et 6 ei ole juhendis kuskil kirjas. See juhis lisab C453-le 6H väärtuse H mis on osa veel koostatavas tekstifailis trükitud käsust – C453 H + 6 H = C459 H . LDA tähendab baidi laadimist akumulaatorisse. Akumulaatorisse laaditav bait pärineb $C459 aadressilt. $ C459, mis on $ C453 summa, mis sisestatakse koos juhisega ja 6 H X-registris leiduvast saab efektiivseks aadressiks, kust pärineb akumulaatorisse laaditav bait. Kui 6 H oli Y-registris, juhendis kirjutatakse X asemele Y.

Trükitud käsulauses tuntakse $C453 baasaadressina ja 6 H X- või Y-registris tuntakse tegeliku aadressi loendus- või indeksiosa. Põhiaadress võib viidata mis tahes baitaadressile mälus ja järgmisele 256-le 10 aadressidele pääseb juurde, eeldades, et X- või Y-registri alustatud indeks (või arv) on 0. Pidage meeles, et üks bait võib anda pideva vahemiku kuni 256 10 numbrid (st 00000000 2 numbrile 11111111 2 ).

Seega lisab absoluutne adresseerimine selle, mis on X- või Y-registris juba pandud (mis on teise käsuga pandud), 16-le aadressile, mis sisestatakse koos käsuga, et saada efektiivne aadress. Trükitavas käsus eristatakse kahte indeksiregistrit X või Y, mis kirjutatakse koma järele. Trükitakse kas X või Y; mitte mõlemat.

Pärast seda, kui programm on tekstiredaktorisse tippitud ja laiendiga '.asm' salvestatud, peab assembler, mis on teine ​​programm, tõlkima trükitud programmi mällu (laaditud) mällu. Eelmine käsk, milleks on “LDA $C453,X”, hõivab mälus kolm baiti, mitte viis.

Pidage meeles, et mnemoonikul, nagu LDA, võib olla rohkem kui üks opkood (erinevad baidid). X-registrit kasutava käsu opkood erineb Y-registrit kasutavast opkoodist. Assembler teab, millist opkoodi kasutada trükitud juhise põhjal. „LDA $C453,X” ühebaidine opkood erineb ühebaidisest opkoodist „LDA $C453,Y”. Tegelikult on „LDA $C453,X” LDA opkood BD ja LDA opkood „LDA $C453,9” puhul on BD.

Kui LDA opkood asub $0200 baidi asukohas. Seejärel võtab $C453 16-bitine aadress baitide asukohad mälus, mis on $0201 ja $0202, kõrval. Konkreetne opkoodi bait näitab, kas tegemist on X- või Y-registriga. Ja nii, kokkupandud keelejuhised, mis on 'LDA $C453,X' või 'LDA $C453,Y', hõivavad mälus kolm järjestikust baiti, mitte neli või viis.

Nulllehe indekseeritud adresseerimine
Nulllehe indeksi adresseerimine sarnaneb absoluutse indeksi adresseerimisega, mida on eelnevalt kirjeldatud, kuid sihtbait peab olema ainult nullleheküljel (0000 $ kuni 00 FF). Nüüd, kui käsitletakse nulllehte, siis kõrgem bait, mis on alati 00 H mälukohtade jaoks tavaliselt välditakse. Seega mainitakse tavaliselt, et nullleht algab 00 dollarist FF-i. Ja nii, 'LDA $C453,X' eelmine juhend on järgmine:

LDA 53,X $

$C4, kõrgemat baiti, mis viitab lehele, mis asub lehekülje nullist kõrgemal, ei saa selles juhises kasutada, kuna see asetab eeldatava sihtbaidi laaditavasse akumuleeritud baiti väljaspool ja üle lehe nulli.

Kui käsus sisestatud väärtus lisatakse indeksiregistri väärtusele, ei tohiks summa anda tulemust üle lehekülje nulli (FF H ). Seega ei tule kõne allagi sellise juhise olemasolu nagu 'LDA $FF, X' ja väärtus nagu FF H indeksiregistris, sest FF H + FF H = 200 H mis on 2. lehekülje (kolmanda lehe) esimene bait (0200 dollarit) mälus, on leheküljest 0 suurel kaugusel. Seega peab nulllehekülje indekseeritud adresseerimise korral tegelik aadress asuma leheküljel null.

Kaudne adresseerimine

Hüppa absoluutne adresseerimine
Enne absoluutse kaudse adresseerimise üle arutlemist on hea vaadata esmalt JMP absoluutset adresseerimist. Oletame, et huvipakkuva väärtusega aadress (sihtbait) on 8765 $. See on 16-bitine, mis koosneb kahest baidist: kõrgem bait, mis on 87 H ja alumine bait, mis on 65 H . Niisiis, kaks baiti 8765 dollari eest pannakse arvutisse (programmiloendur) järgmise juhise jaoks. Assembly keele programmi (faili) sisestatakse järgmine:

JMP 8765 dollarit

Mälus olev täitmisprogramm hüppab mis tahes aadressilt, millele see juurde pääses, 8765 dollarile. JMP märgukirjal on kolm opkoodi, mis on 4C, 6C ja 7C. Selle absoluutse adresseerimise opkood on 4C. JMP absoluutse kaudse adresseerimise opkood on 6C (vt järgmisi jooniseid).

Absoluutne kaudne adresseerimine
Seda kasutatakse ainult hüppejuhisega (JMP). Oletame, et aadress, millel on huvipakkuv bait (sihtbait), on 8765 $. See on 16-bitine, mis koosneb kahest baidist: kõrgem bait, mis on 87 H ja alumine bait, mis on 65 H . Absoluutse kaudse adresseerimise korral asuvad need kaks baiti tegelikult kahes järjestikuses baitide asukohas mujal mälus.

Oletame, et need asuvad mälukohtades $0210 ja $0211. Seejärel huvipakkuva aadressi alumine bait, mis on 65 H on $0210 aadressis ja kõrgem bait, mis on 87 H asub aadressil $0211. See tähendab, et madalam huvipakkuv mälubait läheb madalamale järjestikusele aadressile ja suurem huvipakkuv mälubait läheb kõrgemale järjestikusele aadressile – vähe endiaalsust.

16-bitine aadress võib viidata kahele järjestikusele mälus olevale aadressile. Selles valguses viitab $0210 aadress aadressidele $0210 ja $0211. Aadressipaar $0210 ja $0211 sisaldab sihtbaidi lõplikku aadressi (16 bitti kahest baidist), alumine bait on 65 H 0210 $ ja kõrgem bait 87 H 0211 dollaris. Niisiis, hüppejuhis, mis trükitakse, on järgmine:

JMP (0210 dollarit)

JMP märgukirjal on kolm opkoodi, mis on 4C, 6C ja 7C. Absoluutse kaudse adresseerimise opkood on 6C. Tekstifaili kirjutatakse 'JMP ($ 0210)'. Sulgude tõttu kasutab koostaja (tõlkija) JMP jaoks opkoodi 6C, mitte 4C või 7C.

Absoluutse kaudse adresseerimise korral on tegelikult kolm mälupiirkonda. Esimene piirkond võib koosneda baitide asukohtadest $ 0200, $ 0201 ja $ 0202. Sellel on kolm baiti käsu 'JMP ($ 0210)' jaoks. Teine piirkond, mis ei pruugi olla esimese kõrval, koosneb kahest järjestikusest baidi asukohast $ 0210 ja $ 0211. Siin on alumine bait (0210 $), mis sisestatakse montaažikeele programmi juhistesse. Kui huvipakkuv aadress on 8765 dollarit, siis alumine bait 65 H on $0210 baidi asukohas ja kõrgem bait 87 H on $0211 baidi asukohas. Kolmas piirkond koosneb vaid ühe baidi asukohast. See on sihitud baidi (huvipakkuv viimane bait) aadress 8765 dollarit. Järjestikuste aadresside paar, $ 0210 ja $ 0211, hoiab kursorit $ 8765, mis on huvipakkuv aadress. Pärast arvutuslikku tõlgendamist läheb sihtbaidile juurdepääsuks arvutisse (programmiloendur) 8765 dollarit.

Nulllehe kaudne adresseerimine
See adresseerimine on sama, mis absoluutne kaudne adresseerimine, kuid kursor peab olema leheküljel null. Osutipiirkonna alumise baidi aadress on trükitud käsus järgmine:

JMP (50 dollarit)

Kursori kõrgem bait asub $51 baidi asukohas. Tõhus aadress (suunatud) ei pea olema leheküljel null.

Seega lisatakse indeksaadressi korral indeksiregistri väärtus baasaadressile, mis on antud käsus tõhusa aadressi omamiseks. Kaudne adresseerimine kasutab kursorit.

4.8 Indekseeritud kaudne adresseerimine

Absoluutne indekseeritud kaudne adresseerimine
Seda adresseerimisrežiimi kasutatakse ainult JMP käsuga.
Absoluutse kaudse adresseerimise korral on terav väärtus (bait) oma kahe järjestikuse baidiaadressiga. Need kaks järjestikust aadressi moodustavad kursori, mis asub mälus kahe järjestikuse baidi osuti piirkonnas. Osutipiirkonna alumine bait on see, mis on kirjutatud sulgudes olevas juhises. Kursor on suunatud väärtuse aadress. Eelmises olukorras on 8765 dollarit teravdatud väärtuse aadress. $0210 (järgneb $0211) on aadress, mille sisu on $8765, mis on osuti. Absoluutse kaudse adresseerimisrežiimi korral sisestatakse programmi (tekstifaili) see (0210 dollarit), sealhulgas sulgudesse.

Teisest küljest moodustatakse absoluutse indekseeritud kaudse adresseerimisrežiimi korral osutipiirkonna alumine aadressibait, lisades trükitud aadressile X-registris oleva väärtuse. Näiteks kui kursor asub aadressi asukohas $0210, võib trükitud käsk olla umbes selline:

JMP (020 A, X $)

Kui X-registri väärtus on 6 H . 020A H + 6 H = 0210 H . Selle adresseerimisrežiimiga Y-registrit ei kasutata.

Nulllehe indekseeritud kaudne adresseerimine
See adresseerimisrežiim kasutab X-registrit, mitte Y-registrit. Selle adresseerimisrežiimi korral on selle kahebaidise aadressikursori piirkonnas endiselt terav väärtus ja kursor. Kursori jaoks peab nullleheküljel olema kaks järjestikust baiti. Aadress, mis juhisesse sisestatakse, on ühebaidine aadress. See väärtus lisatakse X-registris olevale väärtusele ja kõik kanded jäetakse kõrvale. Tulemus osutab kursoripiirkonnale leheküljel 0. Näiteks kui huvipakkuv (osutatud) aadress on 8765 $ ja see asub lehekülje 0 baitide asukohtades $50 ja $51 ning väärtus X-registris on $30, trükitud juhis on umbes selline:

LDA (20,X dollarit)

Sest $20 + $30 = $50.

Kaudne indekseeritud adresseerimine
See adresseerimisrežiim kasutab Y-registrit, mitte X-registrit. Selle adresseerimisrežiimi korral on endiselt olemas osutatav väärtus ja osuti piirkond, kuid osutipiirkonna sisu toimib erinevalt. Kursori piirkonna jaoks peab nullleheküljel olema kaks järjestikust baiti. Kursori piirkonna alumine aadress kirjutatakse juhendisse. See arv (baitide paar), mis sisaldub osuti piirkonnas, lisatakse Y-registri väärtusele, et saada tegelik kursor. Näiteks olgu huvipakkuv (suunatud) aadress 8765 dollarit, 6H väärtus Y-registris ja number (kaks baiti) aadressil 50 H ja 51 H . Kaks baiti koos on $ 875 F, kuna $ 875 F + $ 6 = $ 8765. Trükitud juhis on umbes selline:

LDA (50 dollarit), Y

4.9 Juhised suurendamise, vähendamise ja test-BIT-ide kohta

Järgmine tabel näitab suurendamise ja vähendamise juhiste toiminguid:

INA ja DEA suurendavad ja vähendavad vastavalt akumulaatorit. Seda nimetatakse akumulaatori adresseerimiseks. INX, DEX, INY ja DEY on vastavalt X- ja Y-registrite jaoks. Nad ei võta ühtegi operandi. Seega kasutavad nad kaudset adresseerimisrežiimi. Kasv tähendab 1 lisamist registrisse või mälubaiti. Vähendamine tähendab 1 lahutamist registrist või mälubaidist.

INC ja DEC suurendavad ja vähendavad vastavalt mälubaiti (ja mitte registrit). Null-lehe adresseerimise kasutamine absoluutse adresseerimise asemel on käsu mälu säästmiseks. Lehekülje nullaadress on üks bait väiksem kui mällu salvestatud käsu absoluutaadress. Lehe nullaadressi režiim mõjutab aga ainult nulli lehekülge.

BIT-käsk testib mälus oleva baidi bitte akumulaatoris oleva 8 bitiga, kuid ei muuda kumbagi. Seadistatud on ainult mõned protsessori olekuregistri lipud “P”. Määratud mälukoha bitid jagatakse loogiliselt JA akumulaatori omadega. Seejärel määratakse järgmised olekubitid:

  • N, mis on olekuregistri bitt 7 ja viimane bitt (vasakul), võtab enne JA-i andmist vastu mälukoha biti 7.
  • V, mis on olekuregistri bitt 6, võtab vastu mälukoha biti 6 enne JA-i.
  • Olekuregistri Z lipp seatakse (tehtud 1), kui JA tulemus on null (00000000 2 ). Vastasel korral see kustutatakse (tehtud 0).

4.10 Võrdle juhiseid

Võrdlevad juhised 6502 µP jaoks on CMP, CPX ja CPY. Pärast iga võrdlust mõjutavad protsessori olekuregistri “P” lipud N, Z ja C. N lipp seatakse (tehtud 1), kui tulemuseks on negatiivne arv. Z-lipp seatakse (tehtud 1), kui tulemuseks on null (000000002). C-lipp seatakse (tehtud 1), kui toimub ülekanne kaheksast üheksanda bitti. Järgmine tabel annab üksikasjaliku illustratsiooni

Tähendab 'suurem kui'. Sellega seoses peaks võrdlustabel olema iseenesestmõistetav.

4.11 Hüppamise ja hargnemise juhised

Järgmine tabel võtab kokku hüppe ja hargnemise juhised:

JMP juhis kasutab absoluutset ja kaudset adresseerimist. Ülejäänud tabelis olevad juhised on harujuhised. Nad kasutavad ainult suhtelist adresseerimist 6502 µP puhul. Sellega muutub tabel iseenesestmõistetavaks, kui seda lugeda vasakult paremale ja ülalt alla.

Pange tähele, et harusid saab rakendada ainult aadressidele, mis asuvad antud aadressist vahemikus -128 kuni +127 baiti. See on suhteline adresseerimine. Nii JMP kui ka haru käskude puhul mõjutab see otseselt programmiloendurit (PC). 6502 µP ei võimalda harusid absoluutsele aadressile, kuigi hüpe võib teha absoluutse adresseerimise. JMP käsk ei ole harukäsk.

Märge: Suhtelist adresseerimist kasutatakse ainult harujuhistega.

4.12 Virna ala

Alamprogramm on nagu üks eelmistest lühiprogrammidest kahe arvu liitmiseks või kahe arvu lahutamiseks. Mälu pinuala algab 0100 $ kuni $ 01FF (kaasa arvatud). Seda piirkonda nimetatakse lihtsalt virnaks. Kui mikroprotsessor sooritab hüppe alamprogrammi käsule (JSR – vaadake järgmist arutelu), peab ta pärast lõpetamist teadma, kuhu pöörduda. 6502 µP hoiab seda teavet (tagastusaadressi) madalas mälus vahemikus $ 0100 kuni $ 01FF (pinu ala) ja kasutab viimati tagastatud aadressi viimana (9 bitti) pinu osuti registri sisu, mis on mikroprotsessoris 'S'. mis on salvestatud mälu lehele 1 ($0100 kuni $01FF). Pinn kasvab alates $ 01FF-st ja võimaldab pesastada alamprogramme kuni 128 taseme sügavusele.

Teine pinukursori kasutusala on katkestuste käsitlemine. 6502 µP tihvtid on tähistatud kui IRQ ja NMI. Võimalik, et nendele tihvtidele rakendatakse mõningaid väikeseid elektrilisi signaale, mis võivad põhjustada 6502 µP ühe programmi käivitamise lõpetamise ja teise programmi käivitamise. Sel juhul esimene programm katkestatakse. Sarnaselt alamprogrammidega saab katkestuskoodi segmente pesastada. Katkestuste töötlemist käsitletakse järgmises peatükis.

Märge : Pinukursoril on 8 bitti madalama baidi aadressi jaoks, et adresseerida asukohti vahemikus $ 0100 kuni $ 01FF. Kõrgem bait 00000001 2 eeldatakse.

Järgmises tabelis on juhised, mis seovad virna osuti 'S' A-, X-, Y- ja P registritega mälus oleva pinualaga.

4.13 Alamprogrammi helistamine ja tagasisaatmine

Alamprogramm on juhiste kogum, mis saavutab konkreetse eesmärgi. Eelmine liitmise või lahutamise programm on väga lühike alamprogramm. Alamprogramme nimetatakse mõnikord lihtsalt rutiiniks. Alamprogrammi kutsumise juhend on järgmine:

JSR: hüppa alamrutiini

Alamprogrammist naasmise juhend on järgmine:

RTS : alamprogrammist naasmine

Mikroprotsessoril on kalduvus mälus olevaid käske üksteise järel pidevalt täita. Oletame, et mikroprotsessor täidab parasjagu koodisegmenti ja see kohtab hüppekäsku (JMP), et käivitada koodisegment, mis on kodeeritud ja mille taha see võib juba käivitada. See käivitab selle koodisegmendi taga ja jätkab kõigi koodisegmentide (käskude) täitmist, järgides taga olevat koodisegmenti, kuni käivitab uuesti praeguse koodisegmendi ja jätkab allpool. JMP ei suru järgmist käsku virna.

Erinevalt JMP-st lükkab JSR arvutist (programmiloendurist) virnasse enda järel järgmise käsu aadressi. Selle aadressi virna asukoht asetatakse virna kursorisse 'S'. Kui alamprogrammis avastatakse (käivitatakse) RTS-käsk, tõmbab virnale surutud aadress pinu välja ja programm jätkab sellel väljatõmmatud aadressil, mis on järgmine käsuaadress vahetult enne alamprogrammi kutset. Viimane aadress, mis pinust eemaldatakse, saadetakse programmiloendurisse. Järgmises tabelis on toodud JSR-i ja RTS-i juhiste tehnilised üksikasjad:

JSR-i ja RTS-i kasutamise kohta vaadake järgmist illustratsiooni:

4.14 Loendusahela näide

Järgmine alamprogramm loendab $FF-lt $00-ni (kokku 256 10 loeb):

käivita LDX #$FF ; laadige X, kui $ FF = 255
silmus DEX ; X = X – 1
BNE silmus ; kui X ei ole null, siis läheb silmus
RTS ; tagasi

Igal real on kommentaar. Kommentaarid ei lähe kunagi täitmiseks mällu. Assembler (tõlkija), mis teisendab programmi täitmiseks (töötamiseks) mälus olevaks, eemaldab alati kommentaarid. Kommentaar algab tähega ';' . Selle programmi 'start' ja 'silmus' nimetatakse siltideks. Silt identifitseerib (nime) juhise aadressi jaoks. Kui käsk on ühebaidine käsk (kaudne adresseerimine), on silt selle käsu aadress. Kui käsk on mitmebaidine käsk, identifitseerib silt mitmebaidise käsu esimese baidi. Selle programmi esimene juhend koosneb kahest baidist. Eeldades, et see algab 0300 dollari aadressiga, saab 0300 dollari aadressi asendada programmis 'start'. Teine käsk (DEX) on ühebaidine käsk6ion ja see peaks olema aadressil $0302. See tähendab, et $0302 aadressi saab asendada programmis all oleva 'loop'-ga, mis on tegelikult nii 'BNE loop'.

'BNE silmus' tähendab haru antud aadressile, kui olekuregistri Z lipp on 0. Kui A- või X- või Y-registri väärtus on 00000000 2 , viimase toimingu tõttu on Z lipp 1 (komplekt). Seega, kuigi see on 0 (mitte 1), korratakse programmi teist ja kolmandat käsku selles järjekorras. Iga korduva jada puhul vähendatakse väärtust (täisarvu) X-registris 1 võrra. DEX tähendab X = X – 1. Kui väärtus X-registris on $00 = 00000000 2 , Z muutub 1-ks. Sel hetkel kahte käsku enam ei korrata. Programmi viimane RTS-käsk, mis on ühebaidine käsk (implied addressing), naaseb alamprogrammist. Selle juhise eesmärk on muuta programmiloenduri aadress virnas koodi jaoks, mis käivitatakse enne alamprogrammi kutset, ja naaseb programmiloendurisse (PC). See aadress on käsu aadress, mis tuleb täita enne alamprogrammi väljakutsumist.

Märge: Kui kirjutate 6502 µP jaoks montaažikeele programmi, peab ainult silt algama rea ​​algusest; mis tahes muu reakood tuleb nihutada vähemalt ühe tühiku võrra paremale.

Alamprogrammi kutsumine
Ignoreerides eelmiste siltide poolt hõivatud mäluruumi, võtab programm mälus (RAM) 6 baiti järjestikust asukohta vahemikus $ 0300 kuni $ 0305. Sel juhul on programm järgmine:

LDX #$FF ; laadige X, kui $ FF = 255
DEX ; X = X – 1
0302 BNE ; kui X ei ole null, siis läheb silmus
RTS ; tagasi

Alates 0200 dollari suurusest aadressist mälus võib kutsuda alamprogrammi. Kõne juhis on järgmine:

JSR algus ; algus on aadress $ 0300, st JSR $ 0300

Alamprogramm ja selle kutse, mis on tekstiredaktori faili õigesti kirjutatud, on:

käivita LDX #$FF; laadige X, kui $ FF = 255
silmus DEX ; X = X – 1

BNE silmus ; kui X ei ole null, siis läheb silmus
RTS ; tagasi

JSR-i algus: liikuge rutiini juurde alates 0300 dollarist

Nüüd võib ühes pikas programmis olla palju alamprogramme. Kõigil neil ei saa olla nime 'start'. Neil peaks olema erinevad nimed. Tegelikult ei pruugi ühelgi neist olla nime 'start'. 'Alusta' kasutatakse siin õpetamise põhjustel.

4.15 Programmi tõlkimine

Programmi tõlkimine või selle kokkupanek tähendab sama asja. Kaaluge järgmist programmi:

käivitage LDX #$FF : laadige X, kui $FF = 255
silmus DEX: X = X – 1
BNE tsükkel : kui X ei ole null, siis läheb silmus
RTS: tagasi
JSR-i algus: liikuge rutiini juurde alates 0300 dollarist

See on programm, mis on varem kirjutatud. See koosneb alamprogrammist, stardist ja alamprogrammi kutsest. Programm loeb 255-st allapoole 10 0-le 10 . Programm algab kasutaja algusaadressist $0200 (RAM). Programm sisestatakse tekstiredaktorisse ja salvestatakse kettale. Selle nimi on nagu 'sample.asm', kus 'sample' on programmeerija valitud nimi, kuid failinimega peab olema seotud montaažikeele laiend '.asm'.

Kokkupandud programmi toodab teine ​​programm, mida nimetatakse assembleriks. Monteerija tarnib 6502 µP tootja või kolmas osapool. Assembler reprodutseerib programmi nii, et see on selle täitmise (käitamise) ajal mälus (RAM).

Oletame, et JSR-i käsk algab aadressilt $0200 ja alamprogramm algab aadressilt $0300. Koostaja eemaldab kõik kommentaarid ja tühikud. Kommentaarid ja tühikud raiskavad mälu, mida on alati vähe. Võimalik tühi rida eelmise alamprogrammi koodisegmendi ja alamprogrammi kutse vahel on tühiku näide. Kokkupandud fail salvestatakse endiselt kettale ja selle nimi on nagu 'sample.exe'. 'Sample' on programmeerija valitud nimi, kuid laiend '.exe' peaks olema seal, mis näitab, et tegemist on käivitatava failiga.

Koostatud programmi saab dokumenteerida järgmiselt:

Sellise dokumendi koostamine on väidetavalt käsitsi kokkupanek. Pange tähele, et selle dokumendi kommentaarid ei ilmu mällu (käitamiseks). Tabeli aadressi veerg näitab mällu olevate käskude algusaadresse. Pange tähele, et 'JSR start', mis on 'JSR $ 0300', mis eeldatavasti on kodeeritud kui '20 03 00', on tegelikult kodeeritud kui '20 00 03', kusjuures alumine mälubaidi aadress võtab mälus madalama baidi ja Kõrgema mälubaidi aadress, mis võtab mälus kõrgema baidi – väike endiaalsus. JSR-i opkood on 20 16 .

Pange tähele, et harukäsu (nt BNE) nihe on kahetäieline arv vahemikus 128 10 kuni + 127 10 . Niisiis, 'BNE silmus' tähendab 'BNE -1 10 ', mis on tegelikult 'D0 FF' koodi kujul FF 16 on -1 kahes täienduses, mis on kirjutatud kujul = 11111111 kahes aluses. Assemblerprogramm asendab sildid ja väljad tegelike kuueteistkümnendarvudega (kuueteistkümnendarvud on kahendarvud, mis on rühmitatud nelja bitti). Tegelikud aadressid, kust iga käsk algab, on tegelikult lisatud.

Märge: Käsk “JSR start” asendatakse lühemate käskudega, mis saadavad programmiloenduri praeguse sisu (kõrged ja madalad baidid) pinu koos pinukursoriga, mida vähendatakse kaks korda (üks kord kõrge ja üks madala baidi jaoks) ja seejärel laadib arvuti uuesti $0300 aadressiga. Pinukursor osutab nüüd $00FD-le, eeldades, et see on lähtestatud väärtusele $01FF.

Samuti asendatakse RTS-käsk mitmete lühemate käskudega, mis suurendavad pinukursorit 'S' kaks korda (üks kord madala ja üks kõrge baidi jaoks) ja tõmbavad vastavad kaks baiti aadressi pinukursorilt arvutisse. järgmine juhend.

Märge: Sildi tekst ei tohi olla pikem kui 8 tähemärki.

'BNE loop' kasutab suhtelist adresseerimist. See tähendab -3 lisamist 10 järgmise programmi loenduri sisuni 0305 $. 'BNE tsükli' baidid on 'D0 FD', kus FD on kahe -3 täiendus 10 .

Märkus. See peatükk ei esita kõiki 6502 µP juhiseid. Kõik juhised ja nende üksikasjad leiate dokumendist 'SY6500 8-Bit Microprocessor Family'. Selle dokumendi jaoks on olemas PDF-fail nimega “6502.pdf”, mis on Internetis vabalt saadaval. Selles dokumendis kirjeldatud 6502 µP on 65C02.

4.16 Katkestused

Mis tahes seadme signaalid, mis on ühendatud Commodore 64 väliste (vertikaalse pinna) portidega, peavad enne 6502 mikroprotsessorini jõudmist läbima CIA 1 või CIA 2 ahelad (IC). 6502 µP andmesiini signaalid peavad enne mis tahes välisseadmeni jõudmist läbima CIA 1 või CIA 2 kiibi. CIA tähistab Complex Interface Adapter. Joonisel 4.1 “Commodore_64 emaplaadi plokkskeem” tähistavad plokk-sisend-/väljundseadmed CIA 1 ja CIA 2. Kui programm töötab, saab selle enne jätkamist mõne muu koodijupi käivitamiseks katkestada. Esineb riistvara ja tarkvara katkestusi. Riistvaralise katkestuse korral on 6502 µP kaks sisendsignaali kontakti. Nende tihvtide nimed on IRQ ja NMI . Need ei ole µP andmeliinid. µP andmeread on D7, D6, D5, D4, D3, D2, D1 ja D0; D0 kõige vähem olulise biti jaoks ja D7 kõige olulisema biti jaoks.

IRQ tähistab Interrupt ReQuest “aktiivset” madalat. See µP sisendliin on tavaliselt kõrge, umbes 5 volti. Kui see langeb umbes 0 voltini, on see katkestusnõue, mis annab märku µP-st. Niipea kui taotlus rahuldatakse, läheb rida kõrgele tagasi. Katkestuse taotluse lubamine tähendab, et µP hargneb katkestust käsitlevale koodile (alamprogrammile).

NMI tähistab Non-Maskable Interrupt “aktiivset” madalat. Kuigi kood IRQ hukatakse NMI võib madalale minna. Sel juhul, NMI käsitletakse (käitatakse oma kood). Pärast seda kood IRQ jätkub. Pärast koodi IRQ lõpeb, põhiprogrammi kood jätkub. See on, NMI katkestab IRQ käitleja. Signaal jaoks NMI saab siiski anda µP-le isegi siis, kui µP on jõude ja ei käsitle midagi või ei tööta põhiprogrammi.

Märge: See on tegelikult üleminek kõrgelt madalale NMI , see on NMI signaal – sellest lähemalt hiljem. IRQ tavaliselt pärineb CIA 1 ja NMI tavaliselt pärineb CIA 2-st. NMI , mis tähistab mittemaskeeritavat katkestust, võib pidada peatamatuks katkestuseks.

Katkestuste käsitlemine
Kas taotlus pärineb IRQ või NMI , peab kehtiv juhis täitma. 6502-l on ainult A-, X- ja Y-registrid. Kui alamprogramm töötab, võib see kasutada neid kolme registrit koos. Katkestuste töötleja on endiselt alamprogramm, kuigi seda ei nähta sellisena. Pärast praeguse juhise täitmist salvestatakse 65C02 µP A-, X- ja Y-registrite sisu virna. Samuti saadetakse virnasse programmiloenduri järgmise käsu aadress. Seejärel hargneb µP katkestuse koodiks. Pärast seda taastatakse A-, X- ja Y-registrite sisu virust vastupidises järjekorras, kuhu need saadetakse.

Katkestuse kodeerimise näide
Lihtsuse huvides eeldame, et µP rutiin IRQ katkestus on lihtsalt selleks, et lisada numbrid $01 ja $02 ning salvestada tulemus $03 mäluaadressile $0400. Kood on:

ISR PHA
PHX
PHY
;
LDA #$01
ADC #$02
MAKSAVAD 0400 $
;
PLY
PLX
PLA
RTI

ISR on silt ja identifitseerib mäluaadressi, kus asub PHA käsk. ISR tähendab teenuse katkestamise rutiini. PHA, PHX ja PHY saadavad A-, X- ja Y-registrite sisu virna lootusega, et neid läheb vaja mis tahes koodi (programmi) jaoks, mis töötab vahetult enne katkestust. Järgmised kolm käsku moodustavad katkestuste töötleja tuuma. PLY, PLX ja PLA juhised peavad olema selles järjekorras ning need toovad tagasi Y-, X- ja A-registrite sisu. Viimane käsk, milleks on RTI, (ilma operandita) tagastab täitmise jätkumise mis tahes koodile (programmile), mis enne katkestamist käivitatakse. RTI tõmbab virust käivitatava koodi järgmise käsu aadressi tagasi programmiloendurisse. RTI tähendab katkestusest naasmist. Sellega on katkestuste käsitlemine (alamprogramm) läbi.

Tarkvara katkestus
Peamine viis tarkvarakatkestuse saamiseks 6502 µP jaoks on BRK kaudse aadressijuhise kasutamine. Oletame, et põhiprogramm töötab ja see puutub kokku BRK-käsuga. Sellest hetkest alates tuleks arvuti järgmise käsu aadress virna saata, kui praegune käsk on täidetud. Tarkvarajuhiste käsitlemise alamprogrammi nimeks peaks olema 'järgmine'. See katkestuse alamprogramm peaks lükkama A-, X- ja Y-registri sisu virna. Pärast alamprogrammi tuuma käivitamist peaks lõpetav alamprogramm tõmbama A-, X- ja Y-registrite sisu virust tagasi nende registritesse. Rutiini viimane lause on RTI. RTI tõttu tõmmatakse arvuti sisu ka virust arvutisse automaatselt tagasi.

Alamprogrammi ja katkestusteenuse rutiini võrdlemine ja vastandamine
Järgmises tabelis võrreldakse ja vastandatakse alamprogrammi ja teenuse katkestamise rutiini:

4.17 6502 peamiste adresseerimisrežiimide kokkuvõte

Iga käsk 6502 jaoks on üks bait, millele järgneb null või enam operandit.

Vahetu adresseerimise režiim
Vahetu adresseerimisrežiimi korral on pärast operandi väärtus, mitte mäluaadress. Väärtuse ette peab eelnema #. Kui väärtus on kuueteistkümnendsüsteemis, peab '#' järgnema '$'. 65C02 kohesed adresseerimisjuhised on järgmised: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Lugeja peaks tutvuma 65C02 µP dokumentatsiooniga, et teada saada, kuidas kasutada siin loetletud juhiseid, mida selles peatükis ei selgitata. Näidisjuhis on järgmine:

LDA #77 dollarit

Absoluutne adresseerimisrežiim
Absoluutse adresseerimise režiimis on üks operaand. See operand on mälus oleva väärtuse aadress (tavaliselt kuueteistkümnendsüsteemis või sildis). Seal on 64K 10 = 65 536 10 mäluaadressid 6502 µP jaoks. Tavaliselt on ühebaidine väärtus ühel neist aadressidest. 65C02 absoluutsed adresseerimisjuhised on järgmised: 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. Lugeja peaks tutvuma 65C02 µP dokumentatsiooniga, et teada saada, kuidas kasutada siin loetletud juhiseid, aga ka ülejäänud adresseerimisrežiimide kohta, mida selles peatükis ei selgitata. Näidisjuhis on järgmine:

Need on 1234 dollarit

Kaudne adresseerimisrežiim
Kaudse adresseerimise režiimis operandi puudub. Kõik kaasatud µP-register on juhisega hõlmatud. Kaudsed adresseerimisjuhised 65C02 jaoks on järgmised: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, MAKSU, TAY, TSX, TXA, TXS, TYA. Näidisjuhis on järgmine:

DEX: X-registri vähendamine ühe ühiku võrra.

Suhteline adresseerimisrežiim
Suhteline adresseerimisrežiim tegeleb ainult harujuhistega. Suhtelise adresseerimise režiimis on ainult üks operaand. See on väärtus alates -128 10 kuni +127 10 . Seda väärtust nimetatakse nihkeks. Märgi alusel lisatakse või lahutatakse see väärtus programmiloenduri järgmisest käsust, et saada järgmise kavandatud käsu aadress. Suhtelise aadressirežiimi juhised on järgmised: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Juhendi näited on järgmised:

BNE $7F : (filiaal, kui Z = 0 olekuregistris, P)

Mis lisab praegusele programmiloendurile (käivitatavale aadressile) 127 ja hakkab sellel aadressil käsku täitma. Sarnaselt:

BEQ $F9 : (haru, kui Z = : olekuregistris, P)

Mis lisab praegusele programmiloendurile väärtuse -7 ja alustab täitmist uuel programmiloenduri aadressil. Operand on kahe täiendiga arv.

Absoluutne indekseeritud adresseerimine
Absoluutindeksi adresseerimisel lisatakse X- või Y-registri sisu antud absoluutaadressile (kõikjal alates $0000 kuni $FFFF, st alates 0-st 10 numbrile 65536 10 ), et saada tegelik aadress. Seda antud absoluutset aadressi nimetatakse baasaadressiks. Kui kasutatakse X-registrit, on montaažijuhis umbes selline:

LDA $ C453,X

Kui kasutatakse Y-registrit, on see midagi sellist:

LDA $ C453,Y

X- või Y-registri väärtust nimetatakse loendus- või indeksiväärtuseks ja see võib olla vahemikus $00 (0 10 ) kuni $ FF (250 10 ). Seda ei nimetata nihkeks.

Absoluutse indeksi adresseerimise juhised on järgmised: ADC, AND, ASL (ainult X), BIT (koos akumulaatori ja mäluga, ainult X-ga), CMP, DEC (ainult mälu ja X), EOR, INC (ainult mälu ja X), LDA , LDX, LDY, LSR (ainult X), ORA, ROL (ainult X), ROR (ainult X), SBC, STA, STZ (ainult X).

Absoluutne kaudne adresseerimine
Seda kasutatakse ainult hüppejuhisega. Sellega on antud absoluutaadressil pointer aadress. Kursori aadress koosneb kahest baidist. Kahebaidine kursor osutab (on selle aadress) sihtkoha baidi väärtusele mälus. Niisiis, montaažikeele juhend on järgmine:

JMP (3456 dollarit)

Sulgudega ja $13 asub aadressi asukohas $3456, samas kui $EB on aadressi asukohas $3457 (= $3456 + 1). Seejärel on sihtkoha aadress $13EB ja kursor $13EB. Absoluutne $ 3456 on juhendis sulgudes, kus 34 on madalam bait ja 56 kõrgem bait.

4.18 Stringi loomine 6502 µP koostekeelega

Nagu on näidatud järgmises peatükis, saab pärast faili loomist mällu faili kettale salvestada. Failile tuleb anda nimi. Nimi on stringi näide. Programmeerimisel on stringide kohta palju muid näiteid.

ASCII-koodide jada loomiseks on kaks peamist viisi. Mõlemal juhul võtavad kõik ASCII-koodid (märgid) mälus järjestikuseid baitide asukohti. Ühel viisil eelneb sellele baitide jadale täisarv bait, mis on jada (stringi) pikkus (märkide arv). Teisel juhul järgneb märgijadale (kohe järgneb) nullbait, mis on 00 16 st 00 dollarit. Stringi pikkust (märkide arvu) muul viisil ei näidata. Null-märki ei kasutata esimesel viisil.

Näiteks kaaluge 'Ma armastan sind!' string ilma jutumärkideta. Pikkus siin on 11; tühik loetakse ühe ASCII-baidi (märgina). Oletame, et string tuleb mällu paigutada nii, et esimene märk on aadressil $0300.

Järgmine tabel näitab stringimälu sätteid, kui esimene bait on 11 10 = 0B 16 :

Järgmine tabel näitab stringimälu sätteid, kui esimene bait on 'I' ja viimane bait on null ($ 00):

Stringi loomise alustamiseks saab kasutada järgmisi juhiseid:

MAKSAVAD 0300 $

Oletame, et esimene bait on akumulaatoris, mis tuleb saata aadressi asukohta $0300. See juhis kehtib mõlemal juhul (mõlemat tüüpi stringide puhul).

Pärast kõigi märkide ükshaaval sobitamist mälulahtritesse saab stringi lugeda tsükli abil. Esimesel juhul loetakse ette märkide arv pärast pikkust. Teisel juhul loetakse tähemärke 'I'-st, kuni on täidetud nullmärk, mis on 'Null'.

4.19 Massiivi loomine 6502 µP koostekeelega

Ühebaidiliste täisarvude massiiv koosneb järjestikustest mälubaitide asukohtadest koos täisarvudega. Seejärel on kursor, mis osutab esimese täisarvu asukohale. Seega koosneb täisarvude massiiv kahest osast: kursorist ja asukohtade jadast.

Stringide massiivi puhul võib iga string olla mälus erinevas kohas. Seejärel on järjestikused mälukohad koos osutitega, kus iga osuti osutab iga stringi esimesele asukohale. Sel juhul koosneb kursor kahest baidist. Kui string algab selle pikkusega, osutab vastav osuti selle pikkuse asukohale. Kui string ei alga selle pikkusega, vaid lõpeb nullmärgiga, osutab vastav osuti stringi esimese märgi asukohale. Ja seal on kursor, mis osutab järjestikuste osutite esimese kursori madalama baidi aadressile. Niisiis koosneb stringide massiiv kolmest osast: mälu erinevates kohtades olevatest stringidest, vastavatest järjestikustest osutitest ja osutist järjestikuste osutite esimesele osutile.

4.20 Probleemid

Lugejal soovitatakse enne järgmise peatüki juurde liikumist lahendada kõik peatüki ülesanded.

  1. Kirjutage montaažikeele programm, mis algab 6502 µP puhul 0200 dollarist ja lisab 2A94 märgita numbrid H (lisa) 2ABF-ile H (augend). Olgu sisendid ja väljundid mälus. Samuti koostage käsitsi kokkupandud programmidokument.
  2. Kirjutage montaažikeele programm, mis algab 0200 dollarist 6502 µP jaoks ja lahutab märgita arvud 1569 H (alamosa) 2ABF-ist H (minuend). Olgu sisendid ja väljundid mälus. Samuti koostage käsitsi kokkupandud programmidokument.
  3. Kirjutage 6502 µP jaoks montaažikeele programm, mis loeb tsüklit kasutades 00 dollarilt 09 dollarini. Programm peaks algama 0200 dollarist. Samuti koostage käsitsi kokkupandud programmidokument.
  4. Kirjutage montaažikeele programm, mis algab 0200 dollarist 6502 µP jaoks. Programmil on kaks alamprogrammi. Esimene alamprogramm lisab 0203 märgita numbrid H (augend) ja 0102H (lisa). Teine alamprogramm liidab esimese alamprogrammi summa, mis on 0305H kuni 0006 H (augend). Lõpptulemus salvestatakse mällu. Kutsuge esimene alamprogramm, mis on FSTSUB, ja teine ​​alamprogramm, mis on SECSUB. Olgu sisendid ja väljundid mälus. Samuti koostage käsitsi kogu programmi jaoks kokkupandud programmidokument.
  5. Arvestades, et an IRQ Handler lisab $02 kuni $01 akumulaatoris kui põhikäitlemise ajal NMI väljastatakse ja põhikäsitlus NMI lisab akumulaatoris $05 kuni $04, kirjutage mõlema töötleja jaoks koostekeel, sealhulgas nende kõned. Kõne aadressile IRQ käitleja peaks olema aadressil $0200. The IRQ käitleja peaks algama aadressilt 0300 $. The NMI käitleja peaks algama aadressilt 0400 $. Tulemuseks IRQ käitleja tuleks panna aadressile 0500 $ ja tulemus NMI käitleja tuleks panna aadressile $0501.
  6. Selgitage lühidalt, kuidas BRK käsku kasutatakse tarkvarakatkestuse tekitamiseks 65C02 arvutis.
  7. Koostage tabel, mis võrdleb ja vastandab tavalist alamprogrammi katkestusteenuse rutiiniga.
  8. Selgitage lühidalt 65C02 µP peamisi adresseerimisrežiime, võttes arvesse montaažikeele juhiste näiteid.
  9. a) Kirjutage 6502 masinkeelne programm, et lisada 'Ma armastan sind!' ASCII-koodide jada mällu, alustades $0300 aadressist ja stringi pikkusega. Programm peaks algama aadressilt 0200 $. Hankige iga tähemärk akumulaatorist ükshaaval, eeldades, et need saadetakse sinna mõne alamprogrammi kaudu. Samuti koostage programm käsitsi. (Kui teil on vaja teada 'Ma armastan sind!' ASCII-koode. Siin on need: 'I':49 16 , ruumi: 20 16 , 'l': 6C 16 , 'o': 6F 16 , 'in':76 16 , 'e':65, 'y':79 16 , 'in':75 16 , ja '!':21 16 (Märkus: iga kood võtab enda alla 1 baidi).
    b) Kirjutage 6502 masinkeelne programm, et lisada 'Ma armastan sind!' mällu salvestatud ASCII koodide jada, mis algab aadressist $0300 ilma stringi pikkuseta, kuid lõpeb numbriga 00 16 . Programm peaks algama aadressilt 0200 $. Hankige akumulaatorist iga märk, eeldades, et mõni alamprogramm saadab need sinna ükshaaval. Samuti koostage programm käsitsi.