MOS Technology 6502 CPU Emulation
1 mai 2020 It is also worth mentioning that there are numerous sources online which detail all the 6502 CPU instructions. The one that's been primarily ...
Nintendo Entertainment System Hardware Emulation
used the online Easy6502 emulator which is cycle accurate and reads out the values of each of the registers and several memory locations.
Visualizing CPU Microarchitecture
version of Visual6502 simulator [7] was running at approximately 25 Hz. Thanks to recent years advancements on JavaScript runtime in web browsers
Simulátor procesoru 6502 (bakalá?ská práce)
Processor 6502 simulator. Thesis type: bachelor thesis. Department: Department of Computer Science Faculty of Science
Nintendo Entertainment System Hardware Emulation
The 6502 uses memory mapping to communicate with external devices including the PPU APU
Using Python 3 to Build a Cloud Computing Service for my
(plus some ØMQ and Redis). (and some 6502 assembler) For this some resources online. • http://osiweb.org ... Py65 : A 6502 Emulator Written in Python.
Dynamically Recompiling Emulator
optimizations from the LLVM project
Acorn emulators
12 févr. 2002 em6502 is a 6502 emulator capable of running BBC BASIC ... formats used for Beeb files online authentic though CPU-hungry.
User Manual ADAM-6000 Series
Visit the Advantech web site at www.advantech.com/support where you can find the latest information about the product. 2. Contact your distributor sales
A Nintendo Entertainment System simulator coded in pure VHDL
The NES itself consists of three main parts: a customized 6502 We used all resources available to us including online.
BAKALÁŘSKÁ PRÁCE
Simulátor procesoru 65022017 Pavel Kryl
Vedoucí práce: RNDr. Arnošt Ve-
čerkaStudijní obor: Aplikovaná informatika, prezenční formaBibliografické údaje
Autor: Pavel Kryl
Název práce: Simulátor procesoru 6502
Typ práce: bakalářská práce
Pracoviště: Katedra informatiky, Přírodovědecká fakulta, UniverzitaPalackého v Olomouci
Rok obhajoby: 2017
Studijní obor: Aplikovaná informatika, prezenční formaVedoucí práce: RNDr. Arnošt Večerka
Počet stran: 52
Přílohy: 1 CD
Jazyk práce: českÞ
Bibliograhic info
Author: Pavel Kryl
Title: Processor 6502 simulator
Thesis type: bachelor thesis
Department: Department of Computer Science, Faculty of Science, Pa- lackÞ University OlomoucYear of defense: 2017
Study field: Applied Computer Science, full-time formSupervisor: RNDr. Arnošt Večerka
Page count: 52
Supplements: 1 CD
Thesis language: Czech
Anotace
Práce se zabÞvá tvorbou simulátoru procesoru 6502 s podporou připojení jednodu-chÞch periferií. V práci je zahrnut krátkÞ popis procesoru a jeho struktury. Část
textu je věnována adresním módům a instrukční sadě. Dále je popsána struktura
aplikace a způsob, jakÞm probíhá překlad a vykonávání zdrojového kódu.Synopsis
Thesis deals with creating processor 6502 simulator with support for simple pe- ripherals. Thesis also includes short description of processor and its structure. Part of the text describes addressing modes and instruction set. Next there is a description of application structure and the way it compiles and emulates source code. Klíčová slova:simulátor; procesor 6502; překladačKeywords:simulator; processor 6502; compiler
Děkuji RNDr. Arnoštovi Večerkovi a všem lidem, kteří mi pomohli s dokončením této práce.MístopříseŽně prohlašuji, Že jsem celou práci včetně příloh vypracoval/a samo-
statně a za pouŽití pouze zdrojů citovanÞch v textu práce a uvedenÞch v seznamu literatury. datum odevzdání práce podpis autora Obsah1 Procesor 6502
81.1 Registry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91.1.1 Obecné registry . . . . . . . . . . . . . . . . . . . . . . . .
91.1.1.1 Akumulátor . . . . . . . . . . . . . . . . . . . . .
91.1.1.2 Index registry . . . . . . . . . . . . . . . . . . . .
101.1.2 Registr příznaků procesoru . . . . . . . . . . . . . . . . . .
101.1.3 Ukazatel na vrchol zásobníku . . . . . . . . . . . . . . . .
111.1.4 ProgramovÞ čítač . . . . . . . . . . . . . . . . . . . . . . .
121.2 Adresní módy . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
121.2.1 Neindexované adresování . . . . . . . . . . . . . . . . . . .
121.2.1.1 Implicitní adresa (Implied) . . . . . . . . . . . .
121.2.1.2 Bezprostřední hodnota (Immediate) . . . . . . .
121.2.1.3 Absolutní adresa (Absolute) . . . . . . . . . . . .
131.2.1.4 Nultá stránka (Zero Page) . . . . . . . . . . . . .
131.2.1.5 Relativní adresa (Relative) . . . . . . . . . . . .
131.2.2 Indexové adresování . . . . . . . . . . . . . . . . . . . . . .
141.2.2.1 Absolutní indexovaná adresa (Absolute indexed)
141.2.2.2 Indexované nultou stránkou (Zero Page indexed)
141.2.3 Nepřímé adresování . . . . . . . . . . . . . . . . . . . . . .
151.2.3.1 Indexované nepřímé adresování (Indexed Indirect)
151.2.3.2 Nepřímé indexované adresování (Indirect indexed)
151.2.3.3 Nepřímé absolutní adresování (Indirect absolute)
161.3 Instrukční sada . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 61.3.1 Formát instrukcí . . . . . . . . . . . . . . . . . . . . . . .
171.3.2 Přehled instrukcí . . . . . . . . . . . . . . . . . . . . . . .
181.3.2.1 Načítání a ukládání dat . . . . . . . . . . . . . .
181.3.2.2 Aritmetické operace . . . . . . . . . . . . . . . .
191.3.2.3 Logické operace . . . . . . . . . . . . . . . . . . .
231.3.2.4 Testování, větvení a instrukce skoku . . . . . . .
231.3.2.5 BitovÞ posun a rotace . . . . . . . . . . . . . . .
251.3.2.6 Instrukce pro přesun hodnot mezi registry . . . .
261.3.2.7 Zásobníkové operace . . . . . . . . . . . . . . . .
261.3.2.8 Subrutiny . . . . . . . . . . . . . . . . . . . . . .
281.3.2.9 "žádná" operace . . . . . . . . . . . . . . . . . .
282 Emulátor 6502
282 8
2.2 Struktura procesoru . . . . . . . . . . . . . . . . . . . . . . . . . .
302.3 Překlad programu . . . . . . . . . . . . . . . . . . . . . . . . . . .
302.3.1 UloŽení instrukcí . . . . . . . . . . . . . . . . . . . . . . .
3 02.3.2 Překlad . . . . . . . . . . . . . . . . . . . . . . . . . . . .
312.3.3 One-pass assembler . . . . . . . . . . . . . . . . . . . . . .
322.3.4 Vykonávání programu . . . . . . . . . . . . . . . . . . . . .
345
2.3.5 GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34
2.3.5.1 Knihovna Qt . . . . . . . . . . . . . . . . . . . .
342.3.5.2 Hlavní okno aplikace . . . . . . . . . . . . . . . .
362.3.5.3 VÞpis paměti . . . . . . . . . . . . . . . . . . . .
372.3.5.4 Periferie . . . . . . . . . . . . . . . . . . . . . . .
383 Instalace
393.1 Instalace emulátoru . . . . . . . . . . . . . . . . . . . . . . . . . .
393.2 Instalace knihovny Qt . . . . . . . . . . . . . . . . . . . . . . . .
39Závěr
41Conclusions
42A Obsah přiloŽeného CD
43B Abecední přehled instrukcí procesoru
44Literatura
52Bibliografie
526
Seznam obrázků
1 Diagram registrů procesoru . . . . . . . . . . . . . . . . . . . . .
102 Uspořádání registru příznaků . . . . . . . . . . . . . . . . . . . .
113 VÞpočet adresy indexovaného nepřímého adresování . . . . . . . .
154 VÞpočet adresy nepřímého indexovaného adresování . . . . . . . .
165 VÞpočet adresy nepřímého absolutního adresování . . . . . . . . .
176 Znázornění bitového posunu a rotace . . . . . . . . . . . . . . . .
257 Hlavní okno aplikace . . . . . . . . . . . . . . . . . . . . . . . . .
378 Okno s vÞpisem paměti . . . . . . . . . . . . . . . . . . . . . . . .
389 LED displej . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3810 SedmisegmentovÞ displej . . . . . . . . . . . . . . . . . . . . . . .
39Seznam tabulek
1 Rozdělení paměti podle programátorského manuálu . . . . . . . .
82 Podrobnější rozdělení paměti . . . . . . . . . . . . . . . . . . . . .
93 Nastavení příznaků po srovnání . . . . . . . . . . . . . . . . . . .
244 Rozdělení paměti aplikace . . . . . . . . . . . . . . . . . . . . . .
29Seznam zdrojovÞch kódů
1 Kombinace podmíného a nepodmíněného přeskoku . . . . . . . . .
1 42 Sčítání dvou 16bitovÞch čísel . . . . . . . . . . . . . . . . . . . . .
2 03 Odčítání dvou 16bitovÞch čísel . . . . . . . . . . . . . . . . . . . .
204 Nevalidní vÞsledky v decimálním módu . . . . . . . . . . . . . . .
215 Nevalidní příznaky v decimálním módu . . . . . . . . . . . . . . .
226 Posun vlevo tříbytového čísla . . . . . . . . . . . . . . . . . . . .
257 Posun vlevo čtyřbytového znaménkového čísla . . . . . . . . . . .
268 Posun vpravo čtyřbytového znaménkového čísla . . . . . . . . . .
2 79 PouŽití symbolů při práci s periferiemi . . . . . . . . . . . . . . .
2910 Soubor state6502.h, ve kterém je definice struktury procesoru . .
3011 Procedura pro rozdělení řádku . . . . . . . . . . . . . . . . . . . .
3112 Funkce pro převedení argumentů na číselnou hodnotu . . . . . . .
3313 Přepínač pro hledání instrukce podle adresního módu s příkladem
překladu instrukce . . . . . . . . . . . . . . . . . . . . . . . . . . 3414 Přepínač určování instrukce k vykonání . . . . . . . . . . . . . . .
3 515 Procedura nastavující příznaky N a Z . . . . . . . . . . . . . . . .
3516 Procedura k porovnávání hodnot . . . . . . . . . . . . . . . . . .
3617 Procedura pro určení adresního módu . . . . . . . . . . . . . . . .
407
1 Procesor 6502
Procesor 6502 byl navrŽen v roce 1975 a v té době patřil k nejlevnějším plně vybavenÞm procesorům. Velkou mírou se podílel na rapidním sniŽování cen pro-cesorů a stál u zrodu několika různÞch projektů, které podpořily vÞvoj domácích
počítačů. Jedná se o 8bitovÞ procesor s 16bitovou adresní sběrnicí. Nemá velké
mnoŽství registrů, kvůli technologiím, které byly tou dobou k dispozici. Bylomnohem jednodušší, a hlavně levnější, spoléhat více na RAM paměť neŽ NMOS
čipy pro registry.
Díky šířce adresní sběrnice dokázal procesor adresovat aŽ 64 KB paměti. Adresa se pak skládala z horního a dolního bytu. Toho se vyuŽívalo k rozdě-lení paměti na tzv. stránky. KaŽdÞ horní byte označoval číslo stránky. Nultá
stránka, tedy paměť na adrese(0000)16aŽ(00FF)16, byla efektivně vyuŽívánapro adresování. K této části paměti byl zaručen velmi rychlÞ přístup. Dalo se to
povaŽovat za náhradu malého mnoŽství registrů. V přeneseném slova smyslu měl
tedy procesor 256 8bitovÞch registrů.K adresování paměti je moŽné vyuŽívat tzv. labelů. SlouŽí jako jakási záloŽka
pro přeskok v kódu. Je to vlastně obdoba záloŽky z vyšších programovacíchjazyků, ve kterÞch se pouŽívá s příkazem GO TO. ZáloŽek se hojně vyuŽívá pro
větvení programu a také pro zvÞšení čitelnosti kódu. Povolená délka labelu je
maximálně 6 znaků. Stránka jedna, s adresou(0100)16aŽ(01FF)16, se pak vyuŽívala k uloŽení zásobníku. O tom, jakÞm způsobem je zajištěn zásobník více v kapitole 1.1.36502 pouŽívá efektivně indexové registry a zásobník, čímŽ umoŽňuje rozsáhlé
moŽnosti adresování. Kromě jiŽ zmíněného adresování pomocí nulté stránky je
moŽné pouŽít absolutní nebo relativní adresu a také lze vyuŽít registry pro tzv.
offset neboli posunutí. Toho se vyuŽívá například při adresování sekvenčních
bloků dat. O adresování pojednává kapitola 1.2ProtoŽe procesor je orientován na práci s pamětí, je zřejmé, Že paměť by měla
mít určitÞ řád. Jak jiŽ bylo zmíněno první dvě stránky paměti jsou rezervovány.
Co se zbytku paměti tÞče, je vlastně jen na vÞrobci procesoru, jak paměť rozdělí.
Doporučené rozdělení paměti podle programátorského manuálu je uvedeno v tabulce 1Tabulka 1: Rozdělení paměti podle programátorského manuáluAdresa (HEX) vyuŽití
0000 - 3FFF paměť RAM
4000 - 7FFF I/O zařízení
8000 - FFFF paměť ROMV tomto rozdělení však chybí spousta důleŽitÞch informací. Není zde zmínka
například o zásobníku, případně o důleŽité nulté stránce, která je z hlediska ad-
resování velmi uŽitečná. KdyŽ se pak začneme zajímat jakÞm způsobem procesor
pracuje s I/O zařízeními zjistíme, Že z pohledu programátora není rozdíl mezi
8pamětí RAM a I/O zařízením. To znamená, Že pro přístup k periferii se pouŽívá
stejnÞ způsob jako k přístupu k bloku paměti.Dále je pak zvykem posledníchněkolik bytů vymezit pro vektory a obsluhy přerušení. Podrobnější rozdělení pak
ukazuje tabulka 2 Tabulka 2: Podrobnější rozdělení pamětiAdresa (HEX) vyuŽití0000 - 00FF nultá stránka
0100 - 01FF zásobník
0200 - 7FFF paměť RAM, I/O zařízení
8000 - FFF9 paměť ROM
FFFA - FFFF vektory přerušeníVektory přerušení slouŽí k uloŽení adresy kódu, kterÞ se má provést, pokud
dojde k přerušení. Instrukční sada procesoru zahrnuje 56 různÞch instrukcí. Díky různÞm adres-ním módům celkovÞ počet instrukcí dosáhne čísla 151. O instrukcích bude řeč v
kapitole 1.3 Myslím, Že je vhodné zmínit i fakt, Že procesor 6502 nepodporuje "pipelining", tedy schopnost procesoru zpracovávat více instrukcí najednou. Tato moŽnost se objevila aŽ u pozdějších modelů.1.1 Registry
Procesor 6502 disponuje 6 hlavními registry: 16bitovÞ programovÞ čítač (značen jako PC), 8bitovÞ akumulátor (A někdy taky AC), dva 8bitové indexové registry (X a Y), 8bitovÞ ukazatel na vrchol zásobníku (S nebo SP) a 8bitovÞ registr příznaků (P).Na obrázku
1 je diagram registrů.1.1.1 Obecné registry
1.1.1.1 Akumulátor
Akumulátor je 8bitovÞ registr, kterÞ slouŽí k ukládání dat, se kterÞmi se mají
provádět operace. Většina instrukcí se provádí přes akumulátor nebo přes jeden
z pomocnÞch indexovÞch registrů (X nebo Y).Hlavním účelem toho registru je přenášení dat z paměti do akumulátoru nebo
obráceně. BěŽné pouŽití se tedy nejčastěji skládá z načtení hodnoty do registru, ať
uŽ z paměti nebo konstantní hodnotou, provedením nějaké operace jako například
AND/OR, testování vÞsledku této operace a případného následného uloŽení zpět
do paměti.Další ze způsobů pouŽití akumulátoru je například pro sčítání. Jedna z hodnot
k sečtení je uloŽena v registru a druhá se k ní přičítá. VÞsledek operace je pak
znovu uloŽen do akumulátoru. 9Obrázek 1: Diagram registrů procesoru
Akumulátor má tedy dvě hlavní funkce:
1. je to primární místo pro uloŽení dat 2. slouŽí pro ukládání mez ivÞsledkůop erací1.1.1.2 Index registry
Registry X a Y se převáŽně pouŽívají pro uloŽení indexů k procházení nebo ma-
nipulaci se sekvenčními daty v paměti. Oba registry je moŽné inkrementovat adekrementovat, čímŽ se z nich stávají další uŽitečné registry pro ukládání uŽiva-
telskÞch dat.1.1.2 Registr příznaků procesoru
Z uspořádání registru příznaků (P), které je zobrazeno na obrázku 2 je vidět,Že má k dispozici 7 pouŽitelnÞch bitů. Na kaŽdÞ z nich je pak moŽné nahlíŽet
jako na přepínač. Pět z nich jsou příznaky, které podávají informace o naposledy
provedené instrukci. Další dva příznaky jsou kontrolní. Carry flag (C) - česky také příznak přenosu funguje jako 9. bit při vÞpočtu.Je vyuŽíván třeba při bitovém posunu nebo sčítání. Tento příznak je také
moŽné manuálně nastavit instrukcí SEC na 1 nebo jej instrukcí CLC rese- tovat, tedy nastavit na 0. Zero flag (Z) - příznak vynulování podává informace, zda vÞsledek poslední vykonané instrukce byl nulovÞ. Příznak není moŽné manuálně nastavit nebo resetovat instrukcí. 10 Obrázek 2: Uspořádání registru příznakůInterupt disable (I) - příznak povolení přerušení je k dispozici programátorovi,
kterÞ přepínáním tohoto příznaku můŽe procesoru říct, jak obsluhovat pře-
rušení. Decimal mode (D) - přepínač mezi decimálním a binárním módem procesoru. Instrukce SED nastavuje bit D, CLC jej pak resetuje. Break flag (B) - příznak přerušení je nastavován pouze procesorem, a to vpřípadě, Že přerušení bylo způsobeno instrukcí BRK. Další bit registru je
nevyuŽitÞ.Overflow flag (V) - příznak přetečení se pouŽívá pouze u znaménkové aritme-
tiky. Pokud se uvaŽuje neznaménková aritmetika, je moŽné tento bit úplněignorovat. Tento bit značí, Že je potřeba provést nějaké úpravy vÞpočtu.
K nastavení dochází, pokud v případě sčítání čísel se stejnÞm znaménkem
nebo odčítání čísel s různÞmi znaménky je vÞsledek větší neŽ +127 nebo
menší neŽ -128. Negative flag (N) - znaménkovÞ bit podává informaci, zda vÞsledek poslední instrukce měl nastavenÞ nejvyšší tedy 8. bit.1.1.3 Ukazatel na vrchol zásobníku
Zásobník dává moŽnost procesoru například pracovat se subrutinami. Při zavo-lání subrutiny instrukcí JSR se na zásobník uloŽí adresa následující instrukce
a poté se změní hodnota programového čítače na adresu subrutiny. Po zavo- lání instrukce RTS pro návrat ze subrutiny, tedy obdoba příkazu return, se do programového čítače načte uloŽená hodnota ze zásobníku.Ukazatel na zásobník je pouze 8bitovÞ, z toho zřejmě vyplÞvají určitá ome-
zení. Hodnota ukazatele udává niŽší byte adresy, vyšší byte se vŽdy bere jako 1.
To znamená, Že zásobník je v paměti uloŽen na stránce 1 adresního prostoru. 11Zásobník je přístupnÞ i pro data programátora. Na zásobník je moŽné uloŽit
hodnotu akumulátoru nebo i celého registru příznaků, toho se vyuŽívá například
při obsluze přerušení.1.1.4 ProgramovÞ čítač
Poslední z registrů je programovÞ čítač. Je to 16bitová adresa, která ukazuje na
místo s následující instrukcí, která má bÞt prováděna. Díky své velikosti umoŽňuje
adresovat celou paměť procesoru.1.2 Adresní módy
Procesor 6502 pouŽívá 16bitové adresy coŽ umoŽňuje adresovat 65 536 lokací vpaměti. KaŽdá z nich se pak skládá z 8 bitů dat. Adresa paměti se dá povaŽovat
za 256 paměťovÞch stránek s 256 paměťovÞmi lokacemi (1 bytem) na stránku.1.2.1 Neindexované adresování
1.2.1.1 Implicitní adresa (Implied)
Instrukce pouŽívající implicitní adresování jsou jednobytové. Tento byte zabírá
OP CODE instrukce.
Instrukce se uvádí bez argumentů, případně u některÞch instrukcí je moŽné
quotesdbs_dbs10.pdfusesText_16[PDF] 6502 endianness
[PDF] 6502 flags
[PDF] 6502 inc
[PDF] 6502 indirect addressing
[PDF] 6502 instruction
[PDF] 6502 instruction length
[PDF] 6502 instruction reference
[PDF] 6502 instruction set masswerk
[PDF] 6502 instruction set timings
[PDF] 6502 jsr stack
[PDF] 6502 logic diagram
[PDF] 6502 machine and assembly language programming
[PDF] 6502 machine code
[PDF] 6502 map