Poglavlje 4: Udžbenik za asemblerski jezik mikroprocesora 6502

Poglavlje 4 Udzbenik Za Asemblerski Jezik Mikroprocesora 6502



Poglavlje 4: Udžbenik za asemblerski jezik mikroprocesora 6502

4.1 Uvod

Mikroprocesor 6502 objavljen je 1975. godine. Korišten je kao mikroprocesor za neka osobna računala u to vrijeme, kao što su Apple II, Commodore 64 i BBC Micro.







Mikroprocesor 6502 se i danas proizvodi u velikom broju. To više nije središnja procesorska jedinica koja se danas koristi u osobnim računalima (prijenosnim računalima), ali se još uvijek proizvodi u velikom broju i koristi u elektroničkim i električnim uređajima danas. Kako bismo razumjeli modernije računalne arhitekture, vrlo je korisno ispitati stariji, ali prilično uspješan mikroprocesor kao što je 6502.



Budući da je jednostavan za razumijevanje i programiranje, jedan je od najboljih (ako ne i najbolji) mikroprocesora za podučavanje asemblerskog jezika. Asemblerski jezik je jezik niske razine koji se može koristiti za programiranje računala. Imajte na umu da se asemblerski jezik za jedan mikroprocesor razlikuje od asemblerskog jezika drugog mikroprocesora. U ovom poglavlju se uči asemblerski jezik mikroprocesora 6502. Točnije, 65C02 je taj koji se podučava, ali se jednostavno naziva 6502.



Poznato računalo iz prošlosti zove se commodore_64. 6502 je mikroprocesor iz obitelji 6500. Računalo commodore_64 koristi mikroprocesor 6510. Mikroprocesor 6510 ima 6500 µP. Skup instrukcija za 6502 µP su gotovo sve instrukcije za 6510 µP. Znanje ovog i sljedećeg poglavlja temelji se na računalu commodore_64. Ovo se znanje koristi kao osnova za objašnjenje modernih računalnih arhitektura i modernih operativnih sustava u ovom dijelu online karijernog tečaja.





Arhitektura računala odnosi se na komponente matične ploče računala i objašnjenje kako podaci teku unutar svake komponente, posebno mikroprocesora, kako podaci teku između komponenti, te kako podaci međusobno djeluju. Jednina za podatke je datum. Učinkovit način proučavanja računalne arhitekture računala je proučavanje asemblerskog jezika matične ploče.

Za računalo commodore_64 kaže se da je računalo 8-bitne računalne riječi. To znači da se informacije pohranjuju, prenose i manipuliraju u obliku osmobitnih binarnih kodova.



Blok dijagram matične ploče Commodore 64
Blok dijagram matične ploče Commodore 64 je:


Slika 4.1 Blok dijagram jedinice sustava Commodore_64

Zamislite mikroprocesor 6510 kao mikroprocesor 6502. Ukupna memorija je niz bajtova (8 bita po bajtu). Postoji memorija s izravnim pristupom (čitanje/pisanje) u koju se bajtovi mogu upisivati ​​ili brisati. Kada se računalo isključi, sve informacije u memoriji s izravnim pristupom (RAM) se brišu. Tu je i memorija samo za čitanje (ROM). Kada se računalo isključi, podaci u ROM-u ostaju (ne brišu se).

Postoji ulazno/izlazni priključak (krug) koji se na dijagramu naziva ulazno/izlaznim uređajima. Ovaj priključak ne treba brkati s priključcima koji su vidljivi na lijevoj i desnoj ili prednjoj i stražnjoj okomitoj površini jedinice računalnog sustava. To su dvije različite stvari. Veze s ovog unutarnjeg priključka na periferne uređaje kao što su tvrdi disk (ili disketa), tipkovnica i monitor nisu prikazane na dijagramu.

Na dijagramu postoje tri sabirnice (skupine električnih vrlo malih žičanih vodiča). Svaka žica može prenijeti bit 1 ili bit 0. Podatkovna sabirnica za prijenos osam bitnih bajtova odjednom (jedan impuls takta) u RAM i ulazno/izlazni priključak (ulazno/izlazni uređaji) je dvosmjerna. Sabirnica podataka široka je osam bita.

Sve komponente su spojene na adresnu sabirnicu. Adresna sabirnica je jednosmjerna od mikroprocesora. Postoji šesnaest vodiča za adresnu sabirnicu, a svaki nosi jedan bit (1 ili 0). Šesnaest bitova šalje se u jednom taktnom impulsu.

Postoji kontrolna sabirnica. Neki od vodiča kontrolne sabirnice prenijeli bi po jedan bit od mikroprocesora do ostalih komponenti. Nekoliko kontrolnih linija prenosi bitove od ulazno/izlaznog (IO) porta do mikroprocesora.

Računalna memorija
RAM i ROM se smatraju jednim memorijskim sklopom. Ovaj sklop je prikazan dijagramski na sljedeći način gdje heksadecimalni brojevi imaju prefiks “$”:


Slika 4.11 Raspored memorije za Commodore 64 računalo

RAM je od 0000 16 na DFFF 16 koji se piše kao od $0000 do $DFFF. S asemblerskim jezikom 6502 µP, heksadecimalni broj ima prefiks “$” i nema sufiks (pretpisani) sa 16 ili H ili hex. Sve informacije u RAM-u nestaju kada se računalo isključi. ROM počinje od $E000 do $FFFF. Ima potprograme koji se ne isključuju kada se računalo isključi. Ove potprograme su uobičajeno korištene rutine koje pomažu u programiranju. Korisnički program ih poziva (pogledajte sljedeće poglavlje).

Prostor (bajtovi) od $0200 do $D000 je za korisničke programe. Razmak od $D000 do $DFFF je za informacije koje su izravno povezane s periferijama (ulazno/izlazni uređaji). Ovo je dio operativnog sustava. Dakle, operativni sustav računala commodore-64 sastoji se od dva glavna dijela: dio u ROM-u koji se nikada ne gasi i dio od $D000 do $DFFF koji se gasi kada se isključi napajanje. Ovi IO (input/output) podaci moraju se učitati s diska svaki put kada se računalo uključi. Danas se takvi podaci nazivaju periferni upravljački programi. Periferije počinju od priključka ulazno/izlaznog uređaja preko priključaka na matičnoj ploči do prepoznatljivih priključaka na okomitim površinama računala na koje su povezani monitor, tipkovnica itd. i na same periferije (monitor, tipkovnica itd. .).

Memorija se sastoji od 2 16 = lokacije od 65 536 bajtova. U heksadecimalnom obliku to je 10 000 16 = 10000 H = 10000 šesterokutni = 10 000 $ lokacija. U računalstvu, brojanje po bazi dva, bazi deset, bazi šesnaest itd. počinje od 0, a ne od 1. Dakle, prva lokacija je zapravo broj lokacije 00000000000000000 2 = 0 10 = 0000 16 = 0000 dolara. U asemblerskom jeziku 6502 µP, identifikacija lokacije adrese ima prefiks $ i nema sufiksa ili indeksa. Zadnja lokacija je broj lokacije 1111111111111111 2 = 65,535 10 = FFFF 16 = $FFFF a ne 100000000000000000 2 , odnosno 65.536 10 , odnosno 10000 16 , odnosno 10 000 dolara. 10000000000000000 2 , 65,536 10 , 10000 16 , ili 10000 USD daje ukupan broj lokacija bajtova.

Ovdje, 2 16 = 65 536 = 64 x 1024 = 64 x 2 10 = 64 Kbajta (Kilobajta). Sufiks 64 u nazivu Commodore-64 znači 64KB ukupne memorije (RAM i ROM). Bajt ima 8 bitova, a 8 bitova će ići na mjesto jednog bajta u memoriji.

64 Kbajta memorije podijeljeno je na stranice. Svaka stranica ima 0100 16 = 256 10 lokacije bajtova. Prvih 256 10 = prvi 0100 16 lokacije je stranica 0. Druga je stranica 1, treća je stranica 2, i tako dalje.

Za adresiranje 65.536 lokacija potrebno je 16 bitova za svaku lokaciju (adresu). Dakle, adresna sabirnica od mikroprocesora do memorije sastoji se od 16 linija; jedna linija za jedan bit. Bit je ili 1 ili 0.

Registri 6502 µP
Registar je poput ćelija bajta za memorijsku lokaciju bajta. 6502 µP ima šest registara: pet 8-bitnih registara i jedan 16-bitni registar. 16-bitni registar naziva se programski brojač koji se skraćeno naziva PC. Sadrži memorijsku adresu za sljedeću instrukciju. Program na asemblerskom jeziku sastoji se od instrukcija koje su smještene u memoriju. Za adresiranje određene lokacije bajta u memoriji potrebno je šesnaest (16) različitih bitova. Pri određenom taktnom impulsu, ti se bitovi šalju u 16-bitne adresne linije adresne sabirnice za čitanje instrukcije. Svi registri za 6502 µP prikazani su kako slijedi:


Slika 4.12 6502 µP registri

Programski brojač ili PC može se vidjeti kao 16-bitni registar u dijagramu. Nižih osam bitova označeno je kao PCL za nizak programski brojač. Osam bitova višeg značaja označeno je kao PCH za visoki programski brojač. Instrukcija u memoriji za Commodore-64 može se sastojati od jednog, dva ili tri bajta. 16 bita u PC-u ukazuje na sljedeću instrukciju koju treba izvršiti, u memoriji. Među krugovima u mikroprocesoru, dva od njih se nazivaju aritmetičko-logička jedinica i dekoder instrukcija. Ako je trenutna instrukcija koja se obrađuje u µP (mikroprocesoru) dugačka jedan bajt, ova dva kruga povećavaju PC za sljedeću instrukciju za 1 jedinicu. Ako je trenutna instrukcija koja se obrađuje u µP dugačka dva bajta, što znači da zauzima dva uzastopna bajta u memoriji, ova dva kruga povećavaju PC za sljedeću instrukciju za 2 jedinice. Ako je trenutna instrukcija koja se obrađuje u µP dugačka tri bajta, što znači da zauzima tri uzastopna bajta u memoriji, ova dva kruga povećavaju PC za sljedeću instrukciju za 3 jedinice.

Akumulator “A” je osmobitni registar opće namjene koji pohranjuje rezultat većine aritmetičkih i logičkih operacija.

Svaki od registara “X” i “Y” koristi se za brojanje programskih koraka. Brojanje u programiranju počinje od 0. Dakle, nazivaju se indeksnim registrima. Imaju nekoliko drugih svrha.

Iako registar pokazivača steka, 'S' ima 9 bita što se smatra osmobitnim registrom. Njegov sadržaj upućuje na mjesto bajta na stranici 1 memorije s izravnim pristupom (RAM). Stranica 1 počinje od bajta $0100 (256 10 ) u bajt $01FF (511 10 ). Kada se program izvodi, pomiče se od jedne instrukcije do sljedeće uzastopne instrukcije u memoriji. Međutim, to nije uvijek slučaj. Postoje trenuci kada skače s jednog memorijskog područja na drugo memorijsko područje kako bi tamo nastavio izvoditi upute, uzastopno. Stranica 1 u RAM-u koristi se kao stog. Stog je veliko područje RAM memorije koje ima sljedeće adrese za nastavak koda odakle dolazi do skoka. Kodovi s uputama za preskakanje nisu u nizu; drugdje su u sjećanju. Međutim, nakon što su instrukcije skoka na izvršene, adrese nastavka (ne segmenti koda) su u stogu. Tamo su gurnuti kao rezultat skoka ili uputa o grananju.

Osmobitni registar statusa procesora P je posebna vrsta registra. Pojedinačni bitovi nisu međusobno povezani niti povezani. Svaki bit tamo se naziva zastavica i cijeni se neovisno o ostalima. U nastavku su navedena značenja zastava prema potrebi.

Indeks prvog i zadnjeg bita za svaki registar naznačeni su iznad svakog registra u prethodnom dijagramu. Brojanje indeksa bita (položaja) u registru počinje od 0 na desnoj strani.

Memorijske stranice u binarnom, heksadecimalnom i decimalnom sustavu
Sljedeća tablica prikazuje početak memorijskih stranica u binarnom, heksadecimalnom i decimalnom obliku:

Svaka stranica ima 1,0000,0000 2 broj bajtova koji je jednak 100 H broj bajtova koji je isti kao 256 10 broj bajtova. U prethodnom memorijskom dijagramu, stranice su označene prema gore od stranice 0, a ne prema dolje kako je navedeno u tablici.

