4 skyrius: 6502 mikroprocesoriaus surinkimo kalbos pamoka

4 Skyrius 6502 Mikroprocesoriaus Surinkimo Kalbos Pamoka



4 skyrius: 6502 mikroprocesoriaus surinkimo kalbos pamoka

4.1 Įvadas

6502 mikroprocesorius buvo išleistas 1975 m. Jis buvo naudojamas kaip mikroprocesorius kai kuriuose asmeniniuose kompiuteriuose, tokiuose kaip Apple II, Commodore 64 ir BBC Micro.







6502 mikroprocesorius ir šiandien gaminamas dideliais kiekiais. Tai nebėra centrinis procesorius, kuris šiandien naudojamas asmeniniuose kompiuteriuose (nešiojamuosiuose kompiuteriuose), tačiau vis dar gaminamas daug ir šiandien naudojamas elektroniniuose bei elektros prietaisuose. Norint suprasti modernesnes kompiuterių architektūras, labai naudinga ištirti senesnį, bet gana sėkmingą mikroprocesorių, pvz., 6502.



Kadangi jį paprasta suprasti ir programuoti, tai vienas geriausių (jei ne geriausias) mikroprocesorių, naudojamų mokant asamblėjos kalbos. Assembly kalba yra žemo lygio kalba, kurią galima naudoti programuojant kompiuterį. Atminkite, kad vieno mikroprocesoriaus surinkimo kalba skiriasi nuo kito mikroprocesoriaus surinkimo kalbos. Šiame skyriuje mokoma 6502 mikroprocesoriaus surinkimo kalbos. Tiksliau, tai yra 65C02, kuris yra mokomas, bet tiesiog vadinamas 6502.



Praeityje garsus kompiuteris buvo vadinamas commodore_64. 6502 yra 6500 šeimos mikroprocesorius. Commodore_64 kompiuteryje naudojamas 6510 mikroprocesorius. 6510 mikroprocesorius yra 6500 µP. 6502 µP instrukcijų rinkinys yra beveik visas 6510 µP instrukcijas. Šio ir kito skyriaus žinios yra pagrįstos kompiuteriu commodore_64. Šios žinios yra naudojamos kaip pagrindas paaiškinti šiuolaikines kompiuterių architektūras ir šiuolaikines operacines sistemas šioje internetinio karjeros kurso dalyje.





Kompiuterio architektūra reiškia kompiuterio pagrindinės plokštės komponentus ir paaiškinimą, kaip duomenys teka kiekviename komponente, ypač mikroprocesoriuje, kaip duomenys perduodami tarp komponentų ir kaip duomenys sąveikauja. Duomenų vienaskaita yra atskaita. Veiksmingas būdas ištirti kompiuterio architektūrą yra pagrindinės plokštės surinkimo kalba.

Sakoma, kad commodore_64 kompiuteris yra 8 bitų kompiuterio žodžio kompiuteris. Tai reiškia, kad informacija saugoma, perduodama ir manipuliuojama aštuonių bitų dvejetainių kodų forma.



„Commodore 64“ pagrindinės plokštės blokinė schema
Commodore 64 pagrindinės plokštės blokinė schema yra tokia:


4.1 pav. Commodore_64 sistemos bloko blokinė schema

Įsivaizduokite 6510 mikroprocesorių kaip 6502 mikroprocesorių. Bendra atmintis yra baitų serija (8 bitai baite). Yra laisvosios prieigos (skaitymo / rašymo) atmintis, į kurią galima įrašyti arba ištrinti baitus. Išjungus kompiuterio maitinimą, visa operatyviosios atminties (RAM) informacija ištrinama. Taip pat yra tik skaitymo atmintis (ROM). Išjungus kompiuterio maitinimą, ROM informacija išlieka (neištrinama).

Yra įvesties / išvesties prievadas (grandinė), kuris diagramoje vadinamas įvesties / išvesties įrenginiais. Šio prievado nereikėtų painioti su prievadais, kurie matomi kairiajame ir dešiniajame arba priekiniame ir galiniame kompiuterio sistemos bloko vertikaliuose paviršiuose. Tai du skirtingi dalykai. Šio vidinio prievado jungtys su išoriniais įrenginiais, tokiais kaip standusis diskas (arba diskelis), klaviatūra ir monitorius, diagramoje nepateiktos.

Diagramoje yra trys magistralės (elektros labai mažų laidų laidininkų grupės). Kiekvienas laidas gali perduoti bitą 1 arba bitą 0. Duomenų magistralė, skirta aštuonių bitų baitų perdavimui vienu metu (vienas laikrodžio impulsas) į RAM ir įvesties/išvesties prievadą (įvesties/išvesties įrenginius), yra dvikryptis. Duomenų magistralė yra aštuonių bitų pločio.

Visi komponentai yra prijungti prie adresų magistralės. Adresų magistralė yra vienakryptė iš mikroprocesoriaus. Adresų magistralei yra šešiolika laidininkų, kurių kiekvienas turi vieną bitą (1 arba 0). Vienu laikrodžio impulsu siunčiama šešiolika bitų.

Yra valdymo magistralė. Kai kurie valdymo magistralės laidininkai perkeltų po vieną bitą iš mikroprocesoriaus į kitus komponentus. Kelios valdymo linijos perduoda bitus iš įvesties / išvesties (IO) prievado į mikroprocesorių.

Kompiuterio atmintis
RAM ir ROM laikomi vienu atminties mazgu. Šis rinkinys diagramoje pavaizduotas taip, kai šešioliktainiai skaičiai turi „$“ priešdėlį:


4.11 pav. Commodore 64 kompiuterio atminties išdėstymas

RAM yra nuo 0000 16 į DFFF 16 kuri parašyta nuo 0000 USD iki DFFF. Naudojant 6502 µP surinkimo kalbą, šešioliktainis skaičius yra priešdėlis „$“, o ne 16 arba H arba šešioliktainis. Išjungus kompiuterį, bet kokia RAM informacija išnyksta. ROM prasideda nuo $E000 iki $FFFF. Ji turi paprogrames, kurios neišsijungia išjungus kompiuterį. Šios paprogramės yra dažniausiai naudojamos programos, kurios padeda programuoti. Vartotojo programa juos iškviečia (žr. kitą skyrių).

Vieta (baitai) nuo 0200 USD iki D000 USD skirta vartotojo programoms. Vieta nuo $D000 iki $DFFF skirta informacijai, kuri yra tiesiogiai susijusi su periferiniais įrenginiais (įvesties / išvesties įrenginiais). Tai yra operacinės sistemos dalis. Taigi, commodore-64 kompiuterio operacinė sistema susideda iš dviejų pagrindinių dalių: dalis ROM, kuri niekada neišnyksta, ir dalis nuo $ D000 iki $ DFFF, kuri išsijungia išjungus maitinimą. Šie IO (įvesties/išvesties) duomenys turi būti įkeliami iš disko kiekvieną kartą įjungiant kompiuterį. Šiandien tokie duomenys vadinami periferinėmis tvarkyklėmis. Periferiniai įrenginiai prasideda nuo įvesties / išvesties įrenginio prievado per pagrindinės plokštės jungtis iki identifikuojamų prievadų, esančių vertikaliuose kompiuterio paviršiuose, prie kurių prijungtas monitorius, klaviatūra ir kt., ir su pačiais išoriniais įrenginiais (monitoriu, klaviatūra ir kt. .).

Atmintis susideda iš 2 16 = 65 536 baitų vietos. Šešioliktaine forma tai yra 10 000 16 = 10 000 H = 10 000 šešiakampis = 10 000 USD vietos. Skaičiuojant 2, 10, 16 ir tt, skaičiavimas prasideda nuo 0, o ne nuo 1. Taigi pirmoji vieta iš tikrųjų yra vietos numeris 0000000000000000 2 = 0 10 = 0000 16 = 0000 USD. 6502 µP surinkimo kalboje adreso vietos identifikavimas yra priešdėlis $ ir nėra galūnės ar indekso. Paskutinė vieta yra vietos numeris 1111111111111111 2 = 65 535 10 = FFFF 16 = $FFFF, o ne 10000000000000000 2 , arba 65 536 10 , arba 10 000 16 arba 10 000 USD. 10000000000000000 2 , 65 536 10 , 10 000 16 , arba 10 000 USD, nurodo bendrą baitų vietų skaičių.

Čia, 2 16 = 65 536 = 64 x 1024 = 64 x 2 10 = 64 kbitai (kilobaitai). Commodore-64 pavadinime esanti priesaga 64 reiškia 64 KB visos atminties (RAM ir ROM). Baitas yra 8 bitai, o 8 bitai pateks į vieno baito vietą atmintyje.

64 KB atminties padalinta į puslapius. Kiekviename puslapyje yra 0100 16 = 256 10 baitų vietos. Pirmieji 256 10 = pirmasis 0100 16 Vietos yra 0 puslapis. Antrasis yra 1 puslapis, trečias yra 2 puslapis ir pan.

Norint adresuoti 65 536 vietas, kiekvienai vietai (adresui) reikia 16 bitų. Taigi, adreso magistralė iš mikroprocesoriaus į atmintį susideda iš 16 eilučių; viena eilutė vienam bitui. Bitas yra 1 arba 0.

6502 µP registrai
Registras yra kaip baitų ląstelės, skirtos baitų atminties vietai. 6502 µP turi šešis registrus: penkis 8 bitų registrus ir vieną 16 bitų registrą. 16 bitų registras vadinamas programų skaitikliu, kuris sutrumpintas kaip PC. Jame yra atminties adresas kitai instrukcijai. Asamblėjos kalbos programa susideda iš instrukcijų, kurios įdėtos į atmintį. Šešiolika (16) skirtingų bitų reikalingi tam tikrai baitų vietai atmintyje adresuoti. Esant tam tikram laikrodžio impulsui, šie bitai siunčiami į adresų magistralės 16 bitų adreso eilutes, kad būtų galima nuskaityti komandą. Visi 6502 µP registrai pavaizduoti taip:


4.12 pav. 6502 µP registrai

Programų skaitiklis arba kompiuteris diagramoje gali būti matomas kaip 16 bitų registras. Mažesni reikšmingi aštuoni bitai yra pažymėti kaip PCL, reiškiantis Programos skaitiklio žemą. Didesnės reikšmės aštuoni bitai yra pažymėti kaip PCH, kaip Programos skaitiklio aukštas. Commodore-64 atminties nurodymą gali sudaryti vienas, du arba trys baitai. 16 bitų kompiuteryje nurodo kitą vykdytiną komandą atmintyje. Tarp mikroprocesoriaus grandinių dvi iš jų vadinamos aritmetiniu loginiu vienetu ir instrukcijų dekoderiu. Jei dabartinė µP (mikroprocesoriuje) apdorojama instrukcija yra vieno baito ilgio, šios dvi grandinės padidina kompiuterio skaičių kitai komandai 1 vienetu. Jei dabartinė instrukcija, kuri apdorojama µP, yra dviejų baitų ilgio, tai reiškia, kad ji atmintyje užima du baitus iš eilės, šios dvi grandinės padidina kompiuterio skaičių kitai komandai 2 vienetais. Jei dabartinė instrukcija, kuri apdorojama µP, yra trijų baitų ilgio, tai reiškia, kad ji atmintyje užima tris baitus iš eilės, šios dvi grandinės padidina kompiuterio skaičių kitai komandai 3 vienetais.

Akumuliatorius „A“ yra aštuonių bitų bendrosios paskirties registras, kuriame saugomi daugumos aritmetinių ir loginių operacijų rezultatai.

„X“ ir „Y“ registrai naudojami programos žingsniams skaičiuoti. Skaičiavimas programuojant prasideda nuo 0. Taigi jie vadinami indeksų registrais. Jie turi keletą kitų tikslų.

Nors „Stack Pointer“ registras, „S“ turi 9 bitus, kuris laikomas aštuonių bitų registru. Jo turinys nurodo baitų vietą 1 laisvosios prieigos atminties (RAM) puslapyje. 1 puslapis prasideda nuo $0100 baito (256 10 ) iki $01FF baito (511 10 ). Kai programa veikia, ji pereina iš vienos komandos į kitą iš eilės esančią komandą atmintyje. Tačiau taip būna ne visada. Kartais jis peršoka iš vienos atminties srities į kitą, kad toliau vykdytų instrukcijas iš eilės. 1 puslapis RAM naudojamas kaip dėklas. Stackas yra didelė RAM atminties sritis, kurioje yra kiti kodo tęsimo adresai, iš kur yra šuolis. Kodų su šokinėjimo instrukcijomis nėra krūvoje; jie yra kitur atmintyje. Tačiau įvykdžius peršokimo į instrukcijas, tęsinio adresai (ne kodo segmentai) yra krūvoje. Jie buvo nustumti ten dėl šuolio ar šakos nurodymų.

Aštuonių bitų P procesoriaus būsenos registras yra ypatinga registro rūšis. Atskiri bitai nėra susiję arba sujungti vienas su kitu. Kiekvienas bitas yra vadinamas vėliava ir yra vertinamas nepriklausomai nuo kitų. Vėliavėlių reikšmės, esant poreikiui, pateikiamos toliau.

Pirmasis ir paskutinis kiekvieno registro bitų indeksas yra nurodytas virš kiekvieno registro ankstesnėje diagramoje. Bitų indekso (pozicijos) skaičiavimas registre prasideda nuo 0 dešinėje.

Atminties puslapiai dvejetainiais, šešioliktainiais ir dešimtainiais
Šioje lentelėje parodyta atminties puslapių pradžia dvejetainiais, šešioliktainiais ir dešimtainiais skaičiais:

Kiekviename puslapyje yra 1 000 000 000 2 baitų skaičius yra toks pat kaip 100 H baitų skaičius yra toks pat kaip 256 10 baitų skaičius. Ankstesnėje atminties diagramoje puslapiai rodomi kylant nuo 0 puslapio, o ne žemyn, kaip nurodyta lentelėje.

Šios lentelės dvejetainiai, šešioliktainiai ir dešimtainiai stulpeliai pateikia atminties baitų vietos adresus skirtingose ​​jų bazėse. Atkreipkite dėmesį, kad nuliniam puslapiui koduojant reikia įvesti tik apatinio baito bitus. Didesnio baito bitų galima praleisti, nes jie visada yra nuliai (nuliniam puslapiui). Likusiuose puslapiuose turėtų būti naudojami didesnio baito bitai.

Likusioje šio skyriaus dalyje paaiškinama 6502 µP surinkimo kalba naudojant visą ankstesnę informaciją. Norėdamas greitai suprasti kalbą, skaitytojas turi pridėti ir atimti šešioliktą bazę, o ne dešimt. Iš tikrųjų tai turėtų būti antroji bazė, tačiau skaičiuoti pagal antrąją bazę yra sudėtinga. Atminkite, kad pridedant du skaičius prie dviejų bazių, nešimas vis tiek yra 1, kaip ir dešimtyje. Tačiau atimant du skaičius iš dviejų, skolinimasis yra du, o ne dešimt, kaip iš dešimties. Pridedant du skaičius į bazinį šešioliktą, nešimas vis tiek yra 1, kaip ir baziniame dešimtyje. Tačiau atimant du skaičius iš šešiolikos bazinės bazės, skolinimasis yra šešiolika, o ne dešimt, kaip iš dešimties.

4.2 Duomenų perdavimo instrukcijos

Apsvarstykite šią 6502 µP surinkimo kalbos duomenų perdavimo instrukcijų lentelę:

Kai baitas (8 bitai) nukopijuojamas iš atminties baitų vietos į kaupimo registrą, X registrą arba Y registrą, tai įkeliama. Kai baitas nukopijuojamas iš bet kurio iš šių registrų į atminties baitų vietą, tai yra perkėlimas. Kai baitas nukopijuojamas iš vieno registro į kitą, tai vis tiek perkeliama. Antrame lentelės stulpelyje rodyklė rodo baito kopijavimo kryptį. Kituose keturiuose stulpeliuose rodomi skirtingi adresavimo režimai.

Įrašas adresavimo režimo stulpelyje yra tikrasis atitinkamos mnemoninės instrukcijos dalies baito kodas šešioliktaine forma. Pavyzdžiui, AE yra tikrasis LDX baito kodas, kuris turi įkelti baitą iš atminties į X registrą absoliutaus adresavimo režimu, pvz., AE. 16 = 10101110 2 . Taigi, LDX bitai atminties baitų vietoje yra 10101110.

Atkreipkite dėmesį, kad LDX mnemoninėje instrukcijos dalyje yra trys galimi baitai, kurie yra A2, AE ir A6, ir kiekvienas yra skirtas tam tikram adresavimo režimui. Kai baitas, kuris įkeliamas į X registrą, neturi būti nukopijuotas iš atminties baito vietos, reikšmė turi būti įvedama (iš karto po) LDX mnemonika instrukcijoje šešioliktaine arba dešimtaine. Šiame skyriuje tokios reikšmės įvedamos šešioliktaine tvarka. Tai yra tiesioginis adresavimas, todėl tikrasis baitas atmintyje, vaizduojantis LDX, yra A2 16 = 10100010 2 o ne AE 16 kuris lygus 10101110 2 .

Lentelėje visi baitai po adresavimo režimo antraštėmis vadinami Operacijų kodais, kurie sutrumpinami kaip opcodes. Priklausomai nuo adresavimo režimo, vienam mnemonui gali būti daugiau nei vienas opkodas.

Pastaba: Žodis „įkelti“ kompiuterio sisteminiame bloke gali turėti dvi reikšmes: gali reikšti failo įkėlimą iš disko į kompiuterio atmintį arba baito perkėlimą iš atminties baito vietos į mikroprocesoriaus registrą. .

6502 µP yra daugiau adresavimo režimų nei keturi lentelėje.

Jei nenurodyta kitaip, visas vartotojo programavimo kodas šiame skyriuje prasideda nuo adreso 0200 16 kuri yra vartotojo srities pradžia atmintyje.

Atmintis M ir akumuliatorius A

Atmintis į akumuliatorių

Skubus Adresavimas
Šioje instrukcijoje saugomas skaičius FF 16 = 255 10 į akumuliatorių:

LDA #$FF

„$“ naudojamas ne tik atminties adresui identifikuoti. Paprastai jis naudojamas norint nurodyti, kad sekantis skaičius yra šešioliktainis. Šiuo atveju $FF nėra jokios atminties baito vietos adresas. Tai skaičius 255 10 šešioliktaine. 16 bazė ar bet kuris kitas lygiavertis indeksas neturi būti parašytas asamblėjos kalbos instrukcijoje. „#“ rodo, kad tai, kas bus toliau, yra reikšmė, kurią reikia įtraukti į akumuliatoriaus registrą. Reikšmė taip pat gali būti įrašyta baziniu dešimtuku, tačiau to šiame skyriuje nėra. „#“ reiškia nedelsiant kreiptis.

Mnemonika turi tam tikrą panašumą su atitinkama angliška fraze. „LDA #$FF“ reiškia įkelti numerį 255 10 į akumuliatorių A. Kadangi tai yra tiesioginis adresas iš ankstesnės lentelės, LDA yra A9, o ne AD ar A5. A9 dvejetainėje yra 101010001. Taigi, jei LDA A9 atmintyje yra 0200 USD adresu, $FF yra 0301 USD = 0300 + 1 adresas. #$FF yra būtent LDA mnemonikos operandas.

Absoliutus Adresavimas
Jei $FF reikšmė yra $0333 atminties vietoje, ankstesnė instrukcija yra tokia:

LDA 0333 USD

Atkreipkite dėmesį, kad nėra #. Šiuo atveju # nebuvimas reiškia, kad toliau pateikiamas atminties adresas, o ne dominanti reikšmė (ne vertė, kurią reikia įdėti į akumuliatorių). Taigi, LDA opkodas šį kartą yra AD, o ne A9 ar A5. LDA operandas čia yra $0333 adresas, o ne $FF reikšmė. $FF yra $0333 vietoje, kuri yra gana toli. Instrukcija „LDA $0333“ atmintyje užima tris iš eilės vietas, o ne dvi, kaip buvo ankstesnėje iliustracijoje. LDA „AD“ yra 0200 USD vietoje. Apatinis 0333 baitas, kuris yra 33, yra 0301 USD vietoje. Didesnis $0333 baitas, kuris yra 03, yra $0302 vietoje. Tai yra nedidelis 6502 asamblėjos kalbos naudojimas. Skirtingų mikroprocesorių surinkimo kalbos skiriasi.

Tai absoliutaus kreipimosi pavyzdys. $0333 yra vietos, kurioje yra $FF, adresas. Instrukcija susideda iš trijų iš eilės einančių baitų ir neapima $FF arba jo tikrosios baitų vietos.

Nulinio puslapio adresavimas

Tarkime, kad $FF reikšmė yra $0050 atminties vietoje nuliniame puslapyje. Nulinio puslapio baitų vietos prasideda nuo 0000 USD ir baigiasi 00 FF. Tai yra 256 10 vietų iš viso. Kiekvienas Commodore-64 atminties puslapis yra 256 10 ilgai. Atkreipkite dėmesį, kad didesnis baitas yra nulis visose galimose nulinės atminties vietos vietose. Nulinio puslapio adresavimo režimas yra toks pat kaip absoliutus adresavimo režimas, tačiau didesnis 00 baitas į komandą neįvedamas. Taigi, norint įkelti $FF iš $0050 vietos į akumuliatorių, nulinio puslapio adresavimo režimo instrukcija yra tokia:

LDA 50 USD

Kai LDA yra A5, o ne A9 ar AD, A5 16 = 10100101 2 . Atminkite, kad kiekvienas atminties baitas susideda iš 8 langelių ir kiekviename langelyje yra šiek tiek. Instrukcija čia susideda iš dviejų iš eilės einančių baitų. A5, skirtas LDA, yra 0200 USD atminties vietoje, o 50 USD adresas be didesnio 00 baito yra 0301 USD vietoje. Jei nėra 00, kuris būtų sunaudojęs baitą visoje 64 000 atmintyje, taupo atminties vietą.

Akumuliatorius į atmintį

Absoliutus Adresavimas
Ši instrukcija nukopijuoja baito reikšmę, kad ir kokia ji būtų, iš akumuliatoriaus į 1444 USD atminties vietą:

JIE KAINA 1444 USD

Teigiama, kad tai perkeliama iš akumuliatoriaus į atmintį. Nekraunama. Pakrovimas yra priešingas. STA operatyvinio kodo baitas yra 8D 16 = 10001101 2 . Ši instrukcija susideda iš trijų iš eilės atmintyje esančių baitų. 8D 16 yra $0200 vietoje. 44 16 iš $1444 adreso yra $0201 vietoje. Ir 14 16 yra $ 0202 vietoje - mažai endianness. Tikrasis nukopijuotas baitas nėra instrukcijos dalis. STA čia naudojami 8D, o ne 85 nulinio puslapio adresavimui (lentelėje).

Nulinis puslapio adresavimas
Ši instrukcija nukopijuoja baito reikšmę, kad ir kokia ji būtų, iš akumuliatoriaus į 0050 USD atminties vietą nuliniame puslapyje:

STA 0050 USD

STA operatyvinio kodo baitas čia yra 85 16 = 10000101 2 . Ši instrukcija susideda iš dviejų iš eilės atmintyje esančių baitų. 85 16 yra 0200 USD vietoje. 50 16 $0050 adreso yra $0201 vietoje. Endiškumo problema čia nekyla, nes adresas turi tik vieną baitą, kuris yra apatinis baitas. Tikrasis nukopijuotas baitas nėra instrukcijos dalis. STA čia naudojami 85, o ne 8D nuliniam puslapių adresui.

Nėra prasmės naudoti tiesioginį adresavimą, norint perkelti baitą iš kaupiklio į vietą atmintyje. Taip yra todėl, kad tiesioginio adreso instrukcijoje turi būti nurodyta tikroji vertė, pvz., $FF. Taigi, tiesioginis adresavimas neįmanomas, norint perkelti baito reikšmę iš µP registro į bet kurią atminties vietą.

LDX, STX, LDY ir STY mnemonika
LDX ir STX yra atitinkamai panašūs į LDA ir STA. Bet čia naudojamas X registras, o ne A (akumuliatoriaus) registras. LDY ir STY yra atitinkamai panašūs į LDA ir STA. Bet čia naudojamas Y registras, o ne A registras. Žr. 4.21 lentelę apie kiekvieną šešioliktaine veiksmo kodą, atitinkantį tam tikrą mnemoninį ir tam tikrą adresavimo režimą.

Perkėlimai iš registracijos į registrą
Ankstesni du instrukcijų rinkiniai 4.21 lentelėje yra susiję su atminties / mikroprocesoriaus registro kopijavimu (perkėlimu) ir registro / registro kopijavimu (perkėlimu). TAX, TXA, TAY, TYA, TSX ir TXS instrukcijos atlieka kopijavimą (perkėlimą) iš mikroprocesoriaus registro į kitą to paties mikroprocesoriaus registrą.

Norėdami nukopijuoti baitą iš A į X, instrukcija yra tokia:

MOKESČIAI

Norėdami nukopijuoti baitą iš X į A, instrukcija yra tokia:

TX

Norėdami nukopijuoti baitą iš A į Y, instrukcija yra tokia:

RANKA

Norėdami nukopijuoti baitą iš Y į A, instrukcija yra tokia:

TYA

Commodore 64 kompiuteryje dėklas yra 1 puslapis iškart po 0 puslapio atmintyje. Kaip ir kiekvieną kitą puslapį, jį sudaro 25610 10 baitų vietos, nuo 0100 USD iki 01FF USD. Paprastai programa vykdo nuo vienos komandos iki kitos iš eilės atmintyje esančios komandos. Kartkartėmis peršokama į kitą atminties kodo (instrukcijų rinkinio) segmentą. Atmintyje (RAM) esančioje krūvos srityje yra kitų instrukcijų adresai, nuo kurių buvo nutrūkę šuoliai (arba šakos), kad būtų galima tęsti programą.

Stacko rodyklė „S“ yra 9 bitų registras 6502 µP. Pirmasis bitas (kairysis) visada yra 1. Visi baitų vietos adresai pirmame puslapyje prasideda 1, po kurio seka 8 skirtingi bitai, skirti 256 10 vietos. Stacko rodyklė turi 1 puslapyje esančios vietos adresą, kuriame yra kitos komandos, kurią programa turi grąžinti ir tęsti, įvykdžius dabartinį (peršoktą) kodo segmentą, adresą. Kadangi pirmasis visų kamino adresų bitas (pirmasis puslapis) prasideda skaičiumi 1, krūvos rodyklės registre tereikia turėti likusius aštuonis bitus. Galų gale, pirmasis jo bitas, kuris yra kairysis bitas (devintas bitas skaičiuojant iš dešinės), visada yra 1.

Norėdami nukopijuoti baitą iš S į X, instrukcija yra tokia:

TSX

Norėdami nukopijuoti baitą iš X į S, instrukcija yra tokia:

TXT

Instrukcijos iš registro į registrą nenaudoja jokio operando. Jie susideda tik iš mnemonikos. Kiekvienas mnemoninis kodas turi šešioliktainį kodą. Tai yra numanomo adresavimo režimu, nes nėra operando (nėra atminties adreso, nėra reikšmės).

