4. nodaļa: 6502 mikroprocesora montāžas valodas apmācība

4 Nodala 6502 Mikroprocesora Montazas Valodas Apmaciba



4. nodaļa: 6502 mikroprocesora montāžas valodas apmācība

4.1. Ievads

Mikroprocesors 6502 tika izlaists 1975. gadā. To izmantoja kā mikroprocesoru dažiem personālajiem datoriem, piemēram, Apple II, Commodore 64 un BBC Micro.







6502 mikroprocesors joprojām tiek ražots lielā skaitā šodien. Tas vairs nav centrālais procesors, ko mūsdienās izmanto personālajos datoros (klēpjdatoros), taču to joprojām ražo lielā skaitā un izmanto elektroniskajās un elektriskās ierīcēs. Lai izprastu modernākās datoru arhitektūras, ir ļoti noderīgi izpētīt vecāku, bet diezgan veiksmīgu mikroprocesoru, piemēram, 6502.



Tā kā tas ir vienkārši saprotams un programmējams, tas ir viens no labākajiem (ja ne labākajiem) mikroprocesoriem montāžas valodas mācīšanai. Montāžas valoda ir zema līmeņa valoda, ko var izmantot datora programmēšanai. Ņemiet vērā, ka viena mikroprocesora montāžas valoda atšķiras no cita mikroprocesora montāžas valodas. Šajā nodaļā ir aprakstīta 6502 mikroprocesora montāžas valoda. Precīzāk, tas ir 65C02, kas tiek mācīts, bet tiek vienkārši dēvēts par 6502.



Agrāk slaveno datoru sauca par commodore_64. 6502 ir 6500 saimes mikroprocesors. Commodore_64 dators izmanto 6510 mikroprocesoru. 6510 mikroprocesors ir 6500 µP. 6502 µP instrukciju kopa ir gandrīz visa no 6510 µP instrukcijām. Šīs un nākamās nodaļas zināšanas ir balstītas uz datoru commodore_64. Šīs zināšanas tiek izmantotas kā pamats, lai izskaidrotu mūsdienu datoru arhitektūru un modernās operētājsistēmas šajā tiešsaistes karjeras kursa daļā.





Datora arhitektūra attiecas uz datora mātesplates komponentiem un skaidrojumu par to, kā dati plūst katrā komponentā, jo īpaši mikroprocesorā, kā dati plūst starp komponentiem un kā dati mijiedarbojas. Datu vienskaitlis ir datum. Efektīvs veids, kā izpētīt datora datora arhitektūru, ir izpētīt mātesplates montāžas valodu.

Tiek uzskatīts, ka commodore_64 dators ir 8 bitu datora vārda dators. Tas nozīmē, ka informācija tiek glabāta, pārsūtīta un manipulēta astoņu bitu bināro kodu veidā.



Commodore 64 mātesplates blokshēma
Commodore 64 mātesplates blokshēma ir šāda:


4.1. att. Sistēmas vienības Commodore_64 blokshēma

Iedomājieties 6510 mikroprocesoru kā 6502 mikroprocesoru. Kopējā atmiņa ir baitu sērija (8 biti baitā). Ir brīvpiekļuves (lasīšanas/rakstīšanas) atmiņa, kurā var ierakstīt vai dzēst baitus. Kad dators tiek izslēgts, visa brīvpiekļuves atmiņā (RAM) esošā informācija tiek izdzēsta. Ir arī lasāmatmiņa (ROM). Kad dators tiek izslēgts, informācija ROM atmiņā paliek (netiek izdzēsta).

Ir ievades/izvades ports (shēma), kas diagrammā tiek saukts par ievades/izvades ierīcēm. Šo portu nevajadzētu sajaukt ar portiem, kas ir redzami datora sistēmas vienības kreisajā un labajā pusē vai priekšējā un aizmugurējā vertikālajā virsmā. Tās ir divas dažādas lietas. Savienojumi no šī iekšējā porta ar perifērijas ierīcēm, piemēram, cieto disku (vai disketi), tastatūru un monitoru, diagrammā nav parādīti.

Diagrammā ir trīs kopnes (ļoti mazu vadu vadu vadu grupas). Katrs vads var pārsūtīt bitu 1 vai bitu 0. Datu kopne astoņu bitu baitu pārsūtīšanai vienā reizē (viens pulksteņa impulss) uz RAM un ievades/izvades portu (ievades/izejas ierīces) ir divvirzienu. Datu kopne ir astoņus bitus plata.

Visas sastāvdaļas ir savienotas ar adrešu kopni. Adrešu kopne ir vienvirziena no mikroprocesora. Adrešu kopnei ir sešpadsmit vadītāji, un katrā ir viens bits (1 vai 0). Sešpadsmit biti tiek nosūtīti vienā pulksteņa impulsā.

Ir vadības kopne. Daži no vadības kopnes vadītājiem pārsūtītu vienu bitu no mikroprocesora uz citiem komponentiem. Dažas vadības līnijas pārnes bitus no ievades/izvades (IO) porta uz mikroprocesoru.

Datora atmiņa
RAM un ROM tiek uzskatīti par vienu atmiņas komplektu. Šis komplekts ir diagrammā attēlots šādi, kur heksadecimālajiem skaitļiem ir prefikss “$”.


4.11. att. Commodore 64 datora atmiņas izkārtojums

RAM ir no 0000 16 uz DFFF 16 kas ir rakstīts kā no $ 0000 līdz $ DFFF. Izmantojot 6502 µP montāžas valodu, heksadecimālais skaitlis tiek pievienots ar “$”, nevis ar sufiksu (abonēts) ar 16 vai H vai heksadecimālu. Jebkāda RAM informācija tiek izslēgta, kad dators tiek izslēgts. ROM sākas no USD E000 līdz USD FFFF. Tam ir apakšprogrammas, kas neizslēdzas, kad dators tiek izslēgts. Šīs apakšprogrammas ir parasti izmantotās rutīnas, kas palīdz programmēt. Lietotāja programma tos izsauc (skatiet nākamo nodaļu).

Vieta (baiti) no $ 0200 līdz $ D000 ir paredzēta lietotāju programmām. Vieta no USD D000 līdz USD DFFF ir paredzēta informācijai, kas ir tieši saistīta ar perifērijas ierīcēm (ievades/izvades ierīcēm). Šī ir daļa no operētājsistēmas. Tātad datora commodore-64 operētājsistēma sastāv no divām galvenajām daļām: daļa ROM, kas nekad neizslēdzas, un daļa no USD 000 līdz USD DFFF, kas izslēdzas, kad tiek izslēgta barošana. Šie IO (ievades/izvades) dati ir jāielādē no diska katru reizi, kad dators tiek ieslēgts. Mūsdienās šādus datus sauc par perifērijas draiveriem. Perifērijas ierīces sākas no ievades/izvades ierīces porta caur savienojumiem mātesplatē līdz identificējamiem portiem uz datora vertikālajām virsmām, kurām ir pievienots monitors, tastatūra utt., un ar pašām perifērijas ierīcēm (monitoru, tastatūru utt. .).

Atmiņa sastāv no 2 16 = 65 536 baitu vietas. Heksadecimālā formā tie ir 10 000 16 = 10 000 H = 10 000 hex = $10000 vietas. Skaitļošana otrajā, desmitajā, sešpadsmitajā utt. bāzē sākas no 0, nevis no 1. Tātad pirmā vieta faktiski ir vietas numurs 0000000000000000. 2 = 0 10 = 0000 16 = 0000 USD. 6502 µP montāžas valodā adreses atrašanās vietas identifikācija tiek apzīmēta ar $, un nav sufiksa vai apakšindeksa. Pēdējā atrašanās vieta ir vietas numurs 1111111111111111 2 = 65 535 10 = FFFF 16 = FFFF $, nevis 10000000000000000 2 , vai 65 536 10 vai 10 000 16 vai 10 000 USD. 10000000000000000 2 , 65 536 10 , 10 000 16 vai $10000 norāda kopējo baitu atrašanās vietu skaitu.

Šeit, 2 16 = 65 536 = 64 x 1024 = 64 x 2 10 = 64 KB (kilobaiti). Sufikss 64 nosaukumā Commodore-64 nozīmē 64 KB kopējās atmiņas (RAM un ROM). Viens baits ir 8 biti, un 8 biti nonāks viena baita vietā atmiņā.

64 KB atmiņa ir sadalīta lapās. Katrā lapā ir 0100 16 = 256 10 baitu atrašanās vietas. Pirmie 256 10 = pirmais 0100 16 atrašanās vietas ir 0. lapa. Otrā ir 1. lapa, trešā ir 2. lapa un tā tālāk.

Lai adresētu 65 536 atrašanās vietas, katrai vietai (adresei) ir nepieciešami 16 biti. Tātad adreses kopne no mikroprocesora uz atmiņu sastāv no 16 rindām; viena rindiņa vienam bitam. Bits ir 1 vai 0.

6502 µP reģistri
Reģistrs ir kā baitu šūnas baitu atmiņas vietai. 6502 µP ir seši reģistri: pieci 8 bitu reģistri un viens 16 bitu reģistrs. 16 bitu reģistru sauc par programmu skaitītāju, kas tiek saīsināts kā PC. Tajā ir atmiņas adrese nākamajai instrukcijai. Montāžas valodas programma sastāv no instrukcijām, kas tiek ievietotas atmiņā. Sešpadsmit (16) dažādi biti ir nepieciešami, lai adresētu noteiktu baitu vietu atmiņā. Pie noteikta pulksteņa impulsa šie biti tiek nosūtīti uz adrešu kopnes 16 bitu adrešu līnijām, lai nolasītu instrukciju. Visi 6502 µP reģistri ir attēloti šādi:


4.12. att. 6502 µP reģistri

Programmu skaitītāju vai datoru diagrammā var redzēt kā 16 bitu reģistru. Apakšējie nozīmīgie astoņi biti ir apzīmēti kā PCL, kas nozīmē Programmu skaitītājs zems. Augstāki nozīmīgie astoņi biti ir apzīmēti kā PCH, kas nozīmē programmas skaitītāju augsts. Commodore-64 atmiņas instrukcija var sastāvēt no viena, diviem vai trim baitiem. 16 biti datorā norāda uz nākamo izpildāmo instrukciju atmiņā. Starp mikroprocesora shēmām divas no tām sauc par aritmētisko loģisko vienību un instrukciju dekodētāju. Ja pašreizējā instrukcija, kas tiek apstrādāta µP (mikroprocesorā), ir vienu baitu gara, šīs divas shēmas palielina PC nākamajai instrukcijai par 1 vienību. Ja pašreizējā instrukcija, kas tiek apstrādāta µP, ir divus baitus gara, kas nozīmē, ka tā atmiņā aizņem divus secīgus baitus, šīs divas shēmas palielina PC nākamajai instrukcijai par 2 vienībām. Ja pašreizējā instrukcija, kas tiek apstrādāta µP, ir trīs baitus gara, kas nozīmē, ka tā atmiņā aizņem trīs secīgus baitus, šīs divas shēmas palielina PC nākamajai instrukcijai par 3 vienībām.

Akumulators “A” ir astoņu bitu vispārējas nozīmes reģistrs, kurā tiek glabāti vairuma aritmētisko un loģisko darbību rezultāti.

“X” un “Y” reģistri tiek izmantoti, lai uzskaitītu programmas soļus. Programmēšanā skaitīšana sākas no 0. Tātad tos sauc par indeksu reģistriem. Viņiem ir daži citi mērķi.

Lai gan Stack Pointer reģistrā, “S” ir 9 biti, kas tiek uzskatīts par astoņu bitu reģistru. Tās saturs norāda uz baitu atrašanās vietu brīvpiekļuves atmiņas (RAM) 1. lappusē. 1. lapa sākas no baita $0100 (256 10 ) uz baitu $01FF (511 10 ). Kad programma darbojas, tā atmiņā pāriet no vienas instrukcijas uz nākamo secīgo instrukciju. Tomēr tas ne vienmēr notiek. Dažkārt tas pāriet no vienas atmiņas apgabala uz citu atmiņas apgabalu, lai tur turpinātu secīgi izpildīt instrukcijas. RAM 1. lapa tiek izmantota kā steks. Kaudze ir liels RAM atmiņas apgabals, kurā ir nākamās adreses koda turpinājumam, no kurienes ir lēciens. Kodi ar pārlēkšanas instrukcijām nav kaudzē; tie ir citur atmiņā. Tomēr pēc tam, kad ir izpildītas pārejas instrukcijas, turpinājuma adreses (nevis koda segmenti) atrodas kaudzē. Viņi tur tika iegrūsti lēciena vai zara norādījumu rezultātā.

P astoņu bitu procesora statusa reģistrs ir īpašs reģistra veids. Atsevišķi biti nav saistīti vai saistīti viens ar otru. Katrs bits tiek saukts par karogu un tiek novērtēts neatkarīgi no citiem. Karogu nozīmes ir norādītas turpmāk, ja rodas nepieciešamība.

Katra reģistra pirmais un pēdējais bitu indekss ir norādīts virs katra reģistra iepriekšējā diagrammā. Bitu indeksa (pozīcijas) skaitīšana reģistrā sākas no 0 labajā pusē.

Atmiņas lapas binārajā, heksadecimālajā un decimālajā formātā
Šajā tabulā ir parādīts atmiņas lappušu sākums binārajā, heksadecimālajā un decimāldaļā:

Katrā lapā ir 1 0000 0000 2 baitu skaits, kas ir tāds pats kā 100 H baitu skaits, kas ir tāds pats kā 256 10 baitu skaits. Iepriekšējā atmiņas diagrammā lapas ir norādītas augšup no 0 lapas, nevis lejup, kā norādīts tabulā.

