Univerza v Ljubljani Fakulteta za racunalniˇ ˇstvo in informatiko

Klemen Jesenovec igralne konzole Game Boy

DIPLOMSKO DELO

VISOKOSOLSKIˇ STROKOVNI STUDIJSKIˇ PROGRAM PRVE STOPNJE RACUNALNIˇ STVOˇ IN INFORMATIKA

Mentor: doc. dr. BoˇstjanSlivnik

Ljubljana, 2018 Copyright. Rezultati diplomske naloge so intelektualna lastnina avtorja in Fakultete za raˇcunalniˇstvo in informatiko Univerze v Ljubljani. Za objavo in koriˇsˇcenje rezultatov diplomske naloge je potrebno pisno privoljenje avtorja, Fakultete za raˇcunalniˇstvo in informatiko ter mentorja.

Besedilo je oblikovano z urejevalnikom besedil LATEX. Fakulteta za raˇcunalniˇstvo in informatiko izdaja naslednjo nalogo:

Tematika naloge:

Za operacijski sistem MS Windows izdelajte emulator za igralno konzolo Game Boy. Opiˇsitenjegovo zgradbo in naˇcindelovanja, njegovo delovanje pa preizkusite z izbranimi igricami, za katere ugotovite, do katere mere delujejo.

Kazalo

Povzetek

Abstract

1 Uvod 1

2 Sorodna dela 5 2.1 Statiˇcnotolmaˇcenjein dinamiˇcnoprevajanje ...... 6

3 Pregled strojne opreme 9 3.1 Sestava emulatorja ...... 10

4 Centralna procesna enota 11 4.1 Registri in zastavice ...... 11 4.2 Ukazi ...... 12 4.3 Prekinitve ...... 20 4.4 Implementacija v emulatorju ...... 21

5 Pomnilnik 25 5.1 Krmilniki pomnilniˇskihmodulov ...... 27 5.2 Implementacija v emulatorju ...... 28

6 Grafiˇcnikoprocesor 31 6.1 Grafiˇcnicevovod ...... 32 6.2 Registri ...... 33 6.3 Pomnilnik ...... 35 6.4 Implementacija v emulatorju ...... 36

7 Tipkovnica 39 7.1 Implementacija v emulatorju ...... 40

8 Casovnikˇ 43 8.1 Implementacija v emulatorju ...... 44

9 Delovanje emulatorja 47

10 Zakljuˇcek 51

Literatura 53 Seznam uporabljenih kratic

kratica angleˇsko slovensko LCD liquid-crystal display tekoˇcekristalnizaslon IR infrared infrardeˇce ROM read-only memory bralni pomnilnik RAM random-access memory bralno-pisalni pomnilnik PC program counter programski ˇstevec SP stack pointer skladovni kazalec SGB Super Game Boy Super Game Boy MBC memory bank controller krmilnik pomnilniˇskih modu- lov OAM object attribute memory tabela lastnosti objektov DMA direct memory access neposredni dostop do pomnil- nika

Povzetek

Naslov: Emulator igralne konzole Game Boy

Avtor: Klemen Jesenovec

Diplomsko delo obravnava problem ˇstudijestojne opreme in izdelave emula- torja za igralno konzolo Game Boy. Problema smo se lotili s preuˇcevanjem dokumentacije Game Boya in njegovih lastnosti. Za implementacijo emula- torja smo zaradi njegove uˇcinkovitosti in bliˇzini strojne opreme izbrali jezik ++. Problem smo razbili na podprobleme in implementirali vsak podsis- tem Game Boya posebej, ki smo jih nato zdruˇziliv celoto. Konˇcenrezultat diplomske naloge je delujoˇcemulator Game Boya.

Kljuˇcnebesede: emulator, Game Boy, C++.

Abstract

Title: Game Boy Emulator

Author: Klemen Jesenovec

This thesis describes the problem of hardware study and implementation of an emulator for the Game Boy video game console. The work began with studying Game Boy’s documentation and its hardware properties. The C++ language was chosen for the implementation due to its efficiency and it being close to hardware. We divided the problem into sub-problems and implemented each Game Boy subsystem separately, which we then combined into a whole. The final result of the thesis is a working Game Boy emulator.

Keywords: emulator, Game Boy, C++.

Poglavje 1

Uvod

Game Boy [2] je prenosna igralna konzola, ki jo je leta 1989 izdalo japonsko podjetje Nintendo. Prvi model je priˇselle v sivi barvi, prikazan je na sliki 1.1.

Slika 1.1: Prvi model igralne konzole Game Boy (DMG).

Visok je 148, ˇsirok90 in debel 32 milimetorv. Zelen zaslon LCD brez

1 2 Klemen Jesenovec osvetljenega ozadja ima nastavljiv kontrast in premore ˇstiriodtenke zelenka- ste barve. Moˇznoje tudi nastavljanje glasnosti zvoka in prikljuˇcitev sluˇsalk na 3.5 mm zvoˇcniprikljuˇcek. Igre so v obliki kaset in se jih vstavi v reˇzo na zadnjem delu Game Boya. Kaseta igre Tetris je prikazana na sliki 1.2. Game Boy podpira tudi serijsko povezavo z drugo konzolo. Uporabnik z njim upravlja z osmimi gumbi. Nintendu je uspelo prodati kar 118 milijonov konzol [7]. Tako je Game Boy, v ˇcasupisanja tega diplomskega dela, tretja najbolje prodajana igralna konzola vseh ˇcasov. Pred njim je le Sonyjev Playstation 2 z veˇckot 155 milijoni prodanih konzol in Nintendov Nintendo DS, ki je nasledil Game Boyevega naslednika in je bil prodan 154 milijonkrat. V letih po izidu prvega modela igralne konzole, je izˇsloˇse nekaj iz- boljˇsav [12]:

• Game Boy Light je bil preoblikovan izvirnik z manjˇsoobliko in bolj uˇcinkovitim delovanjem, ter je tako porabil manj energije.

• Game Boy Pocket, ki je bil izdan le na japonskem, je bil prav tako preoblika, ki so mu dodali ˇseosvetlitev ozadja.

• Game Boy Color je bila zadnja izboljˇsava, ki je konzoli dodala tudi za- slon v barvah in nekaj novih zmogljivosti strojne opreme kot so hitrejˇse delovanje, veˇcjakoliˇcinaspomina, nove moˇznostiprikazovanja, ipd.

Game Boy so izdelovali vse do leta 2003, ko ga je nasledil Game Boy Advance. Seznam najbolj prodajanih iger vkljuˇcuje[6]:

• Tetris (35 milijonov prodanih kopij),

• Pok´emonRed, Green in Blue (31 milijonov prodanih kopij),

• Super Mario Land (18 milijonov prodanih kopij),

• Kirby’s Dream Land (5 milijonov prodanih kopij). Diplomska naloga 3

Slika 1.2: Kaseta igre Tetris.

V tej diplomski nalogi se bomo posvetili predvsem lastnostim strojne opreme izvirnega modela Game Boya s poudarkom na izdelavi emulatorja, ki bo tekel na osebnih raˇcunalnikih.Vsa izvorna koda nastalega emulatorja je prosto dostopna na GitHubu [5]. V drugem poglavju sledi primerjava sorodnih del. V naslednih poglavjih pa so podrobnejˇseopisane lastnosti strojne opreme in njihove implementa- cije v emulatorju napisanem v programskem jeziku C++. V poglavju 3 se nahaja sploˇsniopis strojne opreme in emulatorja. Temu sledijo poglavja, ki podrobneje opiˇsejopodsisteme. V poglavju 4 centralno procesno enoto, v 5. pomnilnik, v 6. grafiˇcnikoprocesor, v 7. tipkovnico in v 8. poglavju je opisan ˇcasovnik. V 9. poglavju je opisano delovanje emulatorja. Temu sledi le ˇsezakljuˇcek. 4 Klemen Jesenovec Poglavje 2