Pastaba: Nėra X į Y arba Y į X perkėlimo (kopijavimo).

4.3 Aritmetiniai veiksmai

6502 µP grandinė, aritmetinis loginis vienetas, vienu metu gali pridėti tik du aštuonių bitų skaičius. Neatima, nedaugina ir nedalina. Šioje lentelėje pateikiami aritmetinių operacijų operacijų kodai ir adresavimo režimai:

Pastaba: Visi aritmetinių operacijų ir kitų tipų operacijų mnemonikai (t. y. visi 6502 mnemonikai) užima vieną operacijos (op) kodą. Jei yra daugiau nei vienas mnemonikos adresavimo režimas, tai pačiai mnemonikai būtų skirtingi operacijų kodai: vienas kiekvienam adresavimo režimui. C, D ir V lentelėje yra būsenos registro vėliavėlės. Jų reikšmės bus pateiktos vėliau, kai iškils poreikis.

Neparašytų numerių pridėjimas
Naudojant 6502 µP, pažymėti skaičiai yra dviejų komplemento skaičiai. Nepaženklinti skaičiai yra įprasti teigiami skaičiai, prasidedantys nuo nulio. Taigi aštuonių bitų baito mažiausias nepasirašytas skaičius yra 00000000 2 = 0 10 = 00 16 o didžiausias nepasirašytas numeris yra 11111111 2 = 255 10 = FF 16 . Dviejų be ženklų numerių pridėjimas yra toks:

A+M+C→A

Tai reiškia, kad 8 bitų akumuliatoriaus turinį aritmetinis loginis blokas prideda prie baito (8 bitų) iš atminties. Pridėjus A ir M, perkėlimas į devintą bitą pereina į būsenos registro nešiojimo vėliavėlės langelį. Bet koks ankstesnis pernešimo bitas iš ankstesnio papildymo, kuris vis dar yra nešimo vėliavėlės langelyje būsenos registre, taip pat pridedamas prie A ir M sumos, todėl A+M+C→A. Rezultatas grąžinamas į akumuliatorių.

Jei susidomėjimas yra:

A + M

Ir nereikia pridėti ankstesnio nešiojimo, reikia išvalyti nešiojimo vėliavėlę, kuri yra 0, kad pridėjimas būtų:

A+M+0→A tas pats kaip A+M→A

Pastaba: Jei prie A pridedamas M ir 1 perkeliamas, nes rezultatas yra didesnis nei 255 10 = 11111111 2 = FF 16 , tai naujas nešiojimas. Šis naujas 1 perkėlimas automatiškai siunčiamas į nešiojimo vėliavėlės langelį, jei jo reikia kitai aštuonių bitų porai, kad būtų galima sumuoti (kita A + M).

Kodas, skirtas pridėti du nepasirašytus aštuonis bitus
00111111 2 +00010101 2 yra toks pat kaip 3F 16 + 15 16 kuris yra toks pat kaip 63 10 +21 10 . Rezultatas yra 010101002 2 kuris yra toks pat kaip 54 16 ir 84 10 . Rezultatas neviršija didžiausio aštuonių bitų skaičiaus, kuris yra 255 10 = 11111111 2 = FF 16 . Taigi, nėra 1 gauto pernešimo. Kitaip tariant, gautas perkėlimas yra 0. Prieš pridėjimą, nėra ankstesnio 1 perkėlimo. Kitaip tariant, ankstesnis perkėlimas yra 0. Kodas, skirtas šiam papildymui atlikti gali būti:

CLC
LDA#$3F
ADC # 15 USD

Pastaba: Įvedant surinkimo kalbą, kiekvienos instrukcijos pabaigoje paspaudžiamas klaviatūros klavišas „Enter“. Šiame kode yra trys instrukcijos. Pirmoji instrukcija (CLC) išvalo perdavimo vėliavėlę, jei ankstesnis papildymas turi 1. CLC galima atlikti tik numanomu adresavimo režimu. Numanomo adresavimo režimo mnemonika nenaudoja operando. Tai išvalo P būsenos registro pernešimo langelį. Išvalymas reiškia 0 bito suteikimą nešiojimo vėliavėlės langeliui. Kitose dviejose kode instrukcijose naudojamas tiesioginio adresavimo režimas. Taikant tiesioginį adresavimą, mnemonikai yra tik vienas operandas, kuris yra skaičius (ir nei atminties, nei registro adresas). Taigi, prieš skaičių turi būti „#“. „$“ reiškia, kad po jo esantis skaičius yra šešioliktainis.

Antroji instrukcija įkelia skaičių 3F 16 į akumuliatorių. Trečiajai komandai µP aritmetinio loginio vieneto grandinė paima ankstesnį (išvalytą) 0 pernešimą (priversta iki 0) būsenos registro pernešimo vėliavėlės langelyje ir prideda jį prie 15 16 taip pat į vertę, kuri jau yra 3F 16 akumuliatorių ir grąžina visą rezultatą atgal į akumuliatorių. Šiuo atveju gaunamas 0 pernešimas. ALU (Aritmetinis loginis vienetas) siunčia (įdeda) 0 į būsenos registro nešiojimo vėliavėlės langelį. Procesoriaus būsenos registras ir būsenos registras reiškia tą patį. Jei rezultatas yra 1, ALU siunčia 1 į būsenos registro nešiojimo vėliavėlę.

Trys ankstesnio kodo eilutės turi būti atmintyje prieš jas vykdant. Opkodas 1816, skirtas CLC (numanomas adresavimas), yra 0200 USD baitų vietoje. Opkodas A9 16 LDA (skubus adresavimas) yra 0201 USD baito vietoje. Skaičius 3F 10 yra $0202 baitų vietoje. Opkodas 69 16 LDA (skubus adresavimas) yra 0203 USD baitų vietoje. Skaičius 15 10 yra $0204 baitų vietoje.

Pastaba: LDA yra perdavimo (apkrovos) nurodymas, o ne aritmetinis nurodymas (mnemoninis).

Kodas, skirtas pridėti du nepasirašytus šešiolikos bitų
Visi 6502 µP registrai iš esmės yra aštuonių bitų registrai, išskyrus asmeninį kompiuterį (programų skaitiklį), kuris yra 16 bitų. Net būsenos registras yra 8 bitų pločio, nors aštuoni jo bitai neveikia kartu. Šiame skyriuje svarstomas dviejų 16 nepaženklintų bitų pridėjimas su perkėlimu iš pirmosios aštuonių bitų poros į antrąją aštuonių bitų porą. Čia dominantis perkėlimas yra perkėlimas iš aštunto bito pozicijos į devintą bitų padėtį.

Tegul skaičiai yra 0010101010111111 2 = 2ABF16 16 = 10 943 10 ir 0010101010010101 2 = 2A95 16 = 10 901 10 . Suma yra 0101010101010100 2 = 5554 16 = 21 844 10 .

Šių dviejų nepasirašytų skaičių pridėjimas prie dviejų bazių yra toks:

Toliau pateiktoje lentelėje parodytas tas pats papildymas su 1 perkėlimu nuo aštunto bito iki devinto bito padėties, pradedant iš dešinės:

Koduojant tai, pirmiausia pridedami du apatiniai baitai. Tada ALU (aritmetinis loginis vienetas) siunčia 1 perkėlimą iš aštuntojo bito pozicijos į devintąją bitų padėtį į nešiojimo vėliavėlės langelį būsenos registre. Rezultatas 0 1 0 1 0 1 0 0 be pernešimo patenka į akumuliatorių. Tada antroji baitų pora pridedama prie perkėlimo. ADC mnemonika reiškia automatiškai pridėti su ankstesniu pernešimu. Tokiu atveju ankstesnis nešimas, kuris yra 1, neturi būti keičiamas prieš antrąjį papildymą. Pirmą kartą papildant, kadangi ankstesnis perkėlimas nėra šio pilno papildymo dalis, jis turi būti išvalytas (padaryti 0).

Norint visiškai pridėti dvi baitų poras, pirmasis papildymas yra:

A + M + 0 -> A

Antrasis papildymas yra toks:

A + M + 1 -> A

Taigi, nešiojimo vėliavėlė turi būti išvalyta (nurodyta 0) prieš pat pirmąjį papildymą. Šioje programoje, kurios paaiškinimą skaitytojas turi perskaityti, šiam sumavimui naudojamas absoliutus adresavimo režimas:

CLC
LDA 0213 USD
ADC 0215 USD
; nėra kliringo, nes reikalinga nešiojimo vėliavėlės reikšmė
STA 0217 USD
LDA 0214 USD
ADC 0216 USD
STA 0218 USD

Atkreipkite dėmesį, kad naudojant 6502 asamblėjos kalbą komentaras pradedamas kabliataškiu. Tai reiškia, kad vykdant programą kabliataškis ir viskas, kas yra jo dešinėje, yra ignoruojami. Anksčiau parašyta programa yra tekstiniame faile, išsaugoma programuotojo pasirinktu pavadinimu ir plėtiniu.asm. Ankstesnė programa nėra tiksli programa, kuri eina į atmintį vykdyti. Atitinkama programa atmintyje vadinama išversta programa, kurioje mnemonika pakeičiama opkodais (baitais). Bet koks komentaras lieka asamblėjos kalbos tekstiniame faile ir pašalinamas, kol išversta programa pasiekia atmintį. Tiesą sakant, šiandien diske yra išsaugoti du failai: „.asm“ failas ir „.exe“ failas. „.asm“ failas yra ankstesnėje iliustracijoje. Failas „.exe“ yra „.asm“ failas, kuriame visi komentarai yra pašalinti, o visi atminimo elementai pakeisti jų opkodais. Kai atidaroma teksto rengyklėje, „.exe“ failas yra neatpažįstamas. Jei nenurodyta kitaip, šiame skyriuje „.exe“ failas nukopijuojamas į atmintį nuo 0200 USD vietos. Tai yra kita pakrovimo reikšmė.

Du 16 bitų skaičiai, kuriuos reikia pridėti, atmintyje užima keturis baitus absoliučiam adresui: po du baitus vienam skaičiui (atmintis yra baitų seka). Naudojant absoliutų adresą, operandas į operatyvinį kodą yra atmintyje. Sumavimo rezultatas yra dviejų baitų pločio ir taip pat turi būti įrašytas į atmintį. Tai iš viso suteikia 6 10 = 6 16 baitai įvestims ir išvestims. Įvestys nėra iš klaviatūros ir išvestis ne iš monitoriaus ar spausdintuvo. Įvestys yra atmintyje (RAM), o išvestis (sumavimo rezultatas) grįžta į atmintį (RAM).

Prieš paleidžiant programą, išversta versija pirmiausia turi būti atmintyje. Žvelgiant į ankstesnės programos kodą, matyti, kad instrukcijos be komentaro sudaro 19 10 = 13 16 baitų. Taigi, programa užima nuo 0200 USD baitų vietos atmintyje iki 0200 USD + 13 USD – 1 USD = 0212 USD baitų vietų (pradedant nuo 0200 USD, o ne nuo 0201 USD, o tai reiškia - 1 USD). Pridėjus 6 baitus įvesties ir išvesties numeriams, visa programa baigiasi 0212 USD + 6 USD = 0218 USD. Bendra programos trukmė – 19 16 = 25 10 .

Apatinis augendo baitas turėtų būti $0213 adresu, o aukštesnis to paties augendo baitas turėtų būti $0214 adresu – mažas endianiškumas. Panašiai, apatinis priedo baitas turėtų būti $0215 adresu, o aukštesnis to paties priedo baitas turėtų būti $0216 adresu – mažas endianiškumas. Žemesnis rezultato (sumos) baitas turi būti $0217 adresu, o didesnis to paties rezultato baitas turi būti $0218 adresu – mažas endianiškumas.

Opkodas 18 16 CLC (numanomas adresavimas) yra 0200 USD baitų vietoje. Opkodas „LDA $0213“, t. y. AD 16 LDA (absoliutus adresavimas) yra $0201 baito vietoje. Apatinis papildinio baitas, kuris yra 10111111, yra 0213 USD atminties baito vietoje. Atminkite, kad kiekvienas operacijos kodas užima vieną baitą. „LDA $0213“ adresas „$0213“ yra $0202 ir $0203 baitų vietose. Instrukcija „LDA $0213“ įkelia apatinį papildiklio baitą į akumuliatorių.

Opkodas „ADC $0215“, ty 6D 16 ADC (absoliutus adresavimas) yra $0204 baito vietoje. Apatinis priedo baitas, kuris yra 10010101, yra 0215 USD baito vietoje. 'ADC $0215' adresas '$0215' yra $0205 ir $0206 baitų vietose. Instrukcija „ADC $0215“ prideda apatinį papildymo baitą prie apatinio papildymo baito, kuris jau yra akumuliatoriuje. Rezultatas dedamas atgal į akumuliatorių. Bet koks perkėlimas po aštuntojo bito siunčiamas į būsenos registro nešiojimo vėliavėlę. Pernešimo vėliavėlės langelis neturi būti išvalytas prieš antrąjį didesnių baitų pridėjimą. Šis perkėlimas automatiškai pridedamas prie didesnių baitų sumos. Tiesą sakant, dėl CLC prie žemesnių baitų sumos automatiškai pridedamas 0 perkėlimas pradžioje (tai atitinka nepridedamas pernešimas).

Komentaras užima kitus 48 10 = 30 16 baitų. Tačiau tai lieka tik „.asm“ tekstiniame faile. Jis nepasiekia atminties. Jį pašalina vertimas, kurį atlieka surinkėjas (programa).