Šīs tabulas binārās, heksadecimālās un decimālās kolonnas norāda atmiņas baitu atrašanās vietas adreses dažādās bāzēs. Ņemiet vērā, ka nulles lapai kodēšanas laikā ir jāievada tikai apakšējā baita biti. Augstākā baita bitus var izlaist, jo tie vienmēr ir nulles (nulles lapai). Pārējām lapām ir jāizmanto augstāka baita biti.

Šīs nodaļas pārējā daļā ir izskaidrota 6502 µP montāžas valoda, izmantojot visu iepriekšējo informāciju. Lai ātri saprastu valodu, lasītājam ir jāsaskaita un jāatņem sešpadsmitā bāze, nevis bāze desmit. Faktiski tai ir jābūt otrajai bāzei, taču aprēķins otrajā bāzē ir apgrūtinošs. Atcerieties, ka, pievienojot divus skaitļus otrajā bāzē, pārnesums joprojām ir 1, tāpat kā desmitajā bāzē. Bet, atņemot divus skaitļus otrajā bāzē, aizņēmums ir divi, nevis desmit kā desmitā. Saskaitot divus skaitļus sešpadsmitajā bāzē, pārnesums joprojām ir 1, tāpat kā bāzē desmit. Bet, atņemot divus skaitļus sešpadsmitajā bāzē, aizņēmums ir sešpadsmit, nevis desmit, kā bāzē desmit.

4.2 Datu pārsūtīšanas instrukcijas

Apsveriet šādu tabulu ar montāžas valodas datu pārsūtīšanas instrukcijām 6502 µP:

Kad baits (8 biti) tiek kopēts no atmiņas baitu atrašanās vietas uz akumulatoru reģistru, X reģistru vai Y reģistru, notiek ielāde. Kad baits tiek kopēts no jebkura no šiem reģistriem uz atmiņas baita vietu, notiek pārsūtīšana. Kad baits tiek kopēts no viena reģistra uz citu, tas joprojām tiek pārsūtīts. Tabulas otrajā slejā bultiņa parāda baita kopēšanas virzienu. Pārējās četrās kolonnās ir parādīti dažādi adresācijas režīmi.

Ieraksts adresācijas režīma kolonnā ir faktiskais baita kods atbilstošajai instrukcijas mnemoniskajai daļai heksadecimālā veidā. Piemēram, AE ir faktiskais baita kods LDX, kas ielādē baitu no atmiņas uz X reģistru absolūtā adresācijas režīmā, piemēram, AE. 16 = 10101110 2 . Tātad LDX biti atmiņas baitu vietā ir 10101110.

Ņemiet vērā, ka instrukcijas LDX mnemoniskajai daļai ir trīs iespējamie baiti, kas ir A2, AE un A6, un katrs ir paredzēts noteiktam adresācijas režīmam. Ja baits, kas tiek ielādēts X reģistrā, nav jākopē no atmiņas baita atrašanās vietas, vērtība ir jāievada ar LDX mnemoniku instrukcijā heksadecimālā vai decimāldaļā. Šajā nodaļā šādas vērtības ir ievadītas heksadecimālā veidā. Šī ir tūlītēja adresēšana, tāpēc faktiskais baits atmiņā, kas attēlo LDX, ir A2 16 = 10100010 2 nevis AE 16 kas ir vienāds ar 10101110 2 .

Tabulā visi baiti zem adresācijas režīma virsrakstiem tiek saukti par darbības kodiem, kas tiek saīsināti kā opkodi. Vienai mnemonikai var būt vairāk nekā viens opkods atkarībā no adresācijas režīma.

Piezīme: Vārdam “ielādēt” datora sistēmas vienībā var būt divas nozīmes: tas var attiekties uz faila ielādi no diska datora atmiņā vai var attiekties uz baita pārsūtīšanu no atmiņas baita vietas uz mikroprocesora reģistru. .

6502 µP ir vairāk adresācijas režīmu nekā četri tabulā.

Ja nav norādīts citādi, viss lietotāja programmēšanas kods šajā nodaļā sākas ar adresi 0200 16 kas ir lietotāja apgabala sākums atmiņā.

Atmiņa M un akumulators A

Atmiņa uz akumulatoru

Tūlītēja adresācija
Sekojošā instrukcija saglabā numuru FF 16 = 255 10 akumulatorā:

LDA #$FF

“$” tiek izmantots ne tikai atmiņas adreses identificēšanai. Parasti to lieto, lai norādītu, ka nākamais skaitlis ir heksadecimāls. Šajā gadījumā $FF nav nevienas atmiņas baita vietas adrese. Tas ir cipars 255 10 heksadecimālā. Asamblejas valodas instrukcijā nedrīkst rakstīt 16. bāzi vai jebkuru citu tai līdzvērtīgu apakšindeksu. “#” norāda, ka viss, kas sekos, ir vērtība, kas jāievieto akumulatoru reģistrā. Vērtību var ierakstīt arī desmitā bāzē, taču tas šajā nodaļā nav izdarīts. “#” nozīmē tūlītēju adresāciju.

Mnemonikai ir zināma līdzība ar tai atbilstošo frāzi angļu valodā. “LDA #$FF” nozīmē ielādēt numuru 255 10 akumulatorā A. Tā kā šī ir tūlītēja adresācija no iepriekšējās tabulas, LDA ir A9, nevis AD vai A5. A9 binārā ir 101010001. Tātad, ja LDA A9 ir 0200 $ adresē atmiņā, $FF ir $ 0301 = 0300 + 1 adrese. #$FF ir tieši LDA mnemonikas operands.

Absolūtā adresācija
Ja $FF vērtība ir $0333 vietā atmiņā, iepriekšējā instrukcija ir šāda:

LDA 0333 $

Ņemiet vērā, ka # nav. Šajā gadījumā # neesamība nozīmē, ka tālāk ir atmiņas adrese, nevis interesējošā vērtība (nevis vērtība, kas jāievieto akumulatorā). Tātad LDA opkods šoreiz ir AD, nevis A9 vai A5. LDA operands šeit ir $0333 adrese, nevis $FF vērtība. $FF atrodas $0333 vietā, kas ir diezgan tālu. Instrukcija “LDA $0333” atmiņā aizņem trīs secīgas vietas, nevis divas, kā tas bija iepriekšējā attēlā. LDA “AD” atrodas 0200 ASV dolāru vietā. Apakšējais 0333 baits, kas ir 33, atrodas $0301 vietā. Augstākais baits $0333, kas ir 03, atrodas $0302 vietā. Tas ir mazs, ko izmanto 6502 montāžas valoda. Dažādu mikroprocesoru montāžas valodas ir atšķirīgas.

Šis ir absolūtas adresācijas piemērs. $0333 ir tās atrašanās vietas adrese, kurā ir $FF. Instrukcija sastāv no trim secīgiem baitiem un neietver $FF vai tā faktisko baitu atrašanās vietu.

Nulles lapas adresēšana

Pieņemsim, ka $FF vērtība ir $0050 atmiņas vietā nulles lappusē. Nulles lapas baitu atrašanās vietas sākas no USD 0000 un beidzas ar USD 00 FF. Tie ir 256 10 vietas kopā. Katra Commodore-64 atmiņas lapa ir 256 10 garš. Ņemiet vērā, ka augstākais baits ir nulle visām iespējamām vietām atmiņas nulles lappuses vietā. Nulles lapas adresācijas režīms ir tāds pats kā absolūtais adresācijas režīms, bet augstākais baits 00 instrukcijā netiek ierakstīts. Tātad, lai ielādētu $FF no $0050 atrašanās vietas akumulatorā, nulles lapas adresācijas režīma instrukcija ir šāda:

LDA 50 $

Ja LDA ir A5, nevis A9 vai AD, A5 16 = 10100101 2 . Atcerieties, ka katrs baits atmiņā ir no 8 šūnām, un katrā šūnā ir mazliet. Šeit sniegtā instrukcija sastāv no diviem secīgiem baitiem. LDA A5 atrodas $0200 atmiņas vietā un $50 adrese bez augstākā baita 00 atrodas $0301 vietā. 00 neesamība, kas būtu patērējusi baitu kopējā 64 K atmiņā, ietaupa atmiņas vietu.

Akumulators uz atmiņu

Absolūtā adresācija
Šī instrukcija kopē baita vērtību neatkarīgi no tā, no akumulatora uz atmiņas vietu 1444 $:

TIE ir 1444 USD

Tiek uzskatīts, ka tas tiek pārsūtīts no akumulatora uz atmiņu. Tas netiek ielādēts. Iekraušana ir pretēja. Opkoda baits STA ir 8D 16 = 10001101 2 . Šī instrukcija sastāv no trim secīgiem baitiem atmiņā. 8D 16 atrodas $0200 vietā. 44 16 no $1444 adreses atrodas $0201 vietā. Un 14 16 atrodas $ 0202 vietā - maz endianness. Faktiskais baits, kas tiek kopēts, nav daļa no instrukcijas. Šeit STA izmanto 8D, nevis 85 nulles lapas adresēšanai (tabulā).

Nulles lapas adresēšana
Šī instrukcija kopē baita vērtību neatkarīgi no tā, no akumulatora uz atmiņas vietu 0050 $ nulles lappusē:

STA 0050 $

Opkoda baits STA šeit ir 85 16 = 10000101 2 . Šī instrukcija sastāv no diviem secīgiem baitiem atmiņā. 85 16 atrodas vietā $0200. 50 16 no $0050 adreses atrodas vietā $0201. Jautājums par endialitāti šeit nerodas, jo adresei ir tikai viens baits, kas ir zemākais baits. Faktiskais baits, kas tiek kopēts, nav daļa no instrukcijas. Šeit STA izmanto 85, nevis 8D nulles lapas adresēšanai.

Nav jēgas izmantot tūlītējo adresēšanu, lai pārsūtītu baitu no akumulatora uz vietu atmiņā. Tas ir tāpēc, ka faktiskā vērtība, piemēram, $FF, ir jānorāda tūlītējās adresācijas instrukcijā. Tātad tūlītēja adresēšana nav iespējama, lai pārsūtītu baitu vērtību no µP reģistra uz jebkuru atmiņas vietu.

LDX, STX, LDY un STY mnemonika
LDX un STX ir līdzīgi attiecīgi LDA un STA. Bet šeit tiek izmantots X reģistrs, nevis A (akumulatora) reģistrs. LDY un STY ir līdzīgi attiecīgi LDA un STA. Bet šeit tiek izmantots Y reģistrs, nevis A reģistrs. Skatiet 4.21. tabulu par katru operācijas kodu heksadecimālā veidā, kas atbilst noteiktam mnemoniskam un noteiktam adresācijas režīmam.

Pārskaitījumi no reģistra uz reģistrāciju
Iepriekšējās divas instrukciju kopas 4.21. tabulā attiecas uz atmiņas/mikroprocesora-reģistra kopēšanu (pārsūtīšanu) un reģistra/reģistra kopēšanu (pārsūtīšanu). TAX, TXA, TAY, TYA, TSX un TXS instrukcijas veic kopēšanu (pārsūtīšanu) no mikroprocesora reģistra uz citu tā paša mikroprocesora reģistru.

Lai kopētu baitu no A uz X, instrukcija ir šāda:

NODOKLIS

Lai kopētu baitu no X uz A, instrukcija ir:

TX

Lai kopētu baitu no A uz Y, instrukcija ir šāda:

ROKA

Lai kopētu baitu no Y uz A, instrukcija ir šāda:

TYA

Commodore 64 datoram kaudze ir 1. lapa tieši pēc 0. lappuses atmiņā. Tāpat kā visas citas lapas, tā sastāv no 25610 10 baitu atrašanās vietas, no $ 0100 līdz $ 01FF. Parasti programma izpilda no vienas instrukcijas uz nākamo secīgo instrukciju atmiņā. Ik pa laikam notiek pārlēciens uz citu atmiņas koda (instrukciju kopas) segmentu. Atmiņā (RAM) esošajā steka apgabalā ir nākamo instrukciju adreses, no kurienes tika pārtraukti lēcieni (vai atzarojumi), lai turpinātu programmu.

Steka rādītājs “S” ir 9 bitu reģistrs 6502 µP. Pirmais bits (pa kreisi) vienmēr ir 1. Visas baitu atrašanās vietas adreses pirmajā lapā sākas ar 1, kam seko 8 dažādi biti 256. 10 vietas. Steka rādītājam ir 1. lappusē esošās atrašanās vietas adrese, kurā ir nākamās instrukcijas adrese, kas programmai jāatgriež un jāturpina pēc pašreizējā (pārlēktā) koda segmenta izpildes. Tā kā visu steka adrešu pirmais bits (pirmā lapa) sākas ar 1, steka rādītāja reģistrā ir jāietver tikai atlikušie astoņi biti. Galu galā tā pirmais bits, kas ir vistālāk kreisais bits (devītais bits, skaitot no labās puses), vienmēr ir 1.

Lai kopētu baitu no S uz X, instrukcija ir šāda:

TSX

Lai kopētu baitu no X uz S, instrukcija ir šāda:

TXT

Instrukcijas no reģistra uz reģistru neņem nekādus operandus. Tie sastāv tikai no mnemonikas. Katrai mnemonikai ir savs operācijas kods heksadecimālā formātā. Tas ir netiešā adresācijas režīmā, jo nav operanda (nav atmiņas adreses, nav vērtības).

Piezīme: Nav X uz Y vai Y uz X pārsūtīšanas (kopēšanas).

4.3. Aritmētiskās darbības

Ķēde, aritmētiskā loģiskā vienība 6502 µP, var pievienot tikai divus astoņu bitu skaitļus vienlaikus. Tas neatņem, nereizina un nedala. Šajā tabulā ir parādīti aritmētisko darbību opkodi un adresācijas režīmi:

Piezīme: Visas mnemonikas aritmētiskajām operācijām un cita veida operācijām (t.i., visas 6502 mnemonikas) aizņem vienu baitu darbības (op) kodu. Ja mnemonikai ir vairāk nekā viens adresācijas režīms, vienai un tai pašai mnemonikai ir dažādi opkodi: viens katram adresācijas režīmam. C, D un V tabulā ir statusa reģistra karodziņi. To nozīme tiks sniegta vēlāk, kad radīsies vajadzība.

Neparakstītu ciparu pievienošana
Izmantojot 6502 µP, parakstītie skaitļi ir divu komplementa skaitļi. Neparakstītie skaitļi ir parasti pozitīvi skaitļi, kas sākas no nulles. Tātad astoņu bitu baitam mazākais neparakstītais skaitlis ir 00000000 2 = 0 10 = 00 16 un lielākais neparakstītais numurs ir 11111111 2 = 255 10 = FF 16 . Diviem neparakstītiem numuriem pievienojums ir šāds:

A+M+C→A

Tas nozīmē, ka aritmētiskā loģiskā vienība pievieno akumulatora 8 bitu saturu baitam (8 bitiem) no atmiņas. Pēc A un M pievienošanas pārnēsāšana uz devīto bitu tiek pārsūtīta uz pārnešanas karoga šūnu statusa reģistrā. Jebkurš iepriekšējais pārnēsāšanas bits no iepriekšējā pievienošanas, kas statusa reģistrā joprojām atrodas pārneses karoga šūnā, arī tiek pievienots A un M summai, veidojot A+M+C→A. Rezultāts tiek ievietots atpakaļ akumulatorā.

Ja interesējošais papildinājums ir:

A + M

Un nav nepieciešams pievienot iepriekšēju pārnēsāšanu, ir jānotīra pārnēsāšanas karogs, kas ir 0, lai papildinājums būtu:

A+M+0→A tas pats, kas A+M→A

Piezīme: Ja M tiek pievienots A un tiek pārnests 1, jo rezultāts ir lielāks par 255 10 = 11111111 2 = FF 16 , šis ir jauns pārvadājums. Šis jaunais 1 pārnēsājums tiek automātiski nosūtīts uz pārnešanas karoga šūnu, ja tas ir nepieciešams nākamajam astoņu bitu pārim, kas jāsaskaita (vēl viens A +M).

Kods divu neparakstītu astoņu bitu pievienošanai
00111111 2 +00010101 2 ir tāds pats kā 3F 16 + 15 16 kas ir tāds pats kā 63 10 +21 10 . Rezultāts ir 010101002 2 kas ir tāds pats kā 54 16 un 84 10 . Rezultāts nepārsniedz maksimālo astoņu bitu skaitu, kas ir 255 10 = 11111111 2 = FF 16 . Tātad, nav iegūta pārnesuma 1. Citiem vārdiem sakot, iegūtais pārnēsājums ir 0. Pirms pievienošanas nav iepriekšēja pārnesuma 1. Citiem vārdiem sakot, iepriekšējais pārnesums ir 0. Kods, lai veiktu šo pievienošanu. var būt:

CLC
LDA#$3F
ADC # 15 $

Piezīme: Ievadot montāžas valodu, katras instrukcijas beigās tiek nospiests tastatūras taustiņš “Enter”. Šajā kodā ir trīs norādījumi. Pirmā instrukcija (CLC) notīra pārnēsāšanas karogu, ja iepriekšējam papildinājumam ir 1. CLC var veikt tikai netiešās adresācijas režīmā. Mnemonika netiešajam adresācijas režīmam neizmanto operandu. Tas notīra P statusa reģistra pārnēsāšanas šūnu. Notīrīšana nozīmē bita 0 piešķiršanu pārnēsāšanas karoga šūnai. Nākamajos divos koda norādījumos tiek izmantots tūlītējās adresācijas režīms. Izmantojot tūlītēju adresēšanu, mnemonikai ir tikai viens operands, kas ir skaitlis (un ne atmiņas, ne reģistra adrese). Tātad, pirms skaitļa ir jāieraksta “#”. “$” nozīmē, ka sekojošais skaitlis ir heksadecimāls.

Otrajā instrukcijā tiek ielādēts skaitlis 3F 16 akumulatorā. Trešajai instrukcijai µP aritmētiskās loģiskās vienības ķēde ņem iepriekšējo (notīrīto) pārneses karoga šūnas 0 (piespiedu kārtā 0) pārnesumu statusa reģistrā un pievieno to 15. 16 kā arī uz vērtību, kas jau ir 3F 16 akumulatoru un visu rezultātu ievieto atpakaļ akumulatorā. Šajā gadījumā tiek iegūts 0 pārnēsājums. ALU (Aritmētiskā loģiskā vienība) nosūta (ievieto) 0 statusa reģistra pārnešanas karoga šūnā. Procesora statusa reģistrs un statusa reģistrs nozīmē vienu un to pašu. Ja rezultāts ir 1, ALU nosūta 1 statusa reģistra pārnešanas karogam.

Trīs iepriekšējā koda rindām ir jābūt atmiņā, pirms tās tiek izpildītas. Operatīvais kods 1816 CLC (implied addressing) atrodas 0200 USD baitu vietā. Operācijas kods A9 16 LDA (tūlītēja adresācija) atrodas $0201 baita vietā. Skaitlis 3F 10 atrodas $0202 baitu vietā. Opkods 69 16 LDA (tūlītēja adresācija) atrodas 0203 $ baitu vietā. Skaitlis 15 10 atrodas $0204 baitu vietā.

Piezīme: LDA ir pārsūtīšanas (slodzes) instrukcija, nevis aritmētiska instrukcija (mnemonika).

Kods divu neparakstītu sešpadsmit bitu pievienošanai
Visi 6502 µP reģistri būtībā ir astoņu bitu reģistri, izņemot datoru (programmu skaitītāju), kas ir 16 biti. Pat statusa reģistrs ir 8 bitus plats, lai gan tā astoņi biti nedarbojas kopā. Šajā sadaļā tiek apsvērta divu 16 neparakstītu bitu pievienošana ar pārnešanu no pirmā astoņu bitu pāra uz otro astoņu bitu pāri. Intereses pārnešana šeit ir pārnešana no astotā bita pozīcijas uz devīto bitu.

Ļaujiet skaitļiem būt 0010101010111111 2 = 2ABF16 16 = 10 943 10 un 0010101010010101 2 = 2A95 16 = 10 901 10 . Summa ir 0101010101010100 2 = 5554 16 = 21 844 10 .

Šo divu neparakstīto skaitļu pievienošana otrajā bāzē ir šāda:

Nākamajā tabulā parādīts tas pats papildinājums ar 1 pārnesi no astotā bita uz devīto bitu, sākot no labās puses:

Kodējot to, vispirms tiek pievienoti divi zemākie baiti. Pēc tam ALU (aritmētiskā loģiskā vienība) nosūta 1 pārnešanu no astotā bita pozīcijas uz devīto bitu pozīciju statusa reģistra pārneses karoga šūnai. Rezultāts 0 1 0 1 0 1 0 0 bez pārnēsāšanas nonāk akumulatorā. Pēc tam otrais baitu pāris tiek pievienots pārnēsāšanai. ADC mnemonika nozīmē automātisku pievienošanu ar iepriekšējo pārnēsāšanu. Šajā gadījumā iepriekšējo pārnesumu, kas ir 1, nedrīkst mainīt pirms otrās pievienošanas. Pirmajam papildinājumam, jo ​​neviens iepriekšējais pārnēsājums nav šī pilnā papildinājuma daļa, tas ir jādzēš (jānorāda 0).

Lai pilnībā pievienotu divus baitu pārus, pirmais papildinājums ir:

A + M + 0 -> A

Otrais papildinājums ir:

A + M + 1 -> A

Tātad pārnēsāšanas karogs ir jānotīra (norādīta vērtība 0) tieši pirms pirmās pievienošanas. Sekojošā programma, kuras skaidrojums lasītājam jāizlasa, šai summēšanai izmanto absolūto adresācijas režīmu:

CLC
LDA 0213 $
ADC 0215 $
; bez klīringa, jo ir nepieciešama pārnešanas karoga vērtība
STA 0217 ASV dolāri
LDA 0214 $
ADC 0216 $
STA 0218 ASV dolāri

Ņemiet vērā, ka 6502 montāžas valodā komentārs sākas ar semikolu. Tas nozīmē, ka programmas izpildē semikolu un visu, kas atrodas tā labajā pusē, tiek ignorēts. Iepriekš uzrakstītā programma atrodas teksta failā, tiek saglabāta ar programmētāja izvēlēto nosaukumu un paplašinājumu.asm. Iepriekšējā programma nav precīza programma, kas iet uz atmiņu izpildei. Atbilstošo programmu atmiņā sauc par tulkoto programmu, kurā mnemonika tiek aizstāta ar opkodiem (baitiem). Jebkurš komentārs paliek montāžas valodas teksta failā un tiek noņemts, pirms tulkotā programma nonāk atmiņā. Faktiski šodien diskā ir saglabāti divi faili: “.asm” fails un “.exe” fails. “.asm” fails ir tas, kas redzams iepriekšējā attēlā. Fails “.exe” ir “.asm” fails, kurā ir noņemti visi komentāri un visas mnemonikas ir aizstātas ar to opkodiem. Atverot teksta redaktorā, “.exe” fails nav atpazīstams. Ja nav norādīts citādi, šīs nodaļas vajadzībām fails “.exe” tiek kopēts atmiņā, sākot no $0200 atrašanās vietas. Šī ir otra iekraušanas nozīme.

Divi pievienojamie 16 bitu skaitļi absolūtai adresēšanai atmiņā aizņem četrus baitus: divus baitus uz numuru (atmiņa ir baitu secība). Izmantojot absolūto adresēšanu, operands uz operāciju ir atmiņā. Summēšanas rezultāts ir divus baitus plats, un tas arī ir jāievieto atmiņā. Tas kopā dod 6 10 = 6 16 baiti ievadei un izvadei. Ievades nav no tastatūras, un izvade nav no monitora vai printera. Ieejas atrodas atmiņā (RAM), un izvade (summēšanas rezultāts) šajā situācijā tiek atgriezta atmiņā (RAM).

Pirms programmas izpildes, tulkotajai versijai vispirms ir jābūt atmiņā. Apskatot iepriekšējo programmas kodu, redzams, ka instrukcijas bez komentāra veido 19 10 = 13 16 baiti. Tātad programma aizņem no 0200 $ baitu atrašanās vietas atmiņā līdz $ 0200 + $ 13 - $ 1 = $ 0212 baitu vietām (sākot no $ 0200 un nevis no $ 0201, kas nozīmē - $ 1). Pievienojot 6 baitus ievades un izvades numuriem, visa programma beidzas ar $0212 + $6 = $0218. Programmas kopējais garums ir 19 16 = 25 10 .

Augenda zemākajam baitam ir jāatrodas adresē $0213, un tā paša augenda augstākajam baitam jābūt $0214 adresē — maz endianness. Līdzīgi papildinājuma zemākajam baitam ir jāatrodas adresē $0215, un tā paša papildinājuma augstākajam baitam jābūt $0216 adresē — mazs endianness. Zemākajam rezultāta baitam (summai) jābūt $0217 adresē, un tā paša rezultāta augstākajam baitam jābūt $0218 adresē – maz endianness.

Opkods 18 16 CLC (implied addressing) ir baita vietā 0200 USD. Opkods “LDA $0213”, t.i., AD 16 LDA (absolūtā adresācija) atrodas baita vietā $0201. Papildinājuma apakšējais baits, kas ir 10111111, atrodas 0213 $ atmiņas baita vietā. Atcerieties, ka katrs operācijas kods aizņem vienu baitu. “LDA $0213” adrese “$0213” ir $0202 un $0203 baitu vietās. Instrukcija “LDA $0213” ielādē akumulatorā palielinātāja apakšējo baitu.

Opkods “ADC $0215”, t.i., 6D 16 ADC (absolūtā adresācija) atrodas baita vietā $0204. Papildinājuma apakšējais baits, kas ir 10010101, atrodas $0215 baita vietā. 'ADC $0215' adrese '$0215' atrodas $0205 un $0206 baitu vietās. Instrukcija “ADC $0215” pievieno papildinājuma apakšējo baitu augenda apakšējam baitam, kas jau atrodas akumulatorā. Rezultāts tiek ievietots atpakaļ akumulatorā. Jebkurš pārnēsājums pēc astotā bita tiek nosūtīts uz statusa reģistra pārnešanas karogu. Pārnēsāšanas karoga šūnu nedrīkst notīrīt pirms otrās augstāko baitu pievienošanas. Šis pārnesums tiek automātiski pievienots augstāko baitu summai. Faktiski 0 pārnēsāšana tiek automātiski pievienota zemāko baitu summai sākumā (līdzvērtīgi pārnēsāšanas nepievienošanai) CLC dēļ.

Komentārs aizņem nākamos 48 10 = 30 16 baiti. Tomēr tas paliek tikai “.asm” teksta failā. Tas nesasniedz atmiņu. To noņem tulkojums, ko veic montētājs (programma).

Nākamajai instrukcijai, kas ir “STA $0217”, STA operācijas kods ir 8D 16 (absolūtā adresēšana) atrodas $0207 baita vietā. 'STA $0217' adrese '$0217' atrodas $0208 un $0209 atmiņas vietās. Instrukcija “STA $0217” kopē akumulatora astoņu bitu saturu atmiņas vietā $0217.