Sorodna dela

Emulator [1] je programska oprema, ki omogoˇcigostujoˇcemu raˇcunalniˇskemu sistemu, da se obnaˇsakot drug raˇcunalniˇskisistem t. i. gost. To omogoˇca gostujoˇcemu raˇcunaliˇskemu sistemu poganjanje programske opreme, ki je bila napisana za raˇcunalniˇskisistem gosta. To ima kar nekaj prednosti, kot so

• dodatne zmogljivosti, ki jih izvirni raˇcunalniˇskisistem ni imel;

• omogoˇcanjepoganjanja programske opreme na drugaˇcnihsistemih;

• ohranjanje stare programske opreme na novejˇsihsistemih.

Seveda pa imajo emulatorji tudi nekaj hib:

• legalne teˇzave s krˇsitvijoavtorskih pravic;

• gostiteljski sistemi morajo biti bolj zmogljivi od sistema gosta.

Od Game Boyevega izida do danes je bilo narejenih ˇzekar nekaj emulatorjev. Seznam pomembnejˇsihobstojeˇcihemulatorjev vkljuˇcuje:

• BGB je zaprtokodni emulator, poznan po svoji natanˇcnostiin vizual- nim razshroˇsˇcevalnikom.

• Gambatte je zelo natanˇcenemulator, ki pa je tudi odprtokoden.

• Coffee GB je emulator napisan v Javi.

5 6 Klemen Jesenovec

• GEM je emulator Game Boya, ki uporablja dinamiˇcnoprevajanje.

Seznam podobnih emulatorjev, ki niso neposredno povezani z Game Boy- em, vkljuˇcuje:

• Oracle Virtual Box je prosta in odprtokodna programsa oprema za virtualizacijo osebnih raˇcunalnikov. Uporablja dinamiˇcnoprevajanje.

• VMware Workstation Player je prosta, ampak ne odprtokodna, pro- gramska oprema za virtualizacijo osebnih raˇcunalnikov.

• DosBox je prosto dostopen emulator, ki emulira raˇcunalnike kompati- bilne z IBMovem osebnim raˇcunalnikom in poganja DOS operacijski sistem.

2.1 Statiˇcnotolmaˇcenjein dinamiˇcnopreva- janje

Emulatorje lahko delimo v dve veˇcjiskupini glede na metodo izvajanja pro- gramske kode gosta. Emulatorji s s statiˇcnimtolmaˇcenjemkodo programske opreme gosta izvajajo ukaz za ukazom, tako da ukaze berejo in izvajajo pro- gramsko. Po drugi strani emulatorji z dinamiˇcnimprevajanjem ob samem delovanju emulatorja kodo gosta prevedejo v strojno kodo, ki se izvaja na gostiteljskem raˇcunalniˇskem sistemu. Spodaj je naˇstetihnekaj prednosti in slabosti obeh metod.

statiˇcnotolmaˇcenje dinamiˇcnoprevajanje laˇzjaimplementacija teˇzjeza implementacijo poˇcasnejˇseizvajanje programi se izvajajo hitreje niso vezani na arhitekturo gostitelja potrebno je znanje o arhitekturi gostitelja

Tabela 2.1: Primerjava statiˇcnegatolmaˇcenjain dinamiˇcnegaprevajanja. Diplomska naloga 7

Spodaj je v tabeli naˇstetihnekaj programov, ki uporabljajo razliˇcneme- tode.

statiˇcnotolmaˇcenje dinamiˇcnoprevajanje DosBox Oracle Virtual Box Jpcsp PPSSPP Coffee GB PCSX2 RPCS3

Tabela 2.2: Primeri programov, ki uporabljajo razliˇcnemetode.

V tem diplomskem delu smo se zaradi hitrejˇseimplementacije odloˇcili za emulator s statiˇcnimtolmaˇcenjem, saj to ˇsevedno zadoˇsˇcaza realistiˇcno izvajanje programov za igralno konzolo Game Boy. 8 Klemen Jesenovec Poglavje 3

Pregled strojne opreme

Game Boy je kot veˇcinoostalih raˇcunalnikihsistemov sestavljen iz centralne procesne enote, pomnilnika in vhodno izhodnih naprav. Ima po meri narejeno centralno procesno enoto, ki je podobna Zilogo- vem Z80. Ima 8-bitno aritmetiˇcnologiˇcnoenoto in 16-bitno vodilo. Urina frekvenca znaˇsa4.194304 MHz. Vgajen je tudi ˇcasovnik, ki lahko proˇzipre- kinitve. Poleg ˇcasovne prekinitve lahko prekinitve proˇzijotudi video enota, gumbi in serijska povezava. Notranji pomnilnik je razdeljen na delovni, video in specializiran pomnil- nik. Poleg notranjega pomnilnika se v kaseti nahaja tudi zunanji pomnilnik. Na tej se nahaja tudi ROM z igro, ki je lahko dostopen po pomnilniˇskih modulih. Kasete imajo lahko na sebi tudi dodatne funkcije kot so ura, IR senzorji, ipd. Poleg centralne procesne enote ima Game Boy tudi grafiˇcnikoprocesor, ki skrbi za izris grafike na zaslon. Ta je 160x144 toˇckvelik LCD zaslon, ki pa nima osvetljenega ozadja in je sposoben prikazovati 4 barve. Osveˇzujese s frekvenco 59.73 Hz. Game Boy za ustvarjanje zvoka uporablja posebno zvoˇcnoenoto. Ima ˇstiri kanale, ki jih lahko posebej zmeˇsana levi ali desni zvoˇcnik. Prva dva kanala lahko proizvedeta kvadratne valove in imata kontrolo za glasnost, frekvenco in dinamiˇcnipomik teh. Tretji kanal proizvaja valove po meri, ki so shranjeni

9 10 Klemen Jesenovec v specializiranemu pomnilniku. Zadnji kanal pa proizvaja nakljuˇcenˇsum. Uporabnik s konzolo upravlja s pomoˇcjoosmih gumbov: ˇstirismerne tipke, tipka A, tipka B, SELECT in START. Game Boy napajajo ˇstiriAA baterije. Elektriˇcnaporaba se razlikuje od igre do igre, saj so razvijalci uporabljali razliˇcnetrike za varˇcevanje z energijo. Ti vkljuˇcujejoizklapljanje zvoˇcneenote, ko ni v uporabi, ali pa spretno uporabljanje ustavljenega naˇcinadelovanja. Tako lahko s polnimi baterijami Game Boy zdrˇzi20–35 ur igranja [8, 9, 12, 11].

3.1 Sestava emulatorja

Emulator smo napisali v programskem jeziku C++ z uporabo programskega orodja Microsoft Visual Studio 2017. Preveden je s prevajalnikom, ki podpira C++11 standard. Uporabili smo samo eno zunanjo knjiˇznjico za potrebe izrisa in branja tipkovnice. Zaradi prenosljivosti in odprokodnosti smo se odloˇcili za Simple DirectMedia Layer (SDL) [10]. Emulator je sestavljen modularno. Glavni razred Board, ki predstavlja tiskano vezje, vsebuje posamezne module, ki predstavljajo centralno procesno enoto, grafiˇcnikoprocesor in pomnilnik. Te moduli implementirajo svoje funkcionalnosti, ki jih nadzoruje in usklajuje glavni razred. Implementacija vsakega od modulov je podrobneje razloˇzenav naslednjih poglavjih. Poleg razreda Board obstaja ˇserazred z imenom Renderer, ki poskrbi za izrisovanje in ˇcasovno usklajevanje izrisa z emulacijo izvajanja. Poglavje 4

Centralna procesna enota

4.1 Registri in zastavice

