Luku 4: 6502 Microprocessor Assembly Language -opetusohjelma

Luku 4 6502 Microprocessor Assembly Language Opetusohjelma



Luku 4: 6502 Microprocessor Assembly Language -opetusohjelma

4.1 Johdanto

6502-mikroprosessori julkaistiin vuonna 1975. Sitä käytettiin mikroprosessorina joissakin henkilökohtaisissa tietokoneissa, kuten Apple II, Commodore 64 ja BBC Micro.







6502-mikroprosessoria valmistetaan edelleen suuria määriä. Se ei ole enää keskusyksikkö, jota käytetään henkilökohtaisissa tietokoneissa (kannettavissa tietokoneissa) nykyään, mutta sitä valmistetaan edelleen suuria määriä ja käytetään elektronisissa ja sähkölaitteissa nykyään. Nykyaikaisempien tietokonearkkitehtuurien ymmärtämiseksi on erittäin hyödyllistä tarkastella vanhempaa mutta melko menestyvää mikroprosessoria, kuten 6502.



Koska se on helppo ymmärtää ja ohjelmoida, se on yksi parhaista (ellei paras) mikroprosessoreista kokoonpanokielen opettamiseen. Assembly-kieli on matalan tason kieli, jota voidaan käyttää tietokoneen ohjelmointiin. Huomaa, että yhden mikroprosessorin kokoonpanokieli on erilainen kuin toisen mikroprosessorin kokoonpanokieli. Tässä luvussa opetetaan 6502-mikroprosessorikokoonpanokieltä. Tarkemmin sanottuna se on 65C02, jota opetetaan, mutta siihen viitataan yksinkertaisesti nimellä 6502.



Aiemmin kuuluisa tietokone on nimeltään commodore_64. 6502 on 6500-perheen mikroprosessori. Commodore_64-tietokoneessa on 6510-mikroprosessori. 6510-mikroprosessori on 6500 µP. 6502 µP:n käskyt ovat lähes kaikki 6510 µP:n käskyt. Tämän ja seuraavan luvun tiedot perustuvat commodore_64-tietokoneeseen. Tätä tietämystä käytetään perustana nykyaikaisten tietokonearkkitehtuurien ja nykyaikaisten käyttöjärjestelmien selittämiseen tässä verkkourakurssin osassa.





Tietokonearkkitehtuurilla tarkoitetaan tietokoneen emolevyn komponentteja ja selitystä siitä, kuinka data virtaa kunkin komponentin sisällä, erityisesti mikroprosessorissa, kuinka data kulkee komponenttien välillä ja myös kuinka tiedot ovat vuorovaikutuksessa. Datan yksikkö on datum. Tehokas tapa tutkia tietokoneen tietokonearkkitehtuuria on tutkia emolevyn kokoonpanokieltä.

Commodore_64-tietokoneen sanotaan olevan 8-bittisen tietokonesanan tietokone. Tämä tarkoittaa, että tiedot tallennetaan, siirretään ja manipuloidaan kahdeksanbittisten binäärikoodien muodossa.



Commodore 64 -emolevyn lohkokaavio
Commodore 64 -emolevyn lohkokaavio on:


Kuva 4.1 Commodore_64-järjestelmäyksikön lohkokaavio

Kuvittele 6510-mikroprosessori 6502-mikroprosessorina. Kokonaismuisti on sarja tavuja (8 bittiä tavua kohden). Siellä on satunnaispääsymuisti (luku/kirjoitus), johon tavut voidaan kirjoittaa tai poistaa. Kun tietokoneen virta katkaistaan, kaikki RAM-muistin tiedot pyyhitään. Siellä on myös lukumuisti (ROM). Kun tietokoneesta katkaistaan ​​virta, ROM-muistissa olevat tiedot säilyvät (ei poistu).

Siellä on tulo-/lähtöportti (piiri), jota kutsutaan kaaviossa tulo-/lähtölaitteiksi. Tätä porttia ei pidä sekoittaa portteihin, jotka ovat näkyvissä tietokonejärjestelmäyksikön vasemmalla ja oikealla tai etu- ja takapinnalla. Ne ovat kaksi eri asiaa. Tämän sisäisen portin liitännät oheislaitteisiin, kuten kiintolevyyn (tai levykkeeseen), näppäimistöön ja näyttöön, eivät näy kaaviossa.

Kaaviossa on kolme väylää (erittäin pienten sähköjohtimien ryhmää). Kukin johto voi siirtää bitin 1 tai bitin 0. Dataväylä, joka siirtää kahdeksan bitin tavua kerrallaan (yksi kellopulssi) RAM-muistiin ja tulo/lähtöporttiin (tulo/lähtölaitteet) on kaksisuuntainen. Dataväylä on kahdeksan bittiä leveä.

Kaikki komponentit on kytketty osoiteväylään. Osoiteväylä on yksisuuntainen mikroprosessorista. Osoiteväylässä on kuusitoista johdinta, ja jokainen kuljettaa yhden bitin (1 tai 0). Yhdessä kellopulssissa lähetetään kuusitoista bittiä.

Siellä on ohjausväylä. Jotkut ohjausväylän johtimista siirtäisivät kukin yhden bitin mikroprosessorista muihin komponentteihin. Muutamat ohjauslinjat kuljettavat bitit tulo/lähtöportista (IO) mikroprosessoriin.

Tietokoneen muisti
RAM-muistia ja ROM-muistia pidetään yhtenä muistikokoonpanona. Tämä kokoonpano on esitetty kaaviomaisesti seuraavasti, jossa heksadesimaaliluvuilla on '$'-etuliite:


Kuva 4.11 Muistin asettelu Commodore 64 -tietokoneelle

RAM-muisti on alkaen 0000 16 DFFF:lle 16 joka on kirjoitettu välillä $ 0000 - $ DFFF. 6502 µP:n kokoonpanokielellä heksadesimaaliluku on etuliite '$' eikä jälkiliite (alaindeksi) 16:lla tai H:lla tai heksadesimaaliluvulla. Kaikki RAM-muistissa olevat tiedot sammuvat, kun tietokone sammutetaan. ROM alkaa $E000 - $FFFF. Siinä on aliohjelmia, jotka eivät sammu, kun tietokone sammutetaan. Nämä alirutiinit ovat yleisesti käytettyjä rutiineja, jotka auttavat ohjelmoinnissa. Käyttäjäohjelma kutsuu niitä (katso seuraava luku).

Tila (tavuja) $0200 - $D000 on tarkoitettu käyttäjäohjelmille. Väli $D000 - $DFFF on tarkoitettu tiedoille, jotka liittyvät suoraan oheislaitteisiin (tulo-/tulostuslaitteet). Tämä on osa käyttöjärjestelmää. Commodore-64-tietokoneen käyttöjärjestelmä koostuu siis kahdesta pääosasta: ROM-muistissa olevasta osasta, joka ei koskaan sammu, ja osasta $ D000 - $ DFFF, joka sammuu, kun virta katkaistaan. Nämä IO-tiedot (input/output) on ladattava levyltä aina, kun tietokone käynnistetään. Nykyään tällaisia ​​tietoja kutsutaan oheisohjaimiksi. Oheislaitteet alkavat Input/Output Device -portista emolevyn liitäntöjen kautta tunnistettavissa oleviin portteihin tietokoneen pystysuorilla pinnoilla, joihin näyttö, näppäimistö jne. on kytketty, sekä itse oheislaitteisiin (näyttö, näppäimistö jne.). .).

Muisti koostuu 2 16 = 65 536 tavun paikat. Heksadesimaalimuodossa nämä ovat 10 000 16 = 10 000 H = 10 000 hex = $10000 paikat. Laskennassa kakkosluvun kaksi, kymmenen, kuudestoista jne. laskenta alkaa nollasta eikä yhdestä. Ensimmäinen sijainti on siis itse asiassa paikan numero 0000000000000000 2 = 0 10 = 0000 16 = 0000 dollaria. 6502 µP:n kokoonpanokielessä osoitteen sijainnin tunnisteen etuliitteenä on $, eikä siinä ole päätettä tai alaindeksiä. Viimeinen sijainti on sijaintinumero 1111111111111111 2 = 65 535 10 = FFFF 16 = $FFFF eikä 10000000000000000 2 tai 65 536 10 tai 10 000 16 tai 10 000 dollaria. 10000000000000000 2 , 65 536 10 , 10 000 16 tai $10000 antaa tavupaikkojen kokonaismäärän.

Täällä, 2 16 = 65 536 = 64 x 1024 = 64 x 2 10 = 64 kilotavua (kilotavua). Commodore-64-nimen jälkiliite 64 tarkoittaa 64 kilotavua kokonaismuistia (RAM ja ROM). Tavu on 8 bittiä, ja 8 bittiä menee yhden tavun paikkaan muistissa.

64 kilotavua muistia on jaettu sivuille. Jokaisella sivulla on 0100 16 = 256 10 tavujen sijainnit. Ensimmäinen 256 10 = ensimmäinen 0100 16 sijainnit on sivu 0. Toinen on sivu 1, kolmas on sivu 2 ja niin edelleen.

65 536 sijainnin osoittamiseksi tarvitaan 16 bittiä jokaiselle sijainnille (osoitteelle). Joten osoiteväylä mikroprosessorista muistiin koostuu 16 rivistä; yksi rivi yhdelle bitille. Bitti on joko 1 tai 0.

6502 µP rekisterit
Rekisteri on kuin tavumuistipaikan tavusolut. 6502 µP:ssä on kuusi rekisteriä: viisi 8-bittistä rekisteriä ja yksi 16-bittinen rekisteri. 16-bittistä rekisteriä kutsutaan ohjelmalaskuriksi, josta käytetään lyhennettä PC. Siinä on muistiosoite seuraavaa käskyä varten. Assembly-kieliohjelma koostuu käskyistä, jotka tallennetaan muistiin. Kuusitoista (16) eri bittiä tarvitaan osoittamaan tietty tavupaikka muistissa. Tietyllä kellopulssilla nämä bitit lähetetään osoiteväylän 16-bittisille osoitelinjoille käskyn lukemista varten. Kaikki 6502 µP:n rekisterit on kuvattu seuraavasti:


Kuva 4.12 6502 µP rekisterit

Ohjelmalaskuri tai PC voidaan nähdä kaaviossa 16-bittisenä rekisterinä. Alempi merkitsevä kahdeksan bittiä on merkitty PCL:ksi ohjelmalaskurin matalaksi. Korkeammat merkitsevät kahdeksan bittiä on merkitty PCH:ksi ohjelmalaskurin korkealle. Commodore-64:n muistissa oleva ohje voi koostua yhdestä, kahdesta tai kolmesta tavusta. PC:n 16 bittiä osoittavat seuraavaan suoritettavaan käskyyn muistissa. Mikroprosessorin piireistä kahta niistä kutsutaan aritmeettiseksi logiikkayksiköksi ja käskydekooderiksi. Jos µP:ssä (mikroprosessorissa) käsiteltävä käsky on yhden tavun mittainen, nämä kaksi piiriä lisäävät seuraavan käskyn PC:tä 1 yksiköllä. Jos µP:ssä käsiteltävä käsky on kaksi tavua pitkä, mikä tarkoittaa, että se vie kaksi peräkkäistä tavua muistissa, nämä kaksi piiriä lisäävät PC:tä seuraavalle käskylle 2 yksiköllä. Jos µP:ssä käsiteltävä käsky on kolme tavua pitkä, eli se vie muistissa kolme peräkkäistä tavua, nämä kaksi piiriä lisäävät PC:tä seuraavalle käskylle 3 yksiköllä.

Akku 'A' on kahdeksanbittinen yleisrekisteri, joka tallentaa useimpien aritmeettisten ja loogisten operaatioiden tulokset.

“X”- ja “Y”-rekistereitä käytetään kutakin ohjelman vaiheiden laskemiseen. Ohjelmoinnissa laskenta alkaa 0:sta. Niitä kutsutaan siis indeksirekistereiksi. Niillä on muutama muu tarkoitus.

Vaikka Stack Pointer -rekisterissä 'S' on 9 bittiä, jota pidetään kahdeksan bitin rekisterinä. Sen sisältö osoittaa tavun sijaintiin Random Access Memory (RAM) -muistin sivulla 1. Sivu 1 alkaa tavusta $0100 (256 10 ) tavuksi $01FF (511 10 ). Kun ohjelma on käynnissä, se siirtyy muistissa käskystä seuraavaan peräkkäiseen käskyyn. Näin ei kuitenkaan aina ole. Joskus se hyppää muistialueelta toiselle jatkaakseen ohjeiden suorittamista siellä peräkkäin. RAM-muistissa olevaa sivua 1 käytetään pinona. Pino on suuri RAM-muistialue, jossa on seuraavat osoitteet koodin jatkamista varten, mistä on hyppy. Koodit hyppyohjeineen eivät ole pinossa; ne ovat muualla muistissa. Kuitenkin sen jälkeen, kun hyppykäskyt on suoritettu, jatkoosoitteet (ei koodisegmentit) ovat pinossa. Heidät työnnettiin sinne hyppy- tai haaraohjeiden seurauksena.

P:n kahdeksanbittinen prosessorin tilarekisteri on erityinen rekisterilaji. Yksittäiset bitit eivät ole yhteydessä toisiinsa tai liity toisiinsa. Jokaista bittiä kutsutaan lipuksi ja sitä arvostetaan muista riippumatta. Lippujen merkitykset esitetään seuraavassa tarpeen mukaan.

Jokaisen rekisterin ensimmäinen ja viimeinen bittiindeksi on esitetty kunkin rekisterin yläpuolella edellisessä kaaviossa. Bittiindeksin (paikan) laskenta rekisterissä alkaa oikealla olevasta 0:sta.

