MOS Technology 6502

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
Mikroprocesor MOS 6502 v pouzdře DIP-40.
Zapojení vývodů MOS 6502

MOS Technology 6502 je osmibitový mikroprocesor, který navrhli Chuck Peddle a Bill Mensch pro firmu MOS Technology v roce 1975. V té době se jednalo o nejlevnější plně vybavený mikroprocesor na trhu. Stál okolo 20 $, což bylo méně než šestina ceny konkurenčních návrhů z větších společností, jako např. Motorola a Intel. Byl s nimi plně srovnatelný a stejně jako Z80 Zilog uvedený na trh v roce 1976 vyvolal řadu počítačových projektů, které nakonec vedly k éře domácích počítačů v 80. letech. 6502 měl asi 4000 tranzistorů a byl vyráběn i v provedení pro embedded systémy.

Procesor 6502 neumí pipelining, tato vlastnost se objevila až u procesorů 6509 a 6510.[1] Zásobník procesoru je pevně svázán s konkrétním blokem paměti o velikosti 256 byte.[2]

Z počítačů, v jejichž útrobách byl instalován, stojí za zmínku například Apple I či Atari 800XE/XL.

Technický popis[editovat | editovat zdroj]

Registry mikroprocesoru MOS 6502
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 (číslo bitu)
Hlavní registry
  A Accumulator, střadač
Indexregistry
  X X index
  Y Y index
0 0 0 0 0 0 0 1 SP Stack Pointer, ukazatel zásobníku
Programový čítač
PC Program Counter, programový čítač
Stavový registr
  N V - B D I Z C P Processor flags, příznaky procesoru

6502 je osmibitový mikroprocesor s 16bitovou adresní sběrnicí. Původní verze byly vyráběny pomocí technologie NMOS 8 µm[3] s velikostí čipu 153 x 168 mils (3,9 x 4,3 mm)[4].

Přestože 6502 pracoval s poměrně nízkým hodinovým kmitočtem (typicky okolo 1 až 2 MHz), jeho výkonnost byla srovnatelná s procesory pracujícími s mnohem rychlejšími hodinami. Příčinou byla Interní logika pracuje na stejném kmitočtu jako externí hodiny, a i přes jejich nízký kmitočet (typicky okolo 1 až 2 MHz) byla výkonnost 6502 srovnatelná s jinými tehdejšími procesory pracujícími s mnohem rychlejšími hodinami. Zčásti je to způsobeno jednoduchým řadičem implementovaným do větší míry kombinační logikou (neřízenou hodinami) než u mnoha jiných procesorů; dvoufázové hodiny (dodávající dvě synchronizace v jednom cyklu) tak mohly řídit celý strojový cyklus přímo. Typické instrukci na 6502 tak mohl stačit jen poloviční počet cyklů v porovnání s jinými tehdejšími mikroprocesory. Stejně jako u většiny jednoduchých procesorů té doby, dynamický čip 6502 není řízen mikrokódem, ale používá PLA (zabírající asi 15 procent plochy čipu) pro dekódování a provádění instrukcí. Jako většina osmibitových mikroprocesorů obvod prováděl omezené překrývání načítání a provádění instrukcí.

Nízký kmitočet hodin zmírňoval požadavky na rychlost paměti a periferních zařízení připojených k CPU, protože přistupovat k paměti bylo možné přibližně jen v polovině hodinového cyklu (kvůli asynchronnímu návrhu se tento zlomek výrazně měnil podle verze čipu). To bylo v době, kdy dostupné paměti měly časy přístupu v rozsahu 250-450 ns, velmi důležité. Původní 6502 byl minimalisticky navržen a efektivně vyroben a proto byl levný, což je důležitý faktor úspěchu na poli herních konzolí a domácích počítačů, které je velmi citlivé na cenu. Stejně jako jeho předchůdce, Motorola 6800, má 6502 jen několik registrů. V době, kdy byl procesor navrhován, byl počet tranzistorů, které mohly být umístěny na čip, velmi omezen (na několik tisíc), takže dávalo smysl využít paměť RAM místo nákladné plochy NMOS čipu pro registry CPU.

Registry[editovat | editovat zdroj]

Sada registrů 6502 zahrnuje jeden osmibitový akumulátor (A), dva osmibitové indexregistry (X a Y), osmibitový registr příznaků procesoru (P), osmibitový ukazatel zásobníku (S) a 16bitový programový čítač (PC). Zásobník je vždy umístěn na adresách $0100$01FF (256511), protože ukazatel zásobníku je jen osmibitový a jako horní byte adresy se vždy používá hodnota 1. Instrukce pro přístup k zásobníku využívají čtyři implicitní režimy adresování, které umožňují uložení nebo vyzvednutí obsahu akumulátoru nebo stavového registru procesoru. Zásobník se používá také pro ukládání návratových adres z podprogramů v instrukcích JSR (Jump to Subroutine) a RTS (Return from Subroutine) a pro zpracovávání přerušení.

Adresování[editovat | editovat zdroj]

6502 používá efektivně indexregistry a ukazatel zásobníku ve spojení s několika režimy adresování, včetně rychlého režimu „přímé“ nebo „nulté stránky“ podobnému adresování na PDP-8, který pro přístup na libovolnou adresu v paměti používá jedinou osmibitovou adresu 0 až 255, na níž je uložena dvoubytová adresa skutečného operandu (což šetří hodinové cykly normálně nutné pro načtení vyššího bytu adresy). 6502 používá nultou stránku prakticky podobně jako jiné procesory používají registry. Některé operační systémy však používají větší část nulté stránky a ponechávají pro uživatele pouze několik málo lokací.