Game Boyeva centralna procesna enota ima osem 8-bitnih registrov in dva 16-bitna regista. Predstavljeni so v tabeli 4.1, kjer en stolpec predstavlja ˇsirinoosmih bitov.

A F B C D E H L PC SP

Tabela 4.1: Registri.

En par 8-bitnih registrov se lahko uporablja kot 16-bitni register, tako dobimo registre AF, BC, DE in HL. Register A je akumulator in se uporablja za vse aritmetiˇcnologiˇcneoperacije. Register F v zgornjih ˇstirihbitih drˇziˇstiri zastavice. Po vrsti od sedmega do ˇcetrtegabita so:

• Z: niˇcelnazastavica, ki se postavi, ko je rezultat operacije enak 0;

11 12 Klemen Jesenovec

• N: negativna zastavica, ki se postavi ob odˇstevalni operaciji;

• H: polprenosna zastavica, ki se postavi, ˇcepride do prenosa iz tretjega na ˇcetrtibit;

• C: prenosna zastavica, ki se postavi ob prenosu iz sedmega bita.

Zastavice se ne spreminjajo ob vsakem ukazu, saj nekateri ukazi pustijo doloˇcenezastavice nespremenjene. Zastavici N in H se uporabljata samo pri ukazu DAA. Spodnji biti regista F so vedno postavljeni na 0. Register PC je programski ˇstevec in kaˇzena naslov naslednjega ukaza. Register SP je skladovni kazalec, ki kaˇzena vrh sklada. Sklad se ˇsiriproti niˇzjimnaslovom, skladovni kazalec pa kaˇzena zadnji vstavljen element (t. i. full descending sklad).

4.2 Ukazi

Game Boy pozna 501 ukazov, ki so lahko razliˇcne dolˇzine. V tabelah 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9 in 4.10 so predstavljeni vsi ukazi razvrˇsˇceni pa njihovi vrsti [3, 8, 9]. Vrste operandov so lahko: d8 (takojˇsni8-bitni podatek), d16 (takojˇsni 16-bitni podatek), a8 (8-bitni del naslova), a16 (16-bitni naslov), sd8 (8-bitni predznaˇcenpodatek), r8 (8-bitni register), r16 (16-bitni register). Podatek v oklepajih predstavlja naslov. Zastavice so oznaˇcenev enakem vrstnem redu kod zgoraj. Oznaka 0 pomeni, da se zastavica postavi na 0, 1 pa na 1. Zastavica oznaˇcenas ˇcrko pomeni, da se postavi glede na rezultat ukaza (npr. zastavica C, ˇceje pri seˇstevanju priˇslodo preliva). Oznaka - pomeni, da ukaz zastavice ne spreminja. Dolˇzinaukaza je oznaˇcenav bajtih, trajanje pa v urinih periodah. Neka- teri ukazi imajo veˇctrajanj, saj trajajo razliˇcno dolgo odvisno od izpolnje- nosti pogoja. Diplomska naloga 13

mnemonik operandi zastavice dolˇzina trajanje ld r8, r8 ---- 1 4 ld r8, d8 ---- 2 8 ld r8, (HL) ---- 1 8 ld (HL), r8 ---- 1 8 ld (HL), d8 ---- 2 12 ld A, (r16) ---- 1 8 Samo z BC in DE ld A, (a16) ---- 3 16 ld (r16), A ---- 1 8 Samo z BC in DE ld (a16), A ---- 3 16 ldh A, (a8) ---- 2 12 Naloˇziiz naslova 0xFF00 + a8 ldh (a8), A ---- 2 12 Naloˇzina naslov 0xFF00 + a8 ldh A, (C) ---- 1 8 Naloˇziiz naslova 0xFF00 + C ldh (C), A ---- 1 8 Naloˇzina naslov 0xFF00 + C ldi (HL), A ---- 1 8 ldi A, (HL) ---- 1 8 Ukaz ldi po nalaganju inkrementira register HL ldd (HL), A ---- 1 8 ldd A, (HL) ---- 1 8 Ukaz ldd po nalaganju dekrementira register HL

Tabela 4.2: 8-bitni ukazi za nalaganje. 14 Klemen Jesenovec

mnemonik operandi zastavice dolˇzina trajanje ld r16, d16 ---- 3 12 Samo z BC, DE, HL in SP ld SP, HL ---- 1 8 push r16 ---- 1 16 pop r16 znhc 1 12 Zastavice se postavijo ob nalaganju AF

Tabela 4.3: 16-bitni ukazi za nalaganje.

mnemonik operandi zastavice dolˇzina trajanje daa z-0c 1 4 Popravi akumulator po pravilu BCD aritmetike cpl z0hc 1 4 Naredi eniˇskikomplement akumulatorja inc r8 z0h- 1 4 inc (HL) z0h- 1 12 dec r8 z1h- 1 4 dec (HL) z1h- 1 12

Tabela 4.4: 8-bitni aritmetiˇcnologiˇcniukazi. Diplomska naloga 15

mnemonik operandi zastavice dolˇzina trajanje add A, r8 z0hc 1 4 add A, d8 z0hc 2 8 add A, (HL) z0hc 1 8 adc A, r8 z0hc 1 4 adc A, d8 z0hc 2 8 adc A, (HL) z0hc 1 8 sub A, r8 z1hc 1 4 sub A, d8 z1hc 2 8 sub A, (HL) z1hc 1 8 sbc A, r8 z1hc 1 4 sbc A, d8 z1hc 2 8 sbc A, (HL) z1hc 1 8 Ukaza adc/sbc priˇstejeta/odˇstejetaˇsezastavico C and r8 z010 1 4 and d8 z010 2 8 and (HL) z010 1 8 xor r8 z000 1 4 xor d8 z000 2 8 xor (HL) z000 1 8 or r8 z000 1 4 or d8 z000 2 8 or (HL) z000 1 8 cp r8 z1hc 1 4 cp d8 z1hc 2 8 cp (HL) z1hc 1 8

Tabela 4.5: 8-bitni aritmetiˇcnologiˇcniukazi. 16 Klemen Jesenovec

mnemonik operandi zastavice dolˇzina trajanje add HL, r16 -0hc 1 8 inc r16 ---- 1 8 dec r16 ---- 1 8 V zgornjih treh ukazih samo BC, DE, HL in SP add SP, sd8 00hc 2 16 ld HL, SP+sd8 00hc 2 12

Tabela 4.6: 16-bitni aritmetiˇcnologiˇcniukazi.

mnemonik operandi zastavice dolˇzina trajanje bit 0--7, r8 z01- 2 8 bit 0--7, (HL) z01- 2 12 Ukaz bit testira bit set 0--7, r8 ---- 2 8 set 0--7, (HL) ---- 2 16 res 0--7, r8 ---- 2 8 res 0--7, (HL) ---- 2 16

Tabela 4.7: Enobitni ukazi. Diplomska naloga 17

mnemonik operandi zastavice dolˇzina trajanje rlca 000c 1 4 rla 000c 1 4 rrca 000c 1 4 rra 000c 1 4 Zgornji ˇstiriukazi rotirajo akumulator Ukazi s ˇcrkoc rotirajo tudi ˇcezzastavico C rlc r8 z00c 2 8 rlc (HL) z00c 2 16 rl r8 z00c 2 8 rl (HL) z00c 2 16 rrc r8 z00c 2 8 rrc (HL) z00c 2 16 rr r8 z00c 2 8 rr (HL) z00c 2 16 sla r8 z00c 2 8 sla (HL) z00c 2 16 Ukaz sla je aritmetiˇcnipomik levo swap r8 z00c 2 8 swap (HL) z00c 2 16 Ukaz swap zamenja zgornje in spodnje ˇstiribite. sra r8 z00c 2 8 sra (HL) z00c 2 16 Ukaz sra je aritmetiˇcnipomik desno srl r8 z00c 2 8 srl (HL) z00c 2 16 Ukaz srl je logiˇcnipomik desno

