Retroboksia kasaamaan

Minulla on yksi toistuva, selittämätön halu: pelata kesäpäivänä Mega Man 5:a. Etenkin mökillä. Tajusinpas että laatikossani rojuu käyttämättömänä Raspberry Pi, joten siitä se ajatus sitten lähti.

En ole täysin varma mistä tämä juontuu. Miksi juuri Mega Man 5? Omaan lapsuuteeni liittyi sarjasta kaikista selkeiten kakkososa, jonka alkujaan naapurin Joel sai, ja myöhemmin myös minä itse. Koulukaveri Tonilla oli kolmonen, ja naapuritalon veljeksillä (en edes muista nimiä) tämä vitonen. Osat 1, 4, ja 6 olivat tällöin täysin pimennossa. Syystä tai toisesta, vitososa on kulunut psyykkeeseeni jollain tapaa hohdokkaimpana, ja kesäillat tuovat mieleeni Gravity Manin kentän väriloiston.

Projektin skooppi

Lähtöraamit olivat harvinaisen selvät:

  • Saatavilla oleva laite on Raspberry Pi 4 Model B
  • Mahdollisimman nopealla buutilla pääsee suoraan emulaattoriin, jossa lista peleistä
  • Konsolitukena tarvittuna vain NES, ei save stateja tai muuta hömppää
  • Ohjaus simppelillä konsoliuskollisella ohjaimella
  • Ei internetiä, bluetoothia, tai mitään muutakaan turhaa

Tiesin jo ennalta, että alustaksi parhaiten soveltunee RetroPie, joka oli minulle nimeltä tuttu. Asiassa oli toki pieni mutka: en tiedä Linux-ympäristöistä juuri mitään.

Bill of material

Oleellisimmat tavarat minulla oli jo ennestään:

Uutta tarvitsi lähinnä ostaa:

Jälkimmäisen asennuksesta myöhemmin.

Ensiaskeleet

Yksinkertaisimmillaan projekti voi olla ohi minuuteissa. Raspberry Pi Imager tuntee RetroPien, eli prosessi on kutakuinkin seuraava.

  1. Muistikortti sisään.
  2. Imager käyntin, valitaan oikea Raspberry Pi -malli.
  3. Valitaan oikea alusta, eli tässä yhteydessä RetroPie.
  4. Klikataan nextiä ja odotellaan.
  5. Muistikortti Raspberryyn ja homma pelittää.

Näillä kivi lähti vierimään omallakin kohdalla, ja jos kiinnostuksena ei olisi tuunata yhtään mitään vaan ihan vaan pelata pelejä, tällä päästään itse peliromeja tai -imageja vaille maaliin, eikä sen syvempi Linux-alkeiskurssi ole tarpeen.

Tiedonsiirron kommervenkit

Niinpä, eli pelit vaan koneelle.

Tässä löytyi ongelma numero 1: en saanut laitteeni wifi-yhteyttä toimimaan. Adapteri kyllä toimi, en vaan saanut sitä yhdistämään mihinkään kokeilemistani verkoista, vaikka teknisesti asiat olivat kaiken järjen mukaan yhteensopivia. Käytin tähän suhteettoman paljon aikaa, mutta se sikseen: loppukaneettina en saanut internet-yhteyttä koskaan toimimaan, enkä sitä toisaalta edes suoranaisesti tarvinnut.

Vastaavasti tiedonsiirto tuolle SD-kortille ei ole Windows-ympäristöstä aivan niin yksinkertaista, koska muistikortille itseasiassa muodostuu kaksi osiota: järjestelmän boot-osio, sekä RetroPien oma kontsa. Jälkimmäinen on ext4-formaatissa, jota Windows ei suoraan osaa lukea.

Onnekseni muistikorttini on FAT32-formatoitu juuri näiden yhteensopivuuspommien vuoksi. Olin jo aikaisemmin joskus kuratoinut jonkin tiiviin NES-pelikirjaston, joten kansion kopioimalla olin jo puolitiessä. Ensin piti tutustua RetroPien, eli fasadin alla lymyävän Debianin saloihin. Osaan auttavasti toimia DOSissa ja Windows-ympäristöjen komentoriveillä, mutta Unix-maailma on jäänyt itselleni toistaiseksi vieraammaksi joitain nuoruuden sekoiluja laskematta. USB-tikun kytkettyäni en siis ollutkaan kovin varma miten a) saan navigoitua sen sisältöihin, 2) kopioin tavarat Raspberrylle, saatika iii) mihin lokaatioon haluaisin ne siirtää.

