Etusivulle

NES-pelien hakkeroiminen

Tällä sivulla on ohjeita NES-pelien editoimiseen.

Yleistä

NES:in ROM-tiedostojen pääte on ".nes". Niiden rakenne on seuraava:

  1. Header. 16 tavua. Kertoo emulaattorille, minkä tyyppisen pelikasetin peli tarvitsisi, jos olisi oikea. Tätä harvemmin tarvitsee editoida.
  2. Ohjelmakoodi eli PRG-ROM. 16 kt tai enemmän. Tämä on ainoa osa, johon voi vaikuttaa Game Geniellä.
  3. Grafiikkadata eli CHR-ROM. Yleensä 8 kt tai enemmän.

Grafiikkadatan editoiminen

Grafiikkadata muodostuu 8 * 8 pikselin kokoisista nelivärisistä paloista. Osa niistä on varattu taustagrafiikalle, jota ovat useimmat pelikentän rakenteet, ja osa spriteille, joita ovat useimmat liikkuvat ja animoidut objektit.

Hyvä ohjelma grafiikan editoimiseen on YY-Chr. Voit ladata sen täältä. Alla on kuva ohjelmasta, kun siihen on avattu Super Mario Bros -peli oletusasetuksilla.

Vasemmanpuoleisessa suuressa ruudussa näkyvät oletuksena pelin spritet. Voit saada näkymään enemmän tolkkua vaihtamalla asetusta, joka on oletuksena "Normal". Kun napsautat aluetta vasemmanpuoleisesta suuresta ruudusta, voit editoida sitä oikeanpuoleisessa suuressa ruudussa. Kokeile esim. poistaa Pikku-Kuukuselta (pelin ensimmäiseltä vastaan tulevalta viholliselta) kulmakarvat muuttamalla ne valkoisiksi.

Ikkunan oikeassa alakulmassa on NES:in koko väripaletti eli 16 * 4 värillistä neliötä. Sen yläpuolella on editointinäkymän väripaletti. Voit muutella sitä napsauttamalla ensin jotakin neljästä ensimmäisestä ruudusta ja sitten jotakin koko väripaletin väriä. Pelien oikeasti käyttämiä paletteja ei ole määritelty grafiikkadatassa vaan ohjelmakoodissa, jota YY-Chr ei pysty tulkitsemaan. Siksi YY-Chr:n oletuspaletti ei vastaa itse pelin värejä, eivätkä YY-Chr:n palettiin tehdyt muutokset tallennu ROM-tiedostoon.

Väripalettien editoiminen

NES:issä on (hieman yksinkertaistettuna) kiinteä 64 värin paletti, joka näkyy YY-Chr-ohjelman oikeassa alakulmassa. Pelien ohjelmakoodi voi valita paletista yhteen ruudulliseen 25 eri väriä. Ne jakautuvat kahdeksaan osapalettiin, joita on neljä taustagrafiikalle ja neljä spriteille. Kussakin osapaletissa on neljä väriä: kaikille osapaleteille yhteinen taustaväri ja kolme omaa väriä. Ohjelmakoodi myös valitsee kullekin 8 * 8 pikselin spritelle ja 16 * 16 pikselin taustagrafiikan alueelle yhden osapaletin.

Osapaletit on usein tallennettu ohjelmakoodiin neljänä peräkkäisenä tavuna. Oletetaan, että tahdot muuttaa Super Mario Brosin (minkä tahansa version) Marion housut ja hatun sinisiksi. Avaa peli FCEUX-emulaattoriin ja valitse Debug-valikosta PPU Viewer. Ikkunan alareunassa näkyvät kahdeksan senhetkistä osapalettia (kuva alla). Päättele, mikä niistä kuuluu Mariolle (alarivin vasemmanpuoleisin).

Tarkista osapaletin värien arvot viemällä hiiren osoitin niiden päälle. Taustaväri katsotaan ylärivin ensimmäisestä osapaletista ja muut kolme väriä löytämästäsi osapaletista. Kirjoita arvot muistiin ($22, $16, $27, $18; dollarimerkki tarkoittaa 16-kantaista lukua). Avaa ROM-tiedosto heksaeditoriin (esim. XVI32) ja etsi siitä kyseisiä tavuja (Hex string, 22 16 27 18, eli ilman dollarimerkkejä). Ne löytyvät kahdesta paikasta ($5E7 ja $CC7). (Jos haulla ei löytyisi mitään, voitaisiin jättää hausta pois taustaväri eli ensimmäinen arvo.)

Katso sinisen värin koodi YY-Chr:stä ($01). Muuta heksaeditorilla ensimmäinen löytämäsi merkkijono muotoon 22 01 27 18. Käynnistä peli ja totea muutoksen onnistuneen (kuva alla), joten toista löytämääsi merkkijonoa ei tarvitse kokeilla muuttaa.