Tabela 4.8: Rotacije in pomiki. 18 Klemen Jesenovec

mnemonik operandi zastavice dolˇzina trajanje Pogoji so lahko: z, nz, c in nc jp a16 ---- 3 16 jp HL ---- 1 4 jp pogoj, a16 ---- 3 16/12 jr PC+sd8 ---- 2 12 jr pogoj, PC+sd8 ---- 2 12/8 call a18 ---- 3 24 call pogoj, a18 ---- 3 24/12 Ob ukazu call se na sklad zapiˇsevsebina registra PC ret ---- 1 16 ret pogoj ---- 1 20/8 reti ---- 1 16 Ob ukazu ret/reti se iz sklada prepiˇsetadva bajta v PC Ukaz reti ob vrnitvi omogoˇciprekinitve rst n ---- 1 16 Ukaz rst je klic na naslove: 0x00, 0x08, ... , 0x38

Tabela 4.9: Skoˇcniukazi. Diplomska naloga 19

mnemonik operandi zastavice dolˇzina trajanje ccf -00c 1 4 Ukaz ccf komplementira zastavico C scf -001 1 4 Ukaz scf poˇcistizastavico C nop ---- 1 4 halt ---- 1 4 Ukaz halt zaˇcnenizkoenergijski naˇcin stop ---- 1 4 Ukaz stop zaˇcnezelo nizkoenergijski naˇcin di ---- 1 4 Ukaz di onemogoˇciprekinitve ei ---- 1 4 Ukaz ei omogoˇciprekinitve

Tabela 4.10: Kontrolni ukazi. 20 Klemen Jesenovec

4.3 Prekinitve

Game Boy pozna 5 prekinitev, ki si po prioriteti od najviˇsjedo najniˇzje sledijo takole [9]:

1. Prekinitev V-blank, ki se zahteva, ko grafiˇcnikoprocesor nariˇsesliko. PC se postavi na 0x40.

2. Prekinitev LCD STAT, ki se zahteva ob razliˇcnihpogojih grafiˇcnega koprocesorja. Pogoje lahko nastavimo s pomoˇcjoregistrov grafiˇcnega koprocesorja. PC se postavi na 0x48.

3. Casovnaˇ prekinitev, ki se zahteva, ko ˇcasovnk doseˇzesvojo nastavljeno vrednost. PC se postavi na 0x50.

4. Serijska prekinitev, ki se zahteva, ko je poslan/prejet en bajt podatkov. PC se postavi na 0x58.

5. Prekinitev tipkovnice, ki se zahteva, ko je na eni od prej vklopljenima linijima za tipko nizek signal. PC se postavi na 0x60.

Vsaka prekinitev ima v registru IE (Interrupt Enable) na naslovu 0xFFFF bit, ki jo omogoˇci. Prekinitvi z najviˇsjoprioriteto pripada bit z najmanjˇso teˇzo. Prekinitev se zahteva tako, da se v registru IF (Interrupt Flag) na naslovu 0xFF0F postavi njen bit na 1. Prekinitev se servisira samo, ˇcesta njena bita v registru IE in registru IF postavljena na 1 in je hkrati nastavljen tudi IME (Interrupt Master Enable Flag), ki ga vklopimo/izklopimo z ukazoma ei in di. Ceˇ se prekinitev zaˇcne izvajati, se avtomatsko pobriˇsenjen bit v registru IF in izklopi IME. Prav tako se register PC porine na sklad. V nasprotnem primeru ostane bit v registru IF postavljen in tako prekinitev ˇcaka na izvajanje. Prekinitve lahko gnezdimo, tako da ob vstopu v prekinitveno servisni program postavimo IME na 1 z ukazom ei. Moˇznoje tudi roˇcnozahtevati prekinitev s postavitvijo ustreznega bita v registru IF. S pomoˇcjoprekinitev izstopimo iz nizkoenergijskih naˇcinov. Diplomska naloga 21

4.4 Implementacija v emulatorju

Centralno procesno enoto smo implementirali v razredu z imenom CPU. Re- gistre smo implementirali v strukturi regs, ki vkljuˇcujeanonimne unije, v katerih so anonimne strukture. Struktura je razvidna na sliki 4.1. Na ta naˇcinlahko doseˇzemoenostavno naslavljanje 8-bitnih in 16-bitnih registrov (npr. regs.bc ali regs.h).

Slika 4.1: Implementacija registrov v razredu CPU.

Za izvajanje ukazov smo implementirali nekaj pomoˇznihfunkcij, ki lahko izvajajo veˇcoperacijskih kod glede na vrsto ukaza. Podpisi funkcij so prika- zani na sliki 4.2. Funkcija add(byte) je na sliki 4.3. 22 Klemen Jesenovec

Slika 4.2: Podpisi pomoˇznihfunkcij v razredu CPU.

Slika 4.3: Implementacija funkcije add(byte).

Glavna funckija razreda CPU je exec(byte), ki glede na operacijsko kodo podano kot argumet, izvede ukaz in nastavi ˇcasizvajanja v urinih periodah. Diplomska naloga 23

V njej se nahaja switch stavek, ki se glede na operacijsko kodo odloˇci,kaj se izvede. Del implementacije je razviden iz slike 4.4.

Slika 4.4: Del implementacije funkcije exec(byte).

Razred Board, ki kontrolira izvajanje, pred vsakim izvedenim ukazom kliˇcefunkcijo handleInterrupts(), ki jo implementira razred CPU. Ta funkcija po vrstnem redu prioritet prekinitev preveri, ˇceje priˇslodo prekinitve in na sklad porine programski ˇstevec, ga ustrezno popravi, poˇcisti IME in po potrebi izstopi iz nizkoenergijskega naˇcinadelovanja. 24 Klemen Jesenovec Poglavje 5

Pomnilnik

Game Boyeva centralno procesna enota ima 16-bitno naslovno vodilo. Tako lahko naslovi 64K pomnilniˇskihbesed. Sploˇsnapomnilniˇska slika je predsta- vljena na tabeli 5.1 [9].

naslov velikost opis 0x0000–0x3FFF 16 KB niˇctipomnilniˇskimodul ROM-a (na kaseti) 0x4000–0x7FFF 16 KB n-ti pomnilniˇskimodul ROM-a (na kaseti) 0x8000–0x9FFF 8 KB grafiˇcnipomnilnik 0xA000–0xBFFF 8 KB zunanji pomnilnik (na kaseti, lahko veˇc pomnilniˇskihmodulov) 0xC000–0xDFFF 8 KB delovni pomnilnik 0xE000–0xFDFF 7680 B preslikava delovnega pomnilnika (se ne uporablja) 0xFE00–0xFE9F 160 B tabela lastnosti za 40 poseblih grafiˇcnih ploˇsˇcic 0xFEA0–0xFEFF 96 B se ne uporablja 0xFF00–0xFF7F 128 B vhodno izhodni registri (niso vsi dostopni) 0xFF80–0xFFFE 127 B viˇsjipomnilnik (moˇznosthitrejˇsegadostopa) 0xFFFF 1 B IE register

Tabela 5.1: Sploˇsnapomnilniˇska slika.

25 26 Klemen Jesenovec

Na niˇctempomnilniˇskem modulu, ki se nahaja na kaseti v ROM-u, je na naslovih 0x100–0x14F zaglavje kasete, v kateri se nahajajo meta podatki. Opisani so v tabeli 5.2 [9].

