MOS 6502: Skillnad mellan sidversioner
Admin (diskussion | bidrag) |
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
||
(6 mellanliggande sidversioner av samma användare visas inte) | |||
Rad 64: | Rad 64: | ||
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. | 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.'' | ''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 ==== | |||
<code>LDX #0 ; Ladda indexregistret X med noll</code> | |||
<code>LOOP:</code> | |||
<code> LDA MESSAGE,X ; Ladda ackumulatorn med nästa tecken från meddelandet</code> | |||
<code> BEQ DONE ; Om nollterminatorn har nåtts, avsluta programmet</code> | |||
<code> JSR $FDED ; Anropa ROM-funktionen för att skriva ut tecknet på skärmen</code> | |||
<code> INX ; Öka indexregistret för att gå till nästa tecken i meddelandet</code> | |||
<code> JMP LOOP ; Hoppa tillbaka till början av loopen</code> | |||
<code>DONE:</code> | |||
<code> BRK ; Avsluta programmet</code> | |||
<code>MESSAGE:</code> | |||
<code> .text "Hello, World!",0 ; Meddelandet att skriva ut, avslutas med en nollterminator</code> | |||
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 ==== | |||
<code>; "Hello, World!" program for Atari 800</code> | |||
<code>; Load address: $2000</code> | |||
<code> *= $2000 ; Load address</code> | |||
<code>START LDX #0 ; Load X register with 0</code> | |||
<code>LOOP LDA MESSAGE,X ; Load accumulator with the next character from the message</code> | |||
<code> BEQ DONE ; If the null terminator is reached, exit the program</code> | |||
<code> JSR $E456 ; Call OS subroutine to print the character on the screen</code> | |||
<code> INX ; Increment X to point to the next character in the message</code> | |||
<code> JMP LOOP ; Jump back to the beginning of the loop</code> | |||
<code>DONE SWI ; Exit the program</code> | |||
<code>MESSAGE .text "Hello, World!",0 ; The message to print, terminated with a null character</code> | |||
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. <code>SYS 8192</code> om du laddade det på $2000). | |||
=== | ==== C64 ==== | ||
<code>; "Hello, World!" program for Commodore 64</code> | |||
<code>; Load address: $1000</code> | |||
<code> *= $1000 ; Load address</code> | |||
; Load address | |||
<code>START LDX #0 ; Load X register with 0</code> | |||
<code> | <code>LOOP LDA MESSAGE,X ; Load accumulator with the next character from the message</code> | ||
<code> | <code> BEQ DONE ; If the null terminator is reached, exit the program</code> | ||
<code> JSR $FFD2 ; Call KERNAL subroutine to print the character on the screen</code> | |||
<code> INX ; Increment X to point to the next character in the message</code> | |||
; | |||
<code> JMP LOOP ; Jump back to the beginning of the loop</code> | |||
<code> | <code>DONE BRK ; Exit the program</code> | ||
<code>MESSAGE .text "Hello, World!", | <code>MESSAGE .text "Hello, World!",0 ; The message to print, terminated with a null character</code> | ||
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. | |||
[[Kategori:Hårdvara]] | [[Kategori:Hårdvara]] | ||
[[Kategori:Cpu]] | [[Kategori:Cpu]] | ||
[[Kategori:Datorhårdvara]] |
Nuvarande version från 18 november 2023 kl. 10.57
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.