Kitai instrukcijai, kuri yra „STA $0217“, STA operacijos kodas yra 8D 16 (absoliutus adresavimas) yra $0207 baitų vietoje. 'STA $0217' adresas '$0217' yra $0208 ir $0209 atminties vietose. Instrukcija „STA $0217“ nukopijuoja aštuonių bitų akumuliatoriaus turinį į atminties vietą $0217.

Didesnis papildinio baitas, kuris yra 00101010, yra 0214 $ atminties vietoje, o aukštesnis papildinio baitas, kuris yra 00101010, yra $ 02 baito vietoje 16 . „LDA $0214“ opkodas, kuris yra AD16, skirtas LDA (absoliutus adresavimas), yra $020A baitų vietoje. „LDA $0214“ adresas „$0214“ yra $020B ir $020C vietose. Instrukcija „LDA $ 0214“ įkelia aukštesnį papildinio baitą į akumuliatorių, ištrindama viską, kas yra akumuliatoriuje.

Opkodas „ADC $0216“, kuris yra 6D 16 ADC (absoliutus adresavimas) yra $020D baitų vietoje. „ADC 0216“ adresas „$0216“ yra $020E ir $020F baitų vietose. Instrukcija „ADC $0216“ prideda didesnį papildymo baitą prie aukštesnio papildymo baito, kuris jau yra akumuliatoriuje. Rezultatas dedamas atgal į akumuliatorių. Jei yra 1 perkėlimas, šiam antrajam papildymui jis automatiškai įtraukiamas į būsenos registro nešiojimo langelį. Nors pernešimas už šešiolikto bito (kairėje) nėra būtinas šiai problemai spręsti, malonu patikrinti, ar 1 perkėlimas įvyko, patikrinant, ar perkėlimo vėliavėlė tapo 1.

Kitai ir paskutinei instrukcijai, kuri yra „STA $0218“, STA opkodas, kuris yra 8D16 (absoliutus adresavimas), yra $0210 baitų vietoje. 'STA $0218' adresas '$0218' yra $0211 ir $0212 atminties vietose. „STA $0218“ instrukcija nukopijuoja aštuonių bitų akumuliatoriaus turinį į atminties vietą $0218. Dviejų šešiolikos bitų skaičių pridėjimo rezultatas yra 0101010101010100, o apatinis baitas 01010100 atminties vietoje yra 0217 $, o aukštesnis baitas 01010101 - $ 0218 atminties vietoje – mažas endianiškumas.

Atimtis
Naudojant 6502 µP, pažymėti skaičiai yra dviejų komplemento skaičiai. Dviejų komplemento skaičius gali būti aštuonių bitų, šešiolikos bitų arba bet koks aštuonių bitų kartotinis. Naudojant dviejų komplementą, pirmasis bitas iš kairės yra ženklo bitas. Teigiamam skaičiui šis pirmasis bitas yra 0, nurodantis ženklą. Likę bitai sudaro skaičių įprastu būdu. Norėdami gauti neigiamo skaičiaus dviejų komplementą, apverskite visus atitinkamo teigiamo skaičiaus bitus ir pridėkite 1 prie rezultato iš dešiniojo galo.

Norint atimti vieną teigiamą skaičių iš kito teigiamo skaičiaus, dalis paverčiama dviejų komplemento neigiamu skaičiumi. Tada minuend ir naujas neigiamas skaičius pridedamas įprastu būdu. Taigi aštuonių bitų atimtis tampa:

Kai nešiojimas laikomas 1. Rezultatas kaupiklyje yra dviejų komplemento skirtumas. Taigi, norint atimti du skaičius, reikia nustatyti nešiojimo vėliavėlę (padaryti į 1).

Atimant du šešiolikos bitų skaičius, atimtis atliekama du kartus, kaip ir pridedant du šešiolikos bitų skaičius. Kadangi atimtis yra sudėjimo su 6502 µP forma, atimant du šešiolikos bitų skaičius, perdavimo vėliavėlė nustatoma tik vieną kartą pirmajam atimimui. Atliekant antrą atimtį, bet koks nešiojimo vėliavėlės nustatymas atliekamas automatiškai.

Aštuonių bitų arba šešiolikos bitų skaičių atimties programavimas atliekamas panašiai kaip sudėjimo programavimas. Tačiau nešiojimo vėliava turi būti nustatyta pačioje pradžioje. Mnemonika, kaip tai padaryti, yra:

Atimtis su šešiolikos bitų teigiamais skaičiais
Apsvarstykite atimtį iš šių skaičių:

Šis atimtis neapima dviejų komplemento. Kadangi atimtis iš 6502 µP atliekama dviejų komplemente, atimta iš dviejų bazių atliekama taip:

Dviejų komplemento rezultatas yra toks pat kaip rezultatas, gautas iš įprastos atimties. Tačiau atkreipkite dėmesį, kad 1, einantis į septynioliktą bitų poziciją iš dešinės, nepaisoma. Minuend ir subtrahend yra padalinti į du aštuonių bitus. Dviejų dalių apatinio baito 10010110 komplementas nustatomas nepriklausomai nuo jo aukštesniojo baito ir bet kokio perdavimo. Antrinės dalies aukštesniojo baito dviejų komplementas 11101011 nustatomas nepriklausomai nuo apatinio baito ir bet kokio perdavimo.

16 minuend bitų jau yra dviejų papildymų, pradedant nuo 0 iš kairės. Taigi, jo nereikia koreguoti bitais. Naudojant 6502 µP, apatinis minuend baitas be jokių pakeitimų pridedamas prie apatinio pogrupio dviejų komplemento baito. Apatinis minuend baitas nėra konvertuojamas į dviejų komplementą, nes šešiolika viso minuend bitų jau turi būti dviejų komplemento (kai pirmasis bitas kairėje yra 0). Šiame pirmajame papildyme pridedamas privalomas 1 pernešimas dėl 1=0 SEC nurodymo.

Esant dabartinei efektyviajai atimčiai, yra 1 (sudėties) perkėlimas nuo aštunto iki devintojo bito (iš dešinės). Kadangi tai iš tikrųjų yra atėmimas, bet koks bitas, kuris turėtų būti būsenos registro perdavimo vėliavėlėje, yra papildytas (apverstas). Taigi, 1 nešiojimas tampa 0 C vėliavėlėje. Atliekant antrąją operaciją, aukštesnis minuend baitas pridedamas prie pogrupio didesnio dviejų komplemento baito. Taip pat pridedamas automatiškai papildytas būsenos registro nešiojimo vėliavėlės bitas (šiuo atveju yra 0) (prie aukštesnių baitų). Bet koks 1, kuris peržengia šešioliktąjį bitą iš dešinės, yra ignoruojamas.

Kitas dalykas yra tiesiog užkoduoti visą šią schemą taip:

SEC
LDA 0213 USD
SBC 0215 USD
; jokio kliringo, nes reikia apverstos perkėlimo vėliavėlės reikšmės
STA 0217 USD
LDA 0214 USD
SBC 0216 USD
STA 0218 USD

Atminkite, kad naudojant 6502 surinkimo kalbą, kabliataškis pradeda komentarą, kuris nėra įtrauktas į išverstą programos versiją atmintyje. Du 16 bitų atimti skaičiai užima keturis baitus atminties su absoliučiu adresu; du vienam numeriui (atmintis yra baitų serija). Šios įvestys nėra iš klaviatūros. Sumavimo rezultatas yra du baitai ir taip pat turi būti įdėtas į atmintį kitoje vietoje. Ši išvestis nesiunčiama į monitorių ar spausdintuvą; tai eina į atmintį. Tai iš viso suteikia 6 10 = 6 16 baitų įvestims ir išvestims, kurios turi būti patalpintos į atmintį (RAM).

Prieš paleidžiant programą, ji pirmiausia turi būti atmintyje. Žvelgiant į programos kodą, matyti, kad instrukcijos be komentaro sudaro 19 10 = 13 16 baitų. Kadangi visos šiame skyriuje pateiktos programos prasideda nuo 0200 $ atminties vietos, programa pereina nuo $0200 baitų vietos atmintyje iki $0200 + $13 – $1 = $0212 baitų vietos (pradedant nuo $0200, o ne nuo $0201). Į šį diapazoną neįeina įvesties ir išvesties baitų sritis. Du įvesties skaičiai užima 4 baitus, o vienas išvesties skaičius – 2 baitus. Pridėjus 6 baitus įvesties ir išvesties numeriams, gaunamas programos diapazonas, kuris baigiasi 0212 USD + 6 USD = 0218 USD. Bendra programos trukmė – 19 16 = 25 10 .

Apatinis minuend baitas turi būti $0213 adresu, o aukštesnis to paties minuend baitas turi būti $0214 adresu – mažai endianiškumo. Panašiai apatinis poskyrio baitas turėtų būti 0215 USD adresu, o aukštesnis tos pačios dalies baitas turėtų būti 0216 USD adresu – mažas endianiškumas. Žemesnis rezultato baitas (skirtumas) turėtų būti $0217 adresu, o didesnis to paties rezultato baitas turi būti $0218 adresu – mažas endianiškumas.

Opkodas 38 16 SEC (numanomas adresavimas) yra 0200 USD adresu. Manoma, kad visos šiame skyriuje pateiktos programos prasideda nuo 0200 USD atminties vietos, anuliuojant bet kokią ten buvusią programą; nebent nurodyta kitaip. Opkodas „LDA $0213“, t. y. AD 16 , LDA (absoliutus adresavimas) yra $0201 baito vietoje. Apatinis minuend baitas, kuris yra 10111111, yra 0213 USD atminties baito vietoje. Atminkite, kad kiekvienas operacijos kodas užima vieną baitą. „LDA $0213“ adresas „$0213“ yra $0202 ir $0203 baitų vietose. „LDA $0213“ instrukcija į akumuliatorių įkelia apatinį minuend baitą.

Opkodas „SBC $0215“, ty ED 16 , SBC (absoliutus adresavimas) yra $0204 baitų vietoje. Apatinis pogrupio baitas, kuris yra 01101010, yra 0215 USD baitų vietoje. 'ADC $0215' adresas '$0215' yra $0205 ir $0206 baitų vietose. Instrukcija „SBC $0215“ atima apatinį poskyrio baitą iš apatinio minuend baito, kuris jau yra kaupiklyje. Tai yra dviejų komplemento atėmimas. Rezultatas dedamas atgal į akumuliatorių. Bet kurio pernešimo po aštuntojo bito komplementas (inversija) siunčiamas į būsenos registro nešiojimo vėliavėlę. Šios nešiojimo vėliavėlės negalima išvalyti prieš antrą atimtį su didesniais baitais. Šis perkėlimas automatiškai pridedamas prie didesnių baitų atėmimo.

Komentaras užima kitus 57 10 = 3916 16 baitų. Tačiau tai lieka tik „.asm“ tekstiniame faile. Jis nepasiekia atminties. Jį pašalina vertimas, kurį atlieka surinkėjas (programa).

Kitai instrukcijai, kuri yra „STA $0217“, STA opkodas, ty 8D 16 (absoliutus adresavimas), yra $0207 baitų vietoje. 'STA $0217' adresas '$0217' yra $0208 ir $0209 atminties vietose. Instrukcija „STA $0217“ nukopijuoja aštuonių bitų akumuliatoriaus turinį į atminties vietą $0217.

Didesnis minuend baitas, kuris yra 00101010, yra 0214 $ atminties vietoje, o aukštesnis pogrupio baitas, kuris yra 00010101, yra $ 0216 baito vietoje. Opkodas „LDA $0214“, t. y. AD 16 LDA (absoliutus adresavimas) yra $020A baitų vietoje. „LDA $0214“ adresas „$0214“ yra $020B ir $020C vietose. Instrukcija „LDA $0214“ įkelia aukštesnį minuend baitą į akumuliatorių, ištrindama viską, kas yra akumuliatoriuje.

Opkodas „SBC $0216“, ty ED 16 SBC (absoliutus adresavimas) yra $020D baitų vietoje. „SBC $0216“ adresas „$0216“ yra $020E ir $020F baitų vietose. Instrukcija „SBC $ 0216“ atima didesnį pogrupio baitą iš didesnio minuend baito (dviejų komplemento), kuris jau yra kaupiklyje. Rezultatas dedamas atgal į akumuliatorių. Jei šiai antrajai atimčiai yra 1 perkėlimas, jo papildinys automatiškai įtraukiamas į būsenos registro pernešimo langelį. Nors pernešimas už šešiolikto bito (kairėje) nėra būtinas šiai problemai spręsti, malonu patikrinti, ar įvyksta komplemento perkėlimas, patikrinus nešiojimo vėliavėlę.

Kitai ir paskutinei instrukcijai, kuri yra „STA $0218“, STA opkodas, ty 8D 16 (absoliutus adresavimas), yra $0210 baitų vietoje. 'STA $0218' adresas '$0218' yra $0211 ir $0212 atminties vietose. „STA $0218“ instrukcija nukopijuoja aštuonių bitų akumuliatoriaus turinį į atminties vietą $0218. Atimties su dviem šešiolikos bitų skaičiais rezultatas yra 0001010101010101, kurio apatinis baitas 01010101 yra 0217 $ atminties vietoje ir didesnis baitas 00010101 atminties vietoje $ 0218 - mažas endianiškumas.

6502 µP turi grandinę tik sudėjimui ir netiesiogiai dviejų komplemento atėmimui. Jame nėra daugybos ir padalijimo grandinės. Norint atlikti dauginimą ir padalijimą, reikia parašyti asamblėjos kalbos programą su detalėmis, įskaitant dalinių sandaugų ir dalinių dividendų perkėlimą.

4.4 Loginės operacijos