naslov opis 0x100–0x103 vstopna toˇcka, kjer se zaˇcneizvajanje programa 0x104–0x133 Nintendov logo, ki ga Game Boy preveri 0x134–0x143 ime igre (neuporabljeni bajti so postavljeni na 0) 0x144–0x145 nova licenˇcnakoda 0x146 SGB zastavica 0x147 tip kasete 0x148 velikost ROM-a 0x149 velikost zunanjega pomnilnika 0x14A koda destinacije 0x14B stara licenˇcnakoda 0x14C verzija igre 0x14D kontrolna vsota zaglavja (se preveri) 0x14E–0x14F globalna kontrolna vsota (se ne preveri)

Tabela 5.2: Zaglavje kasete.

Niˇctipomnilniˇskimodul se vedno nahaja na prvih 16 KB ROM-a. Na naslednjih 16 KB je lahko preostali ROM ali pa nek pomnilniˇskimodul ROM- a, ˇceje igra veˇcjaod 32 KB. Pomnilniˇske module izbiramo tako, da piˇsemona naslove 0x0000–0x7FFF. Ta pisanja prebere krmilnik pomnilniˇskihmodulov (MBC, Memory Bank Controller), ki se nahaja v kaseti in skrbi za menjavo pomnilniˇskihmodulov. Obstaja veˇcvrst krmilnikov pomnilniˇskihmodulov. Katerega igra uporablja, je zapisano v zaglavju kasete na naslovu 0x147. Podrobneje so opisani spodaj. V grafiˇcnipomnilnik se shranjujejo grafiˇcneploˇsˇcice,ki jih ˇzelimoizrisati. Poleg ploˇsˇcicse tu nahajata ˇsedve mapi, ki poskrbita za pravilno postavitev ploˇsˇcic. Diplomska naloga 27

Zunanji pomnilnik se nahaja na kaseti in se ponavadi uporablja za shra- njevanje stanja igre, tabele z najboljˇsimidoseˇzkiali preslikavo registrov zu- nanje strojne opreme. Ta pomnilnik je ponavadi podprt z baterijo, tako da se podatki ne izbriˇsejopo izklopu Game Boya. Delovni pomnilnik je namenjen sploˇsniuporabi. Tukaj je ponavadi po- stavljen tudi sklad programa. Na naslednjih 7680 bajtih v pomnilniku se nahaja preslikava delovnega pomnilnika, ki se ne uporablja. Na naslovih 0xFE00–0xFE9F se nahaja OAM (Object Attribute Memory), ki vsebuje informacije za 40 posebnih grafiˇcnihploˇsˇcic,ki se lahko prosto pomikajo po ekranu. Sledi ˇsenekaj neuporabljenega prostora in vhodno izhodni registri. Proti koncu pomnilniˇske slike se nahaja viˇsjipomnilnik, do katerega lahko dostopamo s posebnimi ukazi, ki v ROM-u zavzamejo manj prostora od na- vadnih ukazov za dostop do pomnilnika.

5.1 Krmilniki pomnilniˇskihmodulov

Za igre manjˇseod 32 KB krmilnik ni potreben, saj lahko celotno igro po- stavimo na prvih 32 KB v pomnilniˇskisliki. Velika veˇcinaiger pa uporablja enega od spodaj naˇstetihkrmilnikov pomnilniˇskihmodulov [9]:

• Krmilnik MBC1. Ta krmilnik podpira 125 pomnilniˇskihmodulov (vsak 32. pomnilniˇskimodul ni podprt). Tako je lahko velikost ROM-a malo manjˇsaod 2 MB. RAM je lahko velik najveˇc32 KB.

• Krmilnik MBC2. Podpira do 16 pomnilniˇskihmodulov. Velikost ROM-a znaˇsanajveˇc256 KB. Ima poseben RAM, ki je vgrajen kar v krmilnik. Ima 512 besed po 4 bite.

• Krmilnik MBC3. Podpira do 128 pomnilniˇskihmodulov. ROM je tako lahko velik 2 MB. Velikost RAM-a je 32 KB. Krmilnik podpira tudi dodaten ˇcasovnik RTC (Real Time Clock). 28 Klemen Jesenovec

• Krmilnik MBC5. Podpira do 64 pomnilniˇskih modulov (8 MB ROM- a). Podprtih je do 128 KB RAM-a. Poleg dodatnega ˇcasovnika RTC podpira ta krmilnik tudi motor za haptiˇcneinformacije.

5.2 Implementacija v emulatorju

Implementacija pomnilnika se nahaja v razredu Memory. Ta razred vsebuje tabele za zaglavje kasete, delovni pomnilnik, vhodno izhodne registre in viˇsji pomnilnik. Claneˇ razreda lahko vidimo na sliki 5.1.

Slika 5.1: Razred Memory.

Grafiˇcnipomnilnik, grafiˇcniregistri in OAM so implementirani v razredu LCD, ki realizira grafiˇcni koprocesor. Za branje registrov tipkovnice je tu razred Joypad. Casovnikˇ nadzoruje Timer. Razred Memory ima po par metod za branje in pisanje. Metode, ki imajo v imenu besedo get ali besedo set, se uporabljajo za interno nastavljanje pomnilnika. Metode, ki imajo v imenu besedo read ali besedo write, pa se uporabljajo za simulacijo pravih branj in pisanj. Za zunanji pomnilnik (ROM in RAM) skrbijo razredi, ki implemetirajo Diplomska naloga 29 krmilnike pomnilniˇskihmodulov. Tu nam v pomoˇcpride abstraktni razred MBCBase, po katerem dedujejo vsi razredi, ki implementirajo krmilnike po- mnilniˇskihmodulov. Tako imamo v razredu Memory lahko le kazalec na bazni razred. Razred MBCBase je prikazan na sliki 5.2.

Slika 5.2: Razred MBCBase.

Preden se lahko igra zaˇcne izvajati, se mora pomnilnik inicializirati. To se zgodi v konstruktorju razreda Memory, ki prejme pot do datoteke, ki vsebuje ROM igre. Ta prebere zaglavje kasete in glede na tip kasete inicializira razred ustreznega krmilnika pomnilniˇskihmodulov. Konstruktor tega razreda iz zaglavja razbere velikost ROM-a in RAM-a. Nato rezervira dovolj prostora za vse pomnilniˇske module in shrani vsebino vseh pomnilniˇskih modulov ROM-a. Tako je igra pripravljena na izvajanje. Ob zapiranju emulatorja se viri poˇcistijos pomoˇcjodestruktorjev. 30 Klemen Jesenovec Poglavje 6

Grafiˇcnikoprocesor

Grafiˇcnikoprocesor izrisuje na zaslon, ki je ˇsirok160 in visok 144 toˇck.Zaradi omejitev spomina uporablja tehniko ploˇsˇcic,kjer je najmanjˇsaizrisljiva enota ena 8x8 toˇckvelika ploˇsˇcica.

Sposoben je izrisati pomikajoˇceozadje. V spominu je mapa, ki doloˇca 256 toˇckˇsiroko kvadratno ozadje. Ker je velikost zaslona manjˇsaod velikosti tega ozadja, lahko zaslon ”pomikamo”po tem ozadju in tako doseˇzemozamik ozadja. To se doloˇcis toˇcko, od katere se bo desno in dol ozadje izrisalo na zaslon. Ceˇ zaslon preseˇzedesno ali spodnjo mejo ozadja, se izris nadaljuje na levi oziroma na vrhu ozadja.

Nad navadnim ozadjem lahko izriˇsemoˇseeno pokrivajoˇceozadje, ki se imenuje okno. Ta se vedno izriˇseod izbrane toˇcke na ekranu dol in desno.

Nad tem lahko na eno sliko izriˇsemodo 40 posebnih ploˇsˇcic,ki se prosto pomikajo nad ozadjem oziroma oknom. Na eno vrstico ekrana lahko zaradi omejitev grafiˇcnega cevovoda izriˇsemole do 10 posebnih ploˇsˇcic.