Jo aiemmin apunani oli verraton tietoa demokratisoiva helpdesk: ChatGPT. Samalla tästä tulisi itselleni jälleen yksi alustan koeponnistus. Kävikin ilmi, ettei Raspberry edes automaattisesti mountannut USB-tikkua, vaan kaikki piti hoitaa käsipelillä.

sudo mkdir -p /mnt/usb
sudo mount /dev/sda1 /mnt/usb

Vastaavasti kaikki tarkemmat lokaatiot (kuten RetroPien tai sen eri komponenttien, kuten EmulationStationin ja RetroArchin) tulivat luotettavasti valmiina eri komentoihin upotettuna.

Lopputuloksena sain muistitikulta kopioitua tarvittavat tiedostot laitteelle, ja peli voi alkaa.

Välikatselmus

Ensiksi kannattanee luoda katsaus RetroPien korkean tason arkkitehtuuriin, eli minkä niminen palikka tekee mitäkin:

  1. EmulationStation. Pääasiallinen käyttöliittymä, jossa määritellään esimerkiksi pelilista, metadata, ohjainasetukset, sun muu.
  2. RetroArch. Varsinainen emulaattoricorejen ympäristö, jossa hoidetaan ohjainmappaus, video/audio, jne.
  3. RetroPie. Komponenttien integraatio- ja hallintarajapinta.
  4. Raspberry Pi OS / Debian. Alla pyörivä Linux-distro, eli varsinainen käyttöjärjestelmä.

Konffitiedostot löytyvät ripoteltuna näihin kokonaisuuksiin riippuen siitä mitä ollaan tekemässä.

Nyt kasassa oli Raspberry Pi, joka buuttasi suoraan pääkäyttöliittymänä toimivaan EmulationStationiin ja NES-pelilistaan, josta pelin valikoimalla se käynnistyi ja oli täysin pelattava. Projekti olisi voinut jäädä tähän, mutta vielä oli saavutettavaa:

  • Käynnistyksen pitäisi olla nopeampi. Koska tarpeeni on hyvin yksinkertainen, kone epäilemättä lataa kaikkea ylimääräistä skeidaa liittyen internetiin sun muuhun humpuukiin. Myös EmulationStation itse lataa/skannaa kaikkea epämääräistä avautuessaan.
  • Vakioteema ei ollut temaattisesti oikeaoppinen.
  • Mikä pahinta: pelilista oli puhdas tiedostolistaus, eikä peleillä ollut metadataa.

Pureudutaan näihin epämääräisessä järjestyksessä.

Teema kantaa

Vakioteema “Carbon” on ihan kiva, muttei vastannut vaatimaani yksinkertaista retroestetiikkaa modernilla fontillaan ja hiilikuitukuvioinnillaan. Sen sijaan “nes-mini” kutitteli omaa hermostoani. Molemmat ovat nähdävillä ja ladattavissa virallisessa teemakirjastossa. Teemat saa ladattua myös suoraan RetroPien asetuksista, mutta internetin ollessa omalta laitteeltani pannassa jouduin suorittamaan tehtävän käsipelillä: lataa, siirrä muistitikulla, kopioi.

Teemassa oli kaksi lastentautia.

  1. Pelilista ei synkannut taustagrafiikan kanssa. Pelilistalla näkyi kerrallaan kuusi nimikettä, mutta taustagrafiikassa näkyi seitsemän loosia. Pelinimet siis olivat ripoteltuna epämääräisesti niille varattuun alueeseen nähden. Ratkaisuna muokkasin teeman 1080p-layoutista nimikkeiden näyttöaluetta (viewport):

    <size>0.4083333333333333 0.5481481481481481</size>
    muuttui muotoon
    <size>0.4083333333333333 0.575</size>

    …jolloin lootat skaalautuivat oikein. Oikeat lukuarvot tulivat suoraan ChatGPT:ltä asiaa sen enempää meittimättä.
  2. Pelaajamäärät näkyvät teeman oikeassa alanurkassa pienessä lootassaan “1P”. Numeraali tulee pelin metadatasta, ja on kaikesta päätellen rajattu yhteen numeroon; yhden merkin ylittävät arvot näytetään “…P”. Tästä lisää myöhemmin.