Papildinājuma augstākais baits, kas ir 00101010, atrodas 0214 $ atmiņas vietā, un papildinājuma augstākais baits, kas ir 00101010, atrodas 02 $ baita vietā. 16 . Opkods “LDA $0214”, kas ir AD16 LDA (absolūtā adresācija), atrodas baita vietā $020A. 'LDA $0214' adrese '$0214' atrodas $020B un $020C atrašanās vietās. Instrukcija “LDA $0214” ielādē akumulatorā augstāko palielinātāja baitu, dzēšot visu, kas atrodas akumulatorā.

Opkods “ADC $0216”, kas ir 6D 16 ADC (absolūtā adresācija) atrodas $020D baita vietā. “ADC 0216” adrese “$0216” atrodas $020E un $020F baitu vietās. Instrukcija “ADC $0216” pievieno augstāko pievienošanas baitu augend augstākajam baitam, kas jau atrodas akumulatorā. Rezultāts tiek ievietots atpakaļ akumulatorā. Ja ir pārnesums 1, šim otrajam papildinājumam tas tiek automātiski ievietots statusa reģistra pārnēsāšanas šūnā. Lai gan šīs problēmas risināšanai nav nepieciešama pārnešana, kas pārsniedz sešpadsmito bitu (pa kreisi), ir patīkami pārbaudīt, vai pārnešana ir 1, pārbaudot, vai pārnēsāšanas karodziņš kļuva par 1.

Nākamajai un pēdējai instrukcijai, kas ir “STA $0218”, STA operācijas kods, kas ir 8D16 (absolūtā adresācija), atrodas $0210 baita vietā. 'STA $0218' adrese '$0218' atrodas $0211 un $0212 atmiņas vietās. Instrukcija “STA $0218” kopē akumulatora astoņu bitu saturu uz atmiņas vietu $0218. Divu sešpadsmit bitu skaitļu pievienošanas rezultāts ir 0101010101010100, ar zemāko baitu 01010100 atmiņas vietā 0217 $ un augstāko baitu 01010101 atmiņas vietā $ 0218 — maz endianness.

Atņemšana
Izmantojot 6502 µP, parakstītie skaitļi ir divu komplementa skaitļi. Divu komplementa skaitlis var būt astoņi biti, sešpadsmit biti vai jebkurš astoņu bitu daudzkārtnis. Ar divu papildinājumu pirmais bits no kreisās puses ir zīmes bits. Pozitīvam skaitlim šis pirmais bits ir 0, lai norādītu zīmi. Pārējie biti veido skaitli parastajā veidā. Lai iegūtu negatīva skaitļa divu komplementu, apgrieziet visus attiecīgā pozitīva skaitļa bitus un pēc tam pievienojiet 1 rezultātam no labā gala.

Lai atņemtu vienu pozitīvu skaitli no cita pozitīva skaitļa, apakšdaļa tiek pārveidota par divu komplementa negatīvo skaitli. Pēc tam minuend un jaunais negatīvais skaitlis tiek pievienots parastajā veidā. Tātad astoņu bitu atņemšana kļūst:

Kur pārnesums tiek pieņemts kā 1. Rezultāts akumulatorā ir divu komplementa starpība. Tātad, lai atņemtu divus skaitļus, ir jāiestata pārnēsāšanas karogs (izveidots uz 1).

Atņemot divus sešpadsmit bitu skaitļus, atņemšana tiek veikta divreiz tāpat kā ar divu sešpadsmit bitu skaitļu pievienošanu. Tā kā atņemšana ir saskaitīšanas veids ar 6502 µP, atņemot divus sešpadsmit bitu skaitļus, pārnešanas karodziņš tiek iestatīts tikai vienu reizi pirmajai atņemšanai. Otrajai atņemšanai jebkurš pārnēsāšanas karoga iestatījums tiek veikts automātiski.

Atņemšanas programmēšana astoņu bitu skaitļiem vai sešpadsmit bitu skaitļiem tiek veikta līdzīgi kā saskaitīšanas programmēšana. Tomēr nēsāšanas karogs ir jāuzstāda pašā sākumā. Mnemonika, lai to izdarītu, ir:

Atņemšana ar sešpadsmit bitu pozitīviem skaitļiem
Apsveriet atņemšanu ar šādiem skaitļiem:

Šī atņemšana neietver divu papildinājumu. Tā kā atņemšana 6502 µP tiek veikta divu komplementā, atņemšana otrajā bāzē tiek veikta šādi:

Abu komplementa rezultāts ir tāds pats kā rezultāts, kas iegūts no parastās atņemšanas. Tomēr ņemiet vērā, ka 1, kas iet uz septiņpadsmito bitu pozīciju no labās puses, tiek ignorēts. Minuend un apakšrinda ir sadalīta divos astoņu bitos. Divu apakšrindas apakšējā baita papildinājums 10010110 tiek noteikts neatkarīgi no tā augstākā baita un jebkura pārnešanas. Divu apakšrindas augstākā baita papildinājums 11101011 tiek noteikts neatkarīgi no tā apakšējā baita un jebkāda pārnešanas.

Minuend 16 biti jau ir divu komplementā, sākot ar 0 no kreisās puses. Tātad tai nav nepieciešama nekāda pielāgošana bitos. Izmantojot 6502 µP, zemākais baits bez izmaiņām tiek pievienots apakšdaļas divu komplementa apakšējam baitam. Apakšējais minuend baits netiek pārveidots divu komplementā, jo visa minuend sešpadsmit bitiem jau ir jābūt divu komplementā (ar 0 kā pirmo bitu kreisajā pusē). Šajā pirmajā papildinājumā tiek pievienots obligātais pārnēsāšanas rādītājs 1, ņemot vērā 1=0 SEC instrukciju.

Pašreizējā efektīvajā atņemšanā ir 1 (saskaitīšanas) pārnešana no astotā bita uz devīto bitu (no labās puses). Tā kā šī faktiski ir atņemšana, jebkurš bits, kuram statusa reģistrā ir jābūt pārneses karogā, tiek papildināts (apgriezts). Tātad 1 pārnesums C karogā kļūst par 0. Otrajā darbībā augstākais minuend baits tiek pievienots apakšdaļas augstākajam divu komplementa baitam. Tiek pievienots arī automātiski papildinātais statusa reģistra pārneses karoga bits (šajā gadījumā ir 0) (augstākiem baitiem). Jebkurš 1, kas pārsniedz sešpadsmito bitu no labās puses, tiek ignorēts.

Nākamā lieta ir vienkārši iekodēt visu šo shēmu šādi:

SEC
LDA 0213 $
SBC 0215 $
; bez klīringa, jo ir nepieciešama apgrieztā pārvadāšanas karoga vērtība
STA 0217 ASV dolāri
LDA 0214 $
SBC 0216 $
STA 0218 ASV dolāri

Atcerieties, ka 6502 montāžas valodā komentārs sākas ar semikolu, kas nav iekļauts tulkotās programmas versijā atmiņā. Divi 16 bitu skaitļi atņemšanai aizņem četrus baitus atmiņas ar absolūtu adresāciju; divi uz numuru (atmiņa ir baitu sērija). Šīs ievades nav no tastatūras. Summēšanas rezultāts ir divi baiti, un arī tas ir jāievieto atmiņā citā vietā. Šī izvade nenonāk monitorā vai printerī; tas paliek atmiņā. Tas kopā dod 6 10 = 6 16 baiti ieejām un izvadēm, kas jāievieto atmiņā (RAM).

Pirms programmas izpildes tai vispirms ir jāatrodas atmiņā. Apskatot programmas kodu, redzams, ka instrukcijas bez komentāra veido 19 10 = 13 16 baiti. Tā kā visas programmas šajā nodaļā sākas no atmiņas vietas $0200, programma pāriet no $0200 baitu atrašanās vietas atmiņā līdz $0200 + $13 - $1 = $0212 baitu vietai (sākot no $0200, nevis $0201). Šis diapazons neietver ievades un izvades baitu reģionu. Divi ievades numuri aizņem 4 baitus, un viens izvades numurs aizņem 2 baitus. Pievienojot 6 baitus ievades un izvades numuriem, tiek izveidots programmas diapazons, kas beidzas ar USD 0212 + USD 6 = USD 0218. Programmas kopējais garums ir 19 16 = 25 10 .

Apakšējam minuenda baitam ir jāatrodas adresē $0213, un tā paša minuenda augstākajam baitam jāatrodas $0214 adresē — maz endianness. Līdzīgi apakšdaļas zemākajam baitam ir jāatrodas adresē $0215, bet tās pašas apakšdaļas augstākajam baitam jābūt $0216 adresē — maz endianness. Zemākajam rezultāta baitam (starpībai) jābūt $0217 adresē, un tā paša rezultāta augstākajam baitam jābūt $0218 adresē – maz endianness.

Opkods 38 16 SEC (implied addressing) ir USD 0200 adresē. Tiek pieņemts, ka visas šajā nodaļā iekļautās programmas sākas no 0200 $ atmiņas vietas, anulējot jebkuru programmu, kas tur būtu bijusi; ja vien nav norādīts citādi. Opkods “LDA $0213”, t.i., AD 16 , LDA (absolūtā adresācija) atrodas $0201 baita vietā. Apakšējais minuend baits, kas ir 10111111, atrodas atmiņas baita vietā 0213 $. Atcerieties, ka katrs operācijas kods aizņem vienu baitu. “LDA $0213” adrese “$0213” ir $0202 un $0203 baitu vietās. Instrukcija “LDA $0213” akumulatorā ielādē minuenda apakšējo baitu.

Opkods “SBC $0215”, t.i., ED 16 , SBC (absolūtā adresācija) atrodas $0204 baitu vietā. Apakšdaļas apakšējais baits, kas ir 01101010, atrodas $0215 baitu vietā. 'ADC $0215' adrese '$0215' atrodas $0205 un $0206 baitu vietās. Instrukcija “SBC $0215” atņem apakšdaļas apakšējo baitu no akumulatorā jau esošā minuend apakšējā baita. Šī ir divu komplementa atņemšana. Rezultāts tiek ievietots atpakaļ akumulatorā. Jebkura pārnešanas papildinājums (inversija) pēc astotā bita tiek nosūtīts uz statusa reģistra pārnešanas karogu. Šo pārnešanas karogu nedrīkst notīrīt pirms otrās atņemšanas ar augstākiem baitiem. Šis pārnesums tiek automātiski pievienots augstāko baitu atņemšanai.

Komentārs aizņem nākamos 57 10 = 3916 16 baiti. Tomēr tas paliek tikai “.asm” teksta failā. Tas nesasniedz atmiņu. To noņem tulkojums, ko veic montētājs (programma).

Nākamajai instrukcijai, kas ir “STA $0217”, STA operācijas kods, t.i., 8D 16 (absolūtā adresēšana), atrodas $0207 baitu vietā. 'STA $0217' adrese '$0217' atrodas $0208 un $0209 atmiņas vietās. Instrukcija “STA $0217” kopē akumulatora astoņu bitu saturu atmiņas vietā $0217.

Augstākais minuend baits, kas ir 00101010, atrodas atmiņas vietā $0214, un apakšdaļas augstākais baits, kas ir 00010101, atrodas $0216 baita vietā. Opkods “LDA $0214”, t.i., AD 16 LDA (absolūtā adresācija) atrodas 020 A $ baitu vietā. 'LDA $0214' adrese '$0214' atrodas $020B un $020C atrašanās vietās. Instrukcija “LDA $0214” ielādē augstāko minuenda baitu akumulatorā, dzēšot visu, kas atrodas akumulatorā.

Opkods “SBC $0216”, t.i., ED 16 SBC (absolūtā adresācija) atrodas 020 D $ baitu vietā. 'SBC $0216' adrese '$0216' atrodas $020E un $020F baitu vietās. Instrukcija “SBC $0216” atņem apakšdaļas augstāko baitu no augstākā baita miniendā (divu papildinājums), kas jau atrodas akumulatorā. Rezultāts tiek ievietots atpakaļ akumulatorā. Ja šai otrajai atņemšanai ir pārnesums 1, tā papildinājums tiek automātiski ievietots statusa reģistra pārnēsāšanas šūnā. Lai gan pārnešana, kas pārsniedz sešpadsmito bitu (pa kreisi), šai problēmai nav nepieciešama, ir patīkami pārbaudīt, vai notiek komplementa pārnešana, pārbaudot pārnešanas karogu.

Nākamajai un pēdējai instrukcijai, kas ir “STA $0218”, STA operācijas kods, t.i., 8D 16 (absolūtā adresācija), atrodas $0210 baitu vietā. 'STA $0218' adrese '$0218' atrodas $0211 un $0212 atmiņas vietās. Instrukcija “STA $0218” kopē akumulatora astoņu bitu saturu uz atmiņas vietu $0218. Atņemšanas rezultāts ar diviem sešpadsmit bitu skaitļiem ir 0001010101010101 ar zemāko baitu 01010101 atmiņas vietā $0217 un augstāko baitu 00010101 atmiņas vietā $0218 – mazs endianness.

6502 µP ir shēma tikai saskaitīšanai un netiešai abu komplementa atņemšanai. Tam nav shēmas reizināšanai un dalīšanai. Lai veiktu reizināšanu un dalīšanu, ir jāuzraksta montāžas valodas programma ar detaļām, tostarp daļēju reizinājumu un daļēju dividenžu pārvietošanu.

4.4. Loģiskās darbības