Grafiˇcnikoprocesor teˇceloˇcenood centralne procesne enote. Centralna procesna enota do njega dostopa s pomoˇcjokontrolnih registrov in dostopom do grafiˇcnegapomnilnika [9].

31 32 Klemen Jesenovec

6.1 Grafiˇcnicevovod

Grafiˇcnikoprocesor simulira delovanje zaslona s katodno cevjo. Na ekran izrisuje vrstico za vrstico. Izris ene vrstice traja 456 urinih period. Na zaˇcetkuvrstice pregleda OAM tabelo za posebne ploˇsˇcioce, ki bodo izrisane v tej vrstici, kar traja 60 urinih period. Potem toˇcko za toˇcko izriˇsevrstico.

Tu delujeta prevzemnik ploˇsˇcicin toˇckovna vrsta. V toˇckovni vrsti se hranijo informacije o kodi barve in izviru toˇcke (ozadje, okno ali zaporedna ˇstevilka posebne ploˇsˇcice).Ta vrsta vsako urino periodo na LCD porine eno toˇcko, a samo ˇceje v njej veˇckot osem toˇck. V nasprotnem primeru se toˇckovna vrsta ustavi. Preden gre toˇcka na LCD, se doloˇcinjena barva s pomoˇcjopaletnih registrov.

Prevzemnik ploˇsˇcicvsakih 6 urinih period prevzame eno vrstico ploˇsˇcice iz grafiˇcnegapomnilnika. 2 periodi porabi za branje naslova ploˇsˇcice. Seˇ po 2 periodi porabi za prevzem enega bajta infomacij iz pomnilika. Te informacije potem postavi na konec vrste.

Ceˇ je potreben izris okna, se vrsta pobriˇsein prevzemnik zaˇcneprevze- mati ploˇsˇciceokna. Tu mora vrsta poˇcakati na prevzem podatkov, preden lahko porine na LCD naslednjo toˇcko. Ceˇ je potreben izris posebne ploˇsˇcice, prevzemnik prevzame pravo ploˇsˇcicoin jo pomeˇsamed prvih osem toˇckv vrsti. Tako lahko doseˇzemouˇcinekprozorne barve. To je tudi razlog, da mora biti v vrsti vedno vsaj osem toˇck.

Izris toˇcktraja vsaj 172 urinih period. Ta ˇcasse lahko podaljˇsa,ˇcemo- ramo na vrstici izrisati tudi okno ali posebne ploˇsˇcice.Preostali ˇcasgrafiˇcni koprocesor simulira periodo HBLANK, kjer naj bi se ˇzarekv pravem zaslonu s katodno cevjo pomikal na zaˇceteknaslednje vrstice.

Ko je izrisanih vseh 144 vrstic, grafiˇcnikoprocesor simulira periodo VBLANK, kjer naj bi se ˇzarekv pravem zaslonu s katodno cevjo pomikal na zaˇcetek ekrana. To traja 4560 urinih period, kar je enako ˇcasu,ki ga grafiˇcnikopro- cesor potrbuje, da izriˇse10 vrstic [9, 11]. Diplomska naloga 33

6.2 Registri

V tabeli 6.1 so naˇstetiregistri grafiˇcnegakoprocesorja [9].

naslov ime opis 0xFF40 LCDC kontrolni register 0xFF41 STAT statusni register 0xFF42 SCY pomik Y ozadja 0xFF43 SCX pomik X ozadja 0xFF44 LY trenutna vrstica 0xFF45 LYC primerjalni register LY 0xFF4A WY pomik Y okna 0xFF4B WX pomik X okna 0xFF47 BGP paleta ozadja 0xFF48 OBP0 prva paleta posebnih ploˇsˇcic 0xFF49 OBP1 druga paleta posebnih ploˇsˇcic 0xFF46 DMA register za zaˇcetekDMA prenosa

Tabela 6.1: Registri grafiˇcnega koprocesorja.

bit opis pomen 1 pomen 0 7 napajanje zaslona izklopi vklopi 6 mesto mape okna 0x9800–0x9BFF 0x9C00–0x9FFF 5 vklop okna izklopi vklopi 4 mesto ploˇsˇcicozadja in okna 0x8800–0x97FF 0x8000–0x8FFF 3 mesto mape ozadja 0x9800–0x9BFF 0x9C00–0x9FFF 2 velikost posebnih ploˇsˇcic 8x8 8x16 1 vklop posebnih ploˇsˇcic izklopi vklopi 0 vklop ozadja izklopi vklopi

Tabela 6.2: Pomen bitov registra LCDC. 34 Klemen Jesenovec

Z registrom LCDC kontroliramo grafiˇcnikoprocesor. Pomeni bitov tega registra so predstavljeni v tabeli 6.2 [9]. V registru STAT so podatki o stanju grafiˇcnegakoprocesorja. Poleg tega tu lahko nastavimo prekinitev LCD STAT grafiˇcnegakoprocesorja. Prekini- tev V-blank se zahteva vedno ob vstopu v naˇcin VBLANK ne glede na stanje registra STAT. Pomeni nekaterih bitov tega registra so predstavljeni v tabeli 6.3 [9].

bit opis pomen 1 pomen 0 7 neuporabljen 6 vklop LYC=LY prekinitve izklopi vklopi 5 vklop prekinitve naˇcina2 izklopi vklopi 4 vklop prekinitve naˇcina1 izklopi vklopi 3 vklop prekinitve naˇcina0 izklopi vklopi 2 zastavica ujemanja LYC6=LY LYC=LY

Tabela 6.3: Pomen nekaterih bitov registra STAT.

V spodnjih dveh bitih registra STAT se nahaja ˇstevilka naˇcinadelovanja grafiˇcnegaprocesorja. Pomeni naˇcinov [9]:

• Naˇcin0 predstavlja periodo HBLANK. Centralna procesna enota lahko prosto dostopa do grafiˇcnegapomnilnika in tablele OAM.

• Naˇcin1 predstavlja periodo VBLANK. Centralna procesna enota lahko prosto dostopa do grafiˇcnegapomnilnika in tablele OAM.

• V naˇcinu 2 grafiˇcniprocesor bere iz tabele OAM. Centralna procesna enota ne more dostopati do tabele OAM. Lahko pa dostopa do grafiˇcnega pomnilnika.

• V naˇcinu 3 grafiˇcniprocesor bere iz tabele OAM in grafiˇcnegapomnilnika. Dostop je centralni procesni enoti onemogoˇcen. Diplomska naloga 35

Z registroma SCY in SCX nastavimo postavitev ozadja na zaslonu. V regi- stru LY je ˇstevilka trenutne vrstice. Ta register se vedno primerja z vsebino registra LYC za doloˇcanjezahteve prekinitve. Z registroma WY in WX nastavimo postavitev okna na zaslonu. Registri BGP, OPB0 in OPB1 vsebujejo podatke o barvah. Vsak od teh registrov doloˇcaˇstiribarve. Po dva bita za vsako barvo, ki si po vrsti od 3 do 0 sledijo od bita 7 do bita 0. Za paleto ozadja so moˇzneˇstiribarve. Barva 0 je bela, 1 svetlo siva, 2 temno siva in 3 ˇcrna.Za paleti za posebne ploˇsˇcice so moˇznele tri barve, saj barvna koda 0 predstavlja prozorno. Z vpisom bajta 0xXX v register DMA zaˇcnemoDMA prenos iz naslovov 0xXX00–0xXX9F v OAM tabelo na naslovih 0xFE00–0xFE9F. Prenos traja 160 µs. Medtem lahko centralna procesna enota dostopa le do viˇsjegapomnil- nika. Obiˇcajno se pred prenosom v viˇsjipomnilnik kopira kratek program, ki poˇcaka, da se prenos DMA konˇca.

6.3 Pomnilnik