Näiden jälkeen itse teema skaalautui ja näkyi ongelmitta, ja pystyin siirtymään seuraavaan oikaistavaan.

Tietoa tiedosta

Olen koko pienen ikäni ollut totaalinen metadata-addikti. Muistan jo teinivuosina olleeni äärimmäisen tarkka mp3-kirjastoni tageista. Tämä sama takauma triggeröityi kohdatessani pelilistan, jossa oli sekalainen kasa ROM-tiedostojen nimiä sekä muissa asiaankuuluvissa näyttöliittymälooseissa tyhjää.

EmulationStationista löytyy suora scrape-toiminnallisuus, joilla metadatan saa kätevästi täydennettyä suoraan eri nettitietokannoista. Tässä kohtaa aiemmin mainittu netittömyys tuli lopulta vastaan. Lopullisena ratkaisuna oli luoda tätä metadataa isännöivä gamelist.xml alusta. Tehtävä oli lopulta sangen helppo, sillä syötin vain ChatGPT:lle listan ROM-tiedostonimistäni, jonka perusteella sain siistin xml-tiedoston.

<game>
    <path>./Mega Man 5 (USA).nes</path>
    <name>Mega Man 5</name>
    <desc>Proto Man appears to lead an army of eight Robot Masters and kidnaps Dr. Light, forcing Mega Man to confront his enigmatic brother. The Mega Buster returns with a stronger charge shot, while collectible circuit plates unlock Beat, a robotic bird that attacks enemies automatically. The game features themed stages with gravity changes, vehicles and other set pieces before revealing the true architect of the crisis.</desc>
    <image>./images/Mega Man 5 (USA).png</image>
    <releasedate>19921204T000000</releasedate>
    <developer>Capcom</developer>
    <publisher>Capcom</publisher>
    <genre>Action / Platformer</genre>
    <players>1</players>
  </game>

Joidenkin pelien kohdalla halusin muokata esimerkiksi Description-kenttää hiukan, mutta tämä onnistui jo xml-tiedoston siirrettyäni onneksi EmulationStationin käyttöliittymästä.

Jäljelle jäi metsästää kansitaiteet mahdollisimman hyvällä resoluutiolla. Löysinkin vanhan Reddit-keskustelun, jossa linkataan repot varsin laadukkaisiin jenkkikansiin.

Listallani oli pari fanikäännöstä (Final Fantasy II ja III), joihin riittävän tyylikkäät fanitekoiset kannet löytyivät SteamGridDB:stä (II, III).

Jumpan jälkeen piti ratkaista vielä aiemmin mainitsemani pelaajamääräongelma. Moninpeliä tukevat pelit näkyivät UI:ssa “…P”, sillä ChatGPT oli laittanut metadata-xml:ään arvoksi “1-2”. Ongelma ratkesi muuttamalla nämä arvoon “2”, eli pelaajamääränä näkyy aina “1P” tai “2P” (tai vaikkapa “4P”).

Teema näytti vakiona julkaisupäivämäärän jenkkimuotoisesti MM/DD/YYYY, ei meikäläisittäin DD/MM/YYYY. Tämä korjaantui tiedostosta
/opt/retropie/configs/all/emulationstation/themes/nes-mini/nesmini.xml
lisäämällä elementiin

<datetime name=”md_releasedate”>

arvo

<format>%d/%m/%Y</format>

…jonka jälkeen ongelma oli korjattu. Ihanteellisesti olisin halunnut “1P” näkyvän sinisessä kuplassa ja “2P” punaisessa, mutta tämä oli sen verran kälyisen ratkaisun takana että jätin asian sikseen.

Optimoijjaa, pojat

NES itse ei ole millään mittarilla raskas emuloitava, joten sen suorituskyvystä ei ollut missään vaiheessa huolta. Sen sijaan ykkösprioriteettini oli minimoida aika virtojen kytkemisestä siihen että pelivalikko aukeaa. ChatGPT:n ohjeita noudattaen löysin oikeat komennot mittaamaan eri palveluiden buuttiaikaa. Raskaimmat liittyivät poikkeuksetta internet- ja Bluetooth-toiminnallisuuksiin, jotka käytöstä poistamalla pääsin noin 26 sekunnin buuttiaikaan – täysin hyväksyttävä. Samoin erilaiset buuttauksen logaustekstirotlat katosivat näkyvistä, kuten myös RetroPien omista asetuksista erilaiset splashiruudut.