Izmantojot 6502 µP, VAI mnemonika ir ORA un ekskluzīvam VAI mnemonika ir EOR. Ņemiet vērā, ka loģiskajām operācijām nav netiešās adresācijas. Netiešai adresācijai nav nepieciešams operands. Katram no loģiskajiem operatoriem ir jāņem divi operandi. Pirmais atrodas akumulatorā, bet otrais ir atmiņā vai instrukcijā. Rezultāts (8 biti) tiek atgriezts akumulatorā. Pirmais akumulatorā tiek vai nu ievietots ar tūlītēju instrukciju, vai arī tiek kopēts no atmiņas ar absolūtu adresāciju. Šajā sadaļā ilustrācijai tiek izmantota tikai nulles lapas adrese. Visi šie loģiskie operatori ir Bitwise operatori.

UN
Tālāk esošajā tabulā ir parādīts Bitwise AND binārajā, heksadecimālajā un decimāldaļā:

Visām šajā nodaļā minētajām programmām jāsākas ar 0200 USD atmiņas baitu. Tomēr šīs sadaļas programmas ir nulles lapā, lai ilustrētu nulles lapas izmantošanu bez augstākā baita 00000000 2 . Iepriekšējo UN var kodēt šādi:

LDA #$9A ; ne no atmiņas – tūlītēja uzrunāšana
UN #$CD ; ne no atmiņas – tūlītēja uzrunāšana
STA 30 USD; veikalos $88 par nulles bāzi $0030

VAI
Tālāk esošajā tabulā ir parādīts Bitwise OR binārā, heksadecimālā un decimāldaļā.

LDA #$9A ; ne no atmiņas – tūlītēja uzrunāšana
ORA #$CD ; ne no atmiņas – tūlītēja uzrunāšana
STA 30 USD; uzglabā $CF par nulles bāzi $0030

BEZMAKSAS
Nākamajā tabulā ir parādīts bitu XOR binārā, heksadecimālā un decimāldaļa:

LDA #$9A ; ne no atmiņas – tūlītēja uzrunāšana
EOR #$CD ; ne no atmiņas – tūlītēja uzrunāšana
STA 30 USD; veikalos $57 par nulles bāzi $0030

4.5. Pārslēgšanas un pagriešanas darbības

Pārslēgšanas un pagriešanas operatoru mnemonika un operāciju kodi ir:

ASL: pārbīdiet pa kreisi vienu akumulatora vai atmiņas vietas bitu, ievietojot 0 atbrīvotajā galējā labajā šūnā.

LSR: pārbīdiet pa labi vienu akumulatora vai atmiņas vietas bitu, ievietojot 0 atbrīvotajā galējā kreisajā šūnā.
ROL: pagrieziet vienu bitu pa kreisi no akumulatora vai atmiņas vietas, ievietojot kreisajā pusē izmesto bitu atbrīvotajā galējā labajā šūnā.
ROR: pagrieziet vienu bitu pa labi no akumulatora vai atmiņas vietas, ievietojot labajā pusē izmesto bitu atbrīvotajā galējā kreisajā šūnā.

Lai veiktu maiņu vai rotāciju ar akumulatoru, instrukcija ir aptuveni šāda:

LSR A

Tas izmanto citu adresācijas režīmu, ko sauc par akumulatora adresācijas režīmu.

Lai veiktu maiņu vai pagriešanu ar baitu atmiņas vietu, instrukcija ir aptuveni šāda:

ROR $ 2BCD

Kur 2BCD ir atmiņas vieta.

Ņemiet vērā, ka pārslēgšanai vai pagriešanai nav tūlītējas vai netiešas adresācijas režīma. Nav tūlītējas adresācijas režīma, jo nav jēgas pārvietot vai pagriezt numuru, kas paliek tikai instrukcijā. Nav netieša adresācijas režīma, jo 6502 µP dizaineri vēlas, lai tiktu pārvietots vai pagriezts tikai akumulatora saturs (A reģistrs) vai atmiņas baita vieta.

4.6. Relatīvās adresācijas režīms

Mikroprocesors vienmēr palielina (par 1, 2 vai 3 vienībām) programmu skaitītāju (PC), lai norādītu uz nākamo izpildāmo instrukciju. 6502 µP ir instrukcija, kuras mnemonika ir BVS, kas nozīmē atzarojumu pārplūdes komplektā. Dators sastāv no diviem baitiem. Šīs instrukcijas dēļ datoram ir cita atmiņas adrese nākamajai instrukcijai, kas tiks izpildīta, nevis parastā pieauguma rezultātā. Tas tiek darīts, datora saturam pievienojot vai atņemot vērtību, ko sauc par nobīdi. Tādējādi dators norāda uz citu (sazarotu) atmiņas vietu, lai dators varētu turpināt darbību no turienes. Nobīde ir vesels skaitlis no -128 10 uz +127 10 (divu papildinājums). Tātad, nobīde var likt lēcienam iet uz priekšu atmiņā. Ja tas ir pozitīvs vai atpaliek atmiņā, vai ja tas ir negatīvs.

BVS instrukcija aizņem tikai vienu operandu, kas ir nobīde. BVS izmanto relatīvo adresāciju. Apsveriet šādu instrukciju:

BVS $ 7F

Otrajā bāzē 7F H ir 01111111 2 = 127 10 . Pieņemsim, ka nākamās instrukcijas saturs datorā ir 0300 USD. BVS instrukcija liek $7F (pozitīvs skaitlis jau divu komplementā) tiek pievienots $0300, lai iegūtu $037F. Tātad nākamās instrukcijas vietā, kas jāizpilda atmiņas vietā $0300, tā atrodas atmiņas vietā $037F (aptuveni puse lappuses atšķirība).

Ir arī citi filiāļu norādījumi, taču BVS ir ļoti labs, lai ilustrētu relatīvo adresāciju. Relatīvā adresācija attiecas uz filiāles instrukcijām.

4.7. Indeksētā adresēšana un netiešā adresēšana atsevišķi

Šie adresācijas režīmi ļauj 6502 µP īsā laika periodā apstrādāt milzīgus datu apjomus ar samazinātu instrukciju skaitu. Visai Comodore-64 atmiņai ir 64 KB vietas. Tātad, lai piekļūtu jebkurai 16 bitu baita vietai, ir nepieciešami divi baiti. Vienīgais izņēmums no nepieciešamības pēc diviem baitiem ir nulles lapai, kur augstākais baits 00 $ tiek izlaists, lai ietaupītu vietu, ko atmiņā aizņem instrukcija. Ar adresācijas režīmu, kas nav lappuses nulles, 16 bitu atmiņas adreses augstākie un zemākie baiti lielākoties tiek norādīti kaut kā.

Pamata indeksētā adresācija

Absolūtā indeksa adresācija
Atcerieties, ka X vai Y reģistru sauc par indeksu reģistru. Apsveriet šādu instrukciju:

LDA USD C453,X

Pieņemsim, ka vērtība 6 H atrodas X reģistrā. Ņemiet vērā, ka instrukcijā nekur nav ierakstīts 6. Šī instrukcija pievieno 6H vērtību C453 H kas ir daļa no drukātās instrukcijas teksta failā, kas vēl jāsamontē – C453 H + 6 H = C459 H . LDA nozīmē ielādēt baitu akumulatorā. Baits, kas jāielādē akumulatorā, nāk no $C459 adreses. USD C459, kas ir C453 ASV dolāru summa, kas ierakstīta kopā ar instrukciju un 6 H kas atrodama X reģistrā, kļūst par faktisko adresi, no kuras nāk baits, kas jāielādē akumulatorā. Ja 6 H bija Y reģistrā, instrukcijā X vietā ir ierakstīts Y.

Ierakstītajā instrukciju paziņojumā $C453 ir pazīstama kā bāzes adrese un 6 H X vai Y reģistrā ir pazīstama kā faktiskās adreses skaitīšanas vai indeksa daļa. Bāzes adrese var attiekties uz jebkuru baitu adresi atmiņā un uz nākamo 256 10 adresēm var piekļūt, pieņemot, ka sāktais indekss (vai skaits) X vai Y reģistrā ir 0. Atcerieties, ka viens baits var dot nepārtrauktu diapazonu līdz 256 10 skaitļi (t.i., 00000000 2 uz 11111111 2 ).

Tātad, absolūtā adresēšana pievieno visu, kas jau ir ievietots (kas ir ievietots ar citu instrukciju) X vai Y reģistrā, 16 adresēm, kas tiek ievadītas ar instrukciju, lai iegūtu efektīvu adresi. Ierakstītajā instrukcijā divus indeksu reģistrus atšķir ar X vai Y, kas ir ierakstīti aiz komata. Tiek ievadīts vai nu X, vai Y; ne abi.

Pēc tam, kad visa programma ir ierakstīta teksta redaktorā un saglabāta ar paplašinājuma “.asm” faila nosaukumu, montētājam, kas ir cita programma, ir jātulko drukātā programma uz to, kas ir (ielādēta) atmiņā. Iepriekšējā instrukcija, kas ir “LDA $C453,X”, atmiņā aizņem trīs baitu vietas, nevis piecus.

Atcerieties, ka mnemonikai, piemēram, LDA, var būt vairāk nekā viens opkods (dažādi baiti). Operācijas kods instrukcijai, kas izmanto X reģistru, atšķiras no operētājkoda, kas izmanto Y reģistru. Pamatojoties uz ievadīto instrukciju, montētājs zina, kādu opkodu izmantot. Viena baita operācijas kods “LDA $C453,X” atšķiras no viena baita operētājkoda “LDA $C453,Y”. Faktiski LDA operācijas kods “LDA $C453,X” ir BD, un LDA operētājsistēmā “LDA $C453,9” ir BD.

Ja LDA operācijas kods atrodas $0200 baitu vietā. Pēc tam $C453 16 bitu adrese aizņem nākamo baitu vietu atmiņā, kas ir $0201 un $0202. Konkrētais opkoda baits norāda, vai tas ir iesaistīts X reģistrs vai Y reģistrs. Tādējādi saliktā valodas instrukcija, kas ir “LDA $C453,X” vai “LDA $C453,Y”, atmiņā aizņem trīs secīgus baitus, nevis četrus vai piecus.

Nulles lapas indeksētā adresācija
Nulles lapas indeksa adresēšana ir līdzīga iepriekš aprakstītajai absolūtajai indeksa adresācijai, taču mērķa baitam jābūt tikai nulles lapā (no USD 0000 līdz USD 00 FF). Tagad, strādājot ar nulles lapu, augstākais baits vienmēr ir 00 H atmiņas vietām parasti izvairās. Tātad parasti tiek minēts, ka nulles lapa sākas no 00 USD līdz FF. Tātad iepriekšējais “LDA $C453,X” norādījums ir šāds:

LDA 53,X $

$C4 — augstāks baits, kas attiecas uz lapu virs nulles lapas, šajā instrukcijā nevar izmantot, jo tas paredz, ka mērķa baits ir jāielādē uzkrātajā baitā ārpus lapas nulles un virs tās.

Ja instrukcijā ievadītā vērtība tiek pievienota vērtībai indeksa reģistrā, summai nevajadzētu dot rezultātu virs lapas nulles (FF H ). Tātad, nevar būt tāda instrukcija kā “LDA $FF, X” un tāda vērtība kā FF H indeksu reģistrā, jo FF H + FF H = 200 H kas ir 2. lappuses (trešās lapas) pirmais baits (0200 USD) atmiņā, atrodas lielā attālumā no 0. lapas. Tātad ar nulles lapas indeksētu adresāciju efektīvajai adresei ir jāatrodas nulles lapā.

Netiešā adresācija

Pārlēkt absolūto adresāciju
Pirms apspriest absolūto netiešo adresāciju, vispirms ir vērts apskatīt JMP absolūto adresāciju. Pieņemsim, ka adrese, kurai ir interesējošā vērtība (mērķa baits), ir 8765 USD. Tas ir 16 biti, kas sastāv no diviem baitiem: augstākais baits, kas ir 87 H un apakšējais baits, kas ir 65 H . Tātad divi baiti par USD 8765 tiek ievietoti datorā (programmu skaitītājā) nākamajai instrukcijai. Asamblejas valodas programmā (failā) ir ierakstīts:

JMP 8765 $

Atmiņā esošā izpildprogramma pārlec no jebkuras adreses, kurai tā piekļuva, līdz 8765 USD. JMP mnemonikā ir trīs opkodi, kas ir 4C, 6C un 7C. Šīs absolūtās adresācijas darbības kods ir 4C. JMP absolūtās netiešās adresācijas darbības kods ir 6C (skatiet tālāk redzamos attēlus).

Absolūtā netiešā adresācija
To lieto tikai ar lēciena (JMP) instrukciju. Pieņemsim, ka adrese, kurai ir interesējošais baits (mērķa baits), ir 8765 ASV dolāri. Tas ir 16 biti, kas sastāv no diviem baitiem: augstākais baits, kas ir 87 H un apakšējais baits, kas ir 65 H . Izmantojot absolūto netiešo adresēšanu, šie divi baiti faktiski atrodas divās secīgās baitu vietās citur atmiņā.

Pieņemsim, ka tie atrodas $0210 un $0211 atmiņas vietās. Pēc tam interesējošās adreses apakšējais baits, kas ir 65 H atrodas adresē $0210 un augstākajā baitā, kas ir 87 H atrodas adresē $0211. Tas nozīmē, ka interesējošais zemākais atmiņas baits tiek novirzīts uz zemāku secīgu adresi, un augstākais interesējošais atmiņas baits tiek novirzīts uz augstāku secīgo adresi – maz endianness.

16 bitu adrese var attiekties uz divām secīgām adresēm atmiņā. Šajā ziņā $0210 adrese attiecas uz $0210 un $0211 adresēm. Adrešu pāris $0210 un $0211 satur mērķa baita galīgo adresi (divu baitu 16 biti), bet apakšējais baits ir 65 H 0210 ASV dolāros un augstākajā baitā — 87 H 0211 USD vērtībā. Tātad ievadītā lēciena instrukcija ir:

JMP (0210 $)

