Nem célom mélységeiben belemenni a mikroprocesszorok evolúciójába, sem pedig belső működésébe, de néhány dolog azért jó ha az elején elhangzik, mert a későbbiekben még nagyon hasznos lesz. Pár alapfogalom, ami jelenleg csak hablatynak tűnik, de nagyban segíti majd a későbbiek megértését.
És minden assemblyhez kell némi hardver ismeret is, mivel ugye, ahogy az előzőekben elhangzott, ez egy low level cucc, és erősen hardverközeli dolog. Szóval előbb-utóbb el kell kezdenünk, de nyugi, nem fog fájni 😉
Az alábbi részekből nem lesz ZH, azért vannak itt, hogy vissza tudjak linkelni rájuk, amikor lényeges lesz 😉
MOS 6502
A MOS6502 processzort 1975-ben mutatták be, és nagyon hamar elterjedt, főképp az egyszerűségének, és olcsóságának köszönhetően. Rengeteg 80-as évekbeli mikroszámítógép és játékkonzol "agya" volt, mint például az Apple I, és Apple II, Atari 2600, a 8bites Atari számítógépek, BBC Micro, a klasszikus 8bites Nintendo (NES), és természetesen a Commodore masinák. Ami nem meglepő, hiszen a Commodore elég hamar felvásárolta a gyártó MOS Technology nevű céget, így mindenkinél olcsóbban tudta azt a gépeibe szerelni.
Maga a 6502 CPU (Central Processing Unit - központi feldolgozó egység) egy butított és átdolgozott változata egy korábbi, Motorola által fejlesztett processzornak. Általános célú, 8 bites mikroprocesszor, 16 bites cím-, és 8 bites adatbusszal.
Ez pontosan mit is jelent?
Menjünk végig sorjában. A mikroprocesszor valószínűleg nem kell magyarázni.
Ez a CPU 8 bites számokkal képes műveleteket elvégezni, mint például az összeadás, és egyéb műveletek. Ez kizárólag 0-255 közötti számokat jelent. Ez ugye nem egy nagy intervallum, emiatt is tűnik mai szemmel olyan kis bugyutának minden, ami 8 bites.
16 bites címbusza által 16 bitnyi, vagyis 65536 byte-nyi memóriát képes megcímezni és ezáltal elérni. (64 Kb -> 0 és 65 535 közötti értékek)
A 8 bites adatbusz pedig annyit jelent, hogy egyszerre 8 bit, vagyis 1 byte adatot tud "áthúzni" pl a memóriából.
Mint látjuk, ezek nem bődületes nagy számok, de az adott kor körülményeihez képest mégis jelentősek voltak, hiszen ki álmodhatott akkoriban 64 Kb memóriáról?
Belső felépítés
Az alábbi részegységek minden processzorban megvannak, így csak átfutunk rajtuk. A későbbiekben majd részletesebben is lesz róluk szó.
Control Unit - vezérlőegység
A CU feladata az utasítások memóriából kiolvasása, értelmezése, és végrehajtása.
Arithmetical and Logical Unit - Aritmetikai- és logikai egység
Az ALU az a rész, ami a konkrét számításokat végzi, pl összeadás, kivonás, logikai műveletek( pl ÉS, VAGY), stb. A számításokhoz rendszerint különféle belső regisztereket használ.
Regiszterek
A regiszterek a processzoron belül található belső tárolók, amik amolyan "munkamemóriaként" szolgálnak. Pl számok összeadásakor az ALU két megadott regiszter tartalmát összeadja, és az eredmény az egyik regiszterbe kerül. A használható munka regiszterek száma a 6502 esetében elég kevés, számszerint 3 (jelölésük A, X, Y) , méretük egyenként 8-8 bit. A CPU-k jelölésénél pl a "64bites" a regiszterek méretét jelöli, vagyis az adott processzor 64 bites számokkal képes egyszerre dolgozni.
Egyéb tulajdonságok
Program counter (PC)
A PC a proci egyik belső regisztere, funkciója nagyon egyszerű, azt a memóriacímet tárolja, ahonnan a következő utasítást majd ki kell olvasni a memóriából. Bármilyen utasítás végrehajtása után a CU növeli a PC értékét, majd kiolvasásra kerül a következő parancs a PC által mutatott memóraicímről. (És ez így tovább a végtelenségig)
Stack - verem
A verem egy érdekes CPU-n kívüli tároló a fizikai memóriában, amit a processzor kezelni képes. Mérete 255 byte. A verembe elmenthetjük például a munkaregisztereink tartalmát, amit később vissza tudunk olvasni. A vermet legegyszerűbb úgy elképzelni, mint egy gödröt, amibe beledobálhatunk adatokat, de mindig csak a legfelsőt tudjuk belőle kivenni. (LIFO - Last In First Out) Ha a legalsó adat kell, az összes többi felette lévőt ki kell pakolnunk előbb.
Értelme főképp az, hogy a processzorban lévő 3 regiszter kb semmire sem elég, így komplikáltabb dolgokhoz szükség van egy külső tárolóra, amiben egyéb adatokat lehet elmenteni. A verem elérése (írása/olvasása) fizikai adottságokból adódóan jelentősen gyorsabb, mint a memória egyéb területeinek.
Stack Pointer - Veremmutató
Egy processzoron belüli regiszter, amely tárolja, és mutatja a verem aktuális méretét. Ha esetleg megtelne, az bizony túlcsordulást jelent, ami angolul stackoverflow 🤭
Status Register (SR) vagy Processor Status (PS)
Szintén egy belső, 8 bites regiszter, aminek az egyes bitjei különböző jelentéssel bírnak. Ezek a bitek kiolvashatóak, és bizonyos műveletek hatására a CPU automatikusan beállítja őket, ami számunkra nagyon hasznos lehet. Pl kivonunk egymásból két számot, és ha az eredmény negatív lett, a megfelelő bit 1-re vált.
Munkaregiszterek - A, X, Y
Belső regiszterek, amikkel számítási műveleteket tudunk végezni.
Interrupts - megszakítások
A megszakítások adják az egyik legérdekesebb, és legizgalmasabb részét a 6502-nek. A processzor képes bizonyos jelek hatására megszakítani az éppen futó programot, és más egyéb feladatokat végrehajtani. Dolga végeztével visszatér a félbehagyott programhoz, és onnan folytatja, ahol abbahagyta.
Legegyszerűbb úgy elképzelni a megszakításokat, mint amikor vendégeket vársz, és éppen főzöl. Megszólal a csengő, beengeded a vendéget, majd visszatérsz a félbehagyott munkádhoz.
Tipikus életből vett példa a megszakításokra a C64 bekapcsolásától eltelt időnek a mérése. A megszakítás rendszeres időnként lefut, és függetlenül az épp futtatott programtól, mindig növeli egy számláló értékét. Mindebből mi semmit nem veszünk észre. Ugyanúgy, ahogyan manapság egy modern rendszeren sem.
Órajelciklusok
Sokan hallották már a kifejezést, hogy a "proci X mega/gigahertzen ketyeg". Ezt a "ketyegést" egy, a hardverbe épített kvarc oszcillátor állítja elő, aminek egyetlen funkciója és tulajdonsága, hogy feszültség hatására egy adott frekvenciájú "vibrálást" képes leadni. Ez a vibrálás hangolja össze az összes hardver elemet.
Természetesen a processzor is kap ilyen jeleket, nevezhetjük ezt egyfajta szívverésnek is. A CPU minden utasítást megadott "szívdobbanásnyi idő" alatt tud végrehajtani. Van amit 1, 2 vagy pl 4 ilyen ciklus alatt.
Értelemszerűen, minél több "szívdobbanást" kap, annál gyorsabb lesz a végrehajtás, ám minden processzornak megvan a saját maga maximuma, ami fölött már nem működik megbízhatóan. (Ismerős lehet a jelenség a PC-s overclockolásokból, amikor bizonyos túlhúzás után elkezd fagyogatni a gép)
A 6502 1-2 MHz közötti órajelfrekvenciával képes megbízhatóan működni. Ez a frekvencia a C64 esetében 0,985 Mhz, az egyéb hardverelemek összehangolásának eredményeképp. (Pl, lassú ram, együttműködés a grafikus chippel, stb)
Szerencsétlen C64-ünkben a proci nincs még 1 MHz-es sem.
MOS 6510
Eddig a 6502-ről volt szó, viszont köztudottan a Commodre 64-ben 6510-es processzor ketyeg. Az elkövetkezendőkben valószínűleg teljesen következetlenül fogom használni a 6510 és 6502 elnevezéseket, de esetünkben ez nem igazán lényeges. A 6510 a nagytestvér proci, ami a gyakorlatban teljesen kompatibilis a 6502-vel, az egyetlen különbség amiről tudok, az az, hogy a 6510 képes a memory overlappingra.
Aki eddig figyelmesen olvasott, annak feltűnhetett, hogy a processzor kereken, és kizárólag összesen 64Kb memóriát tud megcímezni, és ennél többet sehogy sem lát. A C64 egyik "csodája" az volt, hogy egyszerre tartalmazott 64Kb RAM-ot, és 20Kb ROM-ot, amiben az operációs rendszer volt. Ez pedig összesen 84 Kb, aminek együttes használatára a processzorunk nem képes.
Kezd érdekessé válni? Olvass tovább...
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.