Muistisivut binääri-, heksadesimaali- ja desimaalimuodossa
Seuraava taulukko näyttää muistisivujen alun binääri-, heksadesimaali- ja desimaalimuodossa:

Jokaisella sivulla on 1 000 000 000 2 tavujen määrä, joka on sama kuin 100 H tavujen määrä, joka on sama kuin 256 10 tavujen määrä. Edellisessä muistikaaviossa sivut on merkitty ylöspäin sivulta 0 eikä alaspäin taulukon osoittamalla tavalla.

Tämän taulukon binääri-, heksadesimaali- ja desimaalisarakkeet antavat muistitavujen sijaintiosoitteet eri kannassaan. Huomaa, että sivun nollalla vain alemman tavun bitit tarvitaan kirjoitettaessa koodauksen aikana. Korkeamman tavun bitit voidaan jättää pois, koska ne ovat aina nollia (sivun nolla). Muilla sivuilla tulee käyttää korkeamman tavun bittejä.

Tämän luvun loppuosassa selitetään 6502 µP Assembly Language käyttäen kaikkia aiempia tietoja. Ymmärtääkseen kielen nopeasti lukijan on laskettava yhteen ja vähennettävä kantaluku kuusitoista kantaluvun kymmenen sijaan. Sen pitäisi itse asiassa olla kakkospohja, mutta kakkospohjan laskeminen on hankalaa. Muista, että kun lisäät kaksi numeroa kakkospohjaan, siirto on edelleen 1, kuten kantaluvussa kymmenen. Mutta kun vähennetään kaksi kakkoslukua, laina on kaksi eikä kymmentä, kuten peruskymmenessä. Kun lisäät kaksi numeroa kantaan 16, kanta on edelleen 1, kuten kantaluvussa kymmenen. Mutta kun vähennetään kaksi lukua kantaluvusta kuusitoista, laina on kuusitoista eikä kymmenen kuten kantaluvussa kymmenen.

4.2 Tiedonsiirtoohjeet

Harkitse seuraavaa taulukkoa 6502 µP:n kokoonpanokielen tiedonsiirtoohjeista:

Kun tavu (8 bittiä) kopioidaan muistitavun sijainnista akkurekisteriin, X-rekisteriin tai Y-rekisteriin, se latautuu. Kun tavu kopioidaan mistä tahansa näistä rekistereistä muistitavun sijaintiin, kyseessä on siirto. Kun tavu kopioidaan rekisteristä toiseen, se on edelleen siirtoa. Taulukon toisessa sarakkeessa nuoli osoittaa kopion suunnan tavulle. Loput neljästä sarakkeesta näyttävät eri osoitustilat.

Osoitetilan sarakkeen merkintä on käskyn vastaavan muistoosan todellinen tavukoodi heksadesimaalimuodossa. Esimerkiksi AE on varsinainen tavukoodi LDX:lle, joka lataa tavun muistista X-rekisteriin absoluuttisessa osoitustilassa, kuten AE. 16 = 10101110 2 . Joten LDX:n bitit muistitavupaikassa ovat 10101110.

Huomaa, että käskyn LDX-muistomerkkiosassa on kolme mahdollista tavua, jotka ovat A2, AE ja A6, ja jokainen on tarkoitettu tietylle osoitemoodille. Kun X-rekisteriin latautuvaa tavua ei haluta kopioida muistitavun sijainnista, arvo on kirjoitettava käskyn LDX-muistomerkillä (juuri sen jälkeen) heksadesimaali- tai desimaalimuodossa. Tässä luvussa tällaiset arvot kirjoitetaan heksadesimaalimuodossa. Tämä on välitöntä osoitusta, joten LDX:tä edustava muistin todellinen tavu on A2 16 = 10100010 2 eikä AE 16 joka on yhtä suuri kuin 10101110 2 .

Taulukossa kaikkia osoitemoodin otsikoiden alla olevia tavuja kutsutaan toimintakoodeiksi, jotka lyhennetään operaatiokoodeiksi. Yhdelle muistomerkille voi olla useampi kuin yksi toimintakoodi osoitemoodista riippuen.

Huomautus: Tietokoneen järjestelmäyksikön sanalla 'load' voi olla kaksi merkitystä: se voi viitata tiedoston lataamiseen levyltä tietokoneen muistiin tai tavun siirtämiseen muistin tavupaikasta mikroprosessorirekisteriin. .

6502 µP:lle on enemmän osoitustiloja kuin neljä taulukossa.

Ellei toisin mainita, kaikki käyttäjän ohjelmointikoodi tässä luvussa alkaa osoitteesta 0200 16 joka on muistissa olevan käyttäjäalueen alku.

Muisti M ja akku A

Muistista akkuun

Välitön osoitus
Seuraava ohje tallentaa numeron FF 16 = 255 10 akkuun:

LDA #$FF

'$' -merkkiä ei käytetä vain muistiosoitteen tunnistamiseen. Yleensä sitä käytetään osoittamaan, että seuraava numero on heksadesimaali. Tässä tapauksessa $FF ei ole minkään muistitavupaikan osoite. Se on numero 255 10 heksadesimaalimuodossa. Peruslukua 16 tai muita vastaavia alaindeksiä ei saa kirjoittaa konekieliohjeeseen. '#' osoittaa, että seuraava on arvo, joka lisätään akkurekisteriin. Arvo voidaan kirjoittaa myös kannassa kymmenen, mutta sitä ei tehdä tässä luvussa. '#' tarkoittaa välitöntä osoitusta.

Muistomerkki muistuttaa jonkin verran sitä vastaavaa englanninkielistä lausetta. 'LDA #$FF' tarkoittaa, että lataa numero 255 10 akkuun A. Koska tämä on välitön osoitus edellisestä taulukosta, LDA on A9 eikä AD tai A5. A9 binäärimuodossa on 101010001. Joten jos LDA:n A9 on muistissa $0200-osoitteessa, $FF on kohdassa $0301 = 0300 + 1 osoite. #$FF on juuri operandi LDA-muistomerkille.

Absoluuttinen osoitus
Jos $FF:n arvo on paikassa $0333 muistissa, edellinen ohje on:

LDA 0333 dollaria

Huomaa #:n puuttuminen. Tässä tapauksessa #:n puuttuminen tarkoittaa, että seuraava on muistiosoite eikä kiinnostava arvo (ei arvo, joka laitetaan akkuun). Joten LDA:n toimintakoodi on tällä kertaa AD, ei A9 tai A5. LDA:n operandi tässä on $0333-osoite eikä $FF-arvo. $FF on paikassa $0333, joka on melko kaukana. 'LDA $0333' -käskyllä ​​on kolme peräkkäistä kohtaa muistissa, ei kaksi, kuten edellisessä kuvassa. LDA:n 'AD' on 0200 dollarin sijainnissa. 0333:n alempi tavu, joka on 33, on sijainnissa $0301. $0333:n korkeampi tavu, joka on 03, on paikassa $0302. Tämä on vähäistä endianisuutta, jota 6502-kokoonpanokieli käyttää. Eri mikroprosessorien kokoonpanokielet ovat erilaisia.

Tämä on esimerkki ehdottomasta osoitteesta. $0333 on sen sijainnin osoite, jossa on $FF. Ohje koostuu kolmesta peräkkäisestä tavusta, eikä se sisällä $FF:ta tai sen varsinaista tavupaikkaa.

Nollasivun osoitus

Oletetaan, että $FF-arvo on muistipaikassa $0050 sivulla nolla. Nollasivun tavujen sijainnit alkavat $ 0000 ja päättyvät $ 00FF. Näitä on 256 10 paikat yhteensä. Jokainen Commodore-64-muistin sivu on 256 10 pitkä. Huomaa, että suurempi tavu on nolla kaikissa mahdollisissa paikoissa muistin nollasivutilassa. Nollasivun osoitustila on sama kuin absoluuttinen osoitustila, mutta ylempää tavua 00 ei kirjoiteta käskyyn. Joten, jotta $FF ladataan $0050-paikasta akkuun, nollasivun osoitustilan ohje on:

LDA 50 dollaria

Kun LDA on A5, ei A9 tai AD, A5 16 = 10100101 2 . Muista, että jokainen muistin tavu koostuu 8 solusta ja jokaisessa solussa on vähän. Tässä oleva ohje koostuu kahdesta peräkkäisestä tavusta. LDA:n A5 on muistipaikassa $0200 ja $50-osoite ilman ylempää tavua 00 on paikassa $0301. 00:n puuttuminen, joka olisi kuluttanut tavun 64 000 kokonaismuistista, säästää muistitilaa.

Akku muistiin

Absoluuttinen osoitus
Seuraava ohje kopioi tavun arvon, oli se mikä tahansa, akusta 1444 dollarin muistipaikkaan:

Ne ovat 1444 dollaria

Tämän sanotaan siirtyvän akusta muistiin. Se ei lataudu. Lataus on päinvastoin. STA:n toimintakooditavu on 8D 16 = 10001101 2 . Tämä ohje koostuu kolmesta peräkkäisestä muistissa olevasta tavusta. 8D 16 on $0200 paikassa. 44 16 $1444-osoitteesta on paikassa $0201. Ja 14 16 on 0202 dollarin paikassa – vähän endiannessa. Varsinainen kopioitava tavu ei ole osa ohjetta. STA:lle käytetään tässä 8D eikä 85 nollasivuosoitteita varten (taulukossa).

Zero Page Addressing
Seuraava ohje kopioi tavun arvon, oli se mikä tahansa, akusta 0050 dollarin muistipaikkaan sivulla nolla:

STA $0050

STA:n operaatiokooditavu tässä on 85 16 = 10000101 2 . Tämä ohje koostuu kahdesta peräkkäisestä muistissa olevasta tavusta. 85 16 on paikassa $0200. 50 16 $0050 osoitteesta on paikassa $0201. Endianssikysymys ei esiinny tässä, koska osoitteessa on vain yksi tavu, joka on alempi tavu. Varsinainen kopioitava tavu ei ole osa ohjetta. STA:lle käytetään tässä nollasivuosoitteita varten 85 eikä 8D.

Ei ole järkevää käyttää välitöntä osoitusta siirtämään tavua akusta johonkin muistiin. Tämä johtuu siitä, että todellinen arvo, kuten $FF, on mainittava välittömän osoitteen ohjeessa. Välitön osoitus ei siis ole mahdollista tavuarvon siirtämiseksi µP:n rekisteristä mihinkään muistipaikkaan.

LDX-, STX-, LDY- ja STY-muistomerkit
LDX ja STX ovat samanlaisia ​​kuin LDA ja STA. Mutta tässä käytetään X-rekisteriä eikä A-rekisteriä (akku). LDY ja STY ovat samanlaisia ​​kuin LDA ja STA. Mutta tässä käytetään Y-rekisteriä, ei A-rekisteriä. Katso Taulukko 4.21 jokaisesta operaatiokoodista heksadesimaalimuodossa, joka vastaa tiettyä muistomerkkiä ja tiettyä osoitetilaa.

Rekisteröity-rekisteröinnin siirrot
Kaksi edellistä ohjesarjaa taulukossa 4.21 käsittelevät muistin/mikroprosessorirekisterin kopiointia (siirto) ja rekisteri-/rekisterikopiointia (siirto). TAX-, TXA-, TAY-, TYA-, TSX- ja TXS-käskyt suorittavat kopioinnin (siirron) mikroprosessorissa olevasta rekisteristä saman mikroprosessorin toiseen rekisteriin.

Kopioidaksesi tavun A:sta X:ään, ohje on:

VEROTTAA

Kopioidaksesi tavun X:stä A:hen, ohje on:

TX

Kopioidaksesi tavun A:sta Y:hen, ohje on:

KÄSI

Kopioidaksesi tavun Y:stä A:hen, ohje on:

TYA

Commodore 64 -tietokoneessa pino on sivu 1 heti sivun 0 jälkeen muistissa. Kuten kaikki muutkin sivut, se koostuu numerosta 25610 10 tavujen sijainnit, 0100–01FF. Normaalisti ohjelma suorittaa yhdestä käskystä seuraavaan peräkkäiseen muistissa olevaan käskyyn. Ajoittain tapahtuu hyppy toiseen muistikoodisegmenttiin (ohjesarjaan). Pinoalueella muistissa (RAM) on seuraavat käskyosoitteet, josta hyppyt (tai haarat) jäivät ohjelman jatkamiseen.

Pinoosoitin 'S' on 9-bittinen rekisteri 6502 µP:ssä. Ensimmäinen bitti (vasemmanpuoleisin) on aina 1. Kaikki sivulla 1 olevat tavujen sijaintiosoitteet alkavat numerolla 1, jota seuraa 8 eri bittiä 256:lle 10 sijainnit. Pinoosoittimella on sivun 1 sijainnin osoite, jossa on seuraavan käskyn osoite, johon ohjelman on palattava ja jatkettava nykyisen (hypätyn) koodisegmentin suorittamisen jälkeen. Koska pinon kaikkien osoitteiden ensimmäinen bitti (sivu yksi) alkaa 1:llä, pinon osoitinrekisterin tarvitsee sisältää vain loput kahdeksan bittiä. Loppujen lopuksi sen ensimmäinen bitti, joka on vasemmanpuoleisin bitti (yhdeksäs bitti oikealta laskettuna), on aina 1.

Kopioidaksesi tavun S:stä X:ään, ohje on:

TSX

Kopioidaksesi tavun X:stä S:ään, ohje on:

TXT

Rekisteristä rekisteriin -ohjeet eivät ota mitään operandia. Ne koostuvat vain muistomerkistä. Jokaisella muistomerkillä on toimintakoodi heksadesimaalimuodossa. Tämä on implisiittisessä osoitetilassa, koska siinä ei ole operandia (ei muistiosoitetta, ei arvoa).