JMP mnemonikā ir trīs opkodi, kas ir 4C, 6C un 7C. Absolūtās netiešās adresācijas darbības kods ir 6C. Teksta failā ir ierakstīts “JMP ($0210)”. Iekavu dēļ montētājs (tulkotājs) JMP izmanto opkodu 6C, nevis 4C vai 7C.

Ar absolūto netiešo adresēšanu faktiski ir trīs atmiņas reģioni. Pirmais reģions var sastāvēt no baitu atrašanās vietām USD 0200, USD 0201 un USD 0202. Tajā ir trīs baiti instrukcijai “JMP ($ 0210)”. Otrais reģions, kas ne vienmēr atrodas blakus pirmajam, sastāv no divām secīgām baitu vietām — 0210 $ un 0211 $. Tas ir zemākais baits šeit ($ 0210), kas ir ierakstīts montāžas valodas programmas instrukcijā. Ja interesējošā adrese ir 8765 ASV dolāri, zemākais baits — 65 H atrodas USD 0210 baitā, bet augstākais baits — 87 H atrodas $0211 baitu vietā. Trešais apgabals sastāv tikai no viena baita atrašanās vietas. Tā ir 8765 ASV dolāru adrese mērķa baitam (galējais interesējošais baits). Secīgo adrešu pāris — USD 0210 un USD 0211 — satur USD 8765 rādītāju, kas ir interesējošā adrese. Pēc skaitļošanas interpretācijas datorā (programmu skaitītājs) tiek ieskaitīti USD 8765, lai piekļūtu mērķa baitam.

Nulles lapas netiešā adresācija
Šī adresēšana ir tāda pati kā absolūtā netiešā adresācija, taču rādītājam jāatrodas nulles lappusē. Rādītāja apgabala apakšējā baita adrese ir norādīta drukātajā instrukcijā:

JMP (50 $)

Rādītāja augstākais baits atrodas $51 baita vietā. Spēkā esošajai adresei (norādītai) nav jābūt nulles lappusē.

Tātad, izmantojot indeksa adresēšanu, indeksa reģistra vērtība tiek pievienota bāzes adresei, kas norādīta instrukcijā, lai iegūtu efektīvu adresi. Netiešā adresēšanā tiek izmantots rādītājs.

4.8. Indeksētā netiešā adresācija

Absolūtā indeksētā netiešā adresācija
Šis adresācijas režīms tiek izmantots tikai ar JMP instrukciju.
Izmantojot absolūto netiešo adresēšanu, ir norādīta vērtība (baits) ar savām divām secīgām baitu adresēm. Šīs divas secīgās adreses veido rādītāju, kas atrodas divu secīgu baitu rādītāja apgabalā atmiņā. Rādītāja apgabala apakšējais baits ir tas, kas ir ierakstīts instrukcijā iekavās. Rādītājs ir norādītās vērtības adrese. Iepriekšējā situācijā 8765 $ ir norādītās vērtības adrese. $0210 (kam seko $0211) ir adrese, kuras saturs ir $8765, kas ir rādītājs. Izmantojot absolūto netiešo adresācijas režīmu, programmā (teksta failā) tiek ierakstīts (0210 $), ieskaitot iekavas.

No otras puses, izmantojot absolūtās indeksācijas netiešās adresācijas režīmu, rādītāja reģiona apakšējais adreses baits tiek veidots, pievienojot ievadītajai adresei vērtību X reģistrā. Piemēram, ja rādītājs atrodas adreses vietā $0210, drukātā instrukcija var būt aptuveni šāda:

JMP ($020A,X)

Kur X reģistra vērtība ir 6 H . 020A H + 6 H = 0210 H . Y reģistrs netiek izmantots ar šo adresācijas režīmu.

Nulles lapas indeksēta netiešā adresācija
Šis adresācijas režīms izmanto X reģistru, nevis Y reģistru. Izmantojot šo adresācijas režīmu, tā divu baitu adreses rādītāja apgabalā joprojām ir norādītā vērtība un rādītājs. Rādītāja nulles lappusē ir jābūt diviem secīgiem baitiem. Instrukcijā ievadītā adrese ir viena baita adrese. Šī vērtība tiek pievienota X reģistrā esošajai vērtībai, un visi pārnesumi tiek atmesti. Rezultāts norāda uz rādītāja apgabalu 0. lapā. Piemēram, ja interesējošā adrese (norādīta) ir 8765 ASV dolāri un tā atrodas 0 lapas baitu atrašanās vietās $50 un $51, un vērtība X reģistrā ir 30 ASV dolāri, drukātā instrukcija ir aptuveni šāda:

LDA (20,X $)

Jo $20 + $30 = $50.

Netiešā indeksētā adresācija
Šis adresācijas režīms izmanto Y reģistru, nevis X reģistru. Izmantojot šo adresācijas režīmu, joprojām ir norādītā vērtība un rādītāja apgabals, taču rādītāja apgabala saturs darbojas atšķirīgi. Rādītāja apgabalam nulles lappusē ir jābūt diviem secīgiem baitiem. Rādītāja apgabala apakšējā adrese ir ierakstīta instrukcijā. Šis skaitlis (baitu pāris), kas atrodas rādītāja apgabalā, tiek pievienots vērtībai Y reģistrā, lai iegūtu reālo rādītāju. Piemēram, lai interesējošā adrese (norādīta) ir 8765 USD, 6H vērtība ir Y reģistrā un skaitlis (divi baiti) ir 50. H un 51 H . Abi baiti kopā ir USD 875 F, jo USD 875 F + USD 6 = USD 8765. Ierakstītā instrukcija ir aptuveni šāda:

LDA (50 $), Y

4.9. Palielināšanas, samazināšanas un pārbaudes BIT instrukcijas

Šajā tabulā parādītas palielināšanas un samazināšanas instrukciju darbības:

INA un DEA attiecīgi palielina un samazina akumulatoru. To sauc par akumulatoru adresēšanu. INX, DEX, INY un DEY ir attiecīgi paredzēti X un Y reģistriem. Viņi neņem nekādu operandu. Tātad viņi izmanto netiešo adresācijas režīmu. Pieaugums nozīmē 1 pievienošanu reģistram vai atmiņas baitam. Samazinājums nozīmē 1 atņemšanu no reģistra vai atmiņas baita.

INC un DEC attiecīgi palielina un samazina atmiņas baitu (nevis reģistru). Nulles lapas adresācijas izmantošana absolūtās adresācijas vietā ir, lai taupītu instrukcijas atmiņu. Nulles lapas adresācija ir par vienu baitu mazāka nekā absolūtā adresācija instrukcijai atmiņā. Tomēr nulles lapas adresācijas režīms ietekmē tikai nulles lapu.

BIT instrukcija pārbauda baita bitus atmiņā ar 8 bitiem akumulatorā, bet nemaina nevienu. Ir iestatīti tikai daži procesora statusa reģistra karodziņi “P”. Norādītās atmiņas vietas biti ir loģiski UN apzīmēti ar akumulatora bitiem. Pēc tam tiek iestatīti šādi statusa biti:

  • N, kas ir 7. bits un statusa reģistra pēdējais bits (pa kreisi), saņem atmiņas vietas 7. bitu pirms AND slēgšanas.
  • V, kas ir statusa reģistra 6. bits, pirms AND slēgšanas saņem atmiņas vietas 6. bitu.
  • Statusa reģistra Z karodziņš ir iestatīts (izdarīts 1), ja UN rezultāts ir nulle (00000000 2 ). Pretējā gadījumā tas tiek notīrīts (izdarīts 0).

4.10. Salīdzināt instrukcijas

Salīdzināmās instrukciju mnemonikas 6502 µP ir CMP, CPX un CPY. Pēc katra salīdzinājuma tiek ietekmēti procesora statusa reģistra “P” karodziņi N, Z un C. N karodziņš tiek iestatīts (izdarīts 1), ja rezultāts ir negatīvs skaitlis. Z karodziņš tiek iestatīts (izdarīts 1), ja rezultāts ir nulle (000000002). C karodziņš tiek iestatīts (izgatavots 1), kad notiek pārnešana no astoņiem uz devīto bitu. Nākamajā tabulā sniegts detalizēts ilustrācija

Nozīmē 'lielāks par'. Tādējādi salīdzināšanas tabulai jābūt pašsaprotamai.

4.11. Pārlēkšanas un atzarošanas instrukcijas

Šajā tabulā ir apkopotas lēciena un atzarošanas instrukcijas:

JMP instrukcija izmanto absolūto un netiešo adresēšanu. Pārējie tabulā sniegtie norādījumi ir filiāles norādījumi. Viņi izmanto tikai relatīvo adresāciju ar 6502 µP. Tādējādi tabula kļūst pašsaprotama, ja to lasa no kreisās uz labo un no augšas uz leju.

Ņemiet vērā, ka zarus var lietot tikai adresēm, kas atrodas no -128 līdz +127 baitiem no norādītās adreses. Tā ir relatīva uzrunāšana. Gan JMP, gan filiāles instrukcijām tiek tieši ietekmēts programmu skaitītājs (PC). 6502 µP neļauj zariem sasniegt absolūtu adresi, lai gan lēciens var veikt absolūto adresēšanu. JMP instrukcija nav filiāles instrukcija.

Piezīme: Relatīvā adresācija tiek izmantota tikai ar filiāles instrukcijām.

4.12. Stack zona

Apakšprogramma ir kā viena no iepriekšējām īsajām programmām, lai pievienotu divus skaitļus vai atņemtu divus skaitļus. Steka apgabals atmiņā sākas no USD 0100 līdz USD 01FF ieskaitot. Šo apgabalu vienkārši sauc par kaudzi. Kad mikroprocesors izpilda lēcienu uz apakšprogrammas instrukciju (JSR — skatiet šo diskusiju), tam ir jāzina, kur atgriezties pēc pabeigšanas. 6502 µP saglabā šo informāciju (atgriešanas adresi) mazā atmiņā no $ 0100 līdz $ 01FF (steka apgabals) un izmanto steka rādītāja reģistra saturu, kas mikroprocesorā ir 'S' kā rādītāju (9 biti) uz pēdējo atgriezto adresi. kas tiek saglabāts atmiņas 1. lappusē ($0100 līdz $01FF). Stacks palielinās no USD 01FF un ļauj ligzdot apakšprogrammas līdz 128 līmeņu dziļumam.

Vēl viens steka rādītāja lietojums ir pārtraukumu apstrāde. 6502 µP tapas ir apzīmētas kā IRQ un NMI. Šiem kontaktiem var tikt pielietoti daži nelieli elektriski signāli, kas liek 6502 µP pārtraukt vienas programmas izpildi un likt tai sākt izpildīt citu. Šajā gadījumā pirmā programma tiek pārtraukta. Tāpat kā apakšprogrammas, pārtraukuma koda segmentus var ligzdot. Pārtraukumu apstrāde ir aplūkota nākamajā nodaļā.

Piezīme : steka rādītājam ir 8 biti zemākā baita adresei, adresējot vietas no $0100 līdz $01FF. Augstākais baits — 00000001 2 tiek pieņemts.

Šajā tabulā sniegti norādījumi, kas saista steka rādītāju “S” ar A, X, Y un P reģistriem ar steka apgabalu atmiņā:

4.13. Apakšprogrammas izsaukšana un atgriešana

Apakšprogramma ir instrukciju kopums, kas sasniedz noteiktu mērķi. Iepriekšējā saskaitīšanas vai atņemšanas programma ir ļoti īsa apakšprogramma. Apakšprogrammas dažreiz sauc tikai par rutīnām. Apakšprogrammas izsaukšanas instrukcija ir šāda:

JSR: pāriet uz apakšprogrammu

Norādījums atgriezties no apakšprogrammas ir šāds:

RTS: Atgriezties no apakšprogrammas

Mikroprocesoram ir tendence nepārtraukti izpildīt atmiņā esošās instrukcijas vienu pēc nākamās. Pieņemsim, ka mikroprocesors pašlaik izpilda koda segmentu un tas saskaras ar lēciena (JMP) instrukciju, lai izpildītu koda segmentu, kas ir kodēts aiz tā, lai tas jau varētu būt izpildīts. Tas izpilda šo koda segmentu aiz muguras un turpina izpildīt visus koda segmentus (instrukcijas), kas seko aiz koda segmentam, līdz atkārtoti izpilda pašreizējo koda segmentu un turpina tālāk. JMP nespiež nākamo instrukciju stekā.

Atšķirībā no JMP, JSR no datora (programmu skaitītāja) uz steku nospiež nākamās instrukcijas adresi pēc sevis. Šīs adreses steka pozīcija tiek ievietota steka rādītājā “S”. Kad apakšprogrammā tiek sastapta (izpildīta) RTS instrukcija, adrese, kas tiek uzspiesta uz steka, tiek noņemta no steka, un programma tiek atsākta no izņemtās adreses, kas ir nākamā instrukcijas adrese tieši pirms apakšprogrammas izsaukšanas. Pēdējā adrese, kas noņemta no steka, tiek nosūtīta uz programmu skaitītāju. Šajā tabulā ir sniegta JSR un RTS instrukciju tehniskā informācija:

Skatiet šo ilustrāciju par JSR un RTS izmantošanu:

4.14. Atpakaļskaitīšanas cilpas piemērs

Sekojošā apakšprogramma tiek skaitīta no $FF līdz $00 (kopā 256 10 skaits):

start LDX #$FF ; slodze X ar $ FF = 255
cilpa DEX ; X = X - 1
BNE cilpa ; ja X nav nulle, tad dodieties uz cilpu
RTS ; atgriezties

