MOS 6502

Från Wiki.linux.se
Version från den 18 november 2023 kl. 10.56 av Admin (diskussion | bidrag)
Hoppa till navigering Hoppa till sök

MOS 6502 är en av de mest ikoniska mikroprocessorerna från 1970-talet och var central i datorrevolutionen. Den drev maskiner som Apple I, Apple II, Atari-spelkonsoler, Commodore 64 och många andra. Här är en mer detaljerad titt på MOS 6502:

Grundläggande Specifikationer

   - Arkitektur**: 8-bitars processor.

   - Klockfrekvens: Ofta 1 MHz, men varierar beroende på implementering.

   - Adressbuss: 16 bitar, vilket ger möjlighet att adressera upp till 64 KB minne.

Instruktionsuppsättning

   - MOS 6502 har en enkel men effektiv uppsättning av instruktioner. Den stöder ungefär 56 operationer (t.ex., ADD, SUB, LOAD, STORE, etc.), men tack vare olika adresseringslägen kan dessa bli representerade av över 150 olika opcode-kombinationer.

Adresseringslägen

   - Den stöder flera adresseringslägen, inklusive omedelbar, zeropage, absolut, indirekt, och relativ adressering, bland andra.

Register

   - A (ackumulator)**: Används för de flesta aritmetiska och logiska operationer.

   -X och Y Indexregister**: Hjälper till med vissa adresseringslägen och loop operationer.

   - Statusregister: Innehåller flaggor för saker som noll-resultat, carry, interrupt disable, decimal mode, etc.

   - Stackpekare: För styrning av stacken.

   - Programräknare: Håller koll på den nästa instruktionen som ska exekveras.

Interruptions

   - Har stöd för maskerbara avbrott (IRQ) och icke-maskerbara avbrott (NMI), samt en RESET-interruption för systemåterställning.

Övriga Egenskaper

   - En av de mest framstående egenskaperna hos 6502 var dess pris. Den introducerades till en mycket lägre kostnad än konkurrerande processorer vid den tiden.

   - Den har en inbyggd klockgenerator och behöver bara en enkel extern oscillator.

Variantioner och Ättlingar

   - Många varianter av 6502 utvecklades, inklusive versioner med ytterligare instruktioner eller förbättrad prestanda.

6502: Den ursprungliga versionen av processorn.

6503 till 6507:

Dessa var versioner av 6502 med färre anslutningsstift och därmed en mindre adressbuss. Till exempel hade 6507 bara 13 adressstift, vilket begränsade den till att kunna adressera 8 KB minne. 6507 användes i Atari 2600-spelkonsolen.

6510

En förbättrad version av 6502 med en 8-bitars I/O-port och några andra mindre förändringar. Denna version användes i Commodore 64.

8502

Används i Commodore 128 och var en förbättrad version av 6510, med möjlighet att köras i både 1 MHz och 2 MHz-lägen.

65C02

En CMOS-version av 6502 som införde flera nya instruktioner, förbättrade vissa av de ursprungliga instruktionerna och rättade till några av 6502:ans "buggar". Denna version användes i bland annat Apple IIc och Enhanced Apple IIe.

65CE02

En vidareutveckling av 65C02 med ytterligare förbättringar och utökade instruktioner.

65816/65802

16-bitars utvidgningar av 6502. De kunde köras i 8-bitars kompatibilitetsläge eller 16-bitars infödingsläge. Denna version användes i Super Nintendo Entertainment System (SNES) och Apple IIGS.

Rockwell R6500

En variant framställd av Rockwell som hade några mindre förändringar jämfört med den ursprungliga 6502.

Synertek SY6510

En variant producerad av Synertek.

Kompatibilitet: Även om kärnarkitekturen var densamma och maskinkod skriven för 6502 i stort sett skulle fungera på en R6500, kunde de specifika integrerade funktionerna i vissa R6500-varianter kräva särskild kodning eller systemdesign för att dra full nytta av.


MOS 6502 har ett rykte för att vara enkel att programmera tack vare dess logiska instruktionsuppsättning och var därför mycket populär för hemdatorer och spelkonsoler under 70- och 80-talet. Dess inverkan på datorindustrin kan inte underskattas; den hjälpte till att demokratisera datorteknik och gjorde det tillgängligt för en bredare publik.

Nedan kommer exempel hur man skrev hello world i asm för 3 st olika populärar modeller och märken som fanns

Apple II

   LDX #0            ; Ladda indexregistret X med noll

LOOP:

   LDA MESSAGE,X     ; Ladda ackumulatorn med nästa tecken från meddelandet

   BEQ DONE          ; Om nollterminatorn har nåtts, avsluta programmet

   JSR $FDED         ; Anropa ROM-funktionen för att skriva ut tecknet på skärmen

   INX               ; Öka indexregistret för att gå till nästa tecken i meddelandet

   JMP LOOP          ; Hoppa tillbaka till början av loopen

DONE:

   BRK               ; Avsluta programmet

MESSAGE:

   .text "Hello, World!",0  ; Meddelandet att skriva ut, avslutas med en nollterminator


Du kan använda ett assemblerverktyg som Merlin Assembler för att skapa och köra detta program på din Apple II. När du har skapat programmet, kan du köra det från BASIC genom att skriva "BRUN PROGRAM.NAMN" där "PROGRAM.NAMN" är namnet på ditt assemblerprogram. Programmet kommer att skriva ut "Hello, World!" på skärmen och sedan avsluta.

Atari 8 Bitars

; "Hello, World!" program for Atari 800

; Load address: $2000

        *= $2000    ; Load address

START   LDX #0      ; Load X register with 0

LOOP    LDA MESSAGE,X ; Load accumulator with the next character from the message

        BEQ DONE    ; If the null terminator is reached, exit the program

        JSR $E456   ; Call OS subroutine to print the character on the screen

        INX         ; Increment X to point to the next character in the message

        JMP LOOP    ; Jump back to the beginning of the loop

DONE    SWI         ; Exit the program

MESSAGE .text "Hello, World!",0  ; The message to print, terminated with a null character

Detta program skriver ut "Hello, World!" på skärmen på en Atari 800. Du kan ladda det på din Atari 800 och köra det från BASIC genom att använda "SYS" kommandot med startadressen där programmet laddades (t.ex. SYS 8192 om du laddade det på $2000).

C64

; "Hello, World!" program for Commodore 64

; Load address: $1000

        *= $1000    ; Load address

START   LDX #0      ; Load X register with 0

LOOP    LDA MESSAGE,X ; Load accumulator with the next character from the message

        BEQ DONE    ; If the null terminator is reached, exit the program

        JSR $FFD2   ; Call KERNAL subroutine to print the character on the screen

        INX         ; Increment X to point to the next character in the message

        JMP LOOP    ; Jump back to the beginning of the loop

DONE    BRK         ; Exit the program

MESSAGE .text "Hello, World!",0  ; The message to print, terminated with a null character


Denna källkod är för Commodore 64 och skriver ut "Hello, World!" på skärmen. Du kan använda detta wikikod för att dela programmet och dess källkod med andra användare eller dokumentera det på en wiki-sida. För att köra programmet på en Commodore 64, ladda det på en kassettbandspelare och använd LOAD-kommandot i BASIC för att ladda programmet, sedan skriver du SYS 4096 (eller den adress där programmet laddades) för att köra det.