MOS Technology 6502

MOS Technology 6502 är en 8-bitars CPU skapad av MOS Technology år 1975. Chipet liknar till stora delar 6800-processorn som tillverkades av Motorola, men kostade mycket mindre. Processorn har tillverkats i många olika varianter, som har använts i diverse hemdatorer och tv-spel, bland annat följande: Commodore PET, Commodore VIC-20, Commodore 64:s diskettstationer, Apple II, Atari 2600 och Nintendo Entertainment System (där kallad RP2A03).



Historia 
6502 designades främst av det ingenjörslag som ansvarade för Motorola 6800, strax efter att de sagt upp sig från moderföretaget och bildat MOS Technology. Deras första modell hette 6501, och var 6800-kompatibel i den grad att man utan modifikation kunde använda den på moderkort ritade för 6800. Programmen behövde däremot skrivas om. Motorola svarade med att stämma MOS, vilket ledde till att de lade ner 6501 och började arbeta med en ny design.

Resultatet blev 6502, som till skillnad från föregångaren inte kunde användas direkt på samma moderkort som 6800. För att stimulera ett intresse för den nya processorn konstruerade Chuck Peddle på MOS Technology en mikrodator som kallades KIM-1. Den sålde bra, och inspirerade liknande initiativ baserade på 6502.

En stor anledning till den framgång som 6502 skulle komma att skörda var prissättningen: medan konkurrentprodukterna Motorola 6800 och Intel 8080 såldes för 179 USD, prissattes 6502 när den släpptes i september 1975 till 25 USD. Den enorma prisskillnaden gjorde att få hade förtroende för processorn i början, men när Intel och Motorola raskt därefter sänkte sina priser till 79 USD så tog marknaden notis om allvaret i prissättningen.

Den första användningen av 6502 som vände sig till hemanvändare snarare än elektronikentusiaster var Atari 2600, känd som det första tv-spelet. Denna maskin använde sig av en 6507-processor, som endast kunde adressera 8 Kibyte RAM. Den rena 6502 användes i ett flertal efterföljande datorer av bland annat Apple, Commodore och Atari. Den direkta efterföljaren till 6502 var 6510, och användes i Commodore 64.

Nintendos första spelkonsol, Famicom (Japan) eller Nintendo Entertainment System (Amerika, Europa), använde två specialtillverkade varianter av 6502, nämligen 2A03 i NTSC-system och 2A07 i PAL-diton.

Teknisk beskrivning
6502 har ett generellt dataregister (ackumulatorn A), två indexregister (X och Y), samt programräknare, stackpekare och ett statusregister. Alla dessa register är åtta bitar stora, utom programräknaren som är uppdelad i två bytes (adressrymd 0x0000 – 0xFFFF). Endast ackumulatorn och indexregistren kan manipuleras direkt med load- och store-instruktioner, och endast på ackumulatorn kan man utföra alla operationer.

Bitarna i statusregistret har följande betydelse:

Som en följd av 8-bitarsarkitekturen är RAM indelat i pages om 256 bytes. Den första av dessa pages är speciell och kallas för zero page. Minnesadresserna i zero page kan bland annat användas som en slags adressregister, vilket möjliggör mer avancerade operationer. Se exempel nedan.

Programexempel

Addition i 16 bitar
Följande assemblerprogram för 6502 adderar två 16 bitar stora tal, med carry-flagga:

 lda TAL1_LO      ; Lägg lägsta byten av första talet i ackumulatorregistret
 clc              ; Rensa carry-flaggan innan addition
 adc TAL2_LO      ; Addera ackumulatorvärdet med lägsta byten i andra talet
 sta RESULTAT_LO  ; Lagra nya ackumulatorvärdet i lägsta byten av resultatet
 lda TAL1_HI      ; Lägg högsta byten av första talet i ackumulatorn
 adc TAL2_HI      ; Addera, men rensa inte carry-flaggan denna gång
 sta RESULTAT_HI  ; Lagra ackumulatorn i högsta byten av resultatet

De två bytes som utgör summan återfinns då på minnespositionerna RESULTAT_LO respektive RESULTAT_HI. Carry-flaggan motsvarar den 17:e biten av resultatet.

Minnespekare
Följande assemblerprogram för 6502 fyller minnesområdet mellan 0x1000 och 0x2000 med värdet 0xFF, med hjälp av en pekare i zero page:

     lda #$00     ; Sätt adress $10 till att peka på $1000.
     ldx #$10     ; -
     sta $10      ; Notera LSB-ordning på bytes i adressen.
     stx $11      ; -
     ldy #$00     ; Sätt y-index till noll.
 loop:
     lda #$ff     ; Sätt ackumulatorn till $ff.
     sta ($10),y  ; Lagra ackumulatorvärdet på adressen som ($10) pekar på.
     lda $10      ; Läs den låga byten av pekaradressen till ackumulatorn.
     clc          ; Rensa carry.
     adc #$01     ; Öka värdet.
     sta $10      ; Lagra nya värdet.
     lda $11      ; Läs den höga byten av pekaradressen till ackumulatorn.
     adc #$00     ; Addera eventuell carry-bit från föregående addition.
     sta $11      ; Lagra nya värdet.
     cmp #$20     ; Är den höga byten $20?
     bne loop     ; Om inte, hoppa till loop.

Externa länkar
6502.org – Mer information om processorfamiljen.
6502asm.com – En virtuell maskin baserad på 6502, skriven i JavaScript.
 Easy 6502 Svenska – En interaktiv bok som lär ut assemblerprogrammering. Använder 6502asm.com.

Mikroprocessorer