Katrā rindā ir komentārs. Komentāri nekad neienāk atmiņā izpildei. Montētājs (tulkotājs), kas pārveido programmu par to, kas tā ir atmiņā, lai to izpildītu (palaistu), vienmēr noņem komentārus. Komentārs sākas ar ';' . “Sākums” un “cilpa” šajā programmā tiek saukti par etiķetēm. Etiķete identificē (nosaukums) instrukcijas adresei. Ja instrukcija ir viena baita instrukcija (netiešā adresācija), etiķete ir šīs instrukcijas adrese. Ja instrukcija ir vairāku baitu instrukcija, etiķete identificē vairāku baitu instrukcijas pirmo baitu. Pirmā šīs programmas instrukcija sastāv no diviem baitiem. Pieņemot, ka tā sākas ar 0300 $ adresi, 0300 $ adresi programmā var aizstāt ar “sākt”. Otrā instrukcija (DEX) ir viena baita instrukcija6, un tai jābūt adresē $0302. Tas nozīmē, ka $0302 adresi programmā var aizstāt ar “cilpu”, kas patiesībā ir “BNE cilpa”.

“BNE cilpa” nozīmē atzaru uz doto adresi, kad statusa reģistra Z karodziņš ir 0. Ja vērtība A vai X vai Y reģistrā ir 00000000 2 , sakarā ar pēdējo darbību, Z karodziņš ir 1 (komplekts). Tātad, kamēr tas ir 0 (nevis 1), otrā un trešā instrukcija programmā tiek atkārtota šādā secībā. Katrā atkārtotā secībā vērtība (vesels skaitlis) X reģistrā tiek samazināts par 1. DEX nozīmē X = X – 1. Ja vērtība X reģistrā ir $00 = 00000000. 2 , Z kļūst par 1. Tajā brīdī abi norādījumi vairs neatkārtojas. Pēdējā programmas RTS instrukcija, kas ir viena baita instrukcija (implied addressing), atgriežas no apakšprogrammas. Šīs instrukcijas mērķis ir izveidot programmas skaitītāja adresi skurstenī kodam, kas jāizpilda pirms apakšprogrammas izsaukuma, un atgriezties pie programmas skaitītāja (PC). Šī adrese ir tās instrukcijas adrese, kas jāizpilda pirms apakšprogrammas izsaukšanas.

Piezīme: Rakstot montāžas valodas programmu 6502 µP, tikai etiķete jāsākas rindas sākumā; jebkurš cits rindas kods ir jāpārvieto vismaz par vienu atstarpi pa labi.

Apakšprogrammas izsaukšana
Ignorējot atmiņas vietu, ko aizņem iepriekšējās etiķetes, programma aizņem 6 baitus secīgu vietu atmiņā (RAM) no $ 0300 līdz $ 0305. Šajā gadījumā programma ir šāda:

LDX #$FF ; slodze X ar $ FF = 255
DEX ; X = X - 1
BNE 0302 USD; ja X nav nulle, tad dodieties uz cilpu
RTS ; atgriezties

Sākot no 0200 $ adreses atmiņā, var būt apakšprogrammas izsaukums. Zvana instrukcija ir šāda:

JSR sākums ; sākums ir adrese $0300, t.i., JSR $0300

Apakšprogramma un tās izsaukums, kas ir pareizi ierakstīti teksta redaktora failā, ir:

start LDX #$FF; slodze X ar $ FF = 255
cilpa DEX ; X = X - 1

BNE cilpa ; ja X nav nulle, tad dodieties uz cilpu
RTS ; atgriezties

JSR sākums: pārejiet uz rutīnu, sākot no 0300 USD

Tagad vienā garā programmā var būt daudzas apakšprogrammas. Visiem tiem nevar būt nosaukums “sākt”. Viņiem vajadzētu būt dažādiem nosaukumiem. Patiesībā nevienam no tiem var nebūt nosaukuma “sākt”. 'Sākt' šeit tiek izmantots mācību iemeslu dēļ.

4.15. Programmas tulkošana

Programmas tulkošana vai salikšana nozīmē to pašu. Apsveriet šādu programmu:

sākt LDX #$FF: ielādējiet X ar $FF = 255
cilpa DEX: X = X – 1
BNE cilpa: ja X nav nulle, tad pāriet uz cilpu
RTS: atgriešanās
JSR sākums: pārejiet uz rutīnu, sākot no 0300 USD

Šī ir iepriekš uzrakstītā programma. Tas sastāv no apakšprogrammas, sākuma un apakšprogrammas izsaukuma. Programma skaita atpakaļ no 255 10 uz 0 10 . Programma sākas ar lietotāja sākuma adresi 0200 $ (RAM). Programma tiek ierakstīta teksta redaktorā un tiek saglabāta diskā. Tam ir nosaukums, piemēram, “sample.asm”, kur “sample” ir programmētāja izvēles nosaukums, bet montāžas valodas paplašinājumam “.asm” jābūt saistītam ar faila nosaukumu.

Samontēto programmu veido cita programma, ko sauc par montētāju. Montētāju piegādā 6502 µP ražotājs vai trešā puse. Montētājs reproducē programmu tādā veidā, ka tā izpildes (palaišanas) laikā atrodas atmiņā (RAM).

Pieņemsim, ka JSR instrukcija sākas ar $0200 adresi un apakšprogramma sākas ar $0300 adresi. Montētājs noņem visus komentārus un atstarpes. Komentāri un atstarpes iznieko atmiņu, kuras vienmēr ir maz. Iespējamā tukša rindiņa starp iepriekšējo apakšprogrammas koda segmentu un apakšprogrammas izsaukumu ir atstarpes piemērs. Samontētais fails joprojām tiek saglabāts diskā, un tam ir tāds nosaukums kā “sample.exe”. “Paraugs” ir programmētāja izvēles nosaukums, bet paplašinājumam “.exe” jābūt tur, lai norādītu, ka tas ir izpildāms fails.

Salikto programmu var dokumentēt šādi:

Tiek uzskatīts, ka šāda dokumenta sagatavošana ir salikšana ar rokām. Ņemiet vērā, ka komentāri šajā dokumentā neparādās atmiņā (izpildīšanai). Tabulas adreses kolonna norāda instrukciju sākuma adreses atmiņā. Ņemiet vērā, ka “JSR start”, kas ir “JSR $0300”, ko paredzēts kodēt kā “20 03 00”, faktiski tiek kodēts kā “20 00 03”, un apakšējā atmiņas baita adrese aizņem zemāko baitu atmiņā un augstāka atmiņas baita adrese, kas aizņem augstāko baitu atmiņā – maz endianness. JSR operācijas kods ir 20 16 .

Ņemiet vērā, ka nobīde uz filiāles instrukciju, piemēram, BNE, ir divu komplementa skaitlis diapazonā no 128 10 uz +127 10 . Tātad “BNE cilpa” nozīmē “BNE -1 10 ”, kas faktiski ir “D0 FF” FF koda formā 16 ir -1 divos papildinājumā, kas ir rakstīts kā = 11111111 otrajā bāzē. Montētāja programma aizstāj etiķetes un laukus ar faktiskajiem heksadecimālajiem skaitļiem (heksadecimālie skaitļi ir bināri skaitļi, kas ir sagrupēti četros bitos). Faktiskās adreses, kur sākas katra instrukcija, faktiski ir iekļautas.

Piezīme: Instrukcija “JSR start” tiek aizstāta ar īsākiem norādījumiem, kas nosūta programmas skaitītāja pašreizējo saturu (augstos un zemos baitus) uz steku ar steka rādītāju, kas tiek samazināts divas reizes (vienreiz augstajam baitam un vienreiz zemam baitam) un pēc tam atkārtoti ielādē datoru ar 0300 $ adresi. Steka rādītājs tagad norāda uz $00FD, pieņemot, ka tas ir inicializēts uz $01FF.

Turklāt RTS instrukcija tiek aizstāta ar vairākām īsākām instrukcijām, kas palielina steka rādītāju “S” divas reizes (vienreiz zemam baitam un vienreiz augstajam baitam) un izvelk atbilstošos divus adreses baitus no steka rādītāja uz datoru, lai. nākamā instrukcija.

Piezīme: Etiķetes tekstā nedrīkst būt vairāk par 8 rakstzīmēm.

“BNE cilpa” izmanto relatīvo adresāciju. Tas nozīmē pievienot -3 10 uz nākamo programmu skaitītāja saturu $0305. 'BNE cilpas' baiti ir 'D0 FD', kur FD ir divu -3 papildinājums 10 .

Piezīme. Šajā nodaļā nav sniegti visi norādījumi par 6502 µP. Visas instrukcijas un to detaļas ir atrodamas dokumentā ar nosaukumu “SY6500 8-Bit Microprocessor Family”. Šim dokumentam ir PDF fails ar nosaukumu “6502.pdf”, kas ir brīvi pieejams internetā. Šajā dokumentā aprakstītais 6502 µP ir 65C02.

4.16 Pārtraukumi

Jebkuras ierīces signāliem, kas ir savienoti ar Commodore 64 ārējiem (vertikālās virsmas) portiem, pirms 6502 mikroprocesora sasniegšanas ir jāiziet caur CIA 1 vai CIA 2 ķēdēm (IC). Signāliem no 6502 µP datu kopnes ir jāiet cauri CIA 1 vai CIA 2 mikroshēmai, pirms tie sasniedz jebkuru ārējo ierīci. CIA ir saīsinājums no Complex Interface Adapter. 4.1. attēlā “Commodore_64 mātesplates blokshēma” bloku ievades/izvades ierīces attēlo CIA 1 un CIA 2. Kad programma darbojas, to var pārtraukt, lai pirms turpinātu palaist kādu citu koda daļu. Pastāv aparatūras un programmatūras pārtraukumi. Aparatūras pārtraukumiem 6502 µP ir divas ieejas signāla tapas. Šo tapu nosaukumi ir IRQ un NMI . Tās nav µP datu līnijas. Datu līnijas µP ir D7, D6, D5, D4, D3, D2, D1 un D0; ar D0 vismazāk nozīmīgajam bitam un D7 visnozīmīgākajam bitam.

IRQ apzīmē Interrupt ReQuest “aktīvs” zems. Šī µP ievades līnija parasti ir augsta, aptuveni 5 volti. Kad tas samazinās līdz aptuveni 0 voltiem, tas ir pārtraukuma pieprasījums, kas signalizē par µP. Tiklīdz pieprasījums tiek izpildīts, līnija atgriežas augstā līmenī. Pārtraukuma pieprasījuma piešķiršana nozīmē, ka µP atzarojas ar kodu (apakšprogrammu), kas apstrādā pārtraukumu.

NMI apzīmē Non-Maskable Interrupt “aktīvs” zems. Kamēr kods par IRQ tiek izpildīts NMI var pazemināties. Šajā gadījumā, NMI tiek apstrādāts (tiek izpildīts savs kods). Pēc tam kods IRQ turpinās. Pēc koda priekš IRQ beidzas, galvenais programmas kods turpinās. Tas ir, NMI pārtrauc IRQ apdarinātājs. Signāls priekš NMI joprojām var piešķirt µP pat tad, ja µP ir dīkstāvē un nedarbojas ar neko vai nedarbojas galvenā programma.

Piezīme: Patiesībā tā ir pāreja no augsta uz zemu NMI , tas ir NMI signāls — vairāk par to vēlāk. IRQ parasti nāk no CIP 1 un NMI parasti nāk no CIP 2. NMI , kas apzīmē Non-Maskable Interrupt, var uzskatīt par neapturamu pārtraukumu.

Pārtraukumu apstrāde
Neatkarīgi no tā, vai pieprasījums ir no IRQ vai NMI , ir jāpabeidz pašreizējā instrukcija. 6502 ir tikai A, X un Y reģistri. Kamēr apakšprogramma darbojas, tā var izmantot šos trīs reģistrus kopā. Pārtraukumu apstrādātājs joprojām ir apakšprogramma, lai gan tas netiek uzskatīts par tādu. Kad pašreizējā instrukcija ir pabeigta, 65C02 µP A, X un Y reģistru saturs tiek saglabāts kaudzē. Uz steku tiek nosūtīta arī programmas skaitītāja nākamās instrukcijas adrese. Pēc tam µP sazarojas līdz pārtraukuma kodam. Pēc tam A, X un Y reģistru saturs tiek atjaunots no steka apgrieztā secībā, kādā tie tiek nosūtīti.

Pārtraukuma kodēšanas piemērs
Vienkāršības labad pieņemsim, ka µP rutīna IRQ pārtraukt ir tikai pievienot skaitļus $01 un $02 un saglabāt rezultātu $03 atmiņas adresē $0400. Kods ir:

ISR PHA
PHX
PHY
;
LDA #$01
ADC #$02
TIE MAKSĀ 0400 USD
;
PLY
PLX
PLA
RTI

ISR ir etiķete un identificē atmiņas adresi, kurā atrodas PHA instrukcija. ISR nozīmē pārtraukt pakalpojumu rutīnu. PHA, PHX un PHY nosūta A, X un Y reģistru saturu uz steku ar cerību, ka tie būs nepieciešami jebkuram kodam (programmai), kas darbojas tieši pirms pārtraukuma. Nākamās trīs instrukcijas veido pārtraukumu apstrādātāja kodolu. PLY, PLX un PLA instrukcijām ir jābūt šādā secībā, un tās atgriež Y, X un A reģistru saturu. Pēdējā instrukcija, kas ir RTI, (bez operanda) atgriež izpildes turpinājumu jebkuram kodam (programmai), kas tiek izpildīts pirms pārtraukuma. RTI izvelk nākamās izpildāmā koda instrukcijas adresi no steka atpakaļ uz programmu skaitītāju. RTI nozīmē Atgriezties no pārtraukuma. Līdz ar to pārtraukumu apstrāde (apakšprogramma) ir beigusies.