Huomautus: X:stä Y:hen tai Y:stä X:ään ei ole siirtoa (kopiointia).

4.3 Aritmeettiset operaatiot

Piiri, aritmeettinen logiikkayksikkö 6502 µP:ssä, voi lisätä vain kaksi kahdeksan bitistä numeroa kerrallaan. Se ei vähennä, ei kerro eikä jaa. Seuraavassa taulukossa näkyvät aritmeettisten operaatioiden toimintakoodit ja osoitemoodit:

Huomautus: Kaikki aritmeettisten operaatioiden ja muun tyyppisten operaatioiden muistomerkit (eli kaikki 6502 mnemoniikka) ottavat yhden tavun operaatiokoodia (op). Jos muistomerkillä on useampi kuin yksi osoitusmuoto, samalle muistomerkille on eri toimintakoodit: yksi osoitustilaa kohden. Taulukon C, D ja V ovat tilarekisterin lippuja. Niiden merkitykset ilmoitetaan myöhemmin tarpeen tullen.

Allekirjoittamattomien numeroiden lisääminen
6502 µP:ssä etumerkityt luvut ovat kahden komplementtilukuja. Etumerkittömät luvut ovat tavallisia positiivisia lukuja, jotka alkavat nollasta. Joten kahdeksanbittisen tavun pienin etumerkitön luku on 00000000 2 = 0 10 = 00 16 ja suurin etumerkitön numero on 11111111 2 = 255 10 = FF 16 . Kahden etumerkittömän numeron lisäys on:

A+M+C→A

Tämä tarkoittaa, että aritmeettinen logiikkayksikkö lisää akun 8-bittisen sisällön tavuun (8 bittiä) muistista. A:n ja M:n lisäämisen jälkeen siirto yhdeksänteen bittiin menee siirtolippusoluun tilarekisterissä. Kaikki edellinen siirtobitti edellisestä lisäyksestä, joka on edelleen siirtolippusolussa tilarekisterissä, lisätään myös A:n ja M:n summaan, jolloin A+M+C→A. Tulos laitetaan takaisin akkuun.

Jos kiinnostava lisäys on:

A + M

Ja aikaisempaa siirtoa ei tarvitse lisätä, siirtolippu on tyhjennettävä, josta tulee 0, jotta lisäys on:

A+M+0→A sama kuin A+M→A

Huomautus: Jos M lisätään A:han ja 1:n siirto tapahtuu, koska tulos on suurempi kuin 255 10 = 11111111 2 = FF 16 , tämä on uusi kuljetus. Tämä uusi 1:n siirto lähetetään automaattisesti siirtolippusoluun siltä varalta, että se tarvitsee seuraavan kahdeksan bitin parin summattavan (toinen A + M).

Koodi kahden allekirjoittamattoman kahdeksanbitin lisäämiseen
00111111 2 +00010101 2 on sama kuin 3F 16 + 15 16 joka on sama kuin 63 10 +21 10 . Tulos on 010101002 2 joka on sama kuin 54 16 ja 84 10 . Tulos ei ylitä kahdeksan bitin enimmäismäärää, joka on 255 10 = 11111111 2 = FF 16 . Ei siis ole tuloksena 1:n siirtoa. Toisin sanoen tuloksena oleva siirto on 0. Ennen yhteenlaskua ei ole aiempaa siirtoa 1. Toisin sanoen edellinen siirto on 0. Koodi tämän lisäyksen tekemiseen voi olla:

CLC
LDA #$3F
ADC #15 dollaria

Huomautus: Kun kirjoitat kokoonpanokieltä, painetaan näppäimistön “Enter”-näppäintä jokaisen ohjeen lopussa. Tässä koodissa on kolme ohjetta. Ensimmäinen käsky (CLC) tyhjentää siirtolipun, jos edellisessä lisäyksessä on 1. CLC voidaan tehdä vain implisiittisessä osoitemoodissa. Implisiittisen osoitemoodin muistomerkki ei ota operandia. Tämä tyhjentää P:n tilarekisterin siirtosolun. Tyhjennys tarkoittaa bitin 0 antamista siirtolippusolulle. Koodin kaksi seuraavaa ohjetta käyttävät välitöntä osoitustilaa. Välittömässä osoittamisessa muistomerkillä on vain yksi operandi, joka on numero (eikä muisti- eikä rekisteriosoite). Ja niin, numeron edessä on oltava '#'. '$' tarkoittaa, että seuraava luku on heksadesimaali.

Toinen käsky lataa numeron 3F 16 akkuun. Kolmannelle käskylle µP:n aritmeettinen logiikkayksikköpiiri ottaa tilarekisterin siirtolippusolun edellisen (tyhjentyneen) siirron 0:sta (pakotettu 0:ksi) ja lisää sen 15:een. 16 sekä arvoon, joka on jo 3F:ssä 16 akkuun ja laittaa koko tuloksen takaisin akkuun. Tässä tapauksessa tuloksena on 0. ALU (Aritmetic Logic Unit) lähettää (asettaa) 0:n tilarekisterin siirtolippusoluun. Prosessorin tilarekisteri ja tilarekisteri tarkoittavat samaa asiaa. Jos tuloksena on siirto 1, ALU lähettää 1:n tilarekisterin siirtolipulle.

Edellisen koodin kolmen rivin on oltava muistissa ennen kuin ne suoritetaan. Operaatiokoodi 1816 CLC:lle (implied addressing) on ​​$0200 tavun sijainnissa. Käyttökoodi A9 16 LDA (välitön osoite) on $0201 tavun sijainnissa. Numero 3F 10 on $0202 tavun sijainnissa. Operaatiokoodi 69 16 LDA (välitön osoite) on $0203 tavun sijainnissa. Numero 15 10 on $0204 tavun sijainnissa.

Huomautus: LDA on siirto (lataus) käsky, ei aritmeettinen käsky (muistomerkki).

Koodi kahden allekirjoittamattoman kuusitoistabitin lisäämiseen
Kaikki 6502 µP:n rekisterit ovat oleellisesti kahdeksanbittisiä, paitsi PC (Program Counter), joka on 16-bittinen. Jopa tilarekisteri on 8 bittiä leveä, vaikka sen kahdeksan bittiä eivät toimi yhdessä. Tässä osiossa tarkastellaan kahden 16 etumerkittömän bitin lisäämistä, jolloin siirto ensimmäisestä kahdeksan bitin parista toiseen kahdeksan bitin pariin. Kiinnostava siirto on tässä siirto kahdeksannen bitin paikasta yhdeksänteen bittipaikkaan.

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

Näiden kahden etumerkittömän luvun lisääminen kahteen kantaan on seuraava:

Seuraavassa taulukossa näkyy sama lisäys 1:n siirrolla kahdeksannesta bitistä yhdeksänteen bittipaikkaan, alkaen oikealta:

Tätä koodattaessa kaksi alempaa tavua lisätään ensin. Sitten ALU (Aritmetic Logic Unit) lähettää 1:n siirron kahdeksannen bitin paikasta yhdeksänteen bittipaikkaan, siirtolippusoluun tilarekisterissä. Tulos 0 1 0 1 0 1 0 0 ilman siirtoa menee varaajaan. Sitten toinen tavupari lisätään siirtoon. ADC-muistomerkki tarkoittaa automaattista lisäämistä edelliseen siirtoon. Tässä tapauksessa edellistä siirtoa, joka on 1, ei saa muuttaa ennen toista lisäystä. Ensimmäistä lisäystä varten, koska mikään aikaisempi siirto ei ole osa tätä täydellistä lisäystä, se on tyhjennettävä (tehtävä 0).

Kahden tavuparin täydelliseen lisäämiseen ensimmäinen lisäys on:

A + M + 0 -> A

Toinen lisäys on:

A + M + 1 -> A

Joten siirtolippu on tyhjennettävä (arvona 0) juuri ennen ensimmäistä lisäystä. Seuraava ohjelma, josta lukijan tulee lukea seuraava selitys, käyttää absoluuttista osoitusmuotoa tähän summaukseen:

CLC
LDA 0213 dollaria
ADC 0215 dollaria
; ei tyhjennystä, koska siirtolippuarvo tarvitaan
STA 0217 dollaria
LDA 0214 dollaria
ADC 0216 dollaria
STA 0218 dollaria

Huomaa, että 6502-kokoonpanokielellä puolipiste aloittaa kommentin. Tämä tarkoittaa, että ohjelmaa suoritettaessa puolipiste ja kaikki sen oikealla puolella oleva jätetään huomiotta. Aiemmin kirjoitettu ohjelma on tekstitiedostossa tallennetaan ohjelmoijan valitsemalla nimellä ja “asm”-tunnisteella. Edellinen ohjelma ei ole tarkka ohjelma, joka menee muistiin suoritettavaksi. Vastaavaa muistissa olevaa ohjelmaa kutsutaan käännetyksi ohjelmaksi, jossa muistomerkit korvataan opkoodeilla (tavuilla). Kaikki kommentit jäävät kokoonpanokielen tekstitiedostoon, ja ne poistetaan ennen kuin käännetty ohjelma saapuu muistiin. Itse asiassa levylle on nykyään tallennettu kaksi tiedostoa: '.asm'-tiedosto ja '.exe'-tiedosto. '.asm'-tiedosto on sama kuin edellisessä kuvassa. '.exe'-tiedosto on '.asm'-tiedosto, josta on poistettu kaikki kommentit ja kaikki muistiinpanot korvattu niiden opkoodeilla. Kun .exe-tiedosto avataan tekstieditorissa, sitä ei voi tunnistaa. Ellei toisin mainita, tässä luvussa '.exe'-tiedosto kopioidaan muistiin paikasta $0200 alkaen. Tämä on lataamisen toinen merkitys.

Kaksi lisättävää 16-bittistä numeroa vievät neljä tavua muistissa absoluuttista osoitusta varten: kaksi tavua numeroa kohden (muisti on tavujen sarja). Absoluuttisella osoitteella operandi operaatiokoodiin on muistissa. Summaustulos on kaksi tavua leveä ja se on myös tallennettava muistiin. Tämä antaa yhteensä 6 10 = 6 16 tavua tuloja ja lähtöjä varten. Tulot eivät ole näppäimistöltä, eikä lähtö ole näytöstä tai tulostimesta. Tulot ovat muistissa (RAM) ja lähtö (summaustulos) palaa muistiin (RAM) tässä tilanteessa.

Ennen kuin ohjelma suoritetaan, käännetyn version on oltava ensin muistissa. Tarkasteltaessa edellistä ohjelmakoodia voidaan nähdä, että ohjeet ilman kommenttia muodostavat 19 10 = 13 16 tavua. Joten ohjelma vie 0200 dollarin tavun sijainnista muistissa $ 0200 + $ 13 - $ 1 = $ 0212 tavun sijaintiin (alkaen $ 0200 eikä $ 0201, mikä tarkoittaa - $ 1). Kun lisäät 6 tavua tulo- ja lähtönumeroille, kaikki ohjelma päättyy hintaan $ 0212 + $ 6 = $ 0218. Ohjelman kokonaispituus on 19 16 = 25 10 .

Augendin alemman tavun tulisi olla $0213-osoitteessa ja saman augendin korkeamman tavun pitäisi olla $0214-osoitteessa – vähän endiannessa. Vastaavasti lisäyksen alemman tavun tulisi olla $0215-osoitteessa ja saman lisäyksen ylemmän tavun pitäisi olla $0216-osoitteessa – vähän endiannessa. Tuloksen (summan) alemman tavun tulisi olla $0217-osoitteessa ja saman tuloksen korkeamman tavun tulisi olla $0218-osoitteessa – vähän endianisuutta.

Käyttökoodi 18 16 CLC:lle (implied addressing) on ​​tavun sijainnissa $0200. Operaatiokoodi 'LDA $0213', eli AD 16 LDA:lle (absolute addressing) on ​​$0201:n tavussa. Augendin alempi tavu, joka on 10111111, on $0213:n muistitavun sijainnissa. Muista, että jokainen operaatiokoodi vie yhden tavun. Osoitteen '$0213' osoite 'LDA $0213' on $0202 ja $0203 tavupaikoissa. 'LDA $0213' -käsky lataa augendin alemman tavun akkuun.

Operaatiokoodi 'ADC $0215', eli 6D 16 ADC:lle (absolute addressing) on ​​$0204:n tavussa. Lisäyksen alempi tavu, joka on 10010101, on tavun sijainnissa $0215. 'ADC $0215':n '$0215' osoite on $0205 ja $0206 tavupaikoissa. 'ADC $0215' -käsky lisää lisäyksen alemman tavun lisäyksen alempaan tavuun, joka on jo akussa. Tulos laitetaan takaisin akkuun. Kaikki kahdeksannen bitin jälkeinen siirto lähetetään tilarekisterin siirtolippuun. Kuljetuslippusolua ei saa tyhjentää ennen suurempien tavujen toista lisäystä. Tämä siirto lisätään automaattisesti suurempien tavujen summaan. Itse asiassa 0:n siirto lisätään alempien tavujen summaan automaattisesti alussa (vastaa siirtoa ei lisätä) CLC:n vuoksi.

Kommentti vie seuraavat 48 10 = 30 16 tavua. Tämä jää kuitenkin vain '.asm'-tekstitiedostoon. Se ei saavuta muistia. Se poistetaan käännöksellä, jonka suorittaa assembler (ohjelma).

Seuraavaa käskyä varten, joka on “STA $0217”, STA:n toimintakoodi, joka on 8D 16 (absoluuttinen osoite) on tavun sijainnissa $0207. Kohteen “STA $0217” osoite “$0217” on muistipaikoissa $0208 ja $0209. 'STA $0217' -käsky kopioi akun kahdeksan bitin sisällön muistipaikkaan $0217.