6502 µP OR mnemoninis ženklas yra ORA, o išskirtinio OR - EOR. Atkreipkite dėmesį, kad loginės operacijos neturi numanomo adresavimo. Numanomam adresavimui nereikia operando. Kiekvienas iš loginių operatorių turi paimti du operandus. Pirmasis yra akumuliatoriuje, o antrasis - atmintyje arba instrukcijoje. Rezultatas (8 bitai) grįžta į akumuliatorių. Pirmasis kaupiklyje yra arba patalpinamas iškarto nurodymu, arba nukopijuojamas iš atminties su absoliučiu adresu. Šiame skyriuje iliustracijai naudojamas tik nulinio puslapio adresas. Visi šie loginiai operatoriai yra Bitwise operatoriai.

IR
Toliau pateiktoje lentelėje parodytas Bitwise AND dvejetainis, šešioliktainis ir dešimtainis skaičius:

Visos šiame skyriuje pateiktos programos turėtų prasidėti nuo 0200 USD atminties baitų vietos. Tačiau šiame skyriuje pateiktos programos yra nuliniame puslapyje, siekiant parodyti nulinio puslapio naudojimą be didesnio 00000000 baito. 2 . Ankstesnis AND junginys gali būti užkoduotas taip:

LDA #$9A ; ne iš atminties – betarpiškas kreipimasis
IR #$CD ; ne iš atminties – betarpiškas kreipimasis
STA 30 USD; parduotuvėse kainuoja 88 USD už 0030 USD

ARBA
Šioje lentelėje iliustruojamas bitinis OR dvejetainis, šešioliktainis ir dešimtainis skaičius:

LDA #$9A ; ne iš atminties – betarpiškas kreipimasis
ORA #$CD ; ne iš atminties – betarpiškas kreipimasis
STA 30 USD; parduotuvėse $CF už nulinę 0030 $

LAISVAS
Šioje lentelėje parodytas bitinis XOR dvejetainis, šešioliktainis ir dešimtainis:

LDA #$9A ; ne iš atminties – betarpiškas kreipimasis
EOR #$CD ; ne iš atminties – betarpiškas kreipimasis
STA 30 USD; parduotuvėse 57 USD už nulinį 0030 USD

4.5 Perjungimo ir pasukimo operacijos

Slinkimo ir pasukimo operatorių mnemonika ir operacijų kodai yra šie:

ASL: perkelkite į kairę vieną akumuliatoriaus arba atminties vietos bitą, įterpdami 0 į atlaisvintą dešinįjį langelį.

LSR: perkelkite į dešinę vieną akumuliatoriaus arba atminties vietos bitą, įterpdami 0 į atlaisvintą kairįjį langelį.
ROL: pasukite vieną bitą į kairę nuo akumuliatoriaus arba atminties vietos, įterpdami kairėje iškritusį bitą į atlaisvintą dešinįjį langelį.
ROR: pasukite vieną bitą į dešinę nuo akumuliatoriaus arba atminties vietos, įterpdami dešinėje iškritusį bitą į laisvą kairėje pusėje esantį langelį.

Norėdami pakeisti arba pasukti akumuliatorių, instrukcija yra maždaug tokia:

LSR A

Tam naudojamas kitas adresavimo režimas, vadinamas akumuliatoriaus adresavimo režimu.

Norėdami atlikti poslinkį arba pasukimą su baitų atminties vieta, instrukcija yra maždaug tokia:

ROR $ 2BCD

Kur 2BCD yra atminties vieta.

Atkreipkite dėmesį, kad nėra tiesioginio ar numanomo adresavimo režimo, skirto perjungti ar pasukti. Tiesioginio adresavimo režimo nėra, nes nėra prasmės perkelti ar pasukti skaičių, kuris lieka tik instrukcijoje. Nėra numanomo adresavimo režimo, nes 6502 µP dizaineriai nori, kad būtų perkeltas arba pasuktas tik akumuliatoriaus turinys (A registras) arba atminties baito vieta.

4.6 Santykinio adresavimo režimas

Mikroprocesorius visada padidina (1, 2 arba 3 vienetais) programos skaitiklį (PC), kad nurodytų kitą vykdytiną komandą. 6502 µP turi nurodymą, kurio mnemonika yra BVS, o tai reiškia „Branch on Overflow Set“. Kompiuteris susideda iš dviejų baitų. Dėl šios instrukcijos kompiuteris turi kitą atminties adresą, kad būtų galima vykdyti kitą komandą, o ne dėl įprasto padidėjimo. Tai daroma pridedant arba atimant reikšmę, vadinamą poslinkiu, prie kompiuterio turinio. Taigi, kompiuteris nurodo kitą (šakotąją) atminties vietą, kad kompiuteris galėtų toliau vykdyti veiklą. Poslinkis yra sveikas skaičius nuo -128 10 iki +127 10 (dviejų papildymas). Taigi, poslinkis gali paskatinti šuolį atmintyje. Jei jis teigiamas arba atsilieka nuo atminties, arba jei jis yra neigiamas.

BVS instrukcija turi tik vieną operandą, kuris yra poslinkis. BVS naudoja santykinį adresą. Apsvarstykite šią instrukciją:

BVS $ 7F

Antroje bazėje 7F H yra 01111111 2 = 127 10 . Tarkime, kad kitos instrukcijos turinys kompiuteryje yra 0300 USD. Pagal BVS nurodymą $7F (teigiamas skaičius jau dviejų komplemente) pridedamas prie $0300 ir gaunama $037F. Taigi, vietoj kitos instrukcijos, kuri turi būti vykdoma 0300 USD atminties vietoje, ji yra 037 F USD atminties vietoje (maždaug pusės puslapio skirtumas).

Yra ir kitų šakų nurodymų, tačiau BVS yra labai tinkama naudoti santykiniam adresui iliustruoti. Santykinis adresavimas susijęs su filialų instrukcijomis.

4.7 Indeksuotas adresavimas ir netiesioginis adresavimas atskirai

Šie adresavimo režimai leidžia 6502 µP per trumpą laiką apdoroti milžiniškus duomenų kiekius su mažesniu instrukcijų skaičiumi. Visoje Comodore-64 atmintyje yra 64 KB vietos. Taigi, norint pasiekti bet kurią 16 bitų baitų vietą, reikia dviejų baitų. Vienintelė išimtis, kai reikia dviejų baitų, yra nulinis puslapis, kur didesnis 00 USD baitas yra praleistas, siekiant sutaupyti vietos, kurią atmintyje užima instrukcija. Naudojant ne puslapio nulio adresavimo režimą, tiek aukštesni, tiek žemesni 16 bitų atminties adreso baitai dažniausiai nurodomi kažkaip.

Pagrindinis indeksuotas adresavimas

Absoliutus indeksinis adresavimas
Atminkite, kad X arba Y registras vadinamas indekso registru. Apsvarstykite šią instrukciją:

LDA $ C453,X

Tarkime, kad reikšmė 6 H yra X registre. Atminkite, kad 6 instrukcijose niekur neįrašyta. Ši instrukcija prideda 6H reikšmę prie C453 H kuri yra įvestos instrukcijos dalis tekstiniame faile, kurį dar reikia surinkti – C453 H + 6 H = C459 H . LDA reiškia įkelti baitą į akumuliatorių. Baitas, kurį reikia įkelti į akumuliatorių, gaunamas iš $C459 adreso. C459 USD, tai yra 453 USD suma, įvedama su instrukcija ir 6 H kuris randamas X registre, tampa efektyviu adresu, iš kurio ateina baitas, kurį reikia įkelti į akumuliatorių. Jei 6 H buvo Y registre, instrukcijoje vietoje X įrašytas Y.

Įvestame nurodymų sakinyje $C453 žinomas kaip bazinis adresas, o 6 H X arba Y registre yra žinoma kaip efektyvaus adreso skaičiavimo arba rodyklės dalis. Bazinis adresas gali nurodyti bet kurį baito adresą atmintyje, o kitą – 256 10 adresus galima pasiekti, darant prielaidą, kad pradėtas indeksas (arba skaičius) X arba Y registre yra 0. Atminkite, kad vienas baitas gali suteikti nenutrūkstamą diapazoną iki 256 10 skaičiai (ty 00000000 2 iki 11111111 2 ).

Taigi, absoliutus adresavimas prideda tai, kas jau yra (įdėta kita instrukcija) X arba Y registre, prie 16 adresų, kurie įvedami su instrukcija, norint gauti efektyvų adresą. Įvedimo instrukcijoje du indeksų registrai yra atskirti X arba Y, kurie rašomi po kablelio. Įvedamas X arba Y; ne abu.

Po to, kai visa programa yra įvesta teksto rengyklėje ir išsaugota „.asm“ plėtinio failo pavadinimu, surinkėjas, kuri yra kita programa, turi išversti įvestą programą į tai, kas yra (įkelta) atmintyje. Ankstesnė instrukcija, kuri yra „LDA $C453,X“, atmintyje užima tris baitų vietas, o ne penkias.

Atminkite, kad mnemonika, tokia kaip LDA, gali turėti daugiau nei vieną opkodą (skirtingus baitus). Instrukcijos, kuri naudoja X registrą, opkodas skiriasi nuo operatyvinio kodo, kuris naudoja Y registrą. Remdamasis įvestu nurodymu, surinkėjas žino, kokį opkodą naudoti. Vieno baito operacijos kodas, skirtas „LDA $C453,X“, skiriasi nuo vieno baito operacijos kodo „LDA $C453,Y“. Tiesą sakant, LDA operacinės kodas „LDA $C453,X“ yra BD, o LDA operacinės kodas „LDA $C453,9“ yra BD.

Jei LDA operacijos kodas yra 0200 USD baitų vietoje. Tada 16 bitų $C453 adresas užima kitą vietą atmintyje, kuri yra $0201 ir $0202. Konkretus operacijos kodo baitas nurodo, ar tai yra X registras, ar Y registras. Taigi, surinkta kalbos instrukcija, kuri yra „LDA $C453,X“ arba „LDA $C453,Y“, atmintyje užima tris baitus iš eilės, o ne keturis ar penkis.

Nulinio puslapio indeksuotas adresavimas
Nulinio puslapio indekso adresavimas yra kaip absoliutus indekso adresavimas, kuris aprašytas anksčiau, tačiau tikslinis baitas turi būti tik nuliniame puslapyje (nuo 0000 USD iki 00 FF). Dabar, kai kalbama apie nulinį puslapį, didesnis baitas, kuris visada yra 00 H atminties vietų paprastai vengiama. Taigi, paprastai minima, kad puslapis nulis prasideda nuo 00 USD iki FF. Taigi, ankstesnė „LDA $C453,X“ instrukcija yra tokia:

LDA 53,X USD

$C4, didesnis baitas, nurodantis puslapį, esantį virš nulio puslapio, negali būti naudojamas šioje instrukcijoje, nes numatomas tikslinis baitas įkeliamas į sukauptą baitą už nulio ribų ir virš jo.

Kai instrukcijoje įvesta reikšmė pridedama prie indekso registro reikšmės, suma neturėtų duoti rezultato, viršijančio puslapio nulį (FF H ). Taigi, negalima turėti tokios instrukcijos kaip „LDA $FF, X“ ir tokios reikšmės kaip FF H indeksų registre, nes FF H + FF H = 200 H kuris yra pirmasis baitas (0200 USD) 2 puslapio (trečiojo puslapio) vieta atmintyje, yra dideliu atstumu nuo 0 puslapio. Taigi, su nulinio puslapio indeksuotu adresu, veiksmingas adresas turi būti nuliniame puslapyje.

Netiesioginis adresavimas

Peršokti absoliutų adresavimą
Prieš aptariant absoliutų netiesioginį adresavimą, verta pirmiausia pažvelgti į JMP absoliutų adresavimą. Tarkime, kad adresas, turintis dominančią vertę (tikslinį baitą), yra 8765 USD. Tai yra 16 bitų, sudarytų iš dviejų baitų: aukštesniojo baito, kuris yra 87 H ir apatinis baitas, kuris yra 65 H . Taigi du baitai už 8765 USD įdedami į kompiuterį (programų skaitiklį) kitai instrukcijai. Asamblėjos kalbos programoje (faile) įvesta:

JMP 8765 USD

Vykdomoji programa atmintyje peršoka nuo bet kokio adreso, kurį ji pasiekė, iki 8765 USD. JMP mnemonika turi tris operacijų kodus: 4C, 6C ir 7C. Šio absoliutaus adresavimo operacijos kodas yra 4C. JMP absoliutaus netiesioginio adresavimo operacijos kodas yra 6C (žr. toliau pateiktas iliustracijas).

Absoliutus netiesioginis adresavimas
Tai naudojama tik su šuolio (JMP) instrukcija. Tarkime, kad adresas, kuriame yra dominantis baitas (tikslinis baitas), yra 8765 USD. Tai yra 16 bitų, sudarytų iš dviejų baitų: aukštesniojo baito, kuris yra 87 H ir apatinis baitas, kuris yra 65 H . Naudojant absoliutų netiesioginį adresavimą, šie du baitai iš tikrųjų yra dviejose iš eilės baitų vietose kitur atmintyje.

Tarkime, kad jie yra $0210 ir $0211 atminties vietose. Tada dominančio adreso apatinis baitas, kuris yra 65 H yra 0210 USD adresu, o didesnis baitas yra 87 H yra adresu $0211. Tai reiškia, kad mažesnis dominantis atminties baitas eina į žemesnį iš eilės adresą, o didesnis dominantis atminties baitas – į aukštesnį iš eilės adresą – mažas endianiškumas.