Programmatūras pārtraukums
Galvenais programmatūras pārtraukuma veids 6502 µP ir BRK netiešās adreses instrukcijas izmantošana. Pieņemsim, ka darbojas galvenā programma un tā saskaras ar BRK instrukciju. No šī brīža nākamās instrukcijas adrese datorā ir jānosūta uz steku, kad pašreizējā instrukcija ir pabeigta. Apakšprogramma programmatūras instrukciju apstrādei jāsauc par 'nākamo'. Šai pārtraukuma apakšprogrammai A, X un Y reģistra saturs ir jānospiež uz steku. Pēc apakšprogrammas kodola izpildes pabeigšanas apakšprogrammas A, X un Y reģistru saturs ir jāatvelk no steka uz to reģistriem. Pēdējais paziņojums rutīnā ir RTI. Datora saturs arī tiek automātiski izņemts no steka uz datoru RTI dēļ.

Apakšprogrammas un pakalpojumu pārtraukuma rutīnas salīdzināšana un kontrastēšana
Šajā tabulā ir salīdzinātas un pretstatas apakšprogrammas un pakalpojumu pārtraukšanas rutīnas:

4.17. 6502 galveno adresācijas režīmu kopsavilkums

Katra instrukcija 6502 ir viens baits, kam seko nulle vai vairāki operandi.

Tūlītējās adresācijas režīms
Tūlītējās adresācijas režīmā pēc operanda ir vērtība, nevis atmiņas adrese. Pirms vērtības ir jābūt simbolam #. Ja vērtība ir heksadecimālā, aiz “#” ir jāseko “$”. Tūlītējie adresācijas norādījumi 65C02 ir: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Lasītājam vajadzētu iepazīties ar 65C02 µP dokumentāciju, lai uzzinātu, kā izmantot šeit norādītās instrukcijas, kas nav izskaidrotas šajā nodaļā. Instrukcijas piemērs ir:

LDA # 77 $

Absolūtais adresācijas režīms
Absolūtajā adresācijas režīmā ir viens operands. Šis operands ir vērtības adrese atmiņā (parasti heksadecimālā vai etiķete). Ir 64K 10 = 65 536 10 atmiņas adreses 6502 µP. Parasti viena baita vērtība ir vienā no šīm adresēm. Absolūtās adresēšanas instrukcijas 65C02 ir: 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. Lasītājam vajadzētu iepazīties ar 65C02 µP dokumentāciju, lai uzzinātu, kā izmantot šeit norādītās instrukcijas, kā arī par pārējiem adresācijas režīmiem, kas nav izskaidroti šajā nodaļā. Instrukcijas piemērs ir:

TIE ir 1234 USD

Netiešās adresācijas režīms
Netiešās adresācijas režīmā operanda nav. Jebkurš iesaistītais µP reģistrs ir norādīts instrukcijā. Netiešās adresēšanas instrukcijas 65C02 ir šādas: 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. Instrukcijas piemērs ir:

DEX: samaziniet X reģistru par vienu vienību.

Relatīvās adresācijas režīms
Relatīvās adresācijas režīms attiecas tikai uz filiāles instrukcijām. Relatīvās adresācijas režīmā ir tikai viens operands. Tā ir vērtība no -128 10 uz +127 10 . Šo vērtību sauc par nobīdi. Pamatojoties uz zīmi, šī vērtība tiek pievienota vai atņemta no programmas skaitītāja nākamās instrukcijas, lai iegūtu paredzētās nākamās instrukcijas adresi. Relatīvās adreses režīma instrukcijas ir: BCC, BCS, BEQ, ĶMI, BNE, BPL, BRA, BVC, BVS. Instrukciju piemēri ir:

BNE $7F : (filiāle, ja statusa reģistrā Z = 0, P)

Kas pievieno 127 pašreizējās programmas skaitītājam (izpildāmajai adresei) un sāk izpildīt instrukciju šajā adresē. Līdzīgi:

BEQ $F9 : (filiāle, ja Z = : statusa reģistrā, P)

Kas pievieno -7 pašreizējās programmas skaitītājam un sāk izpildi no jaunās programmas skaitītāja adreses. Operands ir divu komplementa skaitlis.

Absolūtā indeksētā adresācija
Absolūtā indeksa adresēšanā X vai Y reģistra saturs tiek pievienots dotajai absolūtajai adresei (jebkur no $0000 līdz $FFFF, t.i., no 0 10 uz 65536 10 ), lai būtu īstā adrese. Šo doto absolūto adresi sauc par bāzes adresi. Ja tiek izmantots X reģistrs, montāžas instrukcija ir aptuveni šāda:

LDA $ C453,X

Ja tiek izmantots Y reģistrs, tas ir kaut kas līdzīgs:

LDA $ C453,Y

X vai Y reģistra vērtību sauc par skaitīšanas vai indeksa vērtību, un tā var būt jebkur no $00 (0 10 ) līdz USD FF (250 10 ). To nesauc par nobīdi.

Absolūtā indeksa adresēšanas instrukcijas ir šādas: ADC, AND, ASL (tikai X), BIT (ar akumulatoru un atmiņu, tikai ar X), CMP, DEC (tikai atmiņai un X), EOR, INC (tikai atmiņai un X), LDA. , LDX, LDY, LSR (tikai X), ORA, ROL (tikai X), ROR (tikai X), SBC, STA, STZ (tikai X).

Absolūtā netiešā adresācija
To lieto tikai ar lēciena instrukciju. Tādējādi norādītajai absolūtajai adresei ir rādītāja adrese. Rādītāja adrese sastāv no diviem baitiem. Divu baitu rādītājs norāda uz galamērķa baitu vērtību atmiņā (ir tās adrese). Tātad montāžas valodas instrukcija ir:

JMP (3456 $)

Ar iekavām un $13 atrodas adreses vietā $3456, savukārt $EB atrodas adreses vietā $3457 (= $3456 + 1). Pēc tam galamērķa adrese ir $13EB un $13EB ir rādītājs. Absolūtais 3456 $ ir norādīts iekavās instrukcijā, kur 34 ir zemākais baits un 56 ir augstākais baits.

4.18. Virknes izveide ar 6502 µP montāžas valodu

Kā parādīts nākamajā nodaļā, pēc faila izveides atmiņā failu var saglabāt diskā. Failam ir jāpiešķir nosaukums. Nosaukums ir virknes piemērs. Programmēšanā ir daudz citu virkņu piemēru.

Ir divi galvenie veidi, kā izveidot ASCII kodu virkni. Abos veidos visi ASCII kodi (rakstzīmes) ieņem secīgas baitu vietas atmiņā. Vienā no veidiem pirms šīs baitu secības ir vesels baits, kas ir garums (rakstzīmju skaits) secībā (virknē). Citā veidā rakstzīmju secībai seko (tūlīt seko) Null baits, kas ir 00 16 , t.i., 00 USD. Citā veidā virknes garums (rakstzīmju skaits) netiek norādīts. Null rakstzīme netiek izmantota pirmajā veidā.

Piemēram, apsveriet “Es tevi mīlu!” virkne bez pēdiņām. Garums šeit ir 11; atstarpe tiek skaitīta kā viens ASCII baits (rakstzīme). Pieņemsim, ka virkne ir jāievieto atmiņā ar pirmo rakstzīmi adresē $0300.

Nākamajā tabulā parādīts virknes atmiņas iestatījums, ja pirmais baits ir 11 10 = 0 B 16 :

Nākamajā tabulā parādīts virknes atmiņas iestatījums, ja pirmais baits ir “I” un pēdējais baits ir Null ($ 00):

Lai sāktu izveidot virkni, var izmantot šādus norādījumus:

TIE MAKSĀ 0300 USD

Pieņemsim, ka pirmais baits atrodas akumulatorā, kas jānosūta uz adreses atrašanās vietu 0300 $. Šī instrukcija attiecas uz abiem gadījumiem (abiem virkņu veidiem).

Pēc visu rakstzīmju ievietošanas atmiņas šūnās pa vienam, virkni var nolasīt, izmantojot cilpu. Pirmajā gadījumā tiek nolasīts rakstzīmju skaits pēc garuma. Otrajā gadījumā rakstzīmes tiek lasītas no “I”, līdz tiek izpildīta Null rakstzīme, kas ir “Null”.

4.19 Masīva izveide ar 6502 µP montāžas valodu

Viena baita veselu skaitļu masīvs sastāv no secīgām atmiņas baitu vietām ar veseliem skaitļiem. Pēc tam ir rādītājs, kas norāda uz pirmā veselā skaitļa atrašanās vietu. Tātad veselu skaitļu masīvs sastāv no divām daļām: rādītāja un atrašanās vietu sērijas.

Virkņu masīvam katra virkne var atrasties citā vietā atmiņā. Pēc tam ir secīgas atmiņas vietas ar rādītājiem, kur katrs rādītājs norāda uz katras virknes pirmo vietu. Rādītājs šajā gadījumā sastāv no diviem baitiem. Ja virkne sākas ar tās garumu, atbilstošais rādītājs norāda uz šī garuma vietu. Ja virkne nesākas ar tās garumu, bet beidzas ar nulles rakstzīmi, atbilstošais rādītājs norāda uz virknes pirmās rakstzīmes atrašanās vietu. Un ir rādītājs, kas norāda uz pirmā secīgo rādītāju rādītāja apakšējā baita adresi. Tātad virkņu masīvs sastāv no trim daļām: virknes dažādās atmiņas vietās, attiecīgie secīgie rādītāji un rādītājs uz pirmo secīgo rādītāju rādītāju.

4.20 Problēmas

Pirms pāriet uz nākamo nodaļu lasītājam ir ieteicams atrisināt visas nodaļas problēmas.

  1. Uzrakstiet montāžas valodas programmu, kas sākas ar 0200 USD par 6502 µP un pievieno neparakstītos skaitļus 2A94 H (pievienot) 2ABF H (augend). Ļaujiet ieejām un izvadēm atrasties atmiņā. Izveidojiet arī salikto programmas dokumentu ar roku.
  2. Uzrakstiet montāžas valodas programmu, kas sākas ar 0200 USD 6502 µP un atņem neparakstītos skaitļus 1569 H (subtrahenda) no 2ABF H (minuends). Ļaujiet ieejām un izvadēm atrasties atmiņā. Izveidojiet arī salikto programmas dokumentu ar roku.
  3. Uzrakstiet montāžas valodas programmu 6502 µP, kas tiek skaitīta no 00 līdz 09 USD, izmantojot cilpu. Programmai jāsākas no USD 0200. Izveidojiet arī salikto programmas dokumentu ar roku.
  4. Uzrakstiet montāžas valodas programmu, kuras cena ir 0200 USD par 6502 µP. Programmai ir divas apakšprogrammas. Pirmajā apakšprogrammā tiek pievienoti 0203 neparakstītie skaitļi H (augend) un 0102H (pievienot). Otrā apakšprogramma pievieno summu no pirmās apakšprogrammas, kas ir 0305H līdz 0006 H (augend). Gala rezultāts tiek saglabāts atmiņā. Izsauciet pirmo apakšprogrammu, kas ir FSTSUB, un otro apakšprogrammu, kas ir SECSUB. Ļaujiet ieejām un izvadēm atrasties atmiņā. Tāpat ar roku izveidojiet salikto programmas dokumentu visai programmai.
  5. Ņemot vērā, ka an IRQ apdarinātājs pievieno $02 līdz $01 akumulatorā kā pamata apstrādi, kamēr NMI ir izdota un pamata apstrādi NMI pievieno $05 līdz $04 pie akumulatora, uzrakstiet montāžas valodu abiem apstrādātājiem, ieskaitot viņu zvanus. Zvans uz IRQ apdarinātājam jāatrodas adresē 0200 USD. The IRQ apdarinātājam jāsākas ar adresi 0300 USD. The NMI apdarinātājam jāsākas ar adresi 0400 USD. Rezultāts IRQ apdarinātājs jāievieto adresē 0500 $, un rezultāts NMI apdarinātājs jānovieto adresē $0501.
  6. Īsi paskaidrojiet, kā BRK instrukcija tiek izmantota, lai radītu programmatūras pārtraukumu 65C02 datorā.
  7. Izveidojiet tabulu, kas salīdzina un kontrastē parasto apakšprogrammu ar pārtraukuma pakalpojuma rutīnu.
  8. Īsi izskaidrojiet 65C02 µP galvenos adresācijas režīmus, ņemot vērā montāžas valodas instrukciju piemērus.
  9. a) Uzrakstiet 6502 mašīnvalodas programmu, lai pievienotu 'Es tevi mīlu!' ASCII kodu virkne atmiņā, sākot no $0300 adreses ar virknes garumu. Programmai jāsākas ar 0200 USD adresi. Iegūstiet katru rakstzīmi no akumulatora pa vienam, pieņemot, ka tos tur nosūta kāda apakšprogramma. Arī salieciet programmu ar rokām. (Ja jums jāzina ASCII kodi “I love you!”. Šeit tie ir: “I”:49 16 , vieta: 20 16 , “l”: 6C 16 , 'o': 6F 16 , 'in':76 16 , 'e':65, 'y':79 16 , 'in':75 16 , un '!':21 16 (Piezīme: katrs kods aizņem 1 baitu).
    b) Uzrakstiet 6502 mašīnvalodas programmu, lai pievienotu 'Es tevi mīlu!' ASCII kodu virkne atmiņā, sākot no $0300 adreses bez virknes garuma, bet beidzas ar 00 16 . Programmai jāsākas ar 0200 USD adresi. Iegūstiet katru rakstzīmi no akumulatora, pieņemot, ka tos tur pa vienam nosūta kāda apakšprogramma. Arī salieciet programmu ar rokām.