Augendin korkeampi tavu, joka on 00101010, on $0214:n muistipaikassa ja lisäyksen korkeampi tavu, joka on 00101010, on $02:n tavussa. 16 . Operaatiokoodi 'LDA $0214', joka on AD16 LDA:lle (absoluuttinen osoitus), on $020A:n tavussa. 'LDA $0214':n '$0214' osoite on $020B ja $020C sijainneissa. 'LDA $0214' -käsky lataa augendin korkeamman tavun akkuun ja pyyhkii kaiken akussa olevan.

Operaatiokoodi 'ADC $0216':lle, joka on 6D 16 ADC (absolute addressing) on ​​$020D:n tavussa. 'ADC 0216':n '$0216' osoite on $020E ja $020F tavupaikoissa. 'ADC $0216' -käsky lisää lisäyksen korkeamman tavun lisäyksen korkeampaan tavuun, joka on jo akussa. Tulos laitetaan takaisin akkuun. Jos siirto on 1, tämä toinen lisäys sijoitetaan automaattisesti tilarekisterin siirtosoluun. Vaikka kuudennentoista bitin (vasemmalla) jälkeistä siirtoa ei vaadita tähän ongelmaan, on mukavaa tarkistaa, tapahtuiko siirto 1, tarkistamalla, tuliko siirtolipusta 1.

Seuraavaa ja viimeistä ohjetta varten, joka on “STA $0218”, STA:n toimintakoodi, joka on 8D16 (absoluuttinen osoitus), on $0210:n tavussa. Kohteen “STA $0218” osoite “$0218” on muistipaikoissa $0211 ja $0212. 'STA $0218' -käsky kopioi akun kahdeksan bitin sisällön muistipaikkaan $0218. Kahden 16-bittisen luvun lisäämisen tulos on 0101010101010100, jossa alempi tavu 01010100 on muistipaikassa $0217 ja suurempi tavu 01010101 muistipaikassa $0218 – vähän endiannessa.

Vähennyslasku
6502 µP:ssä etumerkityt luvut ovat kahden komplementtilukuja. Kahden komplementtiluku voi olla kahdeksan bittiä, kuusitoista bittiä tai mikä tahansa kahdeksan bitin monikerta. Kahden komplementin kanssa ensimmäinen bitti vasemmalta on merkkibitti. Positiiviselle luvulle tämä ensimmäinen bitti on 0 osoittamaan etumerkkiä. Loput bitit muodostavat luvun normaalisti. Saadaksesi negatiivisen luvun kahden komplementin, käännä kaikki vastaavan positiivisen luvun bitit ja lisää sitten tulokseen 1 oikeasta päästä.

Yhden positiivisen luvun vähentämiseksi toisesta positiivisesta luvusta aliosa muunnetaan kahden komplementin negatiiviseksi luvuksi. Sitten minuend ja uusi negatiivinen luku lisätään tavalliseen tapaan. Joten kahdeksan bitin vähennyksestä tulee:

Kun siirto oletetaan olevan 1. Akkumulaattorin tulos on kahden komplementin erotus. Joten kahden luvun vähentämiseksi siirtolippu on asetettava (tehtävä 1:ksi).

Kun vähennetään kaksi kuusitoistabittistä lukua, vähennys tehdään kahdesti, kuten lisättäessä kaksi kuusitoistabittistä lukua. Koska vähennys on eräs yhteenlaskumuoto 6502 µP:n kanssa, vähennettäessä kaksi 16-bittistä lukua siirtolippu asetetaan vain kerran ensimmäiselle vähennykselle. Toisessa vähennyslaskussa kaikki siirtolipun asetukset tehdään automaattisesti.

Vähennyksen ohjelmointi kahdeksanbittisille luvuille tai kuusitoistabittisille luvuille tehdään samalla tavalla kuin yhteenlasku. Kantolippu on kuitenkin asetettava heti alussa. Muistomerkki tämän tekemiseen on:

Vähennys 16-bittisillä positiivisilla luvuilla
Harkitse vähennyslaskua seuraavilla luvuilla:

Tämä vähennyslasku ei sisällä kahden komplementtia. Koska 6502 µP:n vähennys tehdään kahden komplementissa, vähennys kahdessa tehdään seuraavasti:

Näiden kahden komplementin tulos on sama kuin tulos, joka saadaan tavallisesta vähennyksestä. Huomaa kuitenkin, että 1, joka menee seitsemänteentoista bittipaikkaan oikealta, ohitetaan. Minuendi ja aliosa jaetaan kumpikin kahteen kahdeksaan. Alaosan alemman tavun kahden komplementti 10010110 määritetään riippumatta sen korkeammasta tavusta ja mahdollisesta siirrosta. Alaosan ylemmän tavun kahden komplementti 11101011 määritetään riippumatta sen alemmasta tavusta ja mahdollisesta siirrosta.

Minuendin 16-bittiä on jo kahden komplementissa, alkaen 0:sta vasemmalta. Se ei siis vaadi bittien säätöä. 6502 µP:llä minuutin alempi tavu ilman muutoksia lisätään aliosan kahden komplementin alempaan tavuun. Minuutin alempaa tavua ei muunneta kahden komplementiksi, koska koko minuutin kuudentoista bitin on oltava jo kahden komplementissa (vasemmalla ensimmäinen bitti on 0). Tässä ensimmäisessä lisäyksessä pakollinen siirto 1 lisätään 1=0 SEC-käskyn vuoksi.

Nykyisessä efektiivisessä vähennyslaskussa on 1 (yhteenlasku) siirto kahdeksannnesta bitistä yhdeksänteen bittiin (oikealta). Koska tämä on käytännössä vähennyslaskua, mikä tahansa bitti, jonka oletetaan olevan siirtolipussa tilarekisterissä, täydennetään (käännetään). Joten 1:n kantamisesta tulee 0 C-lipussa. Toisessa operaatiossa minuutin korkeampi tavu lisätään aliosan kahden korkeamman komplementin tavuun. Tilarekisterin automaattisesti täydennetty siirtolippubitti (tässä tapauksessa on 0) lisätään myös (ylempiin tavuihin). Mikä tahansa 1, joka ylittää kuudennentoista bitin oikealta, ohitetaan.

Seuraava asia on vain koodata koko järjestelmä seuraavasti:

SEC
LDA 0213 dollaria
SBC 0215 dollaria
; ei tyhjennystä, koska käänteinen siirtolipun arvo tarvitaan
STA 0217 dollaria
LDA 0214 dollaria
SBC 0216 dollaria
STA 0218 dollaria

Muista, että 6502-kokoonpanokielellä puolipiste aloittaa kommentin, joka ei sisälly muistiin käännettyyn ohjelmaversioon. Kaksi 16-bittistä vähennyslukua vievät neljä tavua muistia absoluuttisella osoitteella; kaksi per numero (muisti on tavusarja). Nämä tulot eivät ole näppäimistöltä. Summaustulos on kaksi tavua ja se on myös sijoitettava muistiin eri paikkaan. Tämä lähtö ei mene näyttöön tai tulostimeen; se menee muistiin. Tämä antaa yhteensä 6 10 = 6 16 tavua muistiin (RAM) sijoitettaville tuloille ja ulostuloille.

Ennen kuin ohjelma suoritetaan, sen on oltava ensin muistissa. Ohjelmakoodia katsomalla voidaan nähdä, että ohjeet ilman kommenttia muodostavat 19 10 = 13 16 tavua. Koska kaikki tämän luvun ohjelmat alkavat muistipaikasta $0200, ohjelma siirtyy $0200 tavun sijainnista muistissa $0200 + $13 – $1 = $0212 tavun sijaintiin (alkaa $0200 eikä $0201). Tämä alue ei sisällä tulo- ja lähtötavujen aluetta. Kaksi tulonumeroa vie 4 tavua ja yksi lähtönumero 2 tavua. Kun lisäät 6 tavua tulo- ja lähtönumeroille, saadaan ohjelman alue, joka päättyy $0212 + $6 = $0218. Ohjelman kokonaispituus on 19 16 = 25 10 .

Minuendin alemman tavun tulisi olla $0213-osoitteessa ja saman minuendin ylemmän tavun pitäisi olla $0214-osoitteessa – vähän endianisuutta. Vastaavasti aliosan alemman tavun tulisi olla $0215-osoitteessa ja saman aliosan korkeamman tavun pitäisi olla $0216-osoitteessa – vähän endianisuutta. Tuloksen alemman tavun (eron) tulisi olla $0217-osoitteessa ja saman tuloksen korkeamman tavun pitäisi olla $0218-osoitteessa – vähän endianisuutta.

Operaatiokoodi 38 16 SEC (implisiittinen osoite) on $0200-osoitteessa. Kaikkien tämän luvun ohjelmien oletetaan alkavan muistipaikasta $0200, mikä mitätöi kaikki ohjelmat, jotka olisivat olleet siellä; ellei toisin mainita. Operaatiokoodi 'LDA $0213', eli AD 16 , LDA (absolute addressing) on ​​$0201 tavun sijainnissa. Minuendin alempi tavu, joka on 10111111, on $0213:n muistitavun sijainnissa. Muista, että jokainen operaatiokoodi vie yhden tavun. Osoitteen '$0213' osoite 'LDA $0213' on $0202 ja $0203 tavupaikoissa. 'LDA $0213' -käsky lataa minuendin alemman tavun akkuun.

Operaatiokoodi 'SBC $0215', eli ED 16 , SBC (absolute addressing) on ​​$0204 tavun sijainnissa. Alaosan alempi tavu, joka on 01101010, on $0215 tavun sijainnissa. 'ADC $0215':n '$0215' osoite on $0205 ja $0206 tavupaikoissa. 'SBC $0215' -käsky vähentää aliosan alemman tavun akussa jo olevan minuend-tavun alemmasta tavusta. Tämä on kahden komplementin vähennyslasku. Tulos laitetaan takaisin akkuun. Minkä tahansa kahdeksannen bitin jälkeisen siirron komplementti (inversio) lähetetään tilarekisterin siirtolipulle. Tätä siirtolippua ei saa tyhjentää ennen toista vähennyslaskua suuremmilla tavuilla. Tämä siirto lisätään automaattisesti suurempien tavujen vähennykseen.

Kommentti vie seuraavat 57 10 = 3916 16 tavua. Tämä jää kuitenkin vain '.asm'-tekstitiedostoon. Se ei saavuta muistia. Se poistetaan käännöksellä, jonka suorittaa assembler (ohjelma).

Seuraavalle käskylle, joka on 'STA $0217', STA:n toimintakoodi, eli 8D 16 (absoluuttinen osoitus), on $0207 tavun sijainnissa. Kohteen “STA $0217” osoite “$0217” on muistipaikoissa $0208 ja $0209. 'STA $0217' -käsky kopioi akun kahdeksan bitin sisällön muistipaikkaan $0217.

Minuendin korkeampi tavu, joka on 00101010, on $0214:n muistipaikassa ja aliosan korkeampi tavu, joka on 00010101, on $0216:n tavussa. Operaatiokoodi 'LDA $0214', eli AD 16 LDA:lle (absolute addressing) on ​​$020A tavun sijainnissa. 'LDA $0214':n '$0214' osoite on $020B ja $020C sijainneissa. 'LDA $0214' -käsky lataa minuendin korkeamman tavun akkuun ja pyyhkii kaiken akussa olevan.

Operaatiokoodi 'SBC $0216', eli ED 16 SBC:lle (absolute addressing) on ​​$020D tavun sijainnissa. 'SBC $0216':n '$0216' osoite on $020E ja $020F tavupaikoissa. 'SBC $0216' -käsky vähentää aliosan korkeamman tavun minuutin (kahden komplementin) korkeammasta tavusta, joka on jo akussa. Tulos laitetaan takaisin akkuun. Jos tälle toiselle vähennykselle on 1:n siirto, sen komplementti sijoitetaan automaattisesti tilarekisterin siirtosoluun. Vaikka kuudennentoista bitin (vasemmalla) jälkeistä siirtoa ei vaadita tähän ongelmaan, on mukavaa tarkistaa, tapahtuuko komplementin siirto, tarkistamalla siirtolippu.

Seuraavalle ja viimeiselle ohjeelle, joka on 'STA $0218', STA:n toimintakoodi, eli 8D 16 (absoluuttinen osoitus), on $0210 tavun sijainnissa. Kohteen “STA $0218” osoite “$0218” on muistipaikoissa $0211 ja $0212. 'STA $0218' -käsky kopioi akun kahdeksan bitin sisällön muistipaikkaan $0218. Vähennyksen tulos kahdella kuusitoistabittisellä luvulla on 0001010101010101, jossa alempi tavu 01010101 on muistipaikassa $0217 ja suurempi tavu 00010101 muistipaikassa $0218 – vähän endiannessa.

6502 µP:ssä on piirit vain yhteenlaskua varten ja epäsuorasti näiden kahden komplementin vähennyslaskua varten. Siinä ei ole kerto- ja jakopiirejä. Kerto- ja jakolaskua varten tulee kirjoittaa konekieliohjelma, jossa on yksityiskohdat, mukaan lukien osittaisten tulojen ja osittaisten osinkojen siirtäminen.

4.4 Loogiset toiminnot

6502 µP:ssä TAI:n muistomerkki on ORA ja yksinomaisen TAI:n muistomerkki on EOR. Huomaa, että loogisissa operaatioissa ei ole implisiittistä osoitusta. Implisiittinen osoitus ei ota operandia. Jokaisen loogisen operaattorin on otettava kaksi operandia. Ensimmäinen on akussa ja toinen muistissa tai ohjeessa. Tulos (8 bittiä) palaa akkuun. Ensimmäinen akussa joko laitetaan sinne välittömällä käskyllä ​​tai kopioidaan muistista absoluuttisella osoitteella. Tässä osiossa käytetään havainnollistamiseen vain nollasivun osoitetta. Nämä loogiset operaattorit ovat kaikki Bitwise-operaattoreita.