Binarni, heksadecimalni i decimalni stupci ove tablice daju adrese memorijskih bajtova u njihovim različitim bazama. Primijetite da je za nultu stranicu samo bitove za donji bajt potrebno upisati prilikom kodiranja. Bitovi za viši bajt mogu se izostaviti jer su uvijek nule (za nultu stranicu). Za ostale stranice treba koristiti bitove za viši bajt.

Ostatak ovog poglavlja objašnjava 6502 µP asemblerski jezik koristeći sve prethodne informacije. Kako bi brzo razumio jezik, čitatelj mora zbrajati i oduzimati u bazi šesnaest umjesto baze deset. Zapravo bi trebala biti baza dva, ali izračunavanje u bazi dva je glomazno. Upamtite da kada zbrajate dva broja u bazi dva, prijenos je i dalje 1 kao u bazi deset. Ali kada se oduzimaju dva broja u bazi dva, posuđenica je dva, a ne deset kao u bazi deset. Kada zbrojite dva broja u bazi šesnaest, prijenos je i dalje 1 kao u bazi deset. Ali kada se oduzimaju dva broja u bazi šesnaest, posuđenica je šesnaest, a ne deset kao u bazi deset.

4.2 Upute za prijenos podataka

Razmotrite sljedeću tablicu uputa za prijenos podataka asemblerskog jezika za 6502 µP:

Kada se bajt (8-bita) kopira s memorijske lokacije bajta u registar akumulatora, registar X ili registar Y, to se učitava. Kada se bajt kopira iz bilo kojeg od ovih registara na memorijsku lokaciju bajta, to je prijenos. Kada se bajt kopira iz jednog registra u drugi, to se još uvijek prenosi. U drugom stupcu tablice strelica pokazuje smjer kopiranja za bajt. Ostatak četiriju stupaca prikazuje različite načine adresiranja.

Unos u stupcu načina adresiranja stvarni je bajt kod za odgovarajući mnemonički dio instrukcije u heksadecimalnom obliku. AE je, na primjer, stvarni bajt kod za LDX koji treba učitati bajt iz memorije u X registar u načinu apsolutnog adresiranja kao što je AE 16 = 10101110 2 . Dakle, bitovi za LDX u memorijskoj lokaciji bajta su 10101110.

Primijetite da za LDX mnemonički dio instrukcije postoje tri moguća bajta koji su A2, AE i A6, a svaki je za određeni način adresiranja. Kada bajt koji se učitava u registar X ne treba kopirati s lokacije memorijskog bajta, vrijednost se mora upisati (odmah nakon) LDX mnemonike u instrukciji u heksadecimalnom ili decimalnom obliku. U ovom poglavlju takve se vrijednosti upisuju u heksadecimalnom obliku. Ovo je trenutno adresiranje, tako da je stvarni bajt u memoriji koji predstavlja LDX A2 16 = 10100010 2 a ne AE 16 što je jednako 10101110 2 .

U tablici, svi bajtovi pod naslovima načina adresiranja nazivaju se kodovi operacija koji su skraćeno opkodovi. Može postojati više od jednog operacijskog koda za jednu mnemotehniku, ovisno o načinu adresiranja.

Bilješka: Riječ 'učitaj' u jedinici računalnog sustava može imati dva značenja: može se odnositi na učitavanje datoteke s diska u memoriju računala ili se može odnositi na prijenos bajta s memorijske lokacije bajta u registar mikroprocesora .

Postoji više načina adresiranja od četiri u tablici za 6502 µP.

Osim ako nije drugačije navedeno, sav korisnički programski kod u ovom poglavlju počinje s adrese 0200 16 što je početak korisničkog područja u memoriji.

Memorija M i Akumulator A

Memorija u akumulator

Trenutno adresiranje
Sljedeća instrukcija pohranjuje broj FF 16 = 255 10 u akumulator:

LDA #$FF

“$” se ne koristi samo za identifikaciju memorijske adrese. Općenito, koristi se za označavanje da je sljedeći broj koji slijedi heksadecimalni. U ovom slučaju, $FF nije adresa nijedne memorijske lokacije bajta. To je broj 255 10 u heksadecimalnom. Baza 16 ili bilo koji drugi ekvivalentni indeksi ne smiju biti napisani u uputama asemblerskog jezika. '#' označava da ono što slijedi je vrijednost koja se stavlja u registar akumulatora. Vrijednost se također može napisati u bazi deset, ali to nije učinjeno u ovom poglavlju. '#' znači trenutno adresiranje.

Mnemotehnika ima neke sličnosti s odgovarajućom engleskom frazom. “LDA #$FF” znači učitavanje broja 255 10 u akumulator A. Budući da je ovo neposredno adresiranje iz prethodne tablice, LDA je A9, a ne AD ili A5. A9 u binarnom obliku je 101010001. Dakle, ako je A9 za LDA u $0200 adresi u memoriji, $FF je u $0301 = 0300 + 1 adresi. #$FF je upravo operand za LDA mnemoniku.

Apsolutno adresiranje
Ako je vrijednost $FF na lokaciji $0333 u memoriji, prethodna je uputa:

LDA 0333 dolara

Obratite pažnju na odsutnost #. U ovom slučaju, odsutnost # znači da je ono što slijedi memorijska adresa, a ne vrijednost od interesa (ne vrijednost za stavljanje u akumulator). Dakle, operativni kod za LDA, ovaj put, je AD, a ne A9 ili A5. Operand za LDA ovdje je adresa $0333, a ne vrijednost $FF. $FF je na lokaciji $0333 koja je prilično daleko. Instrukcija “LDA $0333” zauzima tri uzastopna mjesta u memoriji, a ne dva, kao što je činila prethodna ilustracija. “AD” za LDA nalazi se na lokaciji od 0200 USD. Donji bajt od 0333 koji je 33 nalazi se na lokaciji $0301. Viši bajt od $0333 koji je 03 nalazi se na lokaciji $0302. Ovo je mali endianness koji koristi 6502 asemblerski jezik. Asemblerski jezici različitih mikroprocesora su različiti.

Ovo je primjer apsolutnog adresiranja. $0333 je adresa lokacije koja ima $FF. Instrukcija se sastoji od tri uzastopna bajta i ne uključuje $FF ili njegovu stvarnu lokaciju bajta.

Zero-Page Adresiranje

Pretpostavimo da je vrijednost $FF na memorijskoj lokaciji $0050 na stranici nulta. Lokacije bajtova za nultu stranicu počinju od $0000 i završavaju na $00FF. Ovo su 256 10 mjesta ukupno. Svaka stranica memorije Commodore-64 ima 256 10 dugo. Primijetite da je viši bajt nula za sve moguće lokacije u prostoru od nula stranica u memoriji. Način adresiranja nulte stranice isti je kao i način apsolutnog adresiranja, ali viši bajt od 00 nije upisan u instrukciju. Dakle, za učitavanje $FF s lokacije $0050 u akumulator, instrukcija načina adresiranja nulte stranice je:

LDA 50 dolara

Pri čemu je LDA A5, a ne A9 ili AD, A5 16 = 10100101 2 . Upamtite da se svaki bajt u memoriji sastoji od 8 ćelija, au svakoj ćeliji nalazi se po jedan bit. Instrukcija se ovdje sastoji od dva uzastopna bajta. A5 za LDA nalazi se na memorijskoj lokaciji $0200, a adresa od 50 $, bez višeg bajta od 00, nalazi se na lokaciji $0301. Nedostatak 00, koji bi zauzeo bajt u ukupnoj memoriji od 64K, štedi memorijski prostor.

Akumulator u memoriju

Apsolutno adresiranje
Sljedeća uputa kopira vrijednost bajta, kakva god ona bila, iz akumulatora na memorijsku lokaciju od $1444:

KOSTAJU 1444 dolara

Kaže se da se to prenosi iz akumulatora u memoriju. Ne učitava se. Učitavanje je suprotno. Opcode bajt za STA je 8D 16 = 10001101 2 . Ova se instrukcija sastoji od tri uzastopna bajta u memoriji. 8D 16 nalazi se na lokaciji od 0200 USD. 44 16 od $1444 adrese nalazi se na $0201 lokaciji. i 14 16 nalazi se na lokaciji $0202 – mali endian. Stvarni bajt koji se kopira nije dio instrukcije. Ovdje se za STA koristi 8D, a ne 85 za adresiranje nulte stranice (u tablici).

Zero Page Addressing
Sljedeća uputa kopira vrijednost bajta, kakva god ona bila, iz akumulatora na memorijsku lokaciju od $0050 na nultoj stranici:

STA 0050 USD

Opcode bajt za STA ovdje je 85 16 = 10000101 2 . Ova se instrukcija sastoji od dva uzastopna bajta u memoriji. 85 16 je na lokaciji $0200. 50 16 adrese $0050 nalazi se na lokaciji $0201. Ovdje se ne pojavljuje pitanje endiannessa jer adresa ima samo jedan bajt koji je niži bajt. Stvarni bajt koji se kopira nije dio instrukcije. Ovdje se za STA koristi 85, a ne 8D za adresiranje nulte stranice.

Nema smisla koristiti neposredno adresiranje za prijenos bajta iz akumulatora na mjesto u memoriji. To je zato što stvarna vrijednost poput $FF mora biti navedena u uputama u neposrednom adresiranju. Dakle, trenutno adresiranje nije moguće za prijenos vrijednosti bajta iz registra u µP na bilo koju memorijsku lokaciju.

LDX, STX, LDY i STY mnemotehnika
LDX i STX su slični LDA odnosno STA. Ali ovdje se koristi registar X, a ne registar A (akumulator). LDY i STY su slični LDA odnosno STA. Ali ovdje se koristi Y registar, a ne A registar. Pogledajte Tablicu 4.21 za svaki operacijski kod u heksadecimalnom obliku koji odgovara određenom mnemotehničkom i određenom načinu adresiranja.

Prijenosi iz registra u registar
Prethodna dva skupa instrukcija u tablici 4.21 bave se kopiranjem (prijenosom) registra memorije/mikroprocesora i kopiranjem (prijenosom) registra/registra. Instrukcije TAX, TXA, TAY, TYA, TSX i TXS vrše kopiranje (transfer) iz registra u mikroprocesoru u drugi registar istog mikroprocesora.

Za kopiranje bajta iz A u X, instrukcija je:

POREZ

Za kopiranje bajta iz X u A, instrukcija je:

TX

Za kopiranje bajta iz A u Y, upute su:

RUKA

Za kopiranje bajta iz Y u A, instrukcija je:

TYA

Za računalo commodore 64, stog je stranica 1 odmah nakon stranice 0 u memoriji. Kao i svaka druga stranica, sastoji se od 25610 10 lokacije bajtova, od $0100 do $01FF. Obično se program izvršava od jedne instrukcije do sljedeće uzastopne instrukcije u memoriji. S vremena na vrijeme dolazi do skoka na drugi segment memorijskog koda (skup uputa). Područje stoga u memoriji (RAM) ima adrese sljedećih instrukcija od kojih su skokovi (ili grananja) stali za nastavak programa.

Pokazivač steka “S” je 9-bitni registar u 6502 µP. Prvi bit (krajnji lijevi) uvijek je 1. Sve adrese lokacije bajtova na prvoj stranici počinju s 1 nakon čega slijedi 8 različitih bitova za 256 10 lokacije. Pokazivač stoga ima adresu lokacije na stranici 1 koja ima adresu sljedeće instrukcije koju program mora vratiti i nastaviti s njom nakon izvođenja trenutnog (skočenog na) segmenta koda. Budući da prvi bit svih adresa steka (stranica prva) počinje s 1, registar pokazivača steka treba sadržavati samo preostalih osam bitova. Uostalom, njegov prvi bit, koji je krajnji lijevi bit (deveti bit računajući s desna), uvijek je 1.

Za kopiranje bajta iz S u X, instrukcija je:

TSX

Za kopiranje bajta iz X u S, instrukcija je:

TXT

Instrukcije registar-registar ne uzimaju nikakav operand. Sastoje se samo od mnemotehnike. Svaka mnemonika ima svoj operacijski kod u heksadecimalnom obliku. Ovo je u načinu impliciranog adresiranja jer nema operanda (nema memorijske adrese, nema vrijednosti).

Bilješka: Ne postoji X na Y ili Y na X prijenos (kopiranje).