16 bitų adresas gali nurodyti du iš eilės esančius adresus atmintyje. Atsižvelgiant į tai, $0210 adresas reiškia $0210 ir $0211 adresus. Adresų pora $0210 ir $0211 turi galutinį tikslinio baito adresą (16 bitų iš dviejų baitų), o apatinis baitas yra 65 H 0210 USD ir didesnis 87 baitas H už 0211 USD. Taigi, įvesta šokinėjimo instrukcija yra tokia:

JMP (0210 USD)

JMP mnemonika turi tris operacijų kodus: 4C, 6C ir 7C. Absoliutaus netiesioginio adresavimo operacijos kodas yra 6C. Tekstiniame faile įvesta „JMP (0210 USD)“. Dėl skliaustų surinkėjas (vertėjas) JMP naudoja opkodą 6C, o ne 4C ar 7C.

Naudojant absoliutų netiesioginį adresavimą, iš tikrųjų yra trys atminties sritys. Pirmąjį regioną gali sudaryti $0200, $0201 ir $0202 baitų vietos. Jame yra trys baitai „JMP ($ 0210)“ instrukcijai. Antrasis regionas, kuris nebūtinai yra šalia pirmojo, susideda iš dviejų iš eilės einančių baitų vietos – $0210 ir $0211. Čia yra apatinis baitas (0210 USD), kuris įvedamas asamblėjos kalbos programos instrukcijoje. Jei dominantis adresas yra 8765 USD, apatinis baitas yra 65 H yra 0210 USD baitų vietoje, o didesnis baitas – 87 H yra $0211 baitų vietoje. Trečiasis regionas susideda tik iš vieno baito vietos. Tai 8765 USD adresas, skirtas tiksliniam baitui (paskutinis dominantis baitas). Iš eilės einančių adresų pora, $0210 ir $0211, turi $8765 žymeklį, kuris yra dominantis adresas. Po skaičiavimo interpretacijos į kompiuterį (programų skaitiklį) patenka 8765 USD, kad būtų pasiektas tikslinis baitas.

Nulinis puslapio netiesioginis adresavimas
Šis adresavimas yra toks pat kaip absoliutus netiesioginis adresavimas, tačiau rodyklė turi būti nuliniame puslapyje. Žemesnio baito žymeklio srities adresas yra įvestoje instrukcijoje taip:

JMP (50 USD)

Didesnis žymeklio baitas yra $51 baito vietoje. Veiksmingas adresas (nurodytas) nebūtinai turi būti nuliniame puslapyje.

Taigi, naudojant indekso adresą, indekso registro reikšmė pridedama prie bazinio adreso, pateikto instrukcijoje turėti efektyvų adresą. Netiesioginiam adresavimui naudojamas žymeklis.

4.8 Indeksuotas netiesioginis adresavimas

Absoliutus indeksuotas netiesioginis adresavimas
Šis adresavimo režimas naudojamas tik su JMP instrukcija.
Naudojant absoliutų netiesioginį adresavimą, yra smaili reikšmė (baitas) su savo dviem iš eilės baitų adresais. Šie du iš eilės einantys adresai sudaro žymeklį, kuris yra dviejų iš eilės einančių baitų žymeklio srityje atmintyje. Apatinis rodyklės srities baitas yra tai, kas įvedama instrukcijoje skliausteliuose. Rodyklė yra nukreiptos reikšmės adresas. Ankstesnėje situacijoje 8765 USD yra nurodytos vertės adresas. $0210 (po to $0211) yra adresas, kurio turinys yra $8765, kuris yra rodyklė. Naudojant absoliutų netiesioginio adresavimo režimą, programoje (tekstiniame faile), įskaitant skliaustus, įvedama (0210 USD).

Kita vertus, naudojant absoliutų indeksuotą netiesioginio adresavimo režimą, apatinis žymeklio srities adreso baitas formuojamas X registro reikšmę pridedant prie įvesto adreso. Pavyzdžiui, jei žymeklis yra 0210 USD adreso vietoje, įvesta instrukcija gali būti maždaug tokia:

JMP (020 A, X USD)

Kur X registro reikšmė yra 6 H . 020A H + 6 H = 0210 H . Y registras nenaudojamas su šiuo adresavimo režimu.

Nulinio puslapio indeksavimo netiesioginis adresavimas
Šis adresavimo režimas naudoja X registrą, o ne Y registrą. Naudojant šį adresavimo režimą, dviejų baitų adreso žymeklio srityje vis dar yra nukreipta reikšmė ir žymeklis. Nuliniame puslapyje turi būti du iš eilės rodyklės baitai. Instrukcijoje įvestas adresas yra vieno baito adresas. Ši reikšmė pridedama prie vertės X registre ir bet koks perkėlimas atmetamas. Rezultatas nurodo žymeklio sritį 0 puslapyje. Pavyzdžiui, jei dominantis adresas (nurodytas) yra 8765 USD ir jis yra 0 puslapio 50 ir 51 USD baitų vietose, o reikšmė X registre yra 30 USD, spausdinta instrukcija yra maždaug tokia:

LDA (20,X USD)

Nes 20 USD + 30 USD = 50 USD.

Netiesioginis indeksuotas adresavimas
Šis adresavimo režimas naudoja Y registrą, o ne X registrą. Naudojant šį adresavimo režimą, vis dar yra nukreipta reikšmė ir rodyklės sritis, tačiau žymeklio srities turinys veikia skirtingai. Nuliniame puslapyje turi būti du iš eilės rodyklės srities baitai. Apatinis rodyklės srities adresas įvedamas instrukcijoje. Šis skaičius (baitų pora), esantis žymeklio srityje, pridedamas prie Y registro reikšmės, kad būtų tikrasis žymeklis. Pavyzdžiui, tegul dominantis adresas (nurodytas) yra 8765 USD, 6H reikšmė yra Y registre, o skaičius (du baitai) yra adresu 50 H ir 51 H . Du baitai kartu yra 875 USD, nes 875 USD + 6 USD = 8765 USD. Įvesta instrukcija yra maždaug tokia:

LDA (50 USD), Y

4.9 Padidinimo, mažinimo ir testavimo BIT instrukcijos

Šioje lentelėje parodytos didinimo ir mažinimo instrukcijos:

INA ir DEA atitinkamai padidina ir mažina akumuliatorių. Tai vadinama akumuliatoriaus adresavimu. INX, DEX, INY ir DEY yra atitinkamai skirti X ir Y registrams. Jie nesiima jokio operando. Taigi, jie naudoja numanomąjį adresavimo režimą. Prieaugis reiškia 1 pridėjimą prie registro arba atminties baito. Dekrementas reiškia 1 atėmimą iš registro arba atminties baito.

INC ir DEC atitinkamai padidina ir mažina atminties baitą (o ne registrą). Nulinio puslapio adresavimo, o ne absoliutaus adresavimo, naudojimas leidžia sutaupyti instrukcijų atminties. Nulinis puslapio adresavimas yra vienu baitu mažiau nei absoliutus atmintyje esančios instrukcijos adresavimas. Tačiau nulinio puslapio adresavimo režimas veikia tik nulinį puslapį.

BIT instrukcija patikrina baito bitus atmintyje su 8 bitais akumuliatoriuje, bet nekeičia nė vieno. Nustatytos tik kai kurios procesoriaus būsenos registro vėliavėlės „P“. Nurodytos atminties vietos bitai logiškai AND sujungiami su akumuliatoriaus bitais. Tada nustatomi šie būsenos bitai:

  • N, kuris yra 7 bitas ir paskutinis bitas (kairysis) būsenos registre, gauna 7 atminties vietos bitą prieš AND jungimą.
  • V, kuris yra 6 būsenos registro bitas, gauna 6 atminties vietos bitą prieš AND jungimą.
  • Būsenos registro Z vėliavėlė nustatoma (padaryta 1), jei IR rezultatas yra nulis (00000000 2 ). Priešingu atveju jis išvalomas (padarytas 0).

4.10 Instrukcijų palyginimas

Palyginti 6502 µP instrukcijų mnemoniką yra CMP, CPX ir CPY. Po kiekvieno palyginimo paveikiamos procesoriaus būsenos registro „P“ vėliavėlės N, Z ir C. N vėliavėlė nustatoma (padaroma 1), kai rezultatas yra neigiamas skaičius. Z vėliavėlė nustatoma (padaryta 1), kai rezultatas yra nulis (000000002). C vėliavėlė nustatoma (padaryta 1), kai yra perkėlimas nuo aštuonių iki devintojo bito. Toliau pateiktoje lentelėje pateikiama išsami iliustracija

Reiškia „didesnis nei“. Atsižvelgiant į tai, palyginimo lentelė turėtų būti savaime suprantama.

4.11 Peršokimo ir šakojimo instrukcijos

Šioje lentelėje apibendrinamos šuolio ir šakos instrukcijos:

JMP instrukcijoje naudojamas absoliutus ir netiesioginis adresavimas. Likusios lentelės instrukcijos yra šakos instrukcijos. Jie naudoja tik santykinį adresavimą su 6502 µP. Dėl to lentelė tampa savaime suprantama, jei skaitoma iš kairės į dešinę ir iš viršaus į apačią.

Atminkite, kad šakos gali būti taikomos tik adresams, esantiems nuo -128 iki +127 baitų nuo nurodyto adreso. Tai yra santykinis kreipimasis. Tiek JMP, tiek šakos instrukcijoms tiesiogiai veikia programų skaitiklis (PC). 6502 µP neleidžia šakoms pasiekti absoliutų adresą, nors šuolis gali atlikti absoliutų adresą. JMP instrukcija nėra šakinė instrukcija.

Pastaba: Santykinis adresavimas naudojamas tik su šakų instrukcijomis.

4.12 Kamino sritis

Paprogramė yra kaip viena iš ankstesnių trumpų programų, skirtų pridėti du skaičius arba atimti du skaičius. Krūvos sritis atmintyje prasideda nuo $ 0100 iki $ 01FF imtinai. Ši sritis tiesiog vadinama kaminu. Kai mikroprocesorius vykdo šuolį prie paprogramės nurodymo (JSR – žr. tolesnę diskusiją), jis turi žinoti, kur grįžti baigęs. 6502 µP saugo šią informaciją (grįžimo adresą) mažoje atmintyje nuo 0100 USD iki 01FF USD (dėklo sritis) ir naudoja dėklo žymeklio registro turinį, kuris mikroprocesoriuje yra „S“, kaip žymeklį (9 bitai) į paskutinį grąžintą adresą. kuris yra saugomas 1 puslapyje (nuo 0100 USD iki 01FF USD). Stackas sumažėja nuo $01FF ir leidžia įdėti paprogrames iki 128 lygių gylio.

Kitas kamino žymeklio panaudojimas yra tvarkyti pertraukimus. 6502 µP kaiščiai pažymėti kaip IRQ ir NMI. Šiems kaiščiams gali būti taikomi nedideli elektriniai signalai, dėl kurių 6502 µP nustos vykdyti vieną programą ir pradės vykdyti kitą. Tokiu atveju pirmoji programa nutrūksta. Kaip ir paprogramės, pertraukimo kodo segmentai gali būti įdėti. Pertraukimų apdorojimas aptariamas kitame skyriuje.

Pastaba : dėklo žymeklis turi 8 bitus, skirtus mažesnio baito adresui, adresuojant vietas nuo 0100 USD iki 01FF. Didesnis 00000001 baitas 2 manoma.

Šioje lentelėje pateikiamos instrukcijos, susiejančios dėklo žymeklį „S“ su A, X, Y ir P registrais su krūvos sritimi atmintyje:

4.13 Paprogramė Skambutis ir grįžimas

Paprogramė yra instrukcijų rinkinys, kuriuo pasiekiamas konkretus tikslas. Ankstesnė sudėjimo arba atimties programa yra labai trumpa paprogramė. Paprogramės kartais tiesiog vadinamos rutinomis. Instrukcija iškviesti paprogramę yra tokia:

JSR: Pereikite į subrutiną

Instrukcija grįžti iš paprogramės yra tokia:

RTS: Grįžti iš paprogramės

Mikroprocesorius turi tendenciją nuolat vykdyti atmintyje esančias instrukcijas, vieną po kitos. Tarkime, kad mikroprocesorius šiuo metu vykdo kodo segmentą ir susiduria su šuolio (JMP) instrukcija eiti ir vykdyti kodo segmentą, kuris yra užkoduotas ir jau gali būti įvykdytas. Jis vykdo tą kodo segmentą už nugaros ir toliau vykdo visus kodo segmentus (instrukcijas) po kodo segmento už nugaros, kol iš naujo vykdo esamą kodo segmentą ir tęsia toliau. JMP nestumia kitos instrukcijos į krūvą.

Skirtingai nei JMP, JSR iš kompiuterio (programų skaitiklio) į steką stumia kitos instrukcijos adresą po savęs. Šio adreso krūvos padėtis dedama krūvos rodyklėje „S“. Kai paprogramėje aptinkama (vykdoma) RTS instrukcija, adresas, kuris yra nustumtas į krūvą, pašalinamas iš dėklo ir programa tęsiama tuo ištrauktu adresu, kuris yra kitas komandos adresas prieš pat paprogramės iškvietimą. Paskutinis adresas, pašalintas iš kamino, siunčiamas į programos skaitiklį. Šioje lentelėje pateikiama techninė JSR ir RTS instrukcijų informacija:

Žr. šią JSR ir RTS naudojimo iliustraciją:

4.14 Atskaitymo ciklo pavyzdys

Ši paprogramė skaičiuojama nuo $FF iki $ 00 (iš viso 256 10 skaičiuoja):

paleisti LDX #$FF ; apkrova X su $FF = 255
kilpa DEX ; X = X – 1
BNE kilpa ; jei X nėra nulis, tada pereikite į kilpą
RTS ; grąžinti