Jos olet ennen oikean osoitteen löytymistä kajonnut turhaan muihin samansisältöisiin osoitteisiin, on syytä perua ylimääräiset muutokset palaamalla pelin alkuperäiseen versioon ja editoimalla siitä vain oikeat kohdat. Väärät osoitteet saattoivat nimittäin sisältää alunperin muuntyyppistä dataa (esim. musiikkia), jossa vain sattui olemaan samat tavut kuin paletissa ja joka menee sekaisin, jos sitä editoidaan kuin palettia.

Harjoitustehtävä: muuttele Excitebiken pelihahmon värejä samalla menetelmällä. (Olen testannut, että se onnistuu.)

Tekstien editoiminen

Monissa peleissä tekstit on tallennettu viittauksina grafiikkadatassa olevien kirjainten sijainteihin. Sijainnit voi selvittää esim. FCEUX:n PPU Viewerillä, jota jo aiemmin käytettiin.

Oletetaan, että tahdot muuttaa Super Mario Brosissa ruudun vasemmassa yläkulmassa olevan sanan "MARIO" sanaksi "SONIC". Siirry PPU Vieweriin. Vie hiiren osoitin etsimäsi tekstin ("MARIO") kunkin kirjaimen päälle (kuva alla), katso merkkien koodit "Tile:"-sanan jäljestä ja kirjoita ne muistiin ($16 $0A $1B $12 $18). Selvitä samoin sanan "SONIC" merkkikoodit ($1C $18 $17 $12 $0C).

Avaa ROM-tiedosto heksaeditoriin. Etsi "MARIO"-sanan merkkikoodeja (taas ilman dollarimerkkejä). Ne löytyvät neljästä osoitteesta: $765, $7AB, $7BE ja $D71. Syötä "SONIC"-sanan merkkikoodit vuorotellen kunkin osoitteen kohdalle. Osoittautuu, että ensimmäinen osoite on se, jota haettiin (kuva alla).

Voit pelata peliä eteenpäin ja tutkia, onko muidenkin osoitteiden muutteleminen tarpeellista. Todennäköisesti on, koska sana "MARIO" näkyy pelin aikana useammassa paikassa. Vältä tarpeettomia korvauksia, kuten väripaletin editoimisen yhteydessä sanottiin.

Kun editoit ohjelmatiedostojen tekstejä, et saa koskaan lisätä tai poistaa merkkejä niin, että tiedoston koko muuttuu. Ohjelmakoodin hyppykäskyt menisivät silloin sekaisin. Voit vain ylikirjoittaa olemassaolevia merkkejä. Jos uusi merkkijono on lyhyempi kuin vanha, korvaa ylimääräiset merkit esim. välilyönneillä. Uusi merkkijono ei voi olla pitempi kuin vanhalle varattu tila.

Karsitun version luominen ROM-tiedostosta

Kun ROM-tiedostosta etsitään merkkijonoa, kuten palettia tai tekstin merkkikoodeja, se löytyy joskus niin monesta kohdasta, että kaikkien kokeileminen olisi liian aikaavievää. Tätä varten FCEUX:ssä on Code/Data Logger -toiminto, jolla voi luoda karsitun version ROM-tiedostosta.

Kokeillaan uudestaan tekstin "MARIO" etsimistä Super Mario Brosista. Aiemmin kuvatulla menetelmällä se löytyi neljästä osoitteesta. Tee nyt seuraavasti:

RAM-muistin tutkiminen

NES:issä on 2 kt RAM-muistia. Usein on tarve löytää osoite, joka sisältää esim. pelaajan jäljelläolevien elämien määrän. Se tapahtuu Super Mario Brosin tapauksessa seuraavasti:

  1. Avaa FCEUX:n Tools-valikosta Cheats eli Cheat Search (kuva alla).
  2. Aloita uusi peli.
  3. Paina Reset. Ohjelma luettelee kaikki RAM-muistiosoitteet.
  4. Pelaa vähän aikaa mutta älä kuole. Paina Equal. Ohjelma jättää jäljelle vain osoitteet, joiden sisältö on pysynyt samana. Elämien määrä kuuluu niihin, joten näin saadaan karsittua asiaankuulumattomia osoitteita.
  5. Kuole. Odota, että peli alkaa taas. Rastita Less Than -napin vieressä oleva valintaruutu, kirjoita laatikkoon 1 ja paina Less Than. Ohjelma jättää jäljelle osoitteet, jotka ovat vähentyneet yhdellä, kuten elämien määrä. Listalla on enää pieni määrä osoitteita.
  6. Kuole. Odota, että peli alkaa taas. Paina Less Than. Nyt jäljellä on todennäköisesti vain yksi osoite ($75A). Se on elämien määrä. Jos osoitteita on vielä useampi kuin yksi, toista kohtaa 4 sopivissa paikoissa.

Debug-valikosta löytyvä Hex Editor (kuva alla) näyttää RAM:in sisällön reaaliajassa. Sillä voit tarkkailla löytämäsi osoitteen sisältöä pelin aikana ja varmistua, että se on oikea. Voit myös kirjoittaa osoitteeseen suuremman luvun, niin saat lisää elämiä.

(FCEUX:ssä on myös RAM Search -toiminto, joka muistuttaa Cheatsia, mutta se tuntui bugiselta ainakin versiossa 2.1.3.)

Editoiminen lähdekoodin avulla

Kun tiedät, missä RAM-osoitteessa peli pitää esim. elämien määrää, voit editoida ohjelmakoodia niin, että esim. aloitat 9 elämällä tai sinulla on loputtomat elämät. Tämä on kohtalaisen vaikea toimenpide, koska sinun on osattava NES:in konekieltä. NES:in prosessori perustuu 6502:een. Ohjeita sen ohjelmoimiseen löytyy NESDevistä.

Aluksi on disassembloitava peli esim. Dasm-ohjelmalla. Se toimii komentorivillä. Anna käsky dasm peli.nes > peli.txt , niin saat pelin lähdekoodin tiedostoon peli.txt. Super Mario Brosin lähdekoodin alku näyttää seuraavalta:

00000010: sei
00000011: cld
00000012: lda #$10
00000014: sta $2000
00000017: ldx #$FF
00000019: txs
0000001A: lda $2002
0000001D: bpl $0000001A

Kullakin rivillä on osoite ROM-tiedostossa heksana, kaksoispiste, kolmikirjaiminen konekielikäsky ja sen mahdolliset parametrit. Kukin käsky vie parametreineen 1 - 3 tavua tilaa. Rivit ennen osoitetta $10 ovat pelkkää roskaa (header). Samoin rivit osoitteesta $10 + ohjelmakoodin_koko alkaen ovat turhia (grafiikkadata). Ohjelmakoodin koon näet FCEUX:n Help-valikon Message Log -toiminnolla (32 kt). Voit poistaa nämä rivit lähdekoodista, niin ne eivät häiritse.

Nyt voit etsiä ohjelmakoodista esim. kohdan, jossa pelaajan elämien määrä asetetaan. Super Mario Brosin tapauksessa RAM-osoite on $75A, joten todennäköisimmältä vaikuttaa käsky sta $075A eli A-rekisterin arvon tallentaminen kyseiseen RAM-osoitteeseen. Se löytyy kahdesta paikasta:

000004A6: lda #$FF
000004A8: sta $075A
...
00001079: lda #$02
0000107B: sta $075A

Jälkimmäinen näyttää oikealta paikalta, koska luku $02 muistuttaa elämien määrää. Vaihda heksaeditorilla osoitteen $107A arvoksi $08. Kun käynnistät pelin, sinulla on 9 elämää (kuva alla).

Usein on parempi disassembloida koko pelin sijasta aiemmin mainittu karsittu versio.

Game Genie -koodien luominen

Suosittelen, että luet ensin Game Genie -laitteen esittelysivun.

Tiedämme jo, miten Super Mario Brosin Marion housut ja hattu muutetaan sinisiksi heksaeditoinnilla. Tehdään sama Game Genie -koodilla. Tiedostossahan muutos oli, että osoitteeseen $5E8 vaihdettiin arvo $01. Vähennetään osoitteesta $10 (esim. Windowsin laskimella), koska ROM-tiedoston alussa on sen pituinen header. Saadaan osoite $5D8.

Tarkistetaan pelin ohjelmakoodin koko FCEUX:n Help-valikon Message Log -toiminnolla (32 kt). Jos ohjelmakoodia olisi 16 kt, osoitteeseen lisättäisiin $4000, koska koodi sijoittuisi eri kohtaan muistiavaruudessa. Jos taas ohjelmakoodia olisi enemmän kuin 32 kt, osoitteesta poistettaisiin arvo $2000 niin monta kertaa, että osoite laskisi välille $0 - $7FFF. Tällöin saataisiin neljä eri osoitetta (esim. $1F234 --> $1234, $3234, $5234 ja $7234) ja kokeiltaisiin niitä kaikkia. Mutta koska Super Mario Brosissa on ohjelmakoodia 32 kt, kumpaakaan näistä muutoksista ei tehdä, eli osoite on edelleen $5D8.

Lataa Game Genie Code Converter -ohjelma. Käynnistä se ja valitse koneeksi NES. Lisää osoitteen alkuun etunollia niin, että siitä tulee nelinumeroinen, ja syötä se osoitekenttään eli ennen kysymysmerkkiä olevaan kenttään ilman dollarimerkkiä (05D8). Arvokenttään eli kaksoispisteen jälkeiseen kenttään tulee arvo ilman dollarimerkkiä eli 01. Jos tahdot, voit syöttää myös vertailuarvon eli arvon, joka osoitteessa on oletuksena (kysymysmerkin ja kaksoispisteen väliseen kenttään arvo 16), mutta siitä on hyötyä vain, jos ohjelmakoodia on enemmän kuin 32 kt.

Saat Game Genie -koodin PEIEAI (kuva alla; tai koodin PESEAITP, jos syötät vertailuarvon). Kokeile sitä heksaeditoimattomaan versioon pelistä ja näet, että se toimii.


Etusivulle | Tätä sivua on päivitetty viimeksi 1.9.2010 eli 5 päivää sitten.