4.3 Aritmetičke operacije

Krug, aritmetičko-logička jedinica u 6502 µP, može zbrajati samo dva osmobitna broja odjednom. Ne oduzima, ne množi i ne dijeli. Sljedeća tablica prikazuje operativne kodove i načine adresiranja za aritmetičke operacije:

Bilješka: Sve mnemotehnike za aritmetičke operacije i druge vrste operacija (tj. sve 6502 mnemotehnike) uzimaju jedan bajt operacijskog (op) koda. Ako postoji više od jednog načina adresiranja za mnemotehniku, postojat će različiti operativni kodovi za istu mnemoniku: jedan po načinu adresiranja. C, D i V u tablici su oznake statusnog registra. Njihova značenja bit će navedena kasnije prema potrebi.

Zbrajanje brojeva bez predznaka
Kod 6502 µP, brojevi s predznakom su komplementni brojevi. Brojevi bez predznaka su obični pozitivni brojevi koji počinju od nule. Dakle, za bajt od osam bitova, najmanji broj bez predznaka je 00000000 2 = 0 10 = 00 16 a najveći nepredpisani broj je 11111111 2 = 255 10 = FF 16 . Za dva nepredznačena broja zbrajanje je:

A+M+C→A

To znači da 8-bitni sadržaj akumulatora aritmetičko-logička jedinica dodaje bajtu (8-bita) iz memorije. Nakon dodavanja A i M, prijenos do devetog bita ide u ćeliju zastavice prijenosa u statusnom registru. Svaki prethodni bit prijenosa iz prethodnog dodavanja koji je još uvijek u ćeliji zastavice prijenosa u statusnom registru također se dodaje zbroju A i M, čineći A+M+C→A. Rezultat se vraća u akumulator.

Ako je dodatak kamata:

A + M

I nema potrebe za dodavanjem prethodnog prijenosa, zastavica prijenosa se mora obrisati što je postavljeno na 0, tako da je dodavanje:

A+M+0→A isto kao A+M→A

Bilješka: Ako se M doda A, dolazi do prijenosa 1 jer je rezultat veći od 255 10 = 11111111 2 = FF 16 , ovo je novi nosač. Ovaj novi prijenos od 1 automatski se šalje u ćeliju zastavice prijenosa u slučaju da je potreban sljedećem paru osam bitova koji se zbrajaju (još jedan A + M).

Kod za dodavanje dva nepredznačena osmobita
00111111 2 +00010101 2 je isto što i 3F 16 + 15 16 što je isto kao 63 10 +21 10 . Rezultat je 010101002 2 što je isto kao 54 16 i 84 10 . Rezultat nije izvan maksimalnog broja za osam bitova koji iznosi 255 10 = 11111111 2 = FF 16 . Dakle, nema rezultirajućeg prijenosa 1. Drugim riječima, rezultirajući prijenos je 0. Prije zbrajanja, nema prethodnog prijenosa 1. Drugim riječima, prethodni prijenos je 0. Kôd za ovo zbrajanje Može biti:

CLC
LDA #$3F
ADC # $15

Bilješka: Dok upisujete asemblerski jezik, tipka 'Enter' na tipkovnici se pritisne na kraju svake upute. Postoje tri upute u ovom kodu. Prva instrukcija (CLC) briše oznaku prijenosa u slučaju da prethodni dodatak ima 1. CLC se može izvršiti samo u načinu impliciranog adresiranja. Mnemonika za implicirani način adresiranja ne uzima operand. Ovo briše prijenosnu ćeliju statusnog registra P. Brisanje znači davanje bita 0 ćeliji prijenosne zastavice. Sljedeće dvije upute u kodu koriste način trenutnog adresiranja. S neposrednim adresiranjem, postoji samo jedan operand za mnemotehniku ​​koji je broj (a ne adresa memorije ili registra). Dakle, ispred broja mora stajati “#”. “$” znači da je broj koji slijedi heksadecimalni.

Druga instrukcija učitava broj 3F 16 u akumulator. Za treću instrukciju, krug aritmetičke logičke jedinice µP uzima prethodni (obrisan) prijenos 0 (prisilno na 0) ćelije zastavice prijenosa statusnog registra i dodaje ga 15 16 kao i na vrijednost koja je već u 3F 16 akumulator i cijeli rezultat vraća natrag u akumulator. U ovom slučaju, rezultat je prijenos 0. ALU (Aritmetičko-logička jedinica) šalje (stavlja) 0 u ćeliju zastavice prijenosa statusnog registra. Registar statusa procesora i registar statusa znače isto. Ako je rezultat prijenosa 1, ALU šalje 1 na oznaku prijenosa statusnog registra.

Tri retka prethodnog koda moraju biti u memoriji prije nego što se izvrše. Operacijski kod 1816 za CLC (implicirano adresiranje) nalazi se na lokaciji $0200 bajta. Opcijski kod A9 16 za LDA (trenutno adresiranje) je na lokaciji $0201 bajta. Broj 3F 10 je na lokaciji od $0202 bajta. Operativni kod 69 16 za LDA (trenutno adresiranje) je na lokaciji $0203 bajta. Broj 15 10 je na lokaciji od $0204 bajta.

Bilješka: LDA je instrukcija prijenosa (učitavanja), a ne aritmetička instrukcija (mnemotehnika).

Kod za dodavanje dva nepredpisana šesnaest-bita
Svi registri u 6502 µP su u biti osmobitni registri, osim PC (programski brojač) koji je 16-bitni. Čak je i statusni registar širok 8 bita, iako njegovih osam bita ne rade zajedno. U ovom odjeljku razmatra se zbrajanje dvaju 16 nepredznačenih bitova, s prijenosom iz prvog para od osam bitova u drugi par od osam bitova. Prijenos od interesa ovdje je prijenos od pozicije osmog bita do pozicije devetog bita.

Neka brojevi budu 0010101010111111 2 = 2ABF16 16 = 10,943 10 i 0010101010010101 2 = 2A95 16 = 10,901 10 . Zbroj je 0101010101010100 2 = 5554 16 = 21,844 10 .

Zbrajanje ova dva nepredznačena broja u bazu dva je sljedeće:

Sljedeća tablica prikazuje isto zbrajanje s prijenosom 1 od osmog bita do devetog položaja bita, počevši s desne strane:

Kod ovog kodiranja, prva se dodaju dva niža bajta. Zatim, ALU (aritmetičko-logička jedinica) šalje prijenos 1 s položaja osmog bita na položaj devetog bita, u ćeliju oznake prijenosa u statusnom registru. Rezultat 0 1 0 1 0 1 0 0 bez prijenosa ide u akumulator. Zatim se drugi par bajtova dodaje s prijenosom. ADC mnemonika znači automatsko dodavanje s prethodnim prijenosom. U ovom slučaju, prethodni prijenos, koji je 1, ne smije se mijenjati prije drugog dodavanja. Za prvo dodavanje, budući da bilo koji prethodni prijenos nije dio ovog potpunog dodavanja, mora se očistiti (napraviti 0).

Za potpuno zbrajanje dva para bajtova, prvo zbrajanje je:

A + M + 0 -> A

Drugi dodatak je:

A + M + 1 -> A

Dakle, zastavica prijenosa mora biti obrisana (daje joj se vrijednost 0) neposredno prije prvog dodavanja. Sljedeći program čije objašnjenje čitatelj mora pročitati koristi način apsolutnog adresiranja za ovo zbrajanje:

CLC
LDA 0213 dolara
ADC 0215 dolara
; nema čišćenja jer je potrebna vrijednost oznake prijenosa
STA 0217 dolara
LDA 0214 dolara
ADC 0216 dolara
STA 0218 USD

Imajte na umu da kod asemblerskog jezika 6502 komentar počinje točkom i zarezom. To znači da se u izvršavanju programa zanemaruje točka-zarez i sve s njegove desne strane. Program koji je prethodno napisan nalazi se u tekstualnoj datoteci i sprema se s imenom po izboru programera i s ekstenzijom.asm. Prethodni program nije točan program koji ide u memoriju na izvršenje. Odgovarajući program u memoriji naziva se prevedeni program gdje su mnemotehnike zamijenjene operativnim kodovima (bajtovima). Svaki komentar ostaje u tekstualnoj datoteci asemblerskog jezika i uklanja se prije nego što prevedeni program stigne u memoriju. U stvari, postoje dvije datoteke koje se danas spremaju na disk: datoteka “.asm” i datoteka “.exe”. Datoteka “.asm” je ona na prethodnoj ilustraciji. Datoteka '.exe' je datoteka '.asm' s uklonjenim svim komentarima i svim mnemotehničkim znakovima zamijenjenim njihovim operativnim kodovima. Kada se otvori u uređivaču teksta, datoteka “.exe” je neprepoznatljiva. Osim ako nije drugačije navedeno, za potrebe ovog poglavlja, '.exe' datoteka se kopira u memoriju počevši od lokacije $0200. Ovo je drugo značenje učitavanja.

Dva 16-bitna broja koja se dodaju zauzimaju četiri bajta u memoriji za apsolutno adresiranje: dva bajta po broju (memorija je niz bajtova). Kod apsolutnog adresiranja, operand operacijskog koda nalazi se u memoriji. Rezultat zbrajanja je širok dva bajta i također se mora smjestiti u memoriju. Ovo daje ukupno 6 10 = 6 16 bajtova za ulaze i izlaze. Ulazi nisu s tipkovnice, a izlaz nije s monitora ili pisača. Ulazi su u memoriji (RAM), a izlaz (rezultat zbrajanja) se u ovoj situaciji vraća u memoriju (RAM).

Prije nego što se program izvrši, prevedena verzija najprije mora biti u memoriji. Gledajući prethodni programski kod, vidljivo je da upute bez komentara čine 19 10 = 13 16 bajtova. Dakle, program preuzima od $0200 lokacije bajtova u memoriji do $0200 + $13 – $1 = $0212 lokacije bajtova (počevši od $0200, a ne $0201 što implicira – $1). Dodavanjem 6 bajtova za ulazne i izlazne brojeve cijeli program završava na $0212 + $6 = $0218. Ukupno trajanje programa je 19 16 = 25 10 .

Niži bajt augenda trebao bi biti u adresi $0213, a viši bajt istog augenda trebao bi biti u adresi $0214 – mali endianness. Slično tome, niži bajt zbrojnika trebao bi biti na adresi $0215, a viši bajt istog zbrojnika trebao bi biti na adresi $0216 – mali endianness. Niži bajt rezultata (zbroja) trebao bi biti na adresi $0217, a viši bajt istog rezultata trebao bi biti na adresi $0218 – mali endianness.

Operativni kod 18 16 za CLC (implicirano adresiranje) nalazi se na lokaciji bajta od 0200 USD. Operativni kod za 'LDA $0213', tj. AD 16 za LDA (apsolutno adresiranje), nalazi se na lokaciji bajta od $0201. Donji bajt augenda koji je 10111111 nalazi se na lokaciji memorijskog bajta $0213. Imajte na umu da svaki operacijski kod zauzima jedan bajt. Adresa “$0213” od “LDA $0213” je na lokacijama bajtova $0202 i $0203. Instrukcija “LDA $0213” učitava donji bajt augenda u akumulator.

Operativni kod za 'ADC $0215', tj. 6D 16 za ADC (apsolutno adresiranje), nalazi se na lokaciji bajta od $0204. Donji bajt pribrojnika koji je 10010101 nalazi se na lokaciji bajta $0215. Adresa “$0215” od “ADC $0215” je na lokacijama bajtova $0205 i $0206. Instrukcija “ADC $0215” dodaje donji bajt pribrojnika donjem bajtu augenda koji je već u akumulatoru. Rezultat se vraća u akumulator. Svaki prijenos nakon osmog bita šalje se zastavici prijenosa statusnog registra. Ćelija zastavice prijenosa ne smije se obrisati prije drugog dodavanja viših bajtova. Ovaj prijenos se automatski dodaje zbroju viših bajtova. Zapravo, prijenos od 0 dodaje se zbroju nižih bajtova automatski na početku (ekvivalentno bez dodavanja prijenosa) zbog CLC-a.

Komentar traje sljedećih 48 10 = 30 16 bajtova. Međutim, to ostaje samo u tekstualnoj datoteci “.asm”. Ne dopire do memorije. Uklanja se prevođenjem koje vrši asembler (program).

