Langbahn Team – Weltmeisterschaft

MOS Technology 6502

MOS 6502
W65C02

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:

Bit Betydelse
0 Carry-biten. Sätts till 1 om resultatet av en instruktion som stödjer carry överskrider 8 bitar. Kan sättas manuellt med CLC- och SEC-instruktionerna.
1 Zero-biten. Sätts till 1 om resultatet av en instruktion är noll.
2 IRQ Disable. Stänger av all avbrottshantering om biten är satt. Manipuleras med CLI- respektive SEI-instruktionerna.
3 Decimal mode. Försätter processorn i BCD-läge. Manipuleras med CLD- respektive SED-instruktionerna.
4 BRK command. Sätts av instruktionen BRK, triggar ett non-maskable interrupt.
5 Oanvänd.
6 Overflow-biten. Håller reda på om en räkneoperation involverande negativa tal har hamnat utanför talrymden.
7 Negative-biten. Sätts om högsta biten i resultatet av en instruktion är satt.

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

MOS 6502-serie

6502 | 6507 | 6510 | 65C816