JA
Seuraava taulukko havainnollistaa bittikohtaista JA-arvoa binääri-, heksadesimaali- ja desimaalimuodossa:

Kaikkien tämän luvun ohjelmien tulee alkaa muistitavun sijainnista $0200. Tämän osion ohjelmat ovat kuitenkin sivulla nolla, tarkoituksena havainnollistaa sivun nollan käyttöä ilman ylempää tavua 00000000 2 . Edellinen AND-koodi voidaan koodata seuraavasti:

LDA #$9A ; ei muistista – välitön osoitus
JA #$CD ; ei muistista – välitön osoitus
STA 30 dollaria; tallentaa 88 dollaria nollaperusteisella 0030 dollarilla

TAI
Seuraava taulukko havainnollistaa bittikohtaisen OR:n binääri-, heksadesimaali- ja desimaalimuodossa:

LDA #$9A ; ei muistista – välitön osoitus
ORA #$CD ; ei muistista – välitön osoitus
STA 30 dollaria; tallentaa $CF hintaan nollaperusteinen $0030

VAPAA
Seuraava taulukko havainnollistaa bittikohtaisen XOR:n binääri-, heksadesimaali- ja desimaalimuodossa:

LDA #$9A ; ei muistista – välitön osoitus
EOR #$CD ; ei muistista – välitön osoitus
STA 30 dollaria; tallentaa 57 dollaria nollaperusteisella 0030 dollarilla

4.5 Siirto- ja kiertotoiminnot

Siirto- ja rotate-operaattoreiden muistomerkit ja toimintakoodit ovat:

ASL: Siirrä vasemmalle akun tai muistipaikan bittiä lisäämällä 0 vapautuneeseen oikeanpuoleiseen soluun.

LSR: Siirrä oikealle yksi akun tai muistipaikan bitti lisäämällä 0 vapautuneeseen vasemmanpuoleiseen soluun.
ROL: Kierrä yksi bitti akusta tai muistipaikasta vasemmalle ja lisää vasemmalla pudonnut bitti vapautuneeseen oikeanpuoleiseen soluun.
ROR: Kierrä yksi bitti akun tai muistipaikan oikealle ja lisää oikealta pudonnut bitti vapautettuun vasemmanpuoleisimpaan soluun.

Jos haluat tehdä siirron tai kierron akun kanssa, ohje on suunnilleen seuraava:

LSR A

Tämä käyttää toista osoitustilaa, jota kutsutaan akkuosoitemoodiksi.

Jos haluat tehdä siirron tai kierron tavumuistipaikalla, ohje on suunnilleen seuraava:

ROR $2BCD

Missä 2BCD on muistipaikka.

Huomaa, että välitöntä tai implisiittistä osoitustilaa siirrolle tai kiertämiselle ei ole. Välitöntä osoitustilaa ei ole, koska ei ole järkeä siirtää tai kiertää numeroa, joka jää vain käskyyn. Ei ole olemassa oletettua osoitustilaa, koska 6502 µP:n suunnittelijat haluavat vain akun sisällön (A-rekisterin) tai muistitavupaikan siirrettävän tai kierrettävän.

4.6 Suhteellinen osoitetila

Mikroprosessori kasvattaa aina (1, 2 tai 3 yksiköllä) ohjelmalaskuria (PC) osoittaakseen seuraavaan suoritettavaan käskyyn. 6502 µP:ssä on ohje, jonka muistomerkki on BVS, mikä tarkoittaa Branch on Overflow Set. PC koostuu kahdesta tavusta. Tämä käsky saa PC:lle eri muistiosoitteen seuraavaa suoritettavaa käskyä varten, joka ei johdu normaalista lisäyksestä. Se tekee sen lisäämällä tai vähentämällä arvon, jota kutsutaan offsetiksi, tietokoneen sisältöön. Ja niin, PC osoittaa sitten eri (haarautuneeseen) muistipaikkaan, jotta tietokone voi jatkaa suorittamista sieltä. Siirtymä on kokonaisluku arvosta -128 10 numeroon +127 10 (kahden täydennys). Joten offset voi saada hypyn etenemään muistissa. Jos se on positiivinen tai jäljessä muistissa, tai jos se on negatiivinen.

BVS-käsky ottaa vain yhden operandin, joka on offset. BVS käyttää suhteellista osoitusta. Harkitse seuraavaa ohjetta:

BVS $ 7F

Toisessa pohjassa 7F H on 01111111 2 = 127 10 . Oletetaan, että seuraavan ohjeen sisältö PC:ssä on $0300. BVS-käsky saa aikaan $7F:n (positiivinen luku jo kahden komplementissa) lisäämisen $0300:aan, jolloin saadaan $037F. Joten seuraavan käskyn sijasta, joka suoritetaan muistipaikassa $0300, se on muistipaikassa $037F (noin puoli sivua eroa).

On muitakin haaraohjeita, mutta BVS on erittäin hyvä käyttää havainnollistamaan suhteellista osoitusta. Suhteellinen osoitus käsittelee haaraohjeita.

4.7 Indeksoitu osoitus ja epäsuora osoitus erikseen

Näiden osoitustilojen avulla 6502 µP pystyy käsittelemään valtavia tietomääriä lyhyessä ajassa pienemmällä määrällä käskyjä. Koko Comodore-64-muistille on 64 kilotavua. Joten, jotta päästään mihin tahansa 16-bittiseen tavupaikkaan, tarvitaan kaksi tavua. Ainoa poikkeus kahden tavun tarpeeseen on sivu nolla, jossa korkeampi tavu $ 00 jätetään pois muistin käskyn viemän tilan säästämiseksi. Ei-sivunolla-osoitetilassa 16-bittisen muistiosoitteen sekä korkeampi että alempi tavu ilmaistaan ​​enimmäkseen jotenkin.

Indeksoidun osoitteen perusasetukset

Absoluuttinen indeksiosoitus
Muista, että X- tai Y-rekisteriä kutsutaan indeksirekisteriksi. Harkitse seuraavaa ohjetta:

LDA $ C453,X

Oletetaan, että arvo 6 H on X-rekisterissä. Huomaa, että 6 ei ole kirjoitettu mihinkään ohjeeseen. Tämä ohje lisää 6H:n arvon C453:een H joka on osa kirjoitettua käskyä tekstitiedostossa, joka on vielä koottava – C453 H + 6 H = C459 H . LDA tarkoittaa tavun lataamista akkuun. Akulle ladattava tavu tulee $C459-osoitteesta. $C459, joka on $C453:n summa, joka kirjoitetaan käskyllä ​​ja numerolla 6 H X-rekisteristä löytyvästä osoitteesta tulee tehollinen osoite, josta akulle ladattava tavu tulee. Jos 6 H oli Y-rekisterissä, Y on kirjoitettu käskyn X:n tilalle.

Kirjoitetussa käskylauseessa $C453 tunnetaan perusosoitteena ja 6 H X- tai Y-rekisterissä tunnetaan tehollisen osoitteen laskenta- tai indeksiosana. Perusosoite voi viitata mihin tahansa muistissa olevaan tavuosoitteeseen ja seuraavaan 256:een 10 osoitteita voidaan käyttää olettaen, että X- tai Y-rekisterin aloitettu indeksi (tai lukumäärä) on 0. Muista, että yksi tavu voi antaa jatkuvan alueen jopa 256 10 numeroita (eli 00000000 2 numeroon 11111111 2 ).

Absoluuttinen osoitus lisää siis sen, mikä on jo asetettu (jonka toinen käsky on laittanut) X- tai Y-rekisteriin 16 osoitteeseen, jotka kirjoitetaan käskyllä ​​tehokkaan osoitteen saamiseksi. Kirjoituskäskyssä kaksi indeksirekisteriä erotetaan X:llä tai Y:llä, jotka kirjoitetaan pilkun jälkeen. Joko X tai Y kirjoitetaan; ei kumpikaan.

Kun kaikki ohjelma on kirjoitettu tekstieditoriin ja tallennettu '.asm'-tiedostotunnisteella, kokoajan, joka on toinen ohjelma, on käännettävä kirjoitettu ohjelma siihen, mikä on (ladattu) muistissa. Edellinen ohje, joka on 'LDA $C453,X', varaa kolme tavua muistissa, ei viittä.

Muista, että muistomerkillä, kuten LDA:lla, voi olla useampi kuin yksi toimintakoodi (eri tavuja). X-rekisteriä käyttävän käskyn toimintakoodi eroaa Y-rekisteriä käyttävästä operaatiokoodista. Kokoonpanija tietää, mitä opkoodia tulee käyttää kirjoitetun käskyn perusteella. 'LDA $C453,X':n yhden tavun operaatiokoodi eroaa 'LDA $C453,Y' -tavun operaatiokoodista. Itse asiassa LDA:n toimintakoodi 'LDA $C453,X':ssä on BD ja LDA:n operaatiokoodi 'LDA $C453,9':ssä on BD.

Jos LDA:n toimintakoodi on $0200 tavun sijainnissa. Sitten $C453:n 16-bittinen osoite vie muistissa olevien tavujen sijainteja, jotka ovat $0201 ja $0202. Tietty opcode-tavu osoittaa, onko kyseessä X- vai Y-rekisteri. Niinpä koottu kieliohje, joka on 'LDA $C453,X' tai 'LDA $C453,Y', vie muistissa kolme peräkkäistä tavua, ei neljää tai viittä.

Nollasivuinen indeksoitu osoitus
Nollasivun indeksiosoitus on kuin absoluuttinen indeksiosoitus, joka on kuvattu aiemmin, mutta kohdetavun tulee olla vain sivulla nolla (0000–00FF). Nyt kun käsitellään nollasivua, korkeampi tavu, joka on aina 00 H muistipaikkoja yleensä vältetään. Joten yleensä mainitaan, että sivu nolla alkaa 00 dollarista FF:iin. Ja niin, edellinen ohje 'LDA $C453,X' on:

LDA 53,X $

$C4, korkeampi tavu, joka viittaa sivun nollan yläpuolelle, ei voida käyttää tässä ohjeessa, koska se asettaa odotetun kohdetavun ladattavaksi kerättyyn tavuun sivun nollan ulkopuolelle ja yläpuolelle.

Kun käskyyn kirjoitettu arvo lisätään indeksirekisterin arvoon, summan ei pitäisi antaa tulosta sivunollan yläpuolelle (FF H ). Joten on mahdotonta käyttää ohjetta kuten 'LDA $FF, X' ja arvoa kuten FF H indeksirekisterissä, koska FF H + FF H = 200 H joka on sivun 2 (kolmannen sivun) ensimmäinen tavu (0200 dollaria) muistissa, on suuren etäisyyden päässä sivusta 0. Nollasivuisen indeksoidun osoitteen tapauksessa tehokkaan osoitteen on oltava sivulla nolla.

Epäsuora osoitus

Hyppää absoluuttiseen osoitteeseen
Ennen kuin puhutaan absoluuttisesta epäsuorasta osoitteesta, on hyvä ensin tarkastella JMP-absoluuttista osoitusta. Oletetaan, että osoite, jolla on kiinnostava arvo (kohdetavu), on 8765 dollaria. Tämä on 16-bittinen, joka koostuu kahdesta tavusta: korkeampi tavu, joka on 87 H ja alempi tavu, joka on 65 H . Joten kaksi tavua hintaan 8765 dollaria laitetaan PC:lle (ohjelmalaskuri) seuraavaa ohjetta varten. Assembly-kieliohjelmassa (tiedostossa) kirjoitetaan seuraavaa:

JMP 8765 dollaria

Muistissa oleva suoritusohjelma hyppää mistä tahansa osoitteesta 8765 dollariin. JMP-muistomerkillä on kolme toimintakoodia, jotka ovat 4C, 6C ja 7C. Tämän absoluuttisen osoituksen toimintakoodi on 4C. Absoluuttisen epäsuoran JMP-osoitteen toimintakoodi on 6C (katso seuraavat kuvat).

Absoluuttinen epäsuora osoitus
Tätä käytetään vain hyppykäskyn (JMP) kanssa. Oletetaan, että osoite, jossa on kiinnostava tavu (kohdetavu), on 8765 dollaria. Tämä on 16-bittinen, joka koostuu kahdesta tavusta: korkeampi tavu, joka on 87 H ja alempi tavu, joka on 65 H . Absoluuttisella epäsuoralla osoitteella nämä kaksi tavua sijaitsevat itse asiassa kahdessa peräkkäisessä tavupaikassa muualla muistissa.

Oletetaan, että ne sijaitsevat muistipaikoissa $0210 ja $0211. Sitten kiinnostavan osoitteen alempi tavu, joka on 65 H on $0210-osoitteessa ja korkeampi tavu, joka on 87 H on $0211-osoitteessa. Tämä tarkoittaa, että kiinnostava muistitavu menee alempaan peräkkäiseen osoitteeseen ja suurempi kiinnostava muistitavu korkeampaan peräkkäiseen osoitteeseen – vähän endianisuutta.

16-bittinen osoite voi viitata kahteen peräkkäiseen osoitteeseen muistissa. Tässä valossa $0210-osoite viittaa osoitteisiin $0210 ja $0211. Osoiteparissa $0210 ja $0211 on kohdetavun lopullinen osoite (16 bittiä kaksi tavua) ja alempi tavu on 65 H 0210 dollarissa ja korkeampi tavu 87 H hintaan 0211 dollaria. Joten kirjoitettu hyppyohje on:

JMP (0210 dollaria)