Za sljedeću instrukciju koja je 'STA $0217', operativni kod STA koji je 8D 16 (apsolutno adresiranje) je na lokaciji bajta $0207. Adresa “$0217” od “STA $0217” nalazi se na memorijskim lokacijama $0208 i $0209. Instrukcija “STA $0217” kopira osmobitni sadržaj akumulatora na memorijsku lokaciju $0217.

Viši bajt augenda koji je 00101010 nalazi se na memorijskoj lokaciji $0214, a viši bajt aenda koji je 00101010 nalazi se na lokaciji bajta $02 16 . Operacijski kod za “LDA $0214” koji je AD16 za LDA (apsolutno adresiranje) nalazi se na lokaciji bajta $020A. Adresa “$0214” od “LDA $0214” nalazi se na lokacijama $020B i $020C. Instrukcija “LDA $0214” učitava viši bajt augenda u akumulator, brišući sve što je u akumulatoru.

Operativni kod za 'ADC $0216' koji je 6D 16 za ADC (apsolutno adresiranje) je na lokaciji bajta od $020D. Adresa “$0216” za “ADC 0216” nalazi se na lokacijama bajtova $020E i $020F. Instrukcija “ADC $0216” dodaje viši bajt pribrojnika višem bajtu augenda koji je već u akumulatoru. Rezultat se vraća u akumulator. Ako postoji prijenos 1, za ovo drugo zbrajanje automatski se postavlja u ćeliju prijenosa statusnog registra. Iako prijenos iza šesnaestog bita (lijevo) nije potreban za ovaj problem, lijepo je provjeriti je li došlo do prijenosa 1 provjerom je li zastavica prijenosa postala 1.

Za sljedeću i posljednju instrukciju koja je 'STA $0218', operativni kod STA koji je 8D16 (apsolutno adresiranje) nalazi se na lokaciji bajta $0210. Adresa “$0218” od “STA $0218” nalazi se na memorijskim lokacijama $0211 i $0212. Instrukcija “STA $0218” kopira osmobitni sadržaj akumulatora na memorijsku lokaciju $0218. Rezultat zbrajanja dvaju šesnaestobitnih brojeva je 0101010101010100, s nižim bajtom 01010100 u memorijskoj lokaciji od $0217 i višim bajtom od 01010101 u memorijskoj lokaciji od $0218 – mali endianness.

Oduzimanje
Kod 6502 µP, brojevi s predznakom su komplementni brojevi. Broj komplementa dvojke može biti osam bitova, šesnaest bitova ili bilo koji višekratnik osam bitova. S komplementom dva, prvi bit slijeva je bit predznaka. Za pozitivan broj, ovaj prvi bit je 0 da označi znak. Ostali bitovi tvore broj na normalan način. Da biste dobili komplement dvojke negativnog broja, obrnite sve bitove za odgovarajući pozitivni broj, a zatim dodajte 1 rezultatu s desnog kraja.

Za oduzimanje jednog pozitivnog broja od drugog pozitivnog broja, subtrahend se pretvara u negativni broj s komplementom dvojke. Zatim se umanjenik i novi negativni broj dodaju na uobičajeni način. Dakle, oduzimanje od osam bita postaje:

Gdje se prijenos pretpostavlja kao 1. Rezultat u akumulatoru je razlika u komplementu dva. Dakle, za oduzimanje dva broja, zastavica prijenosa mora biti postavljena (postavljena na 1).

Kod oduzimanja dva šesnaestobitna broja oduzimanje se vrši dva puta kao kod zbrajanja dva šesnaestobitna broja. Budući da je oduzimanje oblik zbrajanja s 6502 µP, kada se oduzimaju dva šesnaestobitna broja, zastavica prijenosa postavlja se samo jednom za prvo oduzimanje. Za drugo oduzimanje, bilo koje postavljanje zastavice za prijenos vrši se automatski.

Programiranje oduzimanja za osmobitne brojeve ili šesnaestobitne brojeve radi se slično programiranju zbrajanja. Međutim, zastavica za prijenos mora biti postavljena na samom početku. Mnemotehnika za to je:

Oduzimanje sa šesnaest-bitnim pozitivnim brojevima
Razmotrite oduzimanje sa sljedećim brojevima:

Ovo oduzimanje ne uključuje komplement dvojke. Budući da se oduzimanje u 6502 µP vrši u komplementu dva, oduzimanje u bazi dva se vrši na sljedeći način:

Rezultat komplementa dva je isti kao rezultat koji se dobije običnim oduzimanjem. Međutim, imajte na umu da se 1 koji ide na položaj sedamnaestog bita s desne strane zanemaruje. Minuend i subtrahend se dijele na po dvije osmice. Dva komplementa od 10010110 donjeg bajta subtrahenda određuju se neovisno o njegovom višem bajtu i bilo kakvom prijenosu. Dva komplementa od 11101011 višeg bajta subtrahenda određuju se neovisno o njegovom nižem bajtu i bilo kakvom prijenosu.

16-bita umanjenika već je u komplementu dva, počevši s 0 slijeva. Dakle, ne treba nikakvo podešavanje u bitovima. S 6502 µP, donji bajt umanjenika bez ikakvih izmjena dodaje se donjem bajtu komplementa dva subtrahenda. Donji bajt umanjenika ne pretvara se u komplement dvojke jer šesnaest bitova cijelog umanjenika već mora biti u komplementu dvojke (s 0 kao prvim bitom s lijeve strane). U ovom prvom zbrajanju, dodaje se obvezno prijenos 1 zbog 1=0 SEC instrukcije.

U trenutnom efektivnom oduzimanju postoji prijenos 1 (zbrajanja) od osmog bita do devetog bita (s desna). Budući da je ovo zapravo oduzimanje, koji god bit koji bi trebao biti u zastavici prijenosa u statusnom registru se nadopunjuje (invertira). Dakle, prijenos 1 postaje 0 u C zastavi. U drugoj operaciji, viši bajt minuenda dodaje se bajtu komplementa dva viša subtrahenda. Automatski komplementirani bit zastavice prijenosa statusnog registra (u ovom slučaju je 0) također se dodaje (višim bajtovima). Svaki 1 koji ide dalje od šesnaestog bita s desne strane se zanemaruje.

Sljedeća stvar je jednostavno kodiranje cijele te sheme na sljedeći način:

SEK
LDA 0213 dolara
SBC 0215 dolara
; nema čišćenja jer je potrebna obrnuta vrijednost oznake prijenosa
STA 0217 dolara
LDA 0214 dolara
SBC $0216
STA 0218 USD

Upamtite da s asemblerskim jezikom 6502 točka-zarez počinje komentar koji nije uključen u prevedenu verziju programa u memoriji. Dva 16-bitna broja za oduzimanje zauzimaju četiri bajta memorije s apsolutnim adresiranjem; dva po broju (memorija je niz bajtova). Ovi unosi nisu s tipkovnice. Rezultat zbrajanja je dva bajta i također se mora smjestiti u memoriju na drugo mjesto. Ovaj izlaz ne ide na monitor ili pisač; ide u memoriju. Ovo daje ukupno 6 10 = 6 16 bajtova za ulaze i izlaze koji će se smjestiti u memoriju (RAM).

Prije nego što se program izvrši, prvo mora biti u memoriji. Gledajući programski kod, vidljivo je da upute bez komentara čine 19 10 = 13 16 bajtova. Budući da svi programi u ovom poglavlju počinju od memorijske lokacije od $0200, program preuzima od $0200 lokacije bajta u memoriji do $0200 + $13 – $1 = $0212 lokacije bajta (počevši od $0200, a ne od $0201). Ovaj raspon ne uključuje regiju za ulazne i izlazne bajtove. Dva ulazna broja zauzimaju 4 bajta, a jedan izlazni broj zauzima 2 bajta. Dodavanje 6 bajtova za ulazne i izlazne brojeve čini raspon za program koji završava na $0212 + $6 = $0218. Ukupno trajanje programa je 19 16 = 25 10 .

Niži bajt minuenda trebao bi biti u adresi $0213, a viši bajt istog minuenda trebao bi biti u adresi $0214 – mali endianness. Slično tome, niži bajt subtrahenda trebao bi biti u adresi $0215, a viši bajt istog subtrahenda trebao bi biti u adresi $0216 – mali endianness. Niži bajt rezultata (razlika) trebao bi biti na adresi $0217, a viši bajt istog rezultata trebao bi biti na adresi $0218 – mali endianness.

Operativni kod 38 16 za SEC (implicirano adresiranje) je u adresi od 0200 $. Pretpostavlja se da svi programi u ovom poglavlju počinju na memorijskoj lokaciji od $0200, poništavajući sve programe koji bi bili tamo; osim što je drugačije navedeno. Operativni kod za 'LDA $0213', tj. AD 16 , za LDA (apsolutno adresiranje) je na lokaciji $0201 bajta. Donji bajt minuenda koji je 10111111 nalazi se na lokaciji memorijskog bajta $0213. Upamtite da svaki operacijski kod zauzima jedan bajt. Adresa “$0213” od “LDA $0213” je na lokacijama bajtova $0202 i $0203. Instrukcija “LDA $0213” učitava donji bajt umanjenika u akumulator.

Operativni kod za 'SBC $0215', tj. ED 16 , za SBC (apsolutno adresiranje) je na lokaciji $0204 bajta. Donji bajt subtrahenda koji je 01101010 nalazi se na lokaciji bajta $0215. Adresa “$0215” od “ADC $0215” je na lokacijama bajtova $0205 i $0206. Instrukcija “SBC $0215” oduzima donji bajt subtrahenda od donjeg bajta umanjenika koji je već u akumulatoru. Ovo je oduzimanje komplementa dva. Rezultat se vraća u akumulator. Komplement (inverzija) bilo kojeg prijenosa nakon osmog bita šalje se zastavici prijenosa statusnog registra. Ova oznaka prijenosa ne smije se obrisati prije drugog oduzimanja s višim bajtovima. Ovo prijenos se automatski dodaje oduzimanju viših bajtova.

Komentar traje sljedećih 57 10 = 3916 16 bajtova. Međutim, to ostaje samo u tekstualnoj datoteci “.asm”. Ne dopire do memorije. Uklanja se prevođenjem koje vrši asembler (program).

Za sljedeću instrukciju koja je 'STA $0217', operativni kod STA, tj. 8D 16 (apsolutno adresiranje), nalazi se na lokaciji $0207 bajta. Adresa “$0217” od “STA $0217” nalazi se na memorijskim lokacijama $0208 i $0209. Instrukcija “STA $0217” kopira osmobitni sadržaj akumulatora na memorijsku lokaciju $0217.

Viši bajt umanjenika koji je 00101010 nalazi se na memorijskoj lokaciji $0214, a viši bajt umanjenika koji je 00010101 nalazi se na lokaciji bajta $0216. Operativni kod za 'LDA $0214', tj. AD 16 za LDA (apsolutno adresiranje), nalazi se na lokaciji bajta $020A. Adresa “$0214” od “LDA $0214” nalazi se na lokacijama $020B i $020C. Instrukcija “LDA $0214” učitava viši bajt minuenda u akumulator, brišući sve što je u akumulatoru.

Operacijski kod za 'SBC $0216', tj. ED 16 za SBC (apsolutno adresiranje), nalazi se na lokaciji bajta $020D. Adresa “$0216” od “SBC $0216” je na lokacijama bajtova $020E i $020F. Instrukcija 'SBC $0216' oduzima viši bajt subtrahenda od višeg bajta umanjenika (komplement dvojke) koji je već u akumulatoru. Rezultat se vraća u akumulator. Ako postoji prijenos 1 za ovo drugo oduzimanje, njegov se komplement automatski postavlja u ćeliju prijenosa registra statusa. Iako prijenos iza šesnaestog bita (lijevo) nije potreban za ovaj problem, lijepo je provjeriti javlja li se prijenos komplementa provjerom oznake prijenosa.

Za sljedeću i posljednju instrukciju koja je 'STA $0218', operativni kod STA, tj. 8D 16 (apsolutno adresiranje), nalazi se na lokaciji $0210 bajta. Adresa “$0218” od “STA $0218” nalazi se na memorijskim lokacijama $0211 i $0212. Instrukcija “STA $0218” kopira osmobitni sadržaj akumulatora na memorijsku lokaciju $0218. Rezultat oduzimanja s dva šesnaestobitna broja je 0001010101010101 s nižim bajtom 01010101 u memorijskoj lokaciji od $0217 i višim bajtom od 00010101 u memorijskoj lokaciji od $0218 – mali endianness.