V grafiˇcnempomnilniku se na naslovih 0x8000–0x97FF nahajajo podatki o ploˇsˇcicah. Vsaka ploˇsˇcicaje velika 8x8 toˇckin ima barvno globino 2 bitov. Tako je v grafiˇcnempomnilniku prostora za 384 ploˇsˇcic,ki se lahko upora- bijo za ozadje, okno ali posebne ploˇsˇcice.Razdeljene so na dve tabeli. Ena se nahaja na naslovih 0x8000–0x8FFF, kjer so ploˇsˇciceoˇstevilˇcenez nepred- znaˇcenimiˇstevilkami 0–255. Druga se nahaja na naslovih 0x8800–0x97FF, kjer so ploˇsˇciceoˇstevilˇcenes predznaˇcenimiˇstevilkami -128–127. Vsaka vrstica ploˇsˇcice zasede 2 bajta. V prvem bajtu so spodnji biti barvih kod, v drugem pa zgornji. Barvne kode se glede na uporabljeno paleto preslikajo v odtenke sive. Na naslovih 0x9800–0x9BFF in 0x9C00–0x9FFF se nahajata dve mapi, ki predstavljata sliko sestavljeno iz ploˇsˇcicdimenzije 256x256 toˇck.Katerakoli mapa se lahko uporablja za prikaz ozadja ali za prikaz okna. 36 Klemen Jesenovec

H grafiˇcnemu pomnilniku sodi tudi OAM tabela, ki leˇzina naslovih 0xFE00– 0xFE9F. Velika je 160 bajtov in vsebuje informacije za prikaz 40 posebnih ploˇsˇcic,za vsako ploˇsˇcico4 bajte. Pomen bajtov [9]:

• Bajt 0 doloˇcapozicijo Y na ekranu. Vrednost 16 prikaˇzevrh ploˇsˇcice na prvi vrstici zaslona.

• Bajt 1 doloˇcapozicijo X na ekranu. Vrednost 8 prikaˇzelevo stran ploˇsˇcicena prvem stolpcu zaslona.

• Bajt 2 doloˇcaˇstevilko ploˇsˇcice.Bajt 0xXX izbere ploˇsˇcicona naslovu 0x8XX0. Ceˇ se ploˇsˇciceprikazujejo v naˇcinu 8x16, se izbereta dve ploˇsˇcici.Zgornja z naslovom, kjer ima bajt 2 zadnji bit postavljen na 0, spodnja pa, kjer ima bajt 2 zadnji bit postavljen na 1.

• Bajt 3 doloˇcalastnosti ploˇsˇcice,kot je prikaz nad/pod ozadjem, zrca- ljenje prek Y/X osi in uporabljena paleta.

6.4 Implementacija v emulatorju

Grafiˇcniprocesor je implementiran v razredu LCD. V njem so tabele, ki hranijo grafiˇcnipomnilkik, OAM, registre in 2D tabelo screen, v katero se izrisuje slika. S pomoˇcjote tabele potem grafiˇcnaknjiˇznicaizriˇsesliko na osebnem raˇcunalniku.Nekateri ˇclanirazreda so vidni na slikah 6.1, 6.2 in 6.3. Diplomska naloga 37

Slika 6.1: Registri grafiˇcnegakoprocesorja.

Slika 6.2: Implementacija pomnilnika in tabele za izris.

Slika 6.3: Spremenljivke za pomnenje stanja in prenos informacij.

Glavna funkcija razreda LCD je funkcija run(int), ki prejme ˇstevilourinih 38 Klemen Jesenovec period in emulira delovanje grafiˇcnegakoporcesorja. S pomoˇznimifunkcijami poskrbi za prenos DMA, izris slike, zahtevo prekinitev, nastavljanje statusnih registrov, itn. Razred implementira tudi funkcije za branje in pisanje pomnilnika, ki so po enakem principu kot v razredu Memory razdeljene na te, ki se uporabljajo za interno nastavljanje in branje vrednosti ter te, ki emulirajo pravo branje in pisanje pomnilnika (npr. nedostopen grafiˇcnipomnilnik zaradi izrisovanja ali prenosa DMA). Te funkcije uporablja razred Memory za branje in pisanje grafiˇcnegapomnilnika. Podpisi funkcij razreda LCD so prikazani na sliki 6.4.

Slika 6.4: Podpisi funkcij razreda LCD. Poglavje 7

Tipkovnica

Game Boyeva tipkovnica ima osem tipk, ki so urejene v 2x4 matriko. Cen- tralna procesna enota enota lahko do stanja tipkovnice dostopa preko registra P1, ki je dostopen na naslovu 0xFF00. Funkcije bitov registra so predsta- vljene v tabeli 7.1 [9].

bit opis pomen 1 pomen 0 7 neuporabljen 6 neuporabljen 5 izbira funkcijskih tipk neizbrane izbrane 4 izbira smernih tipk neizbrane izbrane 3 stanje tipk dol ali start nepritisnjena pritisnjena 2 stanje tipk gor ali select nepritisnjena pritisnjena 1 stanje tipk levo ali B nepritisnjena pritisnjena 0 stanje tipk desno ali A nepritisnjena pritisnjena

Tabela 7.1: Pomen bitov registra P1.

S pomoˇcjebitov 5 in 4 izberemo katere pritiske tipk ˇzelimozaznavati. Na bitih 3–0 lahko potem preberemo, katere tipke so bile pritisnjene. Tipkovnica zahteva prekinitev vsakiˇc,ko se na bitih 3–0 pojavi spre- memba stanja iz 1 na 0. To je lahko precej nezanesljivo, saj pri pritiskih

39 40 Klemen Jesenovec tipk prihaja do odbijanja signala in tako veˇcihsprememb signala. Zato se prekinitev tipkovnice uporablja veˇcinomaza izstop iz zelo nizkoenergijskega naˇcinadelovanja Game Boya.

7.1 Implementacija v emulatorju

Tipkovnica je implementirana v razredu Joypad, ki se nahaja v razredu Memory. Prikazan je na sliki 7.1.

Slika 7.1: Razred Joypad.

Spremenljivka keystates hrani stanje o dejanskih pritiskih tipk na tip- kovnici. Te posodobimo s pomoˇcjofunkcije updateKeystates(const Uint8*), ki poskrbi tudi za nastavljanje prekinitvine zahteve. Diplomska naloga 41

Za branje in pisanje registra P1 so implementirane funkcije za interno na- stavljanje vrednosti in funkcije za simuliranje pravih branj in pisanj. Funkcija readP1reg() je prikazana na sliki 7.2.

Slika 7.2: Funkcija readP1reg(). 42 Klemen Jesenovec Poglavje 8

Casovnikˇ

Game Boy ima notranji 16-bitni ˇcasovnik, ki se poveˇcujez uro procesorja. S tem ˇcasovnikom si pomaga pri poveˇcevanju glavnega ˇcasovnika. Za nadzor uporablja ˇstiriregistre [9]:

• DIV (0xFF04), ki je slika zgornjih osmih bitov notranjega ˇcasovnika. Pisanje na ta naslov postavi notranji ˇcasovnik na 0.

• TIMA (0xFF05) je 8-bitni glavni ˇstevec, ki se poveˇcujeodvisno od stanja kontrolnega registra. Ko pride do preliva, se zahteva prekinitev. Takrat se v ˇstevec naloˇzivrednost registra TMA.

• TMA (0xFF06) je 8-bitni register. Njegova vrednost se naloˇziv TIMA ob prelivu.

• TAC (0xFF07) je kontrolni register. Spodnja dva bita doloˇcatafrekvenco poveˇcevanja TIMA registra. Bit 2 pa omogoˇcipoveˇcevanje TIMA registra.

