Hoppa till innehållet

MOS Technology 6502

Från Wikipedia
Version från den 2 oktober 2006 kl. 11.40 av Radiantx (Diskussion | Bidrag) (Städade upp kommentarerna i andra programexemplet.)

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, bl.a. följande: Commodore PET, Commodore VIC-20, Commodore 64, Apple II, Atari 2600 och Nintendo Entertainment System.

Teknisk beskrivning

6502 har tre generella dataregister (ackumulatorn A, indexregistren 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 dataregistren kan manipuleras direkt med load- och store-instruktioner.

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 involverandes 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å bytesen 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