![]() |
|||
|
|
|
||
|
Órajel generátor A Cp0 órajel bemenetből (980 kHz) a processzor saját maga állitja elő a Cp1 és Cp2 fázisjeleket, melyek nem lapolnak át, tehát élesen két időszeletre osztják az óraciklusokat. Ez nem csak a regiszterek írasánál hasznos, külső egységeknek is szükségük lehet erre, ezért két lábra ki is vannak vezetve. Az órajel generátor működésének lényege, hogy két ellenütemű inverterpár, melyek nagy áramot adnak (mindenhova el kell juttatni a fázisjeleket) és lassúak, mint késleltetők használhatók fel a jelek időbeli csúsztatgatására a lenti ábrának megfelelően. Maga a kapcsolás nagyon egyszerű, kevés tranzisztort használ, viszont sok helyet foglal el szilíciumon, hasonlóan a buszmeghajtó áramkörökhöz.
Utasításdekódoló Légyegi része a PLA, mely NOR kapukból áll, és a bemeneteit az utasitás regiszterből és az időzítőtől kapja. Kimenetei közvetlenül meghajtják a regiszterblokkot. Ezen kívül fontos feladata még az utasításhatárok megállapítása: ez a fetch jel kiadásához és a sync láb vezérlésehez szükséges, valamint az interrupt logikához is (megszakítás csak utasításhatáron). Az, hogy mikor kell új opkódot betölteni (fetch), az előző opkódtól függ, mert az utasítások nagy része adott óraciklust igényel, függetlenül attól, hogy van-e BCD korrekció, vagy nincs. Kivételesek a feltételes vezérlésátadások esetei, melyekben a feltétel teljesülésétől függően vagy vézérlésátadás, vagy fetch következik.
A tiltott kódoknak egyébként fontos alkalmazása volt a programvédelem: egy módszer volt a sok közül arra, hogy egy szoftver írói megnehezítsék a kódtörők munkáját. Eleinte ugyanis a disassemblerek nem ismerték a tiltott kódokat, azokat érvénytelen opkódnak mutatták, ezért rosszul állapították meg az utasításhatárokat is: a tiltott kódokkal megírt program így egy nehezen módosítható, zavaros byte-halmaznak tűnt. Időzítő vezérlő
Interrupt logika
Feladata az IRQ, NMI vonalakon érkező megszakításkérések fogadása, engedélyezés eldöntése, és a megfelelő vektor által meghatározott címre történő vezérlésátadás, amennyiben utasításhatárra ér a processzor, valamint RESET esetén a reset vektor betöltése. Mindhárom eset lényegében egy indirekt vezérlésátadás, melyhez memóriaolvasási ciklusok kellenek. IRQ es NMI eséten veremműveletekre is szük ség van, menteni kell a flag-et és az utasításszámlálót. Megszakítás elfogadásakor az interrupt logika szimulál egy BRK (szoftver megszakítás) utasítást az utasításdekódolónak, a különböző események között csupán annyi a különbség, hogy milyen címen van az ugrásvektor. A vektor címének beállításakor közvetlenül meghajtja a címkimeneteket, ehhez óraciklusokat "foglal le", és a belső READY jellel (Rdy0 a kapcsolási rajzon) várakoztatja a processzor többi részét. Ezt a többi blokk úgy észleli, mintha egy külső, lassú egység húzta volna le a processzor RDY lábát, plusz óraciklusokat igényelve. A három vektor, az NMI, RESET és az IRQ rendre a következő: FFFA, FFFC, FFFE. Vektor betöltésekor tehát a felső 13 címbit 1, az alsó 3 pedig attól függ, milyen esemény van. Az alsó bit mindig 0, mely nem csak arra szolgál, hogy meghajtja a címkimenetet, hanem arra is, hogy jelzi, hogy interrupt végrehajtás van folyamatban. Az alábbi áramkör ezt a jelet, és annak óraciklusokkal késleltetettjeit használja fel arra, hogy óraciklusokat foglaljon le a kérés teljesítéséhez:
A fenti kapcsolásra ugyan látszólag csak az NMI-nek a Schmitt triggeres bemenete van közvetlenül rákötve, de IRQ és RESET esetében is ugyanúgy működik, hiszen a legalsó címbit mindhárom esetben 0, és ennek a jelnek az 1 és 2 óraciklussal késleltetett jele i meghajtják ezt a kapcsolást.Regiszterblokk, utasításszámláló
8 bites processzoron belül egy 16 bites regiszter: két 8 bites darabban valósították meg, 2 óraciklus kell az értékadáshoz. Előnyös az olyan címzésmód, mely az úgynevezett nulláslapon dolgozik (a memória alsó 256 byte-ja), mert ekkor 1 óraciklus megtakarítható. Az utasításszámlálóval végzett leggyakoribb művelet a növelés ehhez külön áramkör van beépítve, így nem kell igénybe venni az ALU-t, és a növelés a processzor többi területétől függet lenül zajlik. A tárolók olyan inverterpárok, melyek a növelőn keresztül vannak visszacsatolva: ha a carry 0, akkor az eredeti bit íródik vissza, ha 1, akkor az inverze.
A transzfer gate-ek jelentése a következő:
Stack pointer, X és Y indexregiszterek
Ezekben a regiszterekben a tárolás egy fázisjellel vezérelt transzfer gate-tel megszakított, keresztbe csatolt inverterpárral valósul meg. Cp1 alatt a parazita kapacitások feltöltése, Cp2 alatt visszacsatolás, az információ tartása történik. A stack pointer annyival tud többet X-nél és Y-nál, hogy értékét a címkimenetre is lehet írni.
Akkumulátor, BCD korrekció Az akkumulátor egy BCD korekciós kapcsoláson keresztül kaphat értéket. (Binary Coded Decimal, ez egy olyan számábrázolás, mélynél például a 33-as byte, a hexadecimális 21 értéke decimális 21-ként kerül feldolgozásra, tehát a byte 2 darab 4 bites fele tárol egy-egy decimális számjegyet.) Összeadásnál és kivonásnál kell korrigálni a kapott eredményt, mert az ALU bináris összeadást végez. Ekkor mindkét dekádot meg kell vizsgálni, hogy nagyobb-e 9-nél, és ha igen, hozzá kell adni 6-ot (így lesz a decimális 10-ből hexadecimális 10). Az alábbi korrekciós áramkör úgy végzi el az összeadást, hogy nem használ bitenként végigfutó carry-t, mert az lassú, 1 óraciklusba kerülő eljárás lenne, hanem az ALU logikai függvényeiből előre számítja az összeadás hatását. A kapcsolás jobb oldali oszlopa az összehasonlítást végzi, jobbról a második oszlop a 6-tal való növelést, amennyiben a dekád nagyobb 9-nél, és a BCD engedélyezett, bal oldalon pedig az 1 bites tárolók és összeadók láthatók.
Aritmetikai és logikai egység
Az aritmetikai és logikai egység egy nagyon kompakt kapcsolás. A regiszterblokkban helyezkedik el, ugyanazokat a belső síneket használja, mint a regiszterek. Két bemenő operandusa van, a kapcsolási rajz jobb oldalán látható az az 5 transzfer gate, melyek kel kiválasztható, hogy a három sín, az egyik negáltja, valamint a 0 közül melyek kerüljenek a bemenetekre. Az ALU az aktuális utasítástól függetlenül előállítja az összes logikai függvényt, a carry-t, az összeget. Hogy ezek közül mi kerül a kimenetre, azt a transzfer gate-ek döntik el.
|