EmulationStation itse skannasi läpi kaikki tukemansa konsolikonfiguraatiot käynnistyessään. Koska oma tarpeeni oli vain ja ainoastaan NES, ohjeistin tiedostosta
/opt/retropie/configs/all/emulationstation/es_systems.cfg
sen lukemaan pelkästään NES-konfiguraation. Samoin NES-pelilistani tulee aiemmin lisäämästäni gamelist.xml:stä, joten pysytin asettamaan EmulationStationin asetuksista “Parse Gamelist Only”. Kaikki automaattiskannaus on lähtökohtaisesti turhaa.

Koska käyttötarkoitukseni on erittäin simppeli, käyttökokemus on lähinnä yksi kahdesta:

  1. Buuttaa laite, pääse pelivalikkoon, pelaa.
  2. Buuttaa laite, sulje EmulationStation ja mene terminaliin painamalla F4, ja tee mitä muutoksia ikinä tarvitseekaan.

Jos myöhemmin haluan lisätä esimerkiksi SNES- tai PSX-tuen, vaatinee se pientä uudelleenkonfigurointia. Ainoa varsinainen päälle jätetty lisähöyste oli RetroPien asetuksista asetettu NES-emulaattorin CRT-shaderi, joka tuo kivaa autenttista pehmeyttä nykytelevisiolla pelatessa.

Pienen hifistelyn tein myös ohjaimelle. Ylä- ja alanuoli luonnollisesti skrollaavat pelivalikkoa, mutta halusin vasemman nuolen toimivan page uppina ja oikean page downina, selaten pelilistaa hiukan nopeammin. Tähän fiksi löytyi mappausta hanskaavasta tiedostosta
/opt/retropie/configs/all/emulationstation/es_input.cfg
…jossa oli valmiiksi NES-ohjaimeni “left”- ja “right”-mappaukset. Näihin lisäsin vain identtiset rivit “pageup”- ja “pagedown”-mappauksille:

<input name=”left” type=”axis” id=”0″ value=”-1″ />
<input name=”pageup” type=”axis” id=”0″ value=”-1″ />
<input name=”right” type=”axis” id=”0″ value=”1″ />
<input name=”pagedown” type=”axis” id=”0″ value=”1″ />

En nyt muista tarkalleen kumpi oli -1 ja kumpi 1, mutta idea lienee selvä.

Peleihin mennessä visuaalista silmääni häiritsivät myös ilmestyvä notifikaatio siitä, mikä ohjain on käytössä. Puukotin nämä pois lisäämällä tiedostoon
/opt/retropie/configs/all/retroarch.cfg
rivit

notification_show_autoconfig = false
notification_show_autoconfig_fails = false

Mietin myös miten pelistä pääsee takaisin pelivalikkoon. Käytössä on kuitenkin vain NES-ohjain, jossa on D-padin lisäksi kokonaista neljä nappia. RetroArch tukee muutamia eri vaihtoehtoja, mutta jätin asetuksen vakiolle (select+start). Samoin reset toimii muistaakseni pikavalinnalla select+B. Eksoottisempien yhdistelmien (kuten haaveilemani select+start+B) vaatisi taas suhteettoman paljon säätöä, eli käytännössä RetroArchin syvempää kustomointia.

Paina naurunappulaa, hihhih

Rautapuolen käyttöliittymä ei ollut kovin käytännöllinen. Kone käynnistyy virtakaapelin kytkiessä, ja sulkeutuu joko EmulationStationin valikosta, tai komentoriviltä. Tai vetämällä johdon irti, jolloin epäasianmukaisesta käsittelystä johtuva Orpon hallituksen tiedostojen korruptio olisi vain ajan kysymys.