Kiekviena eilutė turi komentarą. Komentarai niekada neįsileidžia į atmintį vykdymui. Surinkėjas (vertėjas), konvertuojantis programą į tokią, kokia ji yra atmintyje, kad būtų galima vykdyti (paleisti), visada pašalina komentarus. Komentaras prasideda raide „;“ . Šios programos „pradžia“ ir „ciklas“ vadinami etiketėmis. Etiketė identifikuoja (pavadinimą) instrukcijos adresui. Jei instrukcija yra vieno baito instrukcija (numanomas adresavimas), etiketė yra tos instrukcijos adresas. Jei instrukcija yra kelių baitų instrukcija, etiketė identifikuoja pirmąjį kelių baitų komandos baitą. Pirmoji šios programos instrukcija susideda iš dviejų baitų. Darant prielaidą, kad jis prasideda 0300 USD adresu, 0300 USD adresą programoje galima pakeisti „pradėti“. Antroji instrukcija (DEX) yra vieno baito instrukcija6 ir turėtų būti adresu $0302. Tai reiškia, kad $0302 adresas gali būti pakeistas 'kilpa' programoje, o tai iš tikrųjų yra 'BNE cikle'.

„BNE kilpa“ reiškia atšaką nurodytu adresu, kai būsenos registro Z vėliavėlė yra 0. Kai reikšmė A arba X arba Y registre yra 00000000 2 , dėl paskutinės operacijos Z vėliavėlė yra 1 (nustatyta). Taigi, kol jis yra 0 (ne 1), antroji ir trečioji programos instrukcijos kartojasi tokia tvarka. Kiekvienoje kartotoje sekoje reikšmė (visas skaičius) X registre sumažinamas 1. DEX reiškia X = X – 1. Kai reikšmė X registre yra $00 = 00000000 2 , Z tampa 1. Tuo metu dvi instrukcijos nebepasikartos. Paskutinė programos RTS instrukcija, kuri yra vieno baito instrukcija (numanomas adresavimas), grįžta iš paprogramės. Šios instrukcijos tikslas yra nustatyti programos skaitiklio adresą kodo, kuris turi būti vykdomas prieš paprogramės iškvietimą, krūvoje ir grįžti į programos skaitiklį (PC). Šis adresas yra instrukcijos, kuri turi būti įvykdyta prieš iškviečiant paprogramę, adresas.

Pastaba: Rašant asamblėjos kalbos programą 6502 µP, eilutės pradžioje turi prasidėti tik etiketė; bet koks kitas eilutės kodas turi būti perkeltas bent vienu tarpu į dešinę.

Paprogramės iškvietimas
Nepaisydama atminties vietos, kurią užima ankstesnės etiketės, programa atmintyje (RAM) užima 6 baitus iš eilės nuo 0300 USD iki 0305 USD. Šiuo atveju programa yra tokia:

LDX #$FF ; įkelkite X su $ FF = 255
DEX ; X = X – 1
0302 BNE ; jei X nėra nulis, tada pereikite į kilpą
RTS ; grąžinti

Nuo $0200 adreso atmintyje gali būti paprogramės iškvietimas. Skambučio instrukcija yra tokia:

JSR pradžia ; pradžia yra adresas 0300 USD, t.y. JSR 0300 USD

Teksto rengyklės faile tinkamai įrašyta paprogramė ir jos iškvietimas yra:

paleisti LDX #$FF; įkelkite X su $ FF = 255
kilpa DEX ; X = X – 1

BNE kilpa ; jei X nėra nulis, tada pereikite į kilpą
RTS ; grąžinti

JSR pradžia: pereikite prie rutinos, pradedant nuo 0300 USD

Dabar vienoje ilgoje programoje gali būti daug paprogramių. Visi jie negali turėti pavadinimo „pradžia“. Jie turėtų turėti skirtingus pavadinimus. Tiesą sakant, nė vienas iš jų negali turėti pavadinimo „pradžia“. „Pradėti“ čia naudojamas mokymo sumetimais.

4.15 Programos vertimas

Programos vertimas arba jos surinkimas reiškia tą patį. Apsvarstykite šią programą:

pradėti LDX #$FF : įkelkite X su $FF = 255
kilpa DEX: X = X – 1
BNE kilpa: jei X nėra nulis, tada pereikite į kilpą
RTS: grįžimas
JSR pradžia: pereikite prie rutinos, pradedant nuo 0300 USD

Tai programa, kuri buvo parašyta anksčiau. Jį sudaro paprogramė, pradžia ir paprogramės iškvietimas. Programa skaičiuojama nuo 255 10 iki 0 10 . Programa prasideda nuo vartotojo pradžios adreso 0200 USD (RAM). Programa įvedama teksto rengyklėje ir išsaugoma diske. Jis turi tokį pavadinimą kaip „sample.asm“, kur „sample“ yra programuotojo pasirinktas pavadinimas, tačiau surinkimo kalbos plėtinys „.asm“ turi būti susietas su failo pavadinimu.

Surinktą programą sukuria kita programa, kuri vadinama asambliu. Montuotoją tiekia 6502 µP gamintojas arba trečioji šalis. Asembleris atkuria programą taip, kad ji būtų atmintyje (RAM), kai ji vykdoma (vykdoma).

Tarkime, kad JSR instrukcija prasideda adresu $0200, o paprogramė prasideda $0300 adresu. Surinkėjas pašalina visus komentarus ir tuščius tarpus. Komentarai ir tarpai eikvoja atmintį, kurios visada trūksta. Galima tuščia eilutė tarp ankstesnio paprogramės kodo segmento ir paprogramės iškvietimo yra tarpo pavyzdys. Surinktas failas vis dar išsaugomas diske ir pavadintas panašiu į 'sample.exe'. „Pavyzdys“ yra programuotojo pasirinktas pavadinimas, tačiau plėtinys „.exe“ turėtų būti rodomas, kad tai būtų vykdomasis failas.

Surinkta programa gali būti dokumentuojama taip:

Teigiama, kad tokio dokumento rengimas yra surinkimas rankomis. Atminkite, kad šio dokumento komentarai nerodomi atmintyje (vykdyti). Adreso stulpelyje lentelėje nurodomi atmintyje esančių instrukcijų pradžios adresai. Atkreipkite dėmesį, kad „JSR start“, kuris yra „JSR $ 0300“, kuris turėtų būti užkoduotas kaip „20 03 00“, iš tikrųjų yra užkoduotas kaip „20 00 03“, o apatinis atminties baito adresas užima apatinį baitą atmintyje ir didesnio atminties baito adresas, užimantis didesnį atmintyje esantį baitą – mažas endianiškumas. JSR opkodas yra 20 16 .

Atkreipkite dėmesį, kad poslinkis į šakos komandą, pvz., BNE, yra dviejų komplemento skaičius 128 diapazone. 10 iki +127 10 . Taigi „BNE kilpa“ reiškia „BNE -1 10 “, kuris iš tikrųjų yra „D0 FF“ kodo forma FF 16 yra -1 dviejuose papildyme, kuris parašytas kaip = 11111111 antroje bazėje. Asemblerio programa etiketes ir laukus pakeičia tikrais šešioliktainiais skaičiais (šešioliktainiai skaičiai yra dvejetainiai skaičiai, sugrupuoti į keturis bitus). Faktiniai adresai, kuriais prasideda kiekviena instrukcija, iš tikrųjų įtraukiami.

Pastaba: Instrukcija „JSR start“ pakeičiama trumpesnėmis instrukcijomis, kurios siunčia esamą programos skaitiklio turinį (aukštus ir mažus baitus) į krūvą su dėklo žymekliu, kuris sumažinamas du kartus (vieną kartą, kai baitas yra didelis, ir vieną kartą, kai baitas yra mažas) ir tada iš naujo įkelia kompiuterį su 0300 USD adresu. Kamino rodyklė dabar rodo į $00FD, darant prielaidą, kad ji inicijuota į $01FF.

Be to, RTS instrukcija pakeičiama keletu trumpesnių komandų, kurios du kartus padidina krūvos žymeklį „S“ (vieną kartą, kai baitas yra mažas, o vieną kartą – aukštas baitas) ir ištraukia atitinkamus du adreso baitus iš dėklo žymeklio į kompiuterį. sekanti instrukcija.

Pastaba: Etiketės tekstas neturi būti ilgesnis nei 8 simboliai.

„BNE kilpa“ naudoja santykinį adresą. Tai reiškia pridėti -3 10 į kitą programos skaitiklio turinį 0305 USD. „BNE ciklo“ baitai yra „D0 FD“, kur FD yra dviejų -3 papildinys 10 .

Pastaba: Šiame skyriuje nepateikiamos visos 6502 µP instrukcijos. Visas instrukcijas ir jų detales galite rasti dokumente pavadinimu „SY6500 8-Bit Microprocessor Family“. Yra šio dokumento PDF failas pavadinimu „6502.pdf“, kuris yra laisvai prieinamas internete. Šiame dokumente aprašyta 6502 µP yra 65C02.

4.16 Pertraukimai

Bet kurio įrenginio, prijungto prie išorinių (vertikalaus paviršiaus) Commodore 64 prievadų, signalai turi praeiti per CIA 1 arba CIA 2 grandines (IC), kol pasiekia 6502 mikroprocesorių. Signalai iš 6502 µP duomenų magistralės turi praeiti per CIA 1 arba CIA 2 lustą, kad pasiektų bet kokį išorinį įrenginį. CIA reiškia „Complex Interface Adapter“. 4.1 pav. „Commodore_64 pagrindinės plokštės blokinė diagrama“ blokiniai įvesties / išvesties įrenginiai žymi CIA 1 ir CIA 2. Kai programa veikia, prieš tęsiant ją galima pertraukti, kad paleistumėte kitą kodo dalį. Yra aparatinės įrangos ir programinės įrangos pertrūkių. Aparatūros trikdžiams 6502 µP yra du įvesties signalo kaiščiai. Šių smeigtukų pavadinimai yra IRQ ir NMI . Tai nėra µP duomenų linijos. µP duomenų linijos yra D7, D6, D5, D4, D3, D2, D1 ir D0; su D0 mažiausiai reikšmingu bitu ir D7 – didžiausiu reikšmingumu.

IRQ reiškia Interrupt ReQuest 'aktyvus' žemas. Ši įvesties linija į µP paprastai yra aukšta, maždaug 5 voltai. Kai jis sumažėja iki maždaug 0 voltų, tai yra pertraukimo užklausa, signalizuojanti µP. Kai tik prašymas patenkinamas, linija grįžta aukštai. Pertraukimo užklausos patenkinimas reiškia, kad µP atsišakoja į kodą (paprogramę), kuris tvarko pertraukimą.

NMI reiškia Nemaskuojamas pertraukimas „aktyvus“ žemas. Nors kodas, skirtas IRQ yra vykdoma mirties bausmė NMI gali nukristi žemai. Tokiu atveju, NMI yra tvarkomas (vykdomas savas kodas). Po to kodas, skirtas IRQ tęsiasi. Po kodo už IRQ baigiasi, pagrindinis programos kodas tęsiasi. Tai yra, NMI nutraukia IRQ prižiūrėtojas. Signalas už NMI vis tiek gali būti suteiktas µP, net kai µP neveikia ir nieko netvarko arba nevykdo pagrindinės programos.

Pastaba: Iš tikrųjų tai yra perėjimas iš aukšto į žemą NMI , tai yra NMI signalas – apie tai vėliau. IRQ paprastai ateina iš CŽV 1 ir NMI paprastai ateina iš CŽV 2. NMI , kuris reiškia „Non-Maskable Interrupt“, gali būti laikomas nesustabdomu pertraukimu.

Pertraukimų tvarkymas
Nesvarbu, ar prašymas yra iš IRQ arba NMI , turi būti užpildyta dabartinė instrukcija. 6502 turi tik A, X ir Y registrus. Kol paprogramė veikia, ji gali naudoti šiuos tris registrus kartu. Pertraukimų tvarkytuvas vis dar yra paprogramė, nors ir nelaikoma tokia. Įvykdžius dabartinę instrukciją, 65C02 µP A, X ir Y registrų turinys išsaugomas krūvoje. Kitos programos skaitiklio instrukcijos adresas taip pat siunčiamas į krūvą. Tada µP išsišakoja į pertraukimo kodą. Po to A, X ir Y registrų turinys atkuriamas iš krūvos atvirkštine tvarka, kuria jie siunčiami.

Pertraukimo kodavimo pavyzdys
Paprastumo dėlei tarkime, kad µP rutina IRQ pertraukimas yra tiesiog pridėti skaičiai $01 ir $02 ir išsaugoti $03 rezultatą atminties adresu $0400. Kodas yra:

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

ISR yra etiketė ir identifikuoja atminties adresą, kuriame yra PHA instrukcija. ISR reiškia nutraukti paslaugų rutiną. PHA, PHX ir PHY siunčia A, X ir Y registrų turinį į krūvą su viltimi, kad jų prireiks bet kokiam kodui (programai), kuris veikia prieš pat pertraukimą. Kitos trys instrukcijos sudaro pertraukimų tvarkyklės šerdį. PLY, PLX ir PLA instrukcijos turi būti tokia tvarka, ir jos grąžina Y, X ir A registrų turinį. Paskutinė instrukcija, kuri yra RTI, (be operando) grąžina vykdymo tęsinį bet kokiam kodui (programai), kuris vykdomas prieš pertraukimą. RTI siunčia kitos vykdomo kodo instrukcijos adresą iš kamino atgal į programos skaitiklį. RTI reiškia grįžimą iš pertraukimo. Su tuo pertraukimų tvarkymas (paprogramė) baigtas.