Režimy adresování jsou: implicitní (jednobytové instrukce); absolutní (tříbytové); indexované absolutní (tříbytové); indexované nultou stránkou (dvoubytové); relativní (dvoubytové); akumulátorové (jednobytové); nepřímé s registrem x a nepřímé s registrem y (dvoubytové); a bezprostřední (dvoubytové). Absolutní režim je víceúčelový režim. Instrukce skoku používají osmibitové posunutí se znaménkem od začátku další instrukce; rozsah -128..127 proto se převádí na rozsah 128 bytů zpět nebo 127 byty dopředu od instrukce následující za skokem (což je 126 bytů zpět až 129 bytů za začátkem instrukce skoku). Režim akumulátoru používá obsah akumulátoru jako efektivní adresu a nepotřebuje žádnou bezprostřední hodnotu pro přístup k operandu. Režim immediate používá jako operand osmibitový literál.

Nepřímé adresování[editovat | editovat zdroj]

Nepřímé režimy jsou užitečné pro práci s poli a používání cyklů. U režimu „(indirect),y“, který trvá 5 nebo 6 cyklů hodin, je osmibitový registr Y přičten k 16bitové bázové adrese přečtené z nulové stránky z adresy, která je uvedena v bytu za operačním kódem. Registr Y je proto index-registr v tom smyslu, že obsahuje skutečný index (oproti registru X v 6800 kde je bázová adresa přímo uložena a, na které bezprostřední posunutí by mohlo být přidala). Inkrementování indexregistru při procházení jednotlivých bytů v poli trvá pouze dva hodinové cykly. Spolu s méně často používaným režimem „(indirect,x)“, u kterého se efektivní adresa operandu získá načtením dvou bytů z nulté stránky z adresy tvořené přičtením druhého bytu instrukce k obsahu registru X. Díky použití indexovaných režimů funguje nultá stránka jako sada 128 přídavných (i když velmi pomalých) adresních registrů.

6502 dovoluje sčítat a odčítat binární i BCD čísla. Přepnutí CPU do BCD režimu provádí instrukce SED (nastav příznak D). $99 + $01 pak dává výsledek $00 a nastavuje příznak přenosu (C). V binárním režimu (do něhož se přepíná instrukcí CLD, smaž příznak D) stejná operace dává výsledek $9A s vynulovaným příznakem přenosu. Kromě Atari BASICu se BCD režim používal výjimečně v aplikacích domácích počítačů.

Ukázka kódu[editovat | editovat zdroj]

Následující zdrojový kód v jazyce symbolických adres 6502 je procedura MEMCPY pro kopírování bloku dat zadané délky z jednoho místa v paměti na jiné.



0040            
0040  00 00     
0042  00 00     
0044  00 00

0600            
0600  A4 44     
0602  D0 05     
0604  A5 45     
0606  D0 01     
0608  60        
0609  B1 40     
060B  91 42     
060D  88        
060E  D0 F9     
0610  E6 41     
0612  E6 43     
0614  88        
0615  C6 45     
0617  D0 F0     
0619  60        
061A            
; memcpy --
; Zkopíruje blok paměti z jednoho místa na jiné.
;
; Vstupní parametry
;      SRC - Adresa zdrojového bloku
;      DST - Adresa cílového bloku
;      CNT - Počet bytů, které se mají kopírovat

            ORG     $0040       ;Parametry na adrese $0040
SRC         DW      $0000
DST         DW      $0000
CNT         DW      $0000

            ORG     $0600       ;Kód od adresy $0600
MEMCPY      LDY     CNT+0       ;Načti Y = CNT.L
            BNE     LOOP        ;Jestliže CNT.L > 0, pak smyčka
            LDA     CNT+1       ;Jestliže CNT.H > 0,
            BNE     LOOP        ; pak smyčka
            RTS                 ;Návrat
LOOP        LDA     (SRC),Y     ;Načti ((SRC)+Y) do A
            STA     (DST),Y     ;Ulož A na ((DST)+Y)
            DEY                 ;Decr CNT.L
            BNE     LOOP        ;Jestliže CNT.L > 0, pak smyčka
            INC     SRC+1       ;Incr SRC += $0100
            INC     DST+1       ;Incr DST += $0100
            DEY                 ;Decr CNT.L
            DEC     CNT+1       ;Decr CNT.H
            BNE     LOOP        ;Jestliže CNT.H > 0, pak smyčka
            RTS                 ;Návrat
            END

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku MOS Technology 6502 na anglické Wikipedii.

  1. MOS 6502 family na cs.niu.edu, cit. 2014-03-17
  2. CPU structure na cs.niu.edu, cit. 2014-03-17
  3. CORDER, Mike. Big Things in Small Packages [online]. Sun Microelectronics, Spring 1999, [cit. 2012-04-23]. Dostupné online.  
  4. CUSHMAN, Robert H.. 2-1/2 Generation μP's -$10 Parts That Perform Like Low-End Mini's. EDN. Boston: Cahners Publishing, 1975-09-20. Dostupné online.  "

Literatura[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]