Hitrost poveˇcevanja TIMA registra se doloˇcis pomoˇcjonotranjega ˇcasovnika. Spodnja dva bita TAC registra izbereta en bit notranjega ˇcasovnika. Logiˇcni in tega bita in bita 2 registra TAC gre ˇcezdetektor negativne fronte. Ko je zaznana negativna fronta, se poveˇcavrednost TIMA. Moˇznefrekvence so naˇstetev tabeli 8.1.

43 44 Klemen Jesenovec

bit 1 bit 0 frekvenca 0 0 4096 Hz 0 1 262144 Hz 1 0 65536 Hz 1 1 16384 Hz

Tabela 8.1: Moˇznefrekvence glede na stanje bitov v registru TAC.

8.1 Implementacija v emulatorju

Casovnikˇ je implementiran v razredu Timer, ki se nahaja v razredu Memory. Prikazan je na sliki 8.1.

Slika 8.1: Razred Timer.

Vsebuje vse registre ˇcasovnika. Glavna je funkcija run(int), ki emulira Diplomska naloga 45 delovanje ˇcasovnika za doloˇcenoˇstevilourinih period. Skrbi za poveˇcevanje notranjega ˇcasovnika, registra TIMA in zahtevanje prekinitev. Prikazana je na sliki 8.2.

Slika 8.2: Funkcija run(int).

Za branje in pisanje registrov ˇcasovnika so implementirane funkcije za in- terno nastavljanje vrednosti in funkcije za simuliranje pravih branj in pisanj. 46 Klemen Jesenovec Poglavje 9

Delovanje emulatorja

Vstopna toˇcka emulatorja je funkcija main(), ki prejme en argument, ki vse- buje pot do datoteke z vsebino ROM-a. Potem konstruira razred Render, ki poskrbi za inicializacijo tipkovnice, okna, grafike in razreda Board, ki vsebuje vse podsisteme Game Boya. Konstruktor razreda Board najprej konstruira razred Memory, ki kot argumet dobi pot do datoteke z vsebino ROM-a. Ta se glede na vsebino datoteke odloˇciza ustrezen krmilnik pomnilniˇskihmodulov in pripravi pomnilnik. Konstruktor razreda Board nato ˇsepoveˇzerazrede med sabo (npr. nastavi kazalec LCD* lcd v razredu Memory). Ko so vsi podsistemi inicializirani, se program nadaljuje v glavni zanki, ki se nahaja v razredu Render. Tu je funkicja mainLoop(), ki skrbi za branje tipk s tipkovnice, nadzor razreda Board in izris na ekran, ko je razred LCD v svoj predpomnilnik izrisal eno sliˇcico.Po vsaki iteraciji te zanke emulator spi toliko ˇcasa,da se hitrost izvajanja programa ujema s hitrostjo na pravem Game Boyu. Ker so danaˇsnjiosebni raˇcunalnikiveliko hitrejˇsiod Game Boya, lahko emulacija teˇcev realnem ˇcasu. Na raˇcunalnikus procesorjem Intel i7 2600 smo z merjenjem ˇcasaugotovili, da emulator spi v povpreˇcju 10% ˇcasa. Na emulatorju smo testirali kar nekaj iger. Veˇcinojih deluje pravilno in jih lahko igramo. Nekaj iger se odpre le do neke toˇcke, nato pa pride do napake, ki onemogoˇcinadaljevanje izvajanja. Na slikah 9.1, 9.2, 9.3 in 9.4

47 48 Klemen Jesenovec je prikazanih nekaj delujoˇcihiger.

Slika 9.1: Igra Tetris.

Slika 9.2: Igra Super Mario Land 2: 6 Golden Coins. Diplomska naloga 49

Slika 9.3: Igra Pokemon Red.

Slika 9.4: Igra Kirby’s Dream Land. 50 Klemen Jesenovec

Nekaj iger ne deluje zaradi nepodprtega krmilnika pomnilniˇskihmodulov. Pri veˇcini nedelujoˇcihiger pa gre bodisi za hroˇsˇcev emulatorju ali pa za hroˇsˇcev pravem Game Boyu, ki v emulatorju niso pravilno emulirani. Kar nekaj iger je takih, ki se zanaˇsajo na te nepravilnosti Game Boya in delujejo normalno na pravem sistemu, emulatorji pa imajo z njimi teˇzave. Ena od znanih iger, ki povzroˇcateˇzave, je Pinball Fantasies, ki na veˇcini emulatorjev ne deluje pravilno. To naj bi bila posledica neujemanja ˇcasovnih intervalov [4]. Na izdelanem emulatorju se igra priˇzein ekran enkrat utripne. Potem pa se igra ustavi na skoraj praznem ekranu, ki je prikazan na sliki 9.5.

Slika 9.5: Izvajanje igre Pinball Fantasies obtiˇcikmalu po zagonu igre. Poglavje 10

Zakljuˇcek

Glavna cilja pri izdelavi diplomske naloge sta bila delujoˇcemulator in uˇcenje jezika C++. Pred zaˇcetkom programiranja smo prebrali vso dokumentacijo, ki jo lahko najdemo. Nato smo sestavili naˇcrtarhitekture, ki se je med programiranjem ˇsekar nekajkrat spremenil. Podsisteme smo implementirali enega za drugim in jih nato povezali v celoto. S programiranjem uporabnega programa smo poglobili znanje jezika C++. Tako je bil doseˇzendrugi cilj. Nastali emulator lahko igra precej iger, ki so bile narejene za originalni Game Boy. Seveda bi ga lahko ˇse izboljˇsali z odstranjevanjem manjˇsih hroˇsˇcov in nepravilnosti emulacije. Prav tako emulatorju manjka ˇsepod- pora za zvok in serijski vmesnik, ki bi ga lahko realizirali preko omreˇzja. Te dodatne funkcionalnosti se lahko enostavno dodajo v prihodnosti, saj je arhitektura programa sestavljena zelo modularno. Tako je bil uresniˇcentudi prvi cilj diplomske naloge.

51 52 Klemen Jesenovec Literatura

[1] Emulator. Dosegljivo: https://en.wikipedia.org/wiki/Emulator. [Dostopano: 10. 7. 2018].

[2] Game boy. Dosegljivo: https://en.wikipedia.org/wiki/Game_Boy. [Dostopano: 10. 7. 2018].

[3] Gameboy cpu (lr35902) instruction set. Dosegljivo: http:// pastraiser.com/cpu/gameboy/gameboy_opcodes.html. [Dostopano: 15. 7. 2018].

[4] ”holy grail”bugs in emulation. Dosegljivo: https://mgba.io/2017/05/ 29/holy-grail-bugs. [Dostopano: 20. 8. 2018].

[5] Izvorna koda. Dosegljivo: https://github.com/ExPie/GameBoyEmu. [Dostopano: 20. 8. 2018].

[6] List of best-selling game boy video games. Dosegljivo: https://en.wikipedia.org/wiki/List_of_best-selling_Game_ Boy_video_games. [Dostopano: 10. 7. 2018].

[7] List of best-selling game consoles. Dosegljivo: https://en.wikipedia. org/wiki/List_of_best-selling_game_consoles. [Dostopano: 10. 7. 2018].

[8] Nintendo. Game Boy Programming Manual. 1999.

[9] Pan docs. Dosegljivo: http://bgb.bircd.org/pandocs.htm. [Dosto- pano: 10. 7. 2018].

53 54 Klemen Jesenovec

[10] Simple directmedia layer. Dosegljivo: https://en.wikipedia.org/ wiki/Simple_DirectMedia_Layer. [Dostopano: 15. 7. 2018].

[11] Michael Steil. The ultimate game boy talk. Dosegljivo: https://www. youtube.com/watch?v=HyzD8pNlpwI. [Dostopano: 15. 7. 2018].

[12] Technical data. Dosegljivo: https://www.nintendo.co.uk/Support/ Game-Boy-Pocket-Color/Product-information/Technical- data/Technical-data-619585.html. [Dostopano: 12. 7. 2018].