Tähän on toki myös ratkaisu: kytkemällä Raspberry Pi’n GPIO-liitännän vitospinni eli GPIO3 maahan. Yksinkertaisimmillaan siis vierekkäisten vitos- ja kutospinnien oikosulkeminen nuppineulalla joko herättäisi laitteen käyntiin, tai suorittaisi hallitun sulkemisen. Tässä kuvioon astuu aiemmin mainitsemani painike, joka on täydellisemmin sanottuna paneeliasennettava PPN1-painonappi, normaalisti avoin, palautuva momenttitoiminto. Toisin sanoen se painaessa kytkee piirin, palautuessa katkaisee sen, eikä se “jää pohjaan” vaan palautuu aina jousitetusti off-tilaan. Sopivaa kytkentäjohtoa ja juotostarvikkeet löytyi jo entuudestaan, mutta GPIO-pinneihin liittämistä helpottaakseeni laitoin toiseen päähän DuPont-kontaktit sopivilla liitinkuorilla. Liitäntäjohdon toiset päät kolvasin suoraan painikkeen pinneihin sopivassa 90 asteen kulmassa.

Painike vaati noin seitsemän millin asennusaukon. Sopivimman sijainnin löysin kotelon nurkasta, virta-LEDin ja virtaliittimen väliltä. Mittaus tapahtui puhtaasti silmämääräisesti, ja ensin pelkäsin painikkeen kontaktien osuvan USB-C-liittimeen, mutta näin ei onnekseni käynyt. Suurimman reiän tein 6-millisellä poranterällä, ja loppulevennyken sopivaan suuntaan (lähemmäs kotelon keskustaa) suoritin dremelin jyrsintäterällä (prosessista irtosi suht infernaalisesti valkoista muovihitua).

Softapuolella toiminnallisuus täytyi vielä mahdollistaa lisäämällä tiedostoon
/boot/config.txt
rivi

dtoverlay=gpio-shutdown

Lopputulos oli siisti, ja ennen kaikkea toimi halutulla tavalla. Jos jonkin nillittämisen haluaisin vielä jättää, niin laite silti menee aina päälle virtaliittimen kytkiessä. Tällä tuskin on merkitystä koska laite on joko pidemmän aikaa kytkettynä tai on joka tapauksessa tulossa käyttöön virrat liittäessä, ja ymmärtääkseni toisenlainen toiminto vaatisi erillisen fyysisen virranhallintapiirin.

Tulkoon valkeus

Tässä kohtaa katsoin laitteen v1.0:n olevan valmis.

  • Laite buuttaa virtanapista (tai virtajohdon kytkiessä) suht nopeasti suoraan NES-pelivalikkoon.
  • Käyttölaitteena toimii USB-kytkettävä NES-ohjain.
  • Pelivalikko näyttää siistiltä hyvällä metadatalla ja kansitaiteella.
  • Pelin valittua peli käynnistyy. Pelivalikkoon pääsee yhdistelmällä select+start.
  • Laite sulkeutuu hallitusti erillisestä virtanapista.

Ei muuta ku laite kiinni telkkariin ja virtat päälle!

Virheellinen muoto

LG C9 -televisioni näytti suht epämääräistä virheilmoitusta. Eri HDMI-porttien kokeilu tuotti saman tuloksen.

Kysyn ChatGPT:ltä. Fiksi onneksi oli suht suoraviivainen, ja lisäsin ohjeistetusti tiedostoon
/boot/config.txt
rivit

[HDMI:0]
hdmi_force_hotplug=1
hdmi_group=1
hdmi_mode=16
disable_overscan=1

…joiden sisältö on teknisesti kiinnostavaa mutta tässä turhan detskua. Muutoksen kautta televisio näytti signaalin mutisematta, vaikka ilmoittikin lähteen nimeksi epämääräisen “Now TV by Sky”. Kauneusvirhe, jonka korjaamiseksi ehdotettiin lisätä tiedostoon
/boot/config.txt
rivi

cec_osd_name=NES

…joka ei kuitenkaan itselläni toiminut. Hälläväliä, sillä kyseessä on todella pieni kosmeettinen asia.

TV:ssä oli myös pientä overscania (eli TV-ruudun näyttöala oli pienempi kuin näytettävä kuva-ala), johon korjaus löytyikin itse televisiosta, asettamalla HDMI-kanavan kuvasuhteen skannaus pois automaatiolta.

Viimeinen pieni optimointi koski input lagia, eli viivettä millä komennon syöttäminen näkyy kuvassa. HDMI-kanavan kuvaprosessoinnin asettaminen “Gaming”-moodiin auttoi huomattavasti, kuten tavallista. Pienempinä hiontoina ChatGPT ehdotti tiedostoon
/opt/retropie/configs/nes/retroarch.cfg
rivejä