6502 µP ima sklop samo za zbrajanje i neizravno za oduzimanje komplementa dva. Nema strujni krug za množenje i dijeljenje. Da biste izvršili množenje i dijeljenje, potrebno je napisati program na asemblerskom jeziku s detaljima, uključujući pomicanje djelomičnih proizvoda i djelomičnih dividendi.

4.4 Logičke operacije

U 6502 µP, mnemotehnika za ILI je ORA, a mnemonika za isključivi ILI je EOR. Primijetite da logičke operacije nemaju implicirano adresiranje. Implicitno adresiranje ne uzima operand. Svaki od logičkih operatora mora uzeti dva operanda. Prvi je u akumulatoru, a drugi u memoriji ili u instrukciji. Rezultat (8 bita) se vraća u akumulator. Prvi u akumulatoru se tamo stavlja neposrednom instrukcijom ili se kopira iz memorije s apsolutnim adresiranjem. U ovom se odjeljku za ilustraciju koristi samo adresiranje nulte stranice. Ovi logički operatori su svi bitni operatori.

I
Sljedeća tablica ilustrira bitni I u binarnom, heksadecimalnom i decimalnom obliku:

Svi programi u ovom poglavlju trebali bi početi na lokaciji memorijskog bajta od 0200 $. Međutim, programi u ovom odjeljku nalaze se na nultoj stranici, s ciljem ilustracije upotrebe nulte stranice bez višeg bajta od 00000000 2 . Prethodni AND može se kodirati na sljedeći način:

LDA #$9A ; ne po sjećanju – trenutno adresiranje
I #$CD ; ne po sjećanju – trenutno adresiranje
STA 30 USD ; pohranjuje 88 USD na 0030 USD na bazi nule

ILI
Sljedeća tablica ilustrira Bitwise OR u binarnom, heksadecimalnom i decimalnom obliku:

LDA #$9A ; ne po sjećanju – trenutno adresiranje
ORA #$CD ; ne po sjećanju – trenutno adresiranje
STA 30 USD ; pohranjuje $CF na 0030 $ bazirano na nuli

BESPLATNO
Sljedeća tablica ilustrira Bitwise XOR u binarnom, heksadecimalnom i decimalnom obliku:

LDA #$9A ; ne po sjećanju – trenutno adresiranje
EOR #$CD ; ne po sjećanju – trenutno adresiranje
STA 30 USD ; pohranjuje 57 USD na 0030 USD na bazi nule

4.5 Operacije pomicanja i rotiranja

Mnemotehnika i operativni kodovi za operatore pomaka i rotacije su:

ASL: Pomak ulijevo za jedan bit akumulatora ili memorijske lokacije, umetanje 0 u ispražnjenu krajnju desnu ćeliju.

LSR: pomak udesno za jedan bit akumulatora ili memorijske lokacije, umetanje 0 u ispražnjenu najlijevu ćeliju.
ROL: Rotirajte jedan bit lijevo od akumulatora ili memorijske lokacije, umetanjem bita koji je ispao s lijeve strane u ispražnjenu krajnju desnu ćeliju.
ROR: Rotirajte jedan bit desno od akumulatora ili memorijske lokacije, umetanjem bita koji je ispao s desne strane u ispražnjenu najlijevu ćeliju.

Za pomak ili rotaciju s akumulatorom, upute su otprilike ove:

LSR A

Ovo koristi drugi način adresiranja koji se naziva način adresiranja akumulatora.

Za pomak ili rotaciju s bajtnom memorijskom lokacijom, upute su otprilike ove:

ROR 2BCD

Gdje je 2BCD memorijska lokacija.

Imajte na umu da ne postoji neposredni ili implicirani način adresiranja za pomicanje ili rotiranje. Ne postoji način trenutnog adresiranja jer nema smisla pomicati ili rotirati broj koji ostaje samo u instrukciji. Nema impliciranog načina adresiranja jer dizajneri 6502 µP žele da se samo sadržaj akumulatora (A registar) ili memorijska lokacija bajta pomakne ili rotira.

4.6 Način relativnog adresiranja

Mikroprocesor uvijek povećava (za 1, 2 ili 3 jedinice) programski brojač (PC) kako bi pokazao na sljedeću instrukciju koja se treba izvršiti. 6502 µP ima instrukciju čija je mnemonika BVS što znači grananje na skupu preljeva. PC se sastoji od dva bajta. Ova instrukcija uzrokuje da računalo ima drugu memorijsku adresu za sljedeću instrukciju koja će se izvršiti koja nije rezultat normalnog povećanja. To čini dodavanjem ili oduzimanjem vrijednosti, koja se naziva pomak, sadržaju računala. I tako, računalo zatim ukazuje na drugu (razgranatu) memorijsku lokaciju da bi računalo nastavilo s izvršavanjem od tamo. Pomak je cijeli broj od -128 10 do +127 10 (komplement dvojke). Dakle, pomak može učiniti skok naprijed u memoriji. Ako je pozitivan ili zaostao u pamćenju, ili ako je negativan.

BVS instrukcija uzima samo jedan operand koji je pomak. BVS koristi relativno adresiranje. Razmotrite sljedeću uputu:

BVS 7F USD

U bazi dva, 7F H je 01111111 2 = 127 10 . Pretpostavimo da je sadržaj u računalu za sljedeću instrukciju 0300 USD. BVS instrukcija uzrokuje dodavanje 7F$ (pozitivan broj koji je već u komplementu dvojke) na 0300$ da bi se dobilo 037F$. Dakle, umjesto da se sljedeća instrukcija izvrši na memorijskoj lokaciji od $0300, ona je na memorijskoj lokaciji od $037F (otprilike pola stranice razlike).

Postoje i druge upute za grananje, ali BVS je vrlo dobar za korištenje za ilustraciju relativnog adresiranja. Relativno adresiranje bavi se uputama grananja.

4.7 Indeksirano adresiranje i neizravno adresiranje zasebno

Ovi načini adresiranja omogućuju 6502 µP rukovanje ogromnim količinama podataka u kratkim vremenskim razdobljima sa smanjenim brojem instrukcija. Postoje lokacije od 64 KB za cijelu memoriju Comodore-64. Dakle, za pristup bilo kojoj lokaciji bajta, od 16 bita, potrebna su dva bajta. Jedina iznimka od potrebe za dva bajta je stranica nulta gdje je viši bajt od $00 izostavljen kako bi se uštedio prostor koji instrukcija zauzima u memoriji. S načinom adresiranja bez nulte stranice, i viši i niži bajt 16-bitne memorijske adrese uglavnom su nekako naznačeni.

Osnovno indeksirano adresiranje

Apsolutno indeksno adresiranje
Ne zaboravite da se registar X ili Y naziva indeksni registar. Razmotrite sljedeću uputu:

LDA C453,X

Pretpostavimo da je vrijednost 6 H nalazi se u registru X. Imajte na umu da 6 nije upisano nigdje u uputama. Ova uputa dodaje vrijednost 6H na C453 H koji je dio tipkane instrukcije u tekstualnoj datoteci koju još treba sastaviti – C453 H + 6 H = C459 H . LDA znači učitavanje bajta u akumulator. Bajt koji se učitava u akumulator dolazi s adrese $C459. $C459 što je zbroj $C453 koji je upisan s uputom i 6 H koja se nalazi u registru X postaje efektivna adresa s koje dolazi bajt koji se učitava u akumulator. Ako 6 H bio u registru Y, Y se upisuje umjesto X u instrukciji.

U upisanoj izjavi instrukcije, $C453 je poznat kao osnovna adresa i 6 H u registru X ili Y poznat je kao dio za brojanje ili indeks za efektivnu adresu. Osnovna adresa može se odnositi na bilo koju adresu bajta u memoriji, a sljedećih 256 10 adresama se može pristupiti, pod pretpostavkom da je početni indeks (ili brojač) u registru X ili Y 0. Zapamtite da jedan bajt može dati kontinuirani raspon do 256 10 brojevi (tj. 00000000 2 na 11111111 2 ).

Dakle, apsolutno adresiranje dodaje sve što je već stavljeno (što je stavljeno drugom instrukcijom) u X ili Y registar na 16 adresa koje su upisane s instrukcijom za dobivanje efektivne adrese. U tipkanoj instrukciji, dva indeksna registra se razlikuju po X ili Y koji se upisuju nakon zareza. Upisuje se ili X ili Y; ne oboje.

Nakon što je sav program upisan u uređivaču teksta i spremljen s nazivom datoteke ekstenzije “.asm”, asembler, koji je drugi program, mora prevesti upisani program u ono što je (učitano) u memoriju. Prethodna instrukcija, koja je 'LDA $C453,X', zauzima tri lokacije bajta u memoriji, a ne pet.

Upamtite da mnemotehnika kao što je LDA može imati više od jednog operacijskog koda (različiti bajtovi). Operacijski kod za instrukciju koja koristi X registar razlikuje se od operacijskog koda koji koristi Y registar. Asembler zna koji operativni kod treba koristiti na temelju upisane instrukcije. Jednobajtni operativni kod za 'LDA $C453,X' razlikuje se od jednobajtnog operativnog koda za 'LDA $C453,Y'. Zapravo, operativni kod za LDA u “LDA $C453,X” je BD, a operativni kod za LDA u “LDA $C453,9” je BD.

Ako je opcode za LDA na lokaciji bajta $0200. Zatim, 16-bitna adresa $C453 zauzima sljedeće lokacije bajtova u memoriji koje su $0201 i $0202. Određeni bajt operacijskog koda označava je li uključen X registar ili Y registar. I tako, sastavljena jezična instrukcija koja je “LDA $C453,X” ili “LDA $C453,Y” zauzima tri uzastopna bajta u memoriji, a ne četiri ili pet.

Indeksirano adresiranje bez stranice
Indeksno adresiranje nulte stranice je kao apsolutno indeksno adresiranje koje je prethodno opisano, ali ciljni bajt mora biti samo na nultoj stranici (od $0000 do $00FF). Sada, kada se radi o nultoj stranici, viši bajt koji je uvijek 00 H jer se memorijske lokacije obično izbjegavaju. Dakle, obično se spominje da nulta stranica počinje od 00 USD do FF. I tako, prethodna uputa za “LDA $C453,X” je:

LDA $53.X

$C4, viši bajt koji se odnosi na stranicu iznad nulte stranice, ne može se koristiti u ovoj instrukciji budući da stavlja očekivani ciljni bajt za učitavanje u akumulirani bajt izvan i iznad nulte stranice.

Kada se vrijednost koja je upisana u instrukciji doda vrijednosti u registru indeksa, zbroj ne bi trebao dati rezultat iznad nulte stranice (FF H ). Dakle, ne dolazi u obzir imati instrukciju poput “LDA $FF, X” i vrijednost poput FF H u indeksnom registru jer FF H + FF H = 200 H što je lokacija prvog bajta (0200$) stranice 2 (treća stranica) u memoriji, velika je udaljenost od stranice 0. Dakle, s indeksiranim adresiranjem nulte stranice, efektivna adresa mora ležati na nultoj stranici.

Neizravno adresiranje

Jump Apsolutno adresiranje
Prije rasprave o apsolutnom neizravnom adresiranju, dobro je prvo pogledati JMP apsolutno adresiranje. Pretpostavimo da je adresa koja ima vrijednost interesa (ciljani bajt) 8765 USD. Ovo je 16-bit koji se sastoji od dva bajta: viši bajt koji je 87 H i donji bajt koji je 65 H . Dakle, dva bajta za 8765 dolara stavljaju se u PC (brojač programa) za sljedeću instrukciju. Ono što je upisano u program asemblerskog jezika (datoteka) je:

JMP 8765 dolara

Program koji se izvršava u memoriji skače s bilo koje adrese kojoj je pristupio na $8765. JMP mnemonika ima tri operacijska koda koji su 4C, 6C i 7C. Operacijski kod za ovo apsolutno adresiranje je 4C. Operacijski kod za JMP apsolutno neizravno adresiranje je 6C (pogledajte sljedeće ilustracije).

Apsolutno neizravno adresiranje
Ovo se koristi samo s instrukcijom skoka (JMP). Pretpostavimo da je adresa koja ima bajt od interesa (ciljani bajt) 8765 USD. Ovo je 16-bit koji se sastoji od dva bajta: viši bajt koji je 87 H i donji bajt koji je 65 H . S apsolutnim neizravnim adresiranjem, ova dva bajta su zapravo smještena na dvije uzastopne lokacije bajta negdje drugdje u memoriji.