Programinės įrangos pertraukimas
Pagrindinis 6502 µP programinės įrangos pertraukimo būdas yra BRK numanomo adreso nurodymo naudojimas. Tarkime, kad pagrindinė programa veikia ir susiduria su BRK instrukcija. Nuo to momento kitos instrukcijos adresas kompiuteryje turėtų būti siunčiamas į krūvą, kai dabartinė instrukcija bus baigta. Programinės įrangos nurodymų tvarkymo paprogramė turėtų būti vadinama „kitas“. Ši pertraukimo paprogramė turėtų perkelti A, X ir Y registrų turinį į krūvą. Įvykdžius paprogramės šerdį, A, X ir Y registrų turinį užbaigiančioji paprogramė turėtų ištraukti iš krūvos į jų registrus. Paskutinis teiginys rutinoje yra RTI. Kompiuterio turinys taip pat automatiškai ištraukiamas iš kamino į kompiuterį dėl RTI.

Paprogramės ir pertraukimo paslaugų rutinos palyginimas ir kontrastas
Šioje lentelėje palyginamos ir kontrastuojamos paprogramė ir paslaugų pertraukimo tvarka:

4.17 6502 pagrindinių adresavimo režimų santrauka

Kiekviena 6502 instrukcija yra vieno baito, po kurio seka nulis ar daugiau operandų.

Greito adresavimo režimas
Naudojant tiesioginio adresavimo režimą, po operando yra reikšmė, o ne atminties adresas. Prieš reikšmę turi būti #. Jei reikšmė yra šešioliktainė, po „#“ turi būti „$“. Tiesioginės 65C02 adresų instrukcijos yra šios: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Skaitytojas turėtų susipažinti su 65C02 µP dokumentacija, kad žinotų, kaip naudotis čia pateiktomis instrukcijomis, kurios nepaaiškintos šiame skyriuje. Instrukcijos pavyzdys yra:

LDA # 77 USD

Absoliutus adresavimo režimas
Absoliutaus adresavimo režime yra vienas operandas. Šis operandas yra atmintyje esančios reikšmės adresas (dažniausiai šešioliktaine arba etikete). Yra 64 tūkst 10 = 65 536 10 atminties adresai 6502 µP. Paprastai vieno baito reikšmė yra viename iš šių adresų. Absoliučios 65C02 adresavimo instrukcijos yra: 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. Skaitytojas turėtų žiūrėti 65C02 µP dokumentaciją, kad žinotų, kaip naudotis čia pateiktomis instrukcijomis, taip pat apie kitus adresavimo režimus, kurie nepaaiškinti šiame skyriuje. Instrukcijos pavyzdys yra:

JIE KAINA 1234 USD

Numanomas adresavimo režimas
Numanomo adresavimo režimu operando nėra. Bet koks įtrauktas µP registras yra nurodytas instrukcijose. Numanomos adresavimo instrukcijos, skirtos 65C02: 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. Instrukcijos pavyzdys yra:

DEX: sumažinkite X registrą vienu vienetu.

Santykinio adresavimo režimas
Santykinis adresavimo režimas susijęs tik su šakų instrukcijomis. Santykinio adresavimo režime yra tik vienas operandas. Tai vertė nuo -128 10 iki +127 10 . Ši vertė vadinama poslinkiu. Remiantis ženklu, ši reikšmė pridedama arba atimama iš kitos programos skaitiklio komandos, kad būtų gautas numatytos kitos komandos adresas. Santykinės adreso režimo instrukcijos yra šios: BCC, BCS, BEQ, KMI, BNE, BPL, BRA, BVC, BVS. Instrukcijų pavyzdžiai yra šie:

BNE $7F : (filialas, jei būsenos registre Z = 0, P)

Kuris prideda 127 prie esamo programos skaitiklio (vykdomo adreso) ir tuo adresu pradeda vykdyti komandą. Panašiai:

BEQ $F9 : (filialas, jei Z = : būsenos registre, P)

Kuris prideda -7 prie dabartinės programos skaitiklio ir pradeda vykdyti naujuoju programos skaitiklio adresu. Operandas yra dviejų komplemento skaičius.

Absoliutus indeksuotas adresavimas
Adresuojant absoliučiu indeksu, X arba Y registro turinys pridedamas prie nurodyto absoliutaus adreso (bet kur nuo $ 0000 iki $ FFFF, t. y. nuo 0 10 iki 65536 10 ) turėti tikrąjį adresą. Šis absoliutus adresas vadinamas baziniu adresu. Jei naudojamas X registras, surinkimo instrukcija yra maždaug tokia:

LDA $ C453,X

Jei naudojamas Y registras, tai kažkas panašaus:

LDA $ C453,Y

X arba Y registro reikšmė vadinama skaičiavimo arba indekso reikšme ir gali būti nuo 00 USD (0 10 ) iki $ FF (250 10 ). Tai nevadinama kompensacija.

Absoliutaus indekso adresavimo instrukcijos yra šios: ADC, AND, ASL (tik X), BIT (su akumuliatoriumi ir atmintimi, tik su X), CMP, DEC (tik atmintis ir X), EOR, INC (tik atmintis ir X), LDA , LDX, LDY, LSR (tik X), ORA, ROL (tik X), ROR (tik X), SBC, STA, STZ (tik X).

Absoliutus netiesioginis adresavimas
Tai naudojama tik su šuolio instrukcija. Šiuo atveju nurodytas absoliutus adresas turi žymeklio adresą. Rodyklės adresas susideda iš dviejų baitų. Dviejų baitų žymeklis nurodo (yra adresas) paskirties baito reikšmę atmintyje. Taigi surinkimo kalbos instrukcija yra tokia:

JMP (3456 USD)

Su skliaustais ir $13 yra adreso vietoje $3456, o $EB yra $3457 (= $3456 + 1). Tada paskirties adresas yra $13EB ir $13EB yra žymeklis. Absoliutus 3456 USD yra instrukcijos skliausteliuose, kur 34 yra mažesnis baitas, o 56 yra didesnis baitas.

4.18 Stygos kūrimas naudojant 6502 µP surinkimo kalbą

Kaip parodyta kitame skyriuje, sukūrus failą atmintyje, failą galima įrašyti į diską. Failui reikia suteikti pavadinimą. Pavadinimas yra eilutės pavyzdys. Yra daug kitų programavimo eilučių pavyzdžių.

Yra du pagrindiniai būdai, kaip sukurti ASCII kodų eilutę. Abiem būdais visi ASCII kodai (simboliai) užima iš eilės baitų vietas atmintyje. Vienu iš būdų prieš šią baitų seką rašomas sveikasis baitas, kuris yra sekos (eilutės) ilgis (simbolių skaičius). Kitu būdu simbolių seką seka (iš karto po to) nulinis baitas, kuris yra 00 16 t.y. 00 USD. Kitokiu būdu eilutės ilgis (simbolių skaičius) nenurodomas. Null simbolis nėra naudojamas pirmuoju būdu.

Pavyzdžiui, apsvarstykite „Aš tave myliu! eilutė be kabučių. Ilgis čia yra 11; tarpas skaičiuojamas kaip vienas ASCII baitas (simbolis). Tarkime, kad eilutė turi būti įdėta į atmintį, o pirmasis simbolis yra adresu $ 0300.

Šioje lentelėje parodytas eilutės atminties nustatymas, kai pirmasis baitas yra 11 10 = 0B 16 :

Šioje lentelėje parodytas eilutės atminties nustatymas, kai pirmasis baitas yra „I“, o paskutinis baitas yra Null (00 USD):

Norėdami pradėti kurti eilutę, galite naudoti šią instrukciją:

JIE KAINA 0300 USD

Tarkime, kad pirmasis baitas yra kaupiklyje, kuris turi būti išsiųstas į 0300 USD adreso vietą. Ši instrukcija tinka abiem atvejais (abiejų tipų eilutėms).

Sutalpinus visus simbolius atminties langeliuose po vieną, eilutę galima nuskaityti naudojant kilpą. Pirmuoju atveju nuskaitomas simbolių skaičius po ilgio. Antruoju atveju simboliai skaitomi nuo „aš“, kol pasiekiamas Nulinis simbolis, kuris yra „Nulis“.

4.19 Masyvo kūrimas naudojant 6502 µP surinkimo kalbą

Vieno baito sveikųjų skaičių masyvas susideda iš nuoseklių atminties baitų vietų su sveikaisiais skaičiais. Tada yra žymeklis, rodantis pirmojo sveikojo skaičiaus vietą. Taigi sveikųjų skaičių masyvas susideda iš dviejų dalių: žymeklio ir vietų serijos.

Stygų masyve kiekviena eilutė gali būti skirtingoje atminties vietoje. Tada yra nuoseklios atminties vietos su rodyklėmis, kur kiekviena žymeklis nurodo pirmąją kiekvienos eilutės vietą. Rodyklė šiuo atveju susideda iš dviejų baitų. Jei eilutė prasideda jos ilgiu, atitinkama rodyklė nurodo to ilgio vietą. Jei eilutė prasideda ne jos ilgiu, bet baigiasi nuliniu simboliu, atitinkama rodyklė nurodo pirmojo eilutės simbolio vietą. Ir yra rodyklė, kuri nurodo pirmojo nuoseklaus rodyklės žemesnio baito adresą. Taigi, eilučių masyvas susideda iš trijų dalių: eilutės skirtingose ​​atminties vietose, atitinkamos nuoseklios rodyklės ir žymeklis į pirmą iš eilės einančių rodyklių.

4.20 Problemos

Prieš pereinant prie kito skyriaus, skaitytojui patariama išspręsti visas skyriaus problemas.

  1. Parašykite asamblėjos kalbos programą, kuri prasideda nuo 0200 USD už 6502 µP ir prideda nepasirašytus 2A94 skaičius H (pridėti) prie 2ABF H (augend). Tegul įėjimai ir išvestis būna atmintyje. Taip pat rankomis pagaminkite surinktą programos dokumentą.
  2. Parašykite asamblėjos kalbos programą, kuri prasideda nuo 0200 USD už 6502 µP ir atima beženklius skaičius iš 1569 H (subtrahend) iš 2ABF H (minuendas). Tegul įėjimai ir išėjimai būna atmintyje. Taip pat rankomis pagaminkite surinktą programos dokumentą.
  3. Parašykite asamblėjos kalbos programą 6502 µP, kuri skaičiuojama nuo 00 USD iki 09 USD naudojant kilpą. Programa turėtų prasidėti nuo 0200 USD. Taip pat rankomis pagaminkite surinktą programos dokumentą.
  4. Parašykite asamblėjos kalbos programą, kuri prasideda nuo 0200 USD už 6502 µP. Programa turi dvi paprogrames. Pirmoji paprogramė prideda nepaženklintus numerius 0203 H (augend) ir 0102H (pridėti). Antroji paprogramė prideda sumą iš pirmosios paprogramės, kuri yra 0305H iki 0006 H (augend). Galutinis rezultatas išsaugomas atmintyje. Iškvieskite pirmąją paprogramę, kuri yra FSTSUB, ir antrąją paprogramę, kuri yra SECSUB. Tegul įėjimai ir išėjimai būna atmintyje. Taip pat ranka pagaminkite visos programos surinktą programos dokumentą.
  5. Atsižvelgiant į tai, kad an IRQ tvarkytojas prideda nuo $02 iki $01 prie akumuliatoriaus kaip pagrindinio tvarkymo NMI yra išduotas ir pagrindinis tvarkymas NMI prideda nuo 05 USD iki 04 USD prie akumuliatoriaus, parašykite surinkimo kalbą abiem tvarkytojams, įskaitant jų skambučius. Skambutis į IRQ tvarkytojas turėtų būti 0200 USD adresu. The IRQ tvarkytojas turėtų prasidėti adresu 0300 USD. The NMI tvarkytojas turėtų prasidėti adresu 0400 USD. Rezultatas iš IRQ tvarkytojas turėtų būti pateiktas 0500 USD adresu, o rezultatas NMI tvarkytojas turėtų būti nurodytas 0501 USD adresu.
  6. Trumpai paaiškinkite, kaip BRK instrukcija naudojama programinės įrangos pertraukimui sukurti 65C02 kompiuteryje.
  7. Sukurkite lentelę, kurioje palyginama ir kontrastuojama įprasta paprogramė su pertraukimo tarnybos rutina.
  8. Trumpai paaiškinkite pagrindinius 65C02 µP adresavimo režimus, pateiktus surinkimo kalbos instrukcijų pavyzdžiuose.
  9. a) Parašykite 6502 mašinų kalbos programą, kurioje įrašytumėte „Aš tave myliu! ASCII kodų eilutę atmintyje, pradedant nuo $0300 adreso su eilutės ilgiu. Programa turėtų prasidėti 0200 USD adresu. Gauti kiekvieną simbolį iš kaupiklio po vieną, darant prielaidą, kad juos ten siunčia kokia nors paprogramė. Taip pat programą surinkite rankomis. (Jei reikia žinoti „Aš tave myliu!“ ASCII kodus. Štai jie: „Aš“:49 16 , vieta: 20 16 , „l“: 6C 16 , „o“: 6F 16 , 'į':76 16 , „e“: 65, „y“: 79 16 , 'į':75 16 , ir „!“:21 16 (Pastaba: kiekvienas kodas užima 1 baitą).
    b) Parašykite 6502 mašinų kalbos programą, kurioje įrašytumėte „Aš tave myliu! atmintyje esančių ASCII kodų eilutė, prasidedanti nuo $0300 adreso be eilutės ilgio, bet baigiant 00 16 . Programa turėtų prasidėti 0200 USD adresu. Gaukite kiekvieną simbolį iš kaupiklio, darydami prielaidą, kad juos ten po vieną siunčia kokia nors paprogramė. Taip pat programą surinkite rankomis.