JMP-muistomerkillä on kolme toimintakoodia, jotka ovat 4C, 6C ja 7C. Absoluuttisen epäsuoran osoitteen toimintakoodi on 6C. Tekstitiedostoon kirjoitetaan 'JMP ($0210)'. Sulujen vuoksi kokoaja (kääntäjä) käyttää JMP:lle opkoodia 6C, ei 4C tai 7C.

Absoluuttisella epäsuoralla osoitteella on itse asiassa kolme muistialuetta. Ensimmäinen alue voi koostua $0200-, $0201- ja $0202-tavuista. Tässä on kolme tavua 'JMP ($0210)' -käskylle. Toinen alue, joka ei välttämättä ole ensimmäisen vieressä, koostuu kahdesta peräkkäisestä tavupaikasta $0210 ja $0211. Tämä on alempi tavu (0210 dollaria), joka kirjoitetaan konekieliohjelman ohjeeseen. Jos kiinnostava osoite on 8765 dollaria, alempi tavu 65 H on $0210 tavun sijainnissa ja korkeampi tavu 87 H on $0211 tavun sijainnissa. Kolmas alue koostuu vain yhden tavun sijainnista. Se on 8765 dollarin osoite kohdistetulle tavulle (kiinnostava viimeinen tavu). Peräkkäiset osoitteet, $0210 ja $0211, sisältävät $8765-osoittimen, joka on kiinnostava osoite. Laskentatulkinnan jälkeen 8765 dollaria menee PC:hen (Program Counter) päästäkseen kohdetavuun.

Nolla sivun epäsuora osoitus
Tämä osoitus on sama kuin absoluuttinen epäsuora osoitus, mutta osoittimen on oltava sivulla nolla. Osoitinalueen alemman tavun osoite on kirjoitetussa käskyssä seuraavasti:

JMP (50 dollaria)

Osoittimen korkeampi tavu on $51 tavun sijainnissa. Vaikuttavan osoitteen (osoitti) ei tarvitse olla sivulla nolla.

Joten indeksiosoittamisessa indeksirekisterin arvo lisätään perusosoitteeseen, joka on annettu ohjeessa tehokkaan osoitteen saamiseksi. Epäsuora osoitus käyttää osoitinta.

4.8 Indeksoitu epäsuora osoitus

Absoluuttinen indeksoitu epäsuora osoite
Tätä osoitetilaa käytetään vain JMP-käskyn kanssa.
Absoluuttisessa epäsuorassa osoitteessa on terävä arvo (tavu), jossa on kaksi peräkkäistä tavuosoitetta. Nämä kaksi peräkkäistä osoitetta muodostavat osoittimen olevan kahden peräkkäisen tavun osoitinalueella muistissa. Osoitinalueen alempi tavu on se, joka kirjoitetaan suluissa olevaan ohjeeseen. Osoitin on osoitetun arvon osoite. Edellisessä tilanteessa 8765 dollaria on osoittavan arvon osoite. $0210 (seuraa $0211) on osoite, jonka sisältö on $8765, joka on osoitin. Absoluuttisessa epäsuorassa osoitetilassa se on ($0210), joka kirjoitetaan ohjelmaan (tekstitiedostoon), sulkumerkit mukaan lukien.

Toisaalta Absolute Indexed Indirect Addressing Mode -tilassa alempi osoitetavu osoitinalueelle muodostetaan lisäämällä X-rekisterin arvo kirjoitettuun osoitteeseen. Jos osoitin on esimerkiksi osoitteen sijainnissa $0210, kirjoitettu ohje voi olla jotain tällaista:

JMP (020A,X)

Missä X-rekisterin arvo on 6 H . 020A H + 6 H = 0210 H . Y-rekisteriä ei käytetä tässä osoitemoodissa.

Nolla sivun indeksoitu epäsuora osoitus
Tämä osoitustila käyttää X-rekisteriä eikä Y-rekisteriä. Tässä osoitustilassa on edelleen osoitettu arvo ja osoitin sen kaksitavuisella osoiteosoittimen alueella. Osoittimen sivulla nolla on oltava kaksi peräkkäistä tavua. Ohjeeseen kirjoitettu osoite on yksitavuinen osoite. Tämä arvo lisätään X-rekisterin arvoon ja mahdollinen siirto hylätään. Tulos osoittaa osoitinalueelle sivulla 0. Esimerkiksi jos kiinnostava osoite (osoitti) on $8765 ja se on tavupaikoissa $50 ja $51 sivulla 0 ja arvo X-rekisterissä on $30, kirjoitettu ohje on jotain tällaista:

LDA (20,X dollaria)

Koska 20 dollaria + 30 dollaria = 50 dollaria.

Epäsuora indeksoitu osoite
Tämä osoitusmuoto käyttää Y-rekisteriä eikä X-rekisteriä. Tässä osoitustilassa on edelleen kohdistettu arvo ja osoitinalue, mutta osoitinalueen sisältö toimii eri tavalla. Osoitinalueen sivulla nolla on oltava kaksi peräkkäistä tavua. Osoitinalueen alempi osoite kirjoitetaan ohjeeseen. Tämä numero (tavupari), joka sisältyy osoitinalueeseen, lisätään Y-rekisterin arvoon, jotta saadaan todellinen osoitin. Olkoon esimerkiksi kiinnostava osoite (osoitettu) $8765, 6H:n arvo Y-rekisterissä ja numero (kaksi tavua) osoitteessa 50 H ja 51 H . Kaksi tavua yhdessä ovat $ 875 F, koska $ 875 F + $ 6 = $ 8765. Kirjoitettu ohje on jotain tällaista:

LDA (50 dollaria),Y

4.9 Lisäys-, vähennys- ja testibittien ohjeet

Seuraava taulukko näyttää lisäys- ja vähennyskäskyjen toiminnot:

INA ja DEA lisäävät ja vähentävät akkua, vastaavasti. Tätä kutsutaan akkuosoitteeksi. INX, DEX, INY ja DEY ovat X- ja Y-rekistereitä vastaavasti. He eivät ota mitään operandia. Joten he käyttävät implisiittistä osoitetilaa. Inkrementti tarkoittaa 1:n lisäämistä rekisteriin tai muistitavuun. Vähentäminen tarkoittaa 1:n vähentämistä rekisteristä tai muistitavusta.

INC ja DEC lisäävät ja vähentävät vastaavasti muistitavua (eikä rekisteriä). Nollasivuosoitteiden käyttäminen absoluuttisen osoituksen sijaan säästää käskyn muistia. Nollasivun osoitus on yhden tavun vähemmän kuin muistissa olevan käskyn absoluuttinen osoite. Nollasivun osoitetila vaikuttaa kuitenkin vain sivun nollaan.

BIT-käsky testaa muistissa olevan tavun bitit akun 8 bitin kanssa, mutta ei muuta kumpaakaan. Vain jotkin prosessorin tilarekisterin 'P' liput on asetettu. Määritellyn muistipaikan bitit AND-edetaan loogisesti akun bittien kanssa. Sitten asetetaan seuraavat tilabitit:

  • N, joka on bitti 7 ja tilarekisterin viimeinen bitti (vasemmalla), vastaanottaa muistipaikan bitin 7 ennen JA-lyöntiä.
  • V, joka on tilarekisterin bitti 6, vastaanottaa muistipaikan bitin 6 ennen JA-lausetta.
  • Tilarekisterin Z-lippu asetetaan (tehty 1), jos JA tulos on nolla (00000000 2 ). Muussa tapauksessa se tyhjennetään (tehty 0).

4.10 Vertaile ohjeita

Vertailevat käskymuistomerkit 6502 µP:lle ovat CMP, CPX ja CPY. Jokaisen vertailun jälkeen se vaikuttaa prosessorin tilarekisterin 'P' lippuihin N, Z ja C. N-lippu asetetaan (tehty 1), kun tulos on negatiivinen luku. Z-lippu asetetaan (tehty 1), kun tulos on nolla (000000002). C-lippu asetetaan (tehty 1), kun on siirto kahdeksasta yhdeksänteen bittiin. Seuraava taulukko antaa yksityiskohtaisen kuvan

Tarkoittaa 'suurempaa kuin'. Tämän vuoksi vertailutaulukon pitäisi olla itsestään selvä.

4.11 Jump and Branch -ohjeet

Seuraavassa taulukossa on yhteenveto hyppy- ja haarautumisohjeista:

JMP-käsky käyttää absoluuttista ja epäsuoraa osoitetta. Loput taulukon ohjeet ovat haaraohjeita. Ne käyttävät vain suhteellista osoitusta 6502 µP:n kanssa. Näin taulukosta tulee itsestään selvä, jos sitä luetaan vasemmalta oikealle ja ylhäältä alas.

Huomaa, että haaroja voidaan käyttää vain -128 - +127 tavun sisällä annetusta osoitteesta oleviin osoitteisiin. Tämä on suhteellista osoitusta. Sekä JMP- että haarakäskyt vaikuttavat suoraan ohjelmalaskuriin (PC). 6502 µP ei salli haaroja absoluuttiseen osoitteeseen, vaikka hyppy voi tehdä absoluuttisen osoitteen. JMP-käsky ei ole haarakäsky.

Huomautus: Suhteellista osoitteita käytetään vain haaraohjeiden kanssa.

4.12 Pinoalue

Aliohjelma on kuin yksi aiemmista lyhyistä ohjelmista kahden luvun lisäämiseksi tai kahden luvun vähentämiseksi. Pinoalue muistissa alkaa $0100 - $01FF mukaan lukien. Tätä aluetta kutsutaan yksinkertaisesti pinoksi. Kun mikroprosessori suorittaa hypyn alirutiinikäskyyn (JSR – katso seuraava keskustelu), sen on tiedettävä, minne palata, kun se on valmis. 6502 µP pitää nämä tiedot (paluuosoite) pienessä muistissa välillä $0100 - $01FF (pinoalue) ja käyttää pinon osoitinrekisterin sisältöä, joka on 'S' mikroprosessorissa osoittimena (9 bittiä) viimeiseen palautettuun osoitteeseen. joka on tallennettu muistin sivulle 1 ($0100 - $01FF). Pino kasvaa $01FF:stä ja mahdollistaa aliohjelmien sisäkkäisyyden jopa 128 tason syvyyteen.

Toinen pinoosoittimen käyttötarkoitus on käsitellä keskeytyksiä. 6502 µP:n nastat on merkitty nimellä IRQ ja NMI. On mahdollista, että joitain pieniä sähköisiä signaaleja syötetään näihin nastoihin ja 6502 µP lopettaa yhden ohjelman suorittamisen ja saa sen aloittamaan toisen suorittamisen. Tässä tapauksessa ensimmäinen ohjelma keskeytyy. Kuten aliohjelmat, keskeytyskoodisegmentit voivat olla sisäkkäisiä. Keskeytyksen käsittelyä käsitellään seuraavassa luvussa.

Huomautus : Pinoosoittimessa on 8 bittiä alemman tavun osoitteelle osoitettaessa sijainteja $0100 - $01FF. Korkeampi tavu 00000001 2 on oletettu.

Seuraavassa taulukossa on ohjeet, jotka yhdistävät pinoosoittimen 'S' A-, X-, Y- ja P-rekistereillä muistin pinoalueeseen:

4.13 Aliohjelman kutsu ja paluu

Aliohjelma on joukko ohjeita, jotka saavuttavat tietyn tavoitteen. Edellinen yhteen- tai vähennysohjelma on hyvin lyhyt aliohjelma. Aliohjelmia kutsutaan joskus vain rutiineiksi. Ohje aliohjelman kutsumiseen on:

JSR : Siirry aliohjelmaan

Alirutiinista paluuohje on:

RTS: Paluu alirutiinista

Mikroprosessorilla on taipumus suorittaa jatkuvasti muistissa olevia käskyjä peräkkäin. Oletetaan, että mikroprosessori suorittaa parhaillaan koodisegmenttiä ja se kohtaa hyppykäskyn (JMP) mennä ja suorittaa koodisegmentin, joka on koodattu sen taakse, että se saattaa jo olla suoritettu. Se suorittaa kyseisen koodisegmentin takana ja jatkaa kaikkien koodisegmenttien (käskyjen) suorittamista takana olevan koodisegmentin jälkeen, kunnes se suorittaa nykyisen koodisegmentin uudelleen ja jatkaa alla. JMP ei työnnä seuraavaa käskyä pinoon.

Toisin kuin JMP, JSR työntää seuraavan käskyn osoitteen itsensä jälkeen PC:ltä (ohjelmalaskuri) pinoon. Tämän osoitteen pinopaikka sijoitetaan pinoosoittimeen 'S'. Kun RTS-käsky kohdataan (suoritetaan) aliohjelmassa, pinoon työnnetty osoite vetää pois pinosta ja ohjelma jatkuu vedetystä osoitteesta, joka on seuraava käskyosoite juuri ennen aliohjelman kutsua. Viimeinen pinosta poistettu osoite lähetetään ohjelmalaskuriin. Seuraavassa taulukossa on tekniset tiedot JSR- ja RTS-ohjeista:

Katso seuraava kuva JSR:n ja RTS:n käytöstä:

4.14 Esimerkki laskutussilmukasta

Seuraava aliohjelma laskee alaspäin $FF:sta $ 00:een (yhteensä 256 10 laskee):

aloita LDX #$FF ; kuorma X $FF = 255
silmukka DEX ; X = X - 1
BNE-silmukka ; jos X ei ole nolla, mene silmukaan
RTS ; palata

Jokaisella rivillä on kommentti. Kommentit eivät koskaan mene muistiin suoritettavaksi. Kokoonpanija (kääntäjä), joka muuntaa ohjelman sellaiseksi, mikä se on muistissa suoritettavaa (ajoa) varten, poistaa aina kommentit. Kommentti alkaa kirjaimella ';' . Tämän ohjelman 'aloitus' ja 'silmukka' kutsutaan nimikkeiksi. Tarra identifioi (nimi) ohjeen osoitteelle. Jos käsky on yksitavuinen käsky (implisiittinen osoitus), etiketti on kyseisen käskyn osoite. Jos käsky on monitavuinen käsky, nimiö identifioi monitavuisen käskyn ensimmäisen tavun. Tämän ohjelman ensimmäinen ohje koostuu kahdesta tavusta. Olettaen, että se alkaa $0300-osoitteesta, $0300-osoite voidaan korvata 'aloita'-osoitteella ohjelmassa. Toinen käsky (DEX) on yksitavuinen käsky6ion, ja sen pitäisi olla osoitteessa $0302. Tämä tarkoittaa, että $0302-osoite voidaan korvata 'silmukalla' ohjelmassa alaspäin, mikä on itse asiassa niin 'BNE-silmukassa'.

'BNE-silmukka' tarkoittaa haaraa annettuun osoitteeseen, kun tilarekisterin Z-lippu on 0. Kun A- tai X- tai Y-rekisterin arvo on 00000000 2 , viimeisestä toimenpiteestä johtuen Z-lippu on 1 (set). Joten vaikka se on 0 (ei 1), ohjelman toinen ja kolmas käsky toistetaan tässä järjestyksessä. Jokaisessa toistetussa sekvenssissä X-rekisterin arvoa (koko lukua) pienennetään yhdellä. DEX tarkoittaa X = X - 1. Kun X-rekisterin arvo on $00 = 00000000 2 , Z:sta tulee 1. Siinä vaiheessa kahta käskyä ei enää toisteta. Ohjelman viimeinen RTS-käsky, joka on yksitavuinen käsky (implisiittinen osoitus), palaa aliohjelmasta. Tämän käskyn vaikutuksena on, että ohjelmalaskuri osoite on pinossa suoritettavalle koodille ennen aliohjelman kutsua ja palaa ohjelmalaskuriin (PC). Tämä osoite on sen käskyn osoite, joka tulee suorittaa ennen aliohjelman kutsumista.

Huomautus: Kun kirjoitetaan konekieliohjelmaa 6502 µP:lle, vain etiketin tulee alkaa rivin alusta; mikä tahansa muu rivikoodi on siirrettävä vähintään yhden välilyönnin oikealle.

Aliohjelman kutsuminen
Jättäen huomioimatta edellisten tarrojen viemän muistitilan, ohjelma ottaa 6 tavua peräkkäisiä paikkoja muistista (RAM) $0300 - $0305. Tässä tapauksessa ohjelma on:

LDX #$FF ; kuorma X $FF = 255
DEX ; X = X - 1
BNE $0302 ; jos X ei ole nolla, mene silmukaan
RTS ; palata

Alkaen $0200 osoitteesta muistissa voi olla aliohjelman kutsu. Soitto-ohje on:

JSR-aloitus ; alku on osoite 0300 dollaria, eli JSR 0300 dollaria

Tekstieditoritiedostoon oikein kirjoitettu aliohjelma ja sen kutsu on:

aloita LDX #$FF; kuorma X $FF = 255
silmukka DEX ; X = X - 1

BNE-silmukka ; jos X ei ole nolla, mene silmukaan
RTS ; palata

JSR-aloitus: siirry rutiiniin alkaen 0300 dollarista

Nyt yhdessä pitkässä ohjelmassa voi olla useita aliohjelmia. Kaikilla niillä ei voi olla nimeä 'aloitus'. Niillä pitäisi olla eri nimet. Itse asiassa millään niistä ei ehkä ole nimeä 'aloitus'. 'Aloita' käytetään tässä opetussyistä.

4.15 Ohjelman kääntäminen

Ohjelman kääntäminen tai kokoaminen tarkoittaa samaa asiaa. Harkitse seuraavaa ohjelmaa:

aloita LDX #$FF : lataa X $FF = 255
silmukka DEX: X = X – 1
BNE-silmukka: jos X ei ole nolla, mene silmukaan
RTS: paluu
JSR-aloitus: siirry rutiiniin alkaen 0300 dollarista

Tämä on aiemmin kirjoitettu ohjelma. Se koostuu aliohjelmasta, aloituksesta ja aliohjelman kutsusta. Ohjelma laskee 255:stä 10 0:ksi 10 . Ohjelma alkaa käyttäjän aloitusosoitteesta $0200 (RAM). Ohjelma kirjoitetaan tekstieditorilla ja tallennetaan levylle. Sillä on nimi, kuten 'sample.asm', jossa 'sample' on ohjelmoijan valitsema nimi, mutta kokoonpanokielen '.asm'-laajennus on liitettävä tiedostonimeen.

Kootun ohjelman tuottaa toinen ohjelma, jota kutsutaan assembleriksi. Kokoonpanijan toimittaa 6502 µP:n valmistaja tai kolmas osapuoli. Kokoonpanija toistaa ohjelman siten, että se on muistissa (RAM) sitä suoritettaessa (ajon aikana).

Oletetaan, että JSR-käsky alkaa osoitteesta $0200 ja aliohjelma alkaa osoitteesta $0300. Kokoaja poistaa kaikki kommentit ja tyhjät kohdat. Kommentit ja välilyönnit tuhlaavat muistia, joka on aina niukkaa. Mahdollinen tyhjä rivi edellisen aliohjelman koodisegmentin ja aliohjelman kutsun välillä on esimerkki välilyönnistä. Koottu tiedosto tallennetaan edelleen levylle, ja se on nimeltään 'sample.exe'. 'Sample' on ohjelmoijan valinnan nimi, mutta '.exe'-tunnisteen pitäisi olla siellä osoittamaan, että se on suoritettava tiedosto.

Koottu ohjelma voidaan dokumentoida seuraavasti:

Tällaisen asiakirjan tuottaminen sanotaan kokoamista käsin. Huomaa, että tämän asiakirjan kommentit eivät näy muistissa (suoritusta varten). Taulukon osoitesarake ilmoittaa muistissa olevien ohjeiden aloitusosoitteet. Huomaa, että 'JSR-aloitus', joka on 'JSR $0300', jonka odotetaan olevan koodattu muodossa '20 03 00', on itse asiassa koodattu muodossa '20 00 03', jolloin alemman muistitavun osoite ottaa muistin alemman tavun ja korkeampi muistitavu osoite ottaa korkeamman tavun muistissa – vähän endiannessa. JSR:n toimintakoodi on 20 16 .

Huomaa, että haarakäskyn, kuten BNE, siirtymä on kahden komplementtiluku välillä 128 10 numeroon +127 10 . Joten 'BNE-silmukka' tarkoittaa 'BNE -1 10 ', joka on itse asiassa 'D0 FF' koodimuodossa FF 16 on -1 kahdessa komplementissa, joka kirjoitetaan muodossa = 11111111 kahdessa kannassa. Assembler-ohjelma korvaa tunnisteet ja kentät todellisiksi heksadesimaaliluvuiksi (heksadesimaaliluvut ovat binäärilukuja, jotka on ryhmitelty neljään bittiin). Varsinaiset osoitteet, joista kukin käsky alkaa, ovat itse asiassa mukana.

Huomautus: 'JSR start' -käsky korvataan lyhyemmillä käskyillä, jotka lähettävät ohjelmalaskurin nykyisen sisällön (korkeat ja pienet tavut) pinoon pinoosoittimella, jota vähennetään kahdesti (kerran korkealle tavulle ja kerran matalalle tavulle) ja lataa sitten PC:n uudelleen osoitteella $0300. Pinoosoitin osoittaa nyt $00FD olettaen, että se on alustettu arvoon $01FF.

Lisäksi RTS-käsky korvataan useilla lyhyemmillä käskyillä, jotka kasvattavat pinoosoitinta 'S' kahdesti (kerran matalan tavun ja kerran korkean tavun kohdalla) ja vetää vastaavat kaksi tavua osoitetta pinoosoittimesta PC:lle. seuraava ohje.

Huomautus: Tarran tekstissä saa olla enintään 8 merkkiä.

'BNE-silmukka' käyttää suhteellista osoitetta. Se tarkoittaa, että lisätään -3 10 seuraavaan ohjelmalaskurisisältöön 0305 dollaria. 'BNE-silmukan' tavut ovat 'D0 FD', jossa FD on kahden -3:n komplementti 10 .

Huomautus: Tämä luku ei sisällä kaikkia 6502 µP:n ohjeita. Kaikki ohjeet ja niiden tiedot löytyvät asiakirjasta 'SY6500 8-Bit Microprocessor Family'. Tätä asiakirjaa varten on PDF-tiedosto nimeltä '6502.pdf', joka on vapaasti saatavilla Internetissä. Tässä asiakirjassa kuvattu 6502 µP on 65C02.

4.16 Keskeytykset

Kaikkien Commodore 64:n ulkoisiin (pystypintaisiin) portteihin kytketyn laitteen signaalien täytyy kulkea joko CIA 1- tai CIA 2 -piirien (ICs) läpi ennen kuin ne saavuttavat 6502-mikroprosessorin. 6502 µP:n dataväylältä tulevien signaalien täytyy kulkea joko CIA 1- tai CIA 2 -sirun läpi ennen kuin ne saavuttavat ulkoisen laitteen. CIA tulee sanoista Complex Interface Adapter. Kuvassa 4.1 “Commodore_64-emolevyn lohkokaavio” lohkon syöttö-/tulostuslaitteet edustavat CIA 1:tä ja CIA 2:ta. Kun ohjelma on käynnissä, se voidaan keskeyttää suorittamaan jokin muu koodinpätkä ennen jatkamista. On laitteisto- ja ohjelmistokatkos. Laitteiston keskeytyksiä varten 6502 µP:ssä on kaksi tulosignaalin nastaa. Näiden pinojen nimet ovat IRQ ja NMI . Nämä eivät ole µP-datalinjoja. uP:n datalinjat ovat D7, D6, D5, D4, D3, D2, D1 ja D0; D0 on vähiten merkitsevä bitti ja D7 eniten merkitsevä bitti.

IRQ tarkoittaa Interrupt ReQuest “aktiivista” matalaa. Tämä µP:n tulojohto on normaalisti korkea, noin 5 volttia. Kun se laskee noin 0 volttiin, se on keskeytyspyyntö, joka ilmoittaa µP:n. Heti kun pyyntö on hyväksytty, rivi palaa korkealle. Keskeytyspyynnön hyväksyminen tarkoittaa, että µP haarautuu koodiin (alirutiiniin), joka käsittelee keskeytyksen.

NMI tarkoittaa Non-Maskable Interrupt 'aktiivinen' alhainen. Vaikka koodi IRQ teloitetaan NMI voi mennä alas. Tässä tapauksessa, NMI käsitellään (suoritetaan sen oma koodi). Tämän jälkeen koodi IRQ jatkuu. Koodin jälkeen IRQ päättyy, pääohjelmakoodi jatkuu. Tuo on, NMI keskeyttää IRQ käsittelijä. Signaali varten NMI voidaan silti antaa µP:lle, vaikka µP on tyhjäkäynnillä eikä käsittele mitään tai ei käytä pääohjelmaa.

Huomautus: Se on itse asiassa siirtymistä korkeasta matalaan NMI , tuo on NMI signaali – siitä lisää myöhemmin. IRQ yleensä tulee CIA 1:ltä ja NMI tulee yleensä CIA 2:lta. NMI , joka on lyhenne sanoista Non-Maskable Interrupt, voidaan katsoa pysäyttämättömänä keskeytyksenä.

Keskeytusten käsittely
Onko pyyntö peräisin IRQ tai NMI , nykyisen ohjeen on täytettävä. 6502:ssa on vain A-, X- ja Y-rekisterit. Kun aliohjelma toimii, se saattaa käyttää näitä kolmea rekisteriä yhdessä. Keskeytyskäsittelijä on edelleen aliohjelma, vaikka sitä ei nähdä sellaisena. Kun nykyinen käsky on suoritettu, 65C02 µP:n A-, X- ja Y-rekisterien sisältö tallennetaan pinoon. Pinoon lähetetään myös ohjelmalaskurin seuraavan käskyn osoite. µP haarautuu sitten keskeytyksen koodiksi. Tämän jälkeen A-, X- ja Y-rekisterien sisältö palautetaan pinosta päinvastaisessa järjestyksessä, johon ne lähetetään.

Esimerkki koodauksesta keskeytystä varten
Yksinkertaisuuden vuoksi oletetaan, että µP:n rutiini IRQ keskeytys on vain lisätä numerot $01 ja $02 ja tallentaa tulos $03 muistiosoitteeseen $0400. Koodi on:

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

ISR on etiketti ja identifioi muistiosoitteen, jossa PHA-käsky on. ISR tarkoittaa keskeytä palvelurutiinia. PHA, PHX ja PHY lähettävät A-, X- ja Y-rekisterien sisällön pinoon siinä toivossa, että mikä tahansa koodi (ohjelma), joka on käynnissä juuri ennen keskeytystä, tarvitsee niitä. Seuraavat kolme käskyä muodostavat keskeytyskäsittelijän ytimen. PLY-, PLX- ja PLA-käskyjen on oltava tässä järjestyksessä, ja ne tuovat takaisin Y-, X- ja A-rekisterien sisällön. Viimeinen käsky, joka on RTI, (ilman operandia) palauttaa suorituksen jatkumisen mille tahansa koodille (ohjelmalle), joka suoritetaan ennen keskeytystä. RTI vetää seuraavan suoritettavan koodin käskyn osoitteen pinosta takaisin ohjelmalaskuriin. RTI tarkoittaa ReTurn from Interrupt. Tämän myötä keskeytyksen käsittely (alirutiini) on ohi.

Ohjelmiston keskeytys
Pääasiallinen tapa saada ohjelmistokeskeytys 6502 µP:lle on käyttää BRK-implisiittistä osoitekäskyä. Oletetaan, että pääohjelma on käynnissä ja se kohtaa BRK-käskyn. Siitä lähtien PC:n seuraavan käskyn osoite tulee lähettää pinoon, kun nykyinen käsky on suoritettu. Ohjelmistoohjeiden käsittelyä varten olevaa aliohjelmaa kutsutaan nimellä 'seuraava'. Tämän keskeytysaliohjelman pitäisi työntää A-, X- ja Y-rekisterin sisältö pinoon. Kun aliohjelman ydin on suoritettu, A-, X- ja Y-rekisterien sisältö tulee vetää takaisin pinosta rekistereihinsä valmiin aliohjelman toimesta. Rutiinin viimeinen lause on RTI. PC:n sisältö myös vedetään takaisin pinosta PC:lle automaattisesti RTI:n takia.

Aliohjelman ja keskeytyspalvelurutiinin vertailu ja kontrasti
Seuraavassa taulukossa verrataan ja verrataan aliohjelmaa ja keskeytyspalvelurutiinia:

4.17 Yhteenveto 6502:n pääosoitetiloista

Jokainen käsky 6502:lle on yksi tavu, jota seuraa nolla tai useampi operandi.

Välitön osoitetila
Välittömässä osoitetilassa operandin jälkeen on arvo eikä muistiosoite. Arvoa edeltää #. Jos arvo on heksadesimaali, '#' on seurattava '$'. Välittömät osoitusohjeet 65C02:lle ovat: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Lukijan tulee tutustua 65C02 µP:n asiakirjoihin saadakseen tietää, kuinka tässä lueteltuja ohjeita, joita ei selitetä tässä luvussa, käytetään. Esimerkki ohjeesta on:

LDA #77 dollaria

Absoluuttinen osoitetila
Absoluuttisessa osoitetilassa on yksi operandi. Tämä operandi on muistissa olevan arvon osoite (yleensä heksadesimaalimuodossa tai etiketissä). Niitä on 64k 10 = 65 536 10 muistiosoitteet 6502 µP:lle. Tyypillisesti yksitavuinen arvo on jossakin näistä osoitteista. 65C02:n absoluuttiset osoiteohjeet ovat: 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. Lukijan tulee tutustua 65C02 µP:n asiakirjoihin saadakseen tietää, kuinka tässä lueteltuja ohjeita käytetään, sekä muista osoitustiloista, joita ei ole selitetty tässä luvussa. Esimerkki ohjeesta on:

Ne ovat 1234 dollaria

Implisiittinen osoitetila
Implisiittisessä osoitemoodissa ei ole operandia. Ohje sisältää kaikki µP-rekisterit. 65C02:n oletetut osoiteohjeet ovat: 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. Esimerkki ohjeesta on:

DEX: Pienennä X-rekisteriä yhdellä yksiköllä.

Suhteellinen osoitetila
Suhteellinen osoitetila käsittelee vain haarakäskyjä. Suhteellisessa osoitetilassa on vain yksi operandi. Se on arvo alkaen -128 10 numeroon +127 10 . Tätä arvoa kutsutaan offsetiksi. Etumerkin perusteella tämä arvo lisätään tai vähennetään ohjelmalaskurin seuraavasta käskystä, jolloin saadaan aiotun seuraavan käskyn osoite. Suhteelliset osoitemoodin ohjeet ovat: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Ohjeesimerkit ovat:

BNE $7F : (haara, jos Z = 0 tilarekisterissä, P)

Joka lisää 127 nykyiseen ohjelmalaskuriin (suoritettava osoite) ja aloittaa käskyn suorittamisen kyseisessä osoitteessa. Samalla lailla:

BEQ $F9 : (haara, jos Z = : tilarekisterissä, P)

Mikä lisää -7 nykyiseen ohjelmalaskuriin ja aloittaa suorituksen uudesta ohjelmalaskurin osoitteesta. Operandi on kahden komplementtiluku.

Absoluuttinen indeksoitu osoite
Absoluuttisessa indeksiosoitteessa X- tai Y-rekisterin sisältö lisätään annettuun absoluuttiseen osoitteeseen (mihin tahansa $0000 - $FFFF, eli 0:sta 10 numeroon 65536 10 ) saadaksesi oikean osoitteen. Tätä annettua absoluuttista osoitetta kutsutaan perusosoitteeksi. Jos X-rekisteriä käytetään, kokoonpanoohje on jotain tällaista:

LDA $ C453,X

Jos Y-rekisteriä käytetään, se on jotain tällaista:

LDA $C453,Y

X- tai Y-rekisterin arvoa kutsutaan laskenta- tai indeksiarvoksi, ja se voi olla missä tahansa alkaen $00 (0 10 ) FF:iin (250 10 ). Sitä ei kutsuta offsetiksi.

Absoluuttiset indeksin osoiteohjeet ovat: ADC, AND, ASL (vain X), BIT (akun ja muistin kanssa, vain X:n kanssa), CMP, DEC (vain muisti ja X), EOR, INC (vain muisti ja X), LDA , LDX, LDY, LSR (vain X), ORA, ROL (vain X), ROR (vain X), SBC, STA, STZ (vain X).

Absoluuttinen epäsuora osoitus
Tätä käytetään vain hyppykäskyn kanssa. Tällä annetulla absoluuttisella osoitteella on osoitinosoite. Osoitinosoite koostuu kahdesta tavusta. Kaksitavuinen osoitin osoittaa (on osoite) kohdetavun arvoon muistissa. Assembly-kielen ohje on siis:

JMP (3456 dollaria)

Suluissa ja $13 on osoitepaikassa $3456, kun taas $EB on osoitepaikassa $3457 (= $3456 + 1). Sitten kohdeosoite on $13EB ja $13EB on osoitin. Absoluuttinen $3456 on suluissa ohjeessa, jossa 34 on alempi tavu ja 56 on suurempi tavu.

4.18 Merkkijonon luominen 6502 µP Assembly Language -kielellä

Kuten seuraavassa luvussa osoitetaan, kun tiedosto on luotu muistiin, tiedosto voidaan tallentaa levylle. Tiedostolle on annettava nimi. Nimi on esimerkki merkkijonosta. Ohjelmoinnissa on monia muita esimerkkejä merkkijonoista.

On kaksi päätapaa luoda ASCII-koodijono. Molemmilla tavoilla kaikki ASCII-koodit (merkit) ottavat peräkkäiset tavupaikat muistissa. Yhdellä tavoista tätä tavusarjaa edeltää kokonaislukutavu, joka on sekvenssin (merkkijonon) pituus (merkkien lukumäärä). Muuten merkkijonoa seuraa (välittömästi) Null-tavu, joka on 00 16 , eli 00 dollaria. Merkkijonon pituutta (merkkien lukumäärää) ei ilmoiteta tällä muulla tavalla. Null-merkkiä ei käytetä ensimmäisellä tavalla.

Harkitse esimerkiksi 'Rakastan sinua!' merkkijono ilman lainausmerkkejä. Pituus tässä on 11; välilyönti lasketaan yhdeksi ASCII-tavuksi (merkiksi). Oletetaan, että merkkijono on sijoitettava muistiin siten, että ensimmäinen merkki on osoitteessa $0300.

Seuraava taulukko näyttää merkkijonomuistin asetuksen, kun ensimmäinen tavu on 11 10 = 0B 16 :

Seuraavassa taulukossa näkyy merkkijonomuistiasetus, kun ensimmäinen tavu on 'I' ja viimeinen tavu on nolla ($00):

Seuraavien ohjeiden avulla voidaan aloittaa merkkijonon luominen:

MAKSAAVAT 0300 dollaria

Oletetaan, että ensimmäinen tavu on akussa, joka lähetetään osoitteeseen $0300. Tämä ohje pätee molemmissa tapauksissa (molemmat merkkijonotyypit).

Kun kaikki merkit on sovitettu muistisoluihin yksitellen, merkkijono voidaan lukea silmukan avulla. Ensimmäisessä tapauksessa luetaan merkkien määrä pituuden jälkeen. Toisessa tapauksessa merkit luetaan 'I':stä, kunnes Nolla-merkki, joka on 'Null', täyttyy.

4.19 Matriisin luominen 6502 µP Assembly Language -kielellä

Yksitavuisten kokonaislukujen joukko koostuu peräkkäisistä muistitavujen paikoista kokonaislukujen kanssa. Sitten on osoitin, joka osoittaa ensimmäisen kokonaisluvun sijaintiin. Joten kokonaislukujen joukko koostuu kahdesta osasta: osoittimesta ja sijaintien sarjasta.

Merkkijonojoukolle kukin merkkijono voi olla eri paikassa muistissa. Sitten on peräkkäisiä muistipaikkoja osoittimilla, joissa jokainen osoitin osoittaa kunkin merkkijonon ensimmäiseen sijaintiin. Osoitin koostuu tässä tapauksessa kahdesta tavusta. Jos merkkijono alkaa sen pituudella, vastaava osoitin osoittaa kyseisen pituuden sijaintiin. Jos merkkijono ei ala sen pituudella, vaan päättyy tyhjään merkkiin, vastaava osoitin osoittaa merkkijonon ensimmäisen merkin sijaintiin. Ja siellä on osoitin, joka osoittaa peräkkäisten osoittimien ensimmäisen osoittimen alemman tavun osoitteeseen. Joten merkkijonojoukko koostuu kolmesta osasta: merkkijonoista eri paikoissa muistissa, vastaavista peräkkäisistä osoittimista ja osoittimesta peräkkäisten osoittimien ensimmäiseen osoittimeen.

4.20 Ongelmia

Lukijaa kehotetaan ratkaisemaan kaikki luvun ongelmat ennen siirtymistä seuraavaan lukuun.

  1. Kirjoita konekieliohjelma, joka alkaa 0200 dollarista 6502 µP:lle ja lisää 2A94:n etumerkittömät luvut H (lisää) 2ABF:ään H (augend). Olkoon tulot ja lähdöt muistissa. Valmista myös koottu ohjelmadokumentti käsin.
  2. Kirjoita konekieliohjelma, joka alkaa 0200 dollarista 6502 µP:lle ja vähentää etumerkittömät luvut 1569 H (alaosa) 2ABF:stä H (minuendi). Olkoon tulot ja lähdöt muistissa. Valmista myös koottu ohjelmadokumentti käsin.
  3. Kirjoita konekieliohjelma 6502 µP:lle, joka laskee 00 dollarista 09 dollariin silmukan avulla. Ohjelman pitäisi alkaa 0200 dollarista. Valmista myös koottu ohjelmadokumentti käsin.
  4. Kirjoita konekieliohjelma, joka alkaa 0200 dollarista 6502 µP:lle. Ohjelmassa on kaksi aliohjelmaa. Ensimmäinen aliohjelma lisää 0203:n etumerkittömät numerot H (augend) ja 0102H (lisää). Toinen aliohjelma lisää summan ensimmäisestä aliohjelmasta, joka on 0305H, arvoon 0006 H (augend). Lopputulos tallennetaan muistiin. Kutsu ensimmäinen aliohjelma, joka on FSTSUB, ja toinen alirutiini, joka on SECSUB. Olkoon tulot ja lähdöt muistissa. Tuota myös koottu ohjelmadokumentti koko ohjelmalle käsin.
  5. Ottaen huomioon, että an IRQ Käsittelijä lisää 02 dollaria 01 dollariin akussa ydinkäsittelynä NMI on myönnetty ja ydinkäsittely NMI lisää $05 - $04 akussa, kirjoita kokoonpanokieli molemmille käsittelijöille mukaan lukien heidän kutsunsa. Puhelu osoitteeseen IRQ Käsittelijän tulee olla osoitteessa 0200 dollaria. The IRQ Käsittelijän pitäisi alkaa osoitteesta $0300. The NMI Käsittelijän pitäisi alkaa osoitteesta $0400. Tulos IRQ Käsittelijä tulee laittaa osoitteeseen $0500, ja tulos NMI Käsittelijä tulee laittaa osoitteeseen $0501.
  6. Selitä lyhyesti, kuinka BRK-käskyä käytetään ohjelmistokeskeytyksen tuottamiseen 65C02-tietokoneessa.
  7. Luo taulukko, joka vertaa ja vertaa normaalia aliohjelmaa keskeytyspalvelurutiiniin.
  8. Selitä lyhyesti 65C02 µP:n tärkeimmät osoitustilat kokoonpanokielen ohjeesimerkkien perusteella.
  9. a) Kirjoita 6502 konekielinen ohjelma kirjoittaaksesi 'Rakastan sinua!' ASCII-koodien merkkijono muistissa alkaen $0300-osoitteesta merkkijonon pituudella. Ohjelman pitäisi alkaa 0200 dollarin osoitteesta. Hanki jokainen hahmo akusta yksitellen, olettaen, että ne lähetetään sinne jonkin aliohjelman toimesta. Kokoa ohjelma myös käsin. (Jos haluat tietää 'I love you!' ASCII-koodit. Tässä ne ovat: 'I':49 16 , tila: 20 16 , 'l': 6C 16 , 'o': 6F 16 , 'in':76 16 , 'e':65, 'y':79 16 , 'in':75 16 , ja '!':21 16 (Huomaa: jokainen koodi vie 1 tavun).
    b) Kirjoita 6502 konekielinen ohjelma kirjoittaaksesi 'Rakastan sinua!' ASCII-koodien merkkijono muistissa, alkaen $0300 osoitteesta ilman merkkijonon pituutta, mutta päättyen numeroon 00 16 . Ohjelman pitäisi alkaa 0200 dollarin osoitteesta. Hanki jokainen hahmo akusta olettaen, että joku aliohjelma lähettää ne sinne yksitellen. Kokoa ohjelma myös käsin.