video_threaded = false
video_vsync = true

En tehnyt jälkimmäisen osalta kovin perusteellista ennen-jälkeen-vertailua, mutta ainakin mutuna lopputulos on hyvin pelattava ja audio kuuluu puhtaasti – lukemani perusteella video_threaded = true auttaisi esimerkiksi juuri rätisevään audioon, ja kokemukseni mukaan tämä on ainakin joskus ollut melko tavallinen ongelma PSX-emuloinnissa.

Loppu hyvin, kaikki hyvin?

Kaveriani siteeraten, “jälleen yksi RPi valjastettu hyötykäyttöön pölyyntymästä”. Kokonaislisäinvestointi projektille oli noin 15 euroa, ja yhden-parin päivän harrastetunnit. Melko maltillisella sijoituksella siis pääsin ideasta haluamaani lopputulokseen, enkä ainakaan vielä koe joutuneeni tinkimään mistään relevantista.

Todellinen tulikoe odottanee mökillä, jossa epäilemättä vastaan tulee jotain ongelmia toisen TV:n kanssa joko lagin tai yhteensopivuuden kautta. Kuten tapaan sanoa, “that’s a problem for future me and fuck that guy”.

Ai niin, lopuksi ykkösversion pelilista:

  1. Batman: The Video Game (1989, Sunsoft)
  2. Batman: Return of the Joker (1991, Sunsoft)
  3. Batman Returns (1993, Konami)
  4. Blades of Steel (1988, Konami)
  5. Bubble Bobble (1987, Taito)
  6. Bubble Bobble Part 2 (1993, Taito)
  7. Bucky O’Hare (1992, Konami)
  8. Castlevania (1986, Konami)
  9. Castlevania II: Simon’s Quest (1987, Konami)
  10. Castlevania III: Dracula’s Curse (1989, Konami)
  11. Clash at Demonhead (1989, Vic Tokai)
  12. Disney’s Chip ‘n Dale: Rescue Rangers (1990, Capcom)
  13. Disney’s Chip ‘n Dale: Rescue Rangers 2 (1993, Capcom)
  14. Disney’s DuckTales (1989, Capcom)
  15. Disney’s DuckTales 2 (1993, Capcom)
  16. Double Dragon (1988, Tradewest)
  17. Double Dragon II: The Revenge (1989, Acclaim)
  18. Double Dragon III: The Sacred Stones (1991, Acclaim)
  19. Final Fantasy (1990, Nintendo of America)
  20. Final Fantasy II (1988, Square)
  21. Final Fantasy III (1990, Square)
  22. The Flintstones: The Rescue of Dino & Hoppy (1991, Taito)
  23. The Flintstones: The Surprise at Dinosaur Peak! (1994, Taito)
  24. Kickle Cubicle (1990, Irem)
  25. Kirby’s Adventure (1993, Nintendo)
  26. The Legend of Zelda (1987, Nintendo)
  27. Little Nemo: The Dream Master (1990, Capcom)
  28. Mega Man (1987, Capcom)
  29. Mega Man 2 (1988, Capcom)
  30. Mega Man 3 (1990, Capcom)
  31. Mega Man 4 (1991, Capcom)
  32. Mega Man 5 (1992, Capcom)
  33. Mega Man 6 (1993, Nintendo of America)
  34. Rainbow Islands (1988, Taito)
  35. Super Mario Bros. (1985, Nintendo)
  36. Super Mario Bros. 2 (1988, Nintendo)
  37. Super Mario Bros. 3 (1990, Nintendo)
  38. Teenage Mutant Ninja Turtles (1989, Ultra Games)
  39. Teenage Mutant Ninja Turtles II: The Arcade Game (1990, Ultra Games)
  40. Teenage Mutant Ninja Turtles III: The Manhattan Project (1992, Konami)
  41. Teenage Mutant Ninja Turtles: Tournament Fighters (1993, Konami)
  42. Tetris (1989, Nintendo)
  43. Tiny Toon Adventures (1991, Konami)
  44. Tiny Toon Adventures 2: Trouble in Wackyland (1992, Konami)
  45. Zelda II: The Adventure of Link (1988, Nintendo)

Vastaa

This site uses Akismet to reduce spam. Learn how your comment data is processed.