Pretpostavimo da se nalaze na memorijskim lokacijama $0210 i $0211. Zatim, niži bajt adrese od interesa koja je 65 H nalazi se u adresi $0210 i viši bajt koji je 87 H nalazi se na adresi $0211. To znači da niži memorijski bajt od interesa ide na nižu uzastopnu adresu, a viši memorijski bajt od interesa ide na višu uzastopnu adresu – mali redosljed.

16-bitna adresa može se odnositi na dvije uzastopne adrese u memoriji. U tom svjetlu, adresa $0210 odnosi se na adrese $0210 i $0211. Adresni par od $0210 i $0211 sadrži konačnu adresu (16 bita od dva bajta) ciljnog bajta, s donjim bajtom od 65 H u $0210 i viši bajt od 87 H u 0211 dolara. Dakle, instrukcija skoka koja se upisuje je:

JMP (0210 USD)

JMP mnemonika ima tri operacijska koda koji su 4C, 6C i 7C. Operacijski kod za apsolutno neizravno adresiranje je 6C. Ono što je upisano u tekstualnu datoteku je 'JMP ($0210)'. Zbog zagrada asembler (prevoditelj) koristi op kod 6C za JMP, a ne 4C ili 7C.

S apsolutnim neizravnim adresiranjem zapravo postoje tri memorijska područja. Prvo područje može se sastojati od lokacija bajtova $0200, $0201 i $0202. Ovo ima tri bajta za instrukciju 'JMP ($0210)'. Druga regija, koja nije nužno pored prve, sastoji se od dvije uzastopne lokacije bajtova $0210 i $0211. Ovdje je niži bajt ($0210) koji je upisan u programskoj instrukciji asemblerskog jezika. Ako je adresa od interesa 8765 USD, donji bajt od 65 H nalazi se na lokaciji bajta $0210, a viši bajt od 87 H nalazi se na lokaciji bajta $0211. Treća regija se sastoji od samo jedne lokacije bajta. To je adresa od $8765 za ciljani bajt (krajnji bajt od interesa). Par uzastopnih adresa, $0210 i $0211, drži pokazivač $8765 koji je adresa od interesa. Nakon računalne interpretacije, 8765 USD ide u PC (programski brojač) za pristup ciljnom bajtu.

Neizravno adresiranje nulte stranice
Ovo adresiranje je isto kao i apsolutno neizravno adresiranje, ali pokazivač mora biti na stranici nulta. Adresa donjeg bajta regije pokazivača je ono što je u upisanoj instrukciji kako slijedi:

JMP (50 USD)

Viši bajt pokazivača je na lokaciji $51 bajta. Efektivna adresa (zašiljena) ne mora biti na nultoj stranici.

Dakle, kod indeksnog adresiranja, vrijednost u indeksnom registru dodaje se osnovnoj adresi koja je dana u uputama da bi se dobila efektivna adresa. Neizravno adresiranje koristi pokazivač.

4.8 Indeksirano neizravno adresiranje

Apsolutno indeksirano neizravno adresiranje
Ovaj način adresiranja koristi se samo s JMP instrukcijom.
Kod apsolutnog neizravnog adresiranja, postoji označena vrijednost (bajt) sa svoje dvije uzastopne adrese bajtova. Ove dvije uzastopne adrese tvore pokazivač koji se nalazi u području pokazivača dva uzastopna bajta u memoriji. Donji bajt regije pokazivača je ono što je upisano u instrukciji u zagradama. Pokazivač je adresa označene vrijednosti. U prethodnoj situaciji, $8765 je adresa označene vrijednosti. $0210 (nakon kojeg slijedi $0211) je adresa čiji je sadržaj $8765 koja je pokazivač. S načinom apsolutnog neizravnog adresiranja, ($0210) se upisuje u program (tekstualna datoteka), uključujući zagrade.

S druge strane, s načinom apsolutno indeksiranog neizravnog adresiranja, niži bajt adrese za regiju pokazivača formira se dodavanjem vrijednosti u registru X upisanoj adresi. Na primjer, ako je pokazivač na lokaciji adrese $0210, upisana uputa može biti nešto poput ovoga:

JMP (020 USD, X)

Gdje X registar ima vrijednost 6 H . 020A H + 6 H = 0210 H . Registar Y se ne koristi s ovim načinom adresiranja.

Neizravno adresiranje s indeksom nula stranica
Ovaj način adresiranja koristi X registar, a ne Y registar. S ovim načinom adresiranja još uvijek postoji označena vrijednost i pokazivač u njegovoj dvobajtnoj regiji pokazivača adrese. Mora postojati dva uzastopna bajta na stranici nulta za pokazivač. Adresa koja je upisana u instrukciji je jednobajtna adresa. Ova vrijednost se dodaje vrijednosti u X registru i svaki prijenos se odbacuje. Rezultat pokazuje na područje pokazivača na stranici 0. Na primjer, ako je adresa od interesa (usmjerena) $8765 i nalazi se na lokacijama bajta $50 i $51 stranice 0, a vrijednost u X registru je $30, tipkana instrukcija je otprilike ovakva:

LDA (20,X USD)

Jer 20 $ + 30 $ = 50 $.

Neizravno indeksirano adresiranje
Ovaj način adresiranja koristi Y registar, a ne X registar. S ovim načinom adresiranja još uvijek postoji označena vrijednost i područje pokazivača, ali sadržaj područja pokazivača funkcionira drugačije. Mora postojati dva uzastopna bajta na nultoj stranici za područje pokazivača. Donja adresa regije pokazivača upisuje se u instrukciju. Ovaj broj (par bajtova) koji je sadržan u području pokazivača dodaje se vrijednosti u registru Y da bi se dobio pravi pokazivač. Na primjer, neka interesna adresa (usmjerena) bude $8765, vrijednost 6H bude u Y registru, a broj (dva bajta) bude na adresi 50 H i 51 H . Dva bajta zajedno iznose 875 F jer je 875 F + 6 $ = 8765 $. Tipkana uputa je otprilike ovakva:

LDA (50 USD), Y

4.9 Upute za povećanje, smanjenje i test-BIT-ove

Sljedeća tablica prikazuje operacije instrukcija povećanja i smanjenja:

INA i DEA povećavaju odnosno smanjuju akumulator. To se zove adresiranje akumulatora. INX, DEX, INY i DEY su za X odnosno Y registre. Ne uzimaju nikakav operand. Dakle, koriste implicirani način adresiranja. Inkrement znači dodavanje 1 u registar ili memorijski bajt. Dekrement znači oduzimanje 1 od registra ili memorijskog bajta.

INC i DEC povećavaju odnosno smanjuju memorijski bajt (a ne registar). Korištenje adresiranja nulte stranice umjesto apsolutnog adresiranja služi za uštedu memorije za instrukcije. Adresiranje nulte stranice je jedan bajt manje od apsolutnog adresiranja za instrukciju u memoriji. Međutim, način adresiranja nulte stranice utječe samo na nultu stranicu.

BIT instrukcija testira bitove bajta u memoriji s 8 bitova u akumulatoru, ali ne mijenja ni jedno ni drugo. Postavljene su samo neke zastavice registra statusa procesora “P”. Bitovi navedene memorijske lokacije logički se združuju s onima akumulatora. Zatim se postavljaju sljedeći statusni bitovi:

  • N koji je bit 7 i posljednji bit (lijevo) statusnog registra, prima bit 7 memorijske lokacije prije ANDing-a.
  • V koji je bit 6 statusnog registra prima bit 6 memorijske lokacije prije AND-a.
  • Zastavica Z statusnog registra je postavljena (napravljena kao 1) ako je rezultat AND nula (00000000 2 ). Inače se briše (napravljeno 0).

4.10 Usporedite upute

Mnemotehničke upute za usporedbu za 6502 µP su CMP, CPX i CPY. Nakon svake usporedbe, zastavice N, Z i C statusnog registra procesora 'P' su pogođene. Zastavica N postavlja se (postavlja 1) kada je rezultat negativan broj. Zastavica Z je postavljena (napravljena kao 1) kada je rezultat nula (000000002). C zastavica je postavljena (napravljena kao 1) kada postoji prijenos s osmog na deveti bit. Sljedeća tablica daje detaljnu ilustraciju

Znači 'veći od'. Uz to, tablica za usporedbu trebala bi biti jasna sama po sebi.

4.11 Upute za skok i grananje

Sljedeća tablica sažima upute za skok i grananje:

JMP instrukcija koristi apsolutno i neizravno adresiranje. Ostatak uputa u tablici su upute za grane. Oni koriste samo relativno adresiranje s 6502 µP. Time tablica postaje sama po sebi razumljiva ako se čita s lijeva na desno i odozgo prema dolje.

Imajte na umu da se grane mogu primijeniti samo na adrese unutar -128 do +127 bajtova od dane adrese. Ovo je relativno adresiranje. I za JMP i upute za grananje, programski brojač (PC) je izravno pogođen. 6502 µP ne dopušta grananje na apsolutnu adresu, iako skok može napraviti apsolutno adresiranje. JMP instrukcija nije instrukcija grananja.

Bilješka: Relativno adresiranje se koristi samo s uputama za grananje.

4.12 Područje snopa

Potprogram je poput jednog od prethodnih kratkih programa za zbrajanje dva broja ili oduzimanje dva broja. Područje hrpa u memoriji počinje od $0100 do $01FF uključivo. Ovo se područje jednostavno naziva hrpa. Kada mikroprocesor izvrši skok na instrukciju potprograma (JSR – pogledajte sljedeću raspravu), mora znati gdje se vratiti kada završi. 6502 µP čuva ove informacije (povratnu adresu) u niskoj memoriji od $0100 do $01FF (područje stoga) i koristi sadržaj registra pokazivača stoga koji je 'S' u mikroprocesoru kao pokazivač (9 bita) na posljednju vraćenu adresu koji je pohranjen na stranici 1 ($0100 do $01FF) memorije. Stog raste od $01FF i omogućuje ugniježđivanje potprograma do 128 razina duboko.

Još jedna upotreba pokazivača steka je rukovanje prekidima. 6502 µP ima pinove označene kao IRQ i NMI. Moguće je da se neki mali električni signali primijene na te pinove i uzrokuju da 6502 µP prekine izvršavanje jednog programa i natjera ga da počne izvršavati drugi. U tom slučaju, prvi program se prekida. Poput potprograma, segmenti koda prekida mogu biti ugniježđeni. Obrada prekida raspravlja se u sljedećem poglavlju.

Bilješka : Pokazivač na stogu ima 8 bitova za adresu nižeg bajta u adresiranju lokacija od $0100 do $01FF. Viši bajt od 00000001 2 pretpostavlja se.

Sljedeća tablica daje upute koje povezuju pokazivač stoga 'S' s registrima A, X, Y i P s područjem stoga u memoriji:

4.13 Poziv potprograma i povratak

Potprogram je skup uputa kojima se postiže određeni cilj. Prethodni program zbrajanja ili oduzimanja je vrlo kratka podrutina. Potprogrami se ponekad nazivaju samo rutinama. Instrukcija za pozivanje potprograma je:

JSR : Skoči na podrutinu

Instrukcija za povratak iz potprograma je:

RTS : Povratak iz potprograma

Mikroprocesor ima tendenciju kontinuirano izvršavati instrukcije u memoriji, jednu za drugom. Pretpostavimo da mikroprocesor trenutno izvršava segment koda i nailazi na instrukciju skoka (JMP) da ode i izvrši segment koda koji je kodiran iza kojeg je možda već izvršen. Izvršava taj segment koda iza i nastavlja izvršavati sve segmente koda (upute) koji slijede iza segmenta koda, sve dok ponovno ne izvrši trenutni segment koda i nastavi ispod. JMP ne gura sljedeću instrukciju na stog.

Za razliku od JMP-a, JSR gura adresu sljedeće instrukcije iza sebe s PC-a (brojač programa) na stog. Položaj stoga ove adrese nalazi se u pokazivaču stoga “S”. Kada se u potprogramu naiđe (izvrši) RTS instrukcija, adresa koja je gurnuta na stog povlači se sa stoga i program se nastavlja na toj izvučenoj adresi koja je sljedeća adresa instrukcije neposredno prije poziva potprograma. Zadnja adresa koja je uklonjena sa steka šalje se programskom brojaču. Sljedeća tablica daje tehničke detalje JSR i RTS uputa:

Pogledajte sljedeću ilustraciju za upotrebu JSR i RTS:

4.14 Primjer petlje odbrojavanja

Sljedeći potprogram odbrojava od $FF do $00 (ukupno 256 10 broji):

pokretanje LDX #$FF ; opterećenje X s $FF = 255
petlja DEX; X = X – 1
BNE petlja ; ako X nije nula onda idi u petlju
RTS ; povratak

Svaki red ima komentar. Komentari nikada ne idu u memoriju za izvršenje. Asembler (prevoditelj) koji pretvara program u ono što je u memoriji za izvođenje (izvođenje) uvijek uklanja komentare. Komentar počinje s ';' . 'Start' i 'petlja' u ovom programu nazivaju se oznake. Oznaka identificira (ime) za adresu instrukcije. Ako je instrukcija jednobajtna instrukcija (implicirano adresiranje), oznaka je adresa te instrukcije. Ako je instrukcija višebajtna instrukcija, oznaka identificira prvi bajt za višebajtnu instrukciju. Prva instrukcija za ovaj program sastoji se od dva bajta. Pod pretpostavkom da počinje na adresi $0300, adresa $0300 može se zamijeniti s 'start' dolje u programu. Druga instrukcija (DEX) je jednobajtna instrukcija i trebala bi biti na adresi $0302. To znači da se adresa $0302 može zamijeniti s 'petlja', dolje u programu, što je zapravo tako u 'BNE petlji'.

“BNE petlja” znači grananje na zadanu adresu kada je Z zastavica statusnog registra 0. Kada je vrijednost u A ili X ili Y registru 00000000 2 , zbog posljednje operacije, zastavica Z je 1 (postavljena). Dakle, dok je 0 (ne 1), druga i treća instrukcija u programu se ponavljaju tim redoslijedom. U svakom ponovljenom nizu, vrijednost (cijeli broj) u registru X smanjuje se za 1. DEX znači X = X – 1. Kada je vrijednost u registru X $00 = 00000000 2 , Z postaje 1. U tom trenutku više nema ponavljanja dviju instrukcija. Posljednja RTS instrukcija u programu, koja je jednobajtna instrukcija (implicirano adresiranje), vraća se iz potprograma. Učinak ove instrukcije je napraviti adresu programskog brojača u stogu za kod koji se treba izvršiti prije poziva potprograma i vratiti se na programski brojač (PC). Ova adresa je adresa instrukcije koja se treba izvršiti prije poziva potprograma.

Bilješka: Kada pišete program na asemblerskom jeziku za 6502 µP, samo oznaka mora započeti na početku retka; bilo koji drugi kod linije mora biti pomaknut barem jedno mjesto udesno.

Pozivanje potprograma
Zanemarujući memorijski prostor koji zauzimaju prethodne oznake, program zauzima 6 bajtova uzastopnih lokacija u memoriji (RAM) od $0300 do $0305. U ovom slučaju program je:

LDX #$FF ; opterećenje X s $FF = 255
DEX ; X = X – 1
BNE 0302 dolara; ako X nije nula onda idi u petlju
RTS ; povratak

Počevši od $0200 adrese u memoriji može biti poziv za potprogram. Uputa za poziv je:

JSR početak ; početak je adresa $0300, tj. JSR $0300

Potprogram i njegov poziv koji su ispravno napisani u datoteci uređivača teksta su:

pokretanje LDX #$FF; opterećenje X s $FF = 255
petlja DEX; X = X – 1

BNE petlja ; ako X nije nula onda idi u petlju
RTS ; povratak

JSR početak : skok na rutinu koja počinje od 0300 USD

Sada, u jednom dugom programu može biti mnogo potprograma. Ne mogu svi imati naziv “start”. Trebali bi imati različite nazive. Zapravo, nijedan od njih možda nema naziv 'start'. “Početak” se ovdje koristi iz nastavnih razloga.

4.15 Prijevod programa

Prevođenje programa ili njegovo asembliranje znači isto. Razmotrite sljedeći program:

pokrenite LDX #$FF : učitajte X s $FF = 255
petlja DEX : X = X – 1
BNE petlja: ako X nije nula, onda idi u petlju
RTS : povratak
JSR početak : skok na rutinu koja počinje od 0300 USD

Ovo je program koji je prethodno napisan. Sastoji se od potprograma, starta i poziva potprograma. Program odbrojava od 255 10 do 0 10 . Program počinje na korisničkoj početnoj adresi od $0200 (RAM). Program se upisuje u uređivač teksta i sprema na disk. Ima naziv poput 'uzorak.asm' gdje je 'uzorak' naziv po izboru programera, ali ekstenzija '.asm' za asemblerski jezik mora biti povezana s nazivom datoteke.

Sastavljeni program proizvodi drugi program koji se naziva asembler. Asembler isporučuje proizvođač 6502 µP ili treća strana. Asembler reproducira program na takav način da je u memoriji (RAM) dok se izvršava (izvodi).

Pretpostavimo da JSR instrukcija počinje na adresi $0200, a potprogram počinje na adresi $0300. Asembler uklanja sve komentare i bjeline. Komentari i razmaci troše memoriju koje je uvijek malo. Mogući prazan redak između prethodnog segmenta koda potprograma i poziva potprograma primjer je razmaka. Sastavljena datoteka i dalje je spremljena na disku i naziva se otprilike 'sample.exe'. 'Uzorak' je naziv po izboru programera, ali ekstenzija '.exe' bi trebala biti tu kako bi označila da je to izvršna datoteka.

Sastavljeni program može se dokumentirati na sljedeći način:

Za izradu ovakvog dokumenta kaže se da je ručno sastavljanje. Imajte na umu da se komentari u ovom dokumentu ne pojavljuju u memoriji (za izvršenje). Adresni stupac u tablici označava početne adrese instrukcija u memoriji. Imajte na umu da je 'JSR start' koji je 'JSR $0300', za koji se očekuje da će biti kodiran kao '20 03 00', zapravo kodiran kao '20 00 03' s adresom nižeg memorijskog bajta koji preuzima niži bajt u memoriji i adresa višeg memorijskog bajta uzima viši bajt u memoriji – little endian. Operacijski kod za JSR je 20 16 .

Imajte na umu da je pomak instrukcije grananja kao što je BNE broj komplementa dvojke u rasponu od 128 10 do +127 10 . Dakle, 'BNE petlja' znači 'BNE -1 10 ” što je zapravo “D0 FF” u obliku koda FF 16 je -1 u komplementu dva koji je zapisan kao = 11111111 u bazi dva. Asemblerski program zamjenjuje oznake i polja stvarnim heksadecimalnim brojevima (heksadecimalni brojevi su binarni brojevi koji su grupirani u četiri bita). Uključene su stvarne adrese na kojima svaka instrukcija počinje.

Bilješka: Instrukcija 'JSR start' zamijenjena je kraćim instrukcijama koje šalju trenutni sadržaj (visoki i niski bajt) programskog brojača na stog s pokazivačem stoga koji se dva puta smanjuje (jednom za visoki bajt i jednom za niži bajt) i zatim ponovno učitava računalo s adresom od $0300. Pokazivač stoga sada pokazuje na $00FD, pod pretpostavkom da je inicijaliziran na $01FF.

Također, RTS instrukcija je zamijenjena nizom kraćih instrukcija koje povećavaju pokazivač steka “S” dva puta (jednom za niži bajt i jednom za visoki bajt) i povlače odgovarajuća dva bajta adrese iz pokazivača steka na PC za sljedeća uputa.

Bilješka: Tekst oznake ne smije imati više od 8 znakova.

“BNE petlja” koristi relativno adresiranje. To znači dodati -3 10 do sljedećeg programskog brojača sadržaja od 0305 USD. Bajtovi za 'BNE petlju' su 'D0 FD' gdje je FD komplement dva od -3 10 .

Napomena: ovo poglavlje ne predstavlja sve upute za 6502 µP. Sve upute i njihovi detalji mogu se pronaći u dokumentu pod naslovom “SY6500 8-bit Microprocessor Family”. Za ovaj dokument postoji PDF datoteka pod nazivom “6502.pdf” koja je besplatno dostupna na internetu. 6502 µP koji je opisan u ovom dokumentu je 65C02.

4.16 Prekidi

Signali bilo kojeg uređaja koji je spojen na vanjske (okomite površine) priključke Commodorea 64 moraju proći ili kroz CIA 1 ili CIA 2 sklopove (IC) prije nego što dođu do 6502 mikroprocesora. Signali iz podatkovne sabirnice 6502 µP moraju proći ili kroz CIA 1 ili CIA 2 čip prije nego što dođu do bilo kojeg vanjskog uređaja. CIA je kratica za Complex Interface Adapter. Na slici 4.1 'Blok dijagram matične ploče Commodore_64', blok ulazno/izlazni uređaji predstavljaju CIA 1 i CIA 2. Kada je program pokrenut, može se prekinuti kako bi se pokrenuo neki drugi dio koda prije nastavka. Postoji hardverski prekid i softverski prekid. Za hardverski prekid, postoje dva pina ulaznog signala na 6502 µP. Imena ovih pribadača su IRQ i NMI . Ovo nisu µP podatkovne linije. Podatkovne linije za µP su D7, D6, D5, D4, D3, D2, D1 i D0; s D0 za bit najmanjeg značaja i D7 za bit najvećeg značaja.

IRQ označava Interrupt ReQuest 'aktivan' nizak. Ova ulazna linija za µP je normalno visoka, na približno 5 volti. Kada padne na približno 0 volti, to je zahtjev za prekid koji signalizira µP. Čim se zahtjev odobri, red se vraća visoko. Odobravanje zahtjeva za prekid znači da se µP grana na kod (podprogram) koji rukuje prekidom.

NMI označava Non-Maskable Interrupt 'aktivno' nisko. Dok kod za IRQ se izvršava NMI može ići nisko. U ovom slučaju, NMI se rukuje (izvršava se vlastiti kod). Nakon toga, kod za IRQ nastavlja. Nakon šifre za IRQ završava, glavni programski kod se nastavlja. To je, NMI prekida se IRQ rukovatelj. Signal za NMI još uvijek se može dati µP-u čak i kada je µP u stanju mirovanja i ne rukuje ničim ili ne izvodi glavni program.

Bilješka: To je zapravo prijelaz s visokog na niski, of NMI , to je NMI signal – više o tome kasnije. IRQ obično dolazi iz CIA-e 1 i NMI obično dolazi iz CIA-e 2. NMI , što je kratica za Non-Maskable Interrupt, može se smatrati prekidom koji se ne može zaustaviti.

Rukovanje prekidima
Bilo da je zahtjev od IRQ ili NMI , trenutna uputa mora biti dovršena. 6502 ima samo registre A, X i Y. Dok potprogram radi, možda koristi ova tri registra zajedno. Rukovatelj prekidom još uvijek je potprogram, iako se ne doživljava kao takav. Nakon dovršetka trenutne instrukcije, sadržaj registara A, X i Y za 65C02 µP sprema se u stog. Adresa sljedeće instrukcije programskog brojača također se šalje na stog. µP se zatim grana na kod za prekid. Nakon toga, sadržaji registara A, X i Y vraćaju se iz stoga obrnutim redoslijedom u koji su poslani.

Primjer kodiranja za prekid
Radi jednostavnosti, pretpostavimo da je rutina za µP IRQ prekid je samo zbrajanje brojeva $01 i $02 i spremanje rezultata $03 na memorijsku adresu $0400. Šifra je:

ISR PHA
PHX
PHY
;
LDA #$01
ADC #$02
KOŠTAJU 0400$
;
PROMETOVATI
PLX
PLA
RTI

ISR je oznaka i identificira memorijsku adresu na kojoj se nalazi PHA instrukcija. ISR znači Interrupt Service Routine. PHA, PHX i PHY šalju sadržaj registara A, X i Y na stog s nadom da će biti potrebni bilo kojem kodu (programu) koji se izvodi neposredno prije prekida. Sljedeće tri instrukcije čine jezgru rukovatelja prekidima. Instrukcije PLY, PLX i PLA moraju biti tim redoslijedom i one vraćaju sadržaj registara Y, X i A. Posljednja instrukcija, koja je RTI, (bez operanda) vraća nastavak izvođenja bilo kojem kodu (programu) koji se izvršavao prije prekida. RTI povlači adresu sljedeće instrukcije koda koja se izvršava sa stoga natrag u programski brojač. RTI znači Return from Interrupt. Time je obrada prekida (podrutina) gotova.

Softverski prekid
Glavni način za softverski prekid za 6502 µP je korištenje BRK implicirane adresne instrukcije. Pretpostavimo da se glavni program izvodi i nailazi na BRK instrukciju. Od te točke, adresa sljedeće instrukcije u PC-u treba biti poslana na stog kada je trenutna instrukcija dovršena. Potprogram za obradu softverskih uputa trebao bi se zvati 'sljedeće'. Ovaj prekidni potprogram trebao bi gurnuti sadržaj registra A, X i Y na stog. Nakon što se izvrši jezgra potprograma, sadržaj registara A, X i Y trebao bi se povući natrag sa stoga u njihove registre dovršetkom potprograma. Posljednja izjava u rutini je RTI. PC sadržaj se također automatski povlači natrag sa stoga na PC zbog RTI-ja.

Usporedba i kontrast potprograma i rutine usluge prekida
Sljedeća tablica uspoređuje i suprotstavlja potprogram i rutinu usluge prekida:

4.17 Sažetak 6502 glavnih načina adresiranja

Svaka instrukcija za 6502 je jedan bajt, iza kojeg slijedi nula ili više operanda.

Način trenutnog adresiranja
Kod trenutnog načina adresiranja, nakon operanda je vrijednost, a ne memorijska adresa. Ispred vrijednosti mora biti #. Ako je vrijednost heksadecimalna, nakon “#” mora slijediti “$”. Upute za neposredno adresiranje za 65C02 su: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Čitatelj bi trebao pogledati dokumentaciju za 65C02 µP kako bi znao kako koristiti upute koje su ovdje navedene, a nisu objašnjene u ovom poglavlju. Primjer upute je:

LDA #$77

Način apsolutnog adresiranja
U načinu apsolutnog adresiranja postoji jedan operand. Ovaj operand je adresa vrijednosti u memoriji (obično u heksadecimalnom obliku ili oznaka). Postoji 64K 10 = 65,536 10 memorijske adrese za 6502 µP. Obično je jednobajtna vrijednost na jednoj od ovih adresa. Apsolutne upute za adresiranje za 65C02 su: 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. Čitatelj bi trebao pogledati dokumentaciju za 65C02 µP kako bi znao kako koristiti upute koje su ovdje navedene, kao i za ostale načine adresiranja koji nisu objašnjeni u ovom poglavlju. Primjer upute je:

KOSTAJU 1234 dolara

Način impliciranog adresiranja
U načinu impliciranog adresiranja nema operanda. Svaki uključeni µP registar implicira se u instrukciji. Implicitne upute za adresiranje za 65C02 su: 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. Primjer upute je:

DEX : Smanjite X registar za jednu jedinicu.

Način relativnog adresiranja
Način relativnog adresiranja bavi se samo uputama grananja. U načinu relativnog adresiranja postoji samo jedan operand. To je vrijednost od -128 10 do +127 10 . Ova se vrijednost naziva pomak. Na temelju predznaka, ova se vrijednost dodaje ili oduzima od sljedeće instrukcije programskog brojača kako bi se dobila adresa namjeravane sljedeće instrukcije. Relativne upute za način rada adrese su: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Primjeri uputa su:

BNE $7F : (grananje ako je Z = 0 u statusnom registru, P)

Što dodaje 127 trenutnom brojaču programa (adresa za izvršenje) i počinje izvršavati instrukcije na toj adresi. Slično:

BEQ $F9 : (grananje ako je Z = : u statusnom registru, P)

Što dodaje -7 trenutnom brojaču programa i počinje izvršavanje na novoj adresi brojača programa. Operand je komplement broja dvojke.

Apsolutno indeksirano adresiranje
U apsolutnom indeksnom adresiranju, sadržaj registra X ili Y dodaje se danoj apsolutnoj adresi (bilo gdje od $0000 do $FFFF, tj. od 0 10 na 65536 10 ) imati pravu adresu. Ova dana apsolutna adresa naziva se bazna adresa. Ako se koristi X registar, instrukcija asemblera je otprilike ovakva:

LDA C453,X

Ako se koristi Y registar, to je nešto poput:

LDA $C453, Y

Vrijednost za registar X ili Y naziva se broj ili vrijednost indeksa i može biti bilo gdje od $00 (0 10 ) na FF (250 10 ). Ne zove se ofset.

Upute za adresiranje apsolutnog indeksa su: ADC, AND, ASL (samo X), BIT (s akumulatorom i memorijom, samo s X), CMP, DEC (samo memorija i X), EOR, INC (samo memorija i X), LDA , LDX, LDY, LSR (samo X), ORA, ROL (samo X), ROR (samo X), SBC, STA, STZ (samo X).

Apsolutno neizravno adresiranje
Ovo se koristi samo s uputama za skok. S tim, data apsolutna adresa ima adresu pokazivača. Adresa pokazivača sastoji se od dva bajta. Pokazivač od dva bajta pokazuje (adresa je) odredišne ​​vrijednosti bajta u memoriji. Dakle, instrukcija asemblerskog jezika je:

JMP (3456 USD)

Sa zagradama, $13 je na lokaciji adrese od $3456 dok je $EB na lokaciji adrese od $3457 (= $3456 + 1). Zatim je odredišna adresa $13EB, a $13EB je pokazivač. Apsolutnih 3456 USD nalazi se u zagradama u uputama gdje je 34 niži bajt, a 56 viši bajt.

4.18 Stvaranje niza s 6502 µP asemblerskim jezikom

Kao što je prikazano u sljedećem poglavlju, nakon stvaranja datoteke u memoriji, datoteka se može spremiti na disk. Datoteci treba dati naziv. Naziv je primjer niza. Postoje mnogi drugi primjeri nizova u programiranju.

Postoje dva glavna načina stvaranja niza ASCII kodova. U oba načina, svi ASCII kodovi (znakovi) zauzimaju uzastopne lokacije bajtova u memoriji. Na jedan od načina, ovom nizu bajtova prethodi cjelobrojni bajt koji je duljina (broj znakova) u nizu (nizu). Na drugi način, niz znakova nasljeđuje (odmah nakon) Null bajt koji je 00 16 , tj. 00 USD. Duljina niza (broj znakova) nije naznačena na ovaj drugi način. Null znak se ne koristi na prvi način.

Na primjer, razmislite o 'Volim te!' niz bez navodnika. Duljina je ovdje 11; razmak se računa kao jedan ASCII bajt (znak). Pretpostavimo da se niz mora smjestiti u memoriju s prvim znakom na adresi $0300.

Sljedeća tablica prikazuje postavku memorije niza kada je prvi bajt 11 10 = 0B 16 :

Sljedeća tablica prikazuje postavku memorije niza kada je prvi bajt 'I', a zadnji bajt Null ($00):

Sljedeće upute mogu se koristiti za početak stvaranja niza:

KOŠTAJU 0300$

Pretpostavimo da je prvi bajt u akumulatoru koji treba poslati na adresnu lokaciju od $0300. Ova uputa vrijedi za oba slučaja (obje vrste nizova).

Nakon uklapanja svih znakova u memorijske ćelije, jedan po jedan, niz se može čitati pomoću petlje. U prvom slučaju, čita se broj znakova nakon duljine. U drugom slučaju, znakovi se čitaju od 'I' dok se ne sretne Null znak koji je 'Null'.

4.19 Stvaranje niza s 6502 µP asemblerskim jezikom

Niz jednobajtnih cijelih brojeva sastoji se od uzastopnih memorijskih lokacija bajtova s ​​cijelim brojevima. Zatim, postoji pokazivač koji pokazuje na mjesto prvog cijelog broja. Dakle, niz cijelih brojeva sastoji se od dva dijela: pokazivača i niza lokacija.

Za niz nizova, svaki niz može biti na drugom mjestu u memoriji. Zatim, postoje uzastopne memorijske lokacije s pokazivačima gdje svaki pokazivač pokazuje na prvu lokaciju svakog niza. Pokazivač se u ovom slučaju sastoji od dva bajta. Ako niz počinje svojom duljinom, odgovarajući pokazivač pokazuje na mjesto te duljine. Ako niz ne počinje svojom duljinom nego završava nultim znakom, odgovarajući pokazivač pokazuje na mjesto prvog znaka niza. I tu je pokazivač koji pokazuje na nižu adresu bajta prvog pokazivača uzastopnih pokazivača. Dakle, niz nizova sastoji se od tri dijela: nizova na različitim mjestima u memoriji, odgovarajućih uzastopnih pokazivača i pokazivača na prvi pokazivač od uzastopnih pokazivača.

4.20 Problemi

Čitatelju se savjetuje da riješi sve probleme u poglavlju prije nego prijeđe na sljedeće poglavlje.

  1. Napišite program na asemblerskom jeziku koji počinje od $0200 za 6502 µP i dodaje nepredpisane brojeve 2A94 H (dodaj) na 2ABF H (augend). Neka ulazi i izlaz budu u memoriji. Također, izradite ručno sastavljeni programski dokument.
  2. Napišite program na asemblerskom jeziku koji počinje od $0200 za 6502 µP i oduzima nepredpisane brojeve od 1569 H (sutrahend) iz 2ABF H (minuend). Neka ulazi i izlazi budu u memoriji. Također, izradite ručno sastavljeni programski dokument.
  3. Napišite program na asemblerskom jeziku za 6502 µP koji broji od $00 do $09 koristeći petlju. Program bi trebao početi od 0200 dolara. Također, izradite ručno sastavljeni programski dokument.
  4. Napišite program na asemblerskom jeziku koji počinje od $0200 za 6502 µP. Program ima dvije potprograme. Prva potprograma dodaje nepredpisane brojeve 0203 H (augend) i 0102H (dodati). Drugi potprogram zbraja zbroj iz prvog potprograma koji je 0305H do 0006 H (augend). Konačni rezultat pohranjuje se u memoriju. Pozovite prvi potprogram koji je FSTSUB i drugi potprogram koji je SECSUB. Neka ulazi i izlazi budu u memoriji. Također, izradite ručno sastavljeni programski dokument za cijeli program.
  5. S obzirom da an IRQ rukovatelj dodaje $02 do $01 na akumulator kao rukovanje jezgrom dok NMI izdaje se i rukovanje jezgrom za NMI dodaje $05 do $04 na akumulatoru, napišite asemblerski jezik za oba rukovatelja uključujući njihove pozive. Poziv na IRQ rukovatelj bi trebao biti na adresi $0200. The IRQ rukovatelj bi trebao početi na adresi $0300. The NMI rukovatelj bi trebao početi na adresi od $0400. Rezultat IRQ rukovatelj treba staviti na adresu $0500, a rezultat NMI rukovatelj treba staviti na adresu $0501.
  6. Ukratko objasnite kako se BRK instrukcija koristi za proizvodnju softverskog prekida u računalu 65C02.
  7. Napravite tablicu koja uspoređuje i suprotstavlja normalnu potprogramu s rutinom usluge prekida.
  8. Ukratko objasnite glavne načine adresiranja 65C02 µP s obzirom na primjere instrukcija asemblerskog jezika.
  9. a) Napišite program na strojnom jeziku 6502 da stavite 'Volim te!' niz ASCII kodova u memoriji, počevši od $0300 adrese s duljinom niza. Program bi trebao početi na adresi $0200. Uzmite svaki znak iz akumulatora jedan po jedan, pod pretpostavkom da su tamo poslani pomoću neke podrutine. Također, sastavite program ručno. (Ako trebate znati ASCII kodove za 'Volim te!'. Evo ih: 'Ja':49 16 , razmak: 20 16 , 'l': 6C 16 , 'o': 6F 16 , 'u':76 16 , 'e':65, 'y':79 16 , ‘u’:75 16 , i '!':21 16 (Napomena: svaki kod zauzima 1 bajt).
    b) Napišite program na strojnom jeziku 6502 da stavite 'Volim te!' niz ASCII kodova u memoriji, počevši od adrese $0300 bez duljine niza, ali završava s 00 16 . Program bi trebao početi na adresi $0200. Dobijte svaki znak iz akumulatora, pod pretpostavkom da su poslani tamo, jedan po jedan, pomoću neke podrutine. Također, sastavite program ručno.