Priča o nemogućem prijenosu: Kako je Quake prenesen na Game Boy Advance

Prijenos Quakea na Game Boy Advance činilo bi se nemogućim, ali Randy Linden je to uspio izvesti. Evo kako.

Game Boy Advance je ručna igraća konzola koju je stvorio Nintendo. Objavljen je u Japanu 2001. godine i poslužio je kao nasljednik Game Boy Colora. Imao je ARM7TDMI na taktu od 16,78 MHz, 32 kb internog radnog RAM-a, 256 kb vanjskog RAM-a i 96 kb VRAM-a. Nije najjači stroj, ali ima dosta igara za dlanovnike koje su mnogima ostale u lijepom sjećanju. Jedna igra koja nikad nije ugledala svjetlo dana za uređaj bila je prototip porta Quakea, igre koju je razvio id Software i koja je pomogla u definiranju žanra pucačina u prvom licu kakav poznajemo danas.

Quake je nevjerojatno detaljna igra s fantastičnim soundtrackom i zaraznim načinom igranja, a baš kao i DOOM, prenesena je na praktički svaki uređaj koji vam padne na pamet. Njegov priključak na Game Boy Advance posebno je nevjerojatan jer izvorno ne podržava 3D grafiku, a Nintendo je posebno reklamirao dlanovnik kao dvodimenzionalno iskustvo igranja. To ipak nije spriječilo Randyja Lindena da razvije vlastitu luku.

Fotografija Quake porta reproducirana na analognom džepu korištena uz dopuštenje Modern Vintage Gamera

Ako niste upoznati s Lindenom, on je najpoznatiji po tome što je razvio oba bleem! (PlayStation emulator) i SNES priključak za DOOM, postignuće koje je John Romero, suosnivač id Software-a, jednom rekao u intervjuu za Shacknews nije mislio da je moguće. Lindenova stručnost u razvoju dokazala je da će to vjerojatno biti on, ako će itko uspjeti pretvoriti Quake na Game Boy Advance u stvarnost.

Ova je luka izašla na vidjelo zahvaljujući Lindenovom vlastitom izdanju kroz projekt Forest of Illusion. Forest of Illusion je projekt čiji je cilj očuvanje povijesti Nintendovih igara, a Linden pružio ruku kako bi distribuirao kopiju Quake porta koju je pronašao na flash kartici od 256 MB u svom posjed.

Željeli bismo zahvaliti Randyju Lindenu što je odvojio vrijeme da odgovori na naša pitanja i osigura tehničku točnost ovog članka. Također želimo zahvaliti Moderni vintage igrač jer nam je dopustio da koristimo sve potrebne fotografije iz njegovog videa. Ovaj port nema službene veze s id Software-om ili ZeniMaxom i razvio ga je Linden kao solo projekt.

Quakeov Game Boy Advance priključak

Tehnički govoreći, pravo je čudo da Quake uopće može postići razinu na kojoj je na Game Boy Advanceu. Radi s dobrim brojem sličica u sekundi i održava ispravno osvjetljenje i paletu boja originalne igre Quake. Sve je 3D, uključujući oružje i čudovišta. Igre na Game Boy Advanceu postigle su 3D grafiku obično kroz spriteove, ali ovo je bila prava stvar. Ne koristi bacanje zraka na način na koji su to činile druge 3D igre na dlanovniku, a čak postiže i poantu svjetlosni efekti na unaprijed renderiranim objektima putem trika za promjenu palete kako bi se postigla iluzija dinamike rasvjeta.

Da budemo jasni, ovaj port nije cijela igra, i to je prototip koji je Linden namjeravao odnijeti u id Software nakon što bude dovršen kako bi se napravio za puštanje. Međutim, popularnost Game Boy Advancea počela je slabjeti, a umjesto toga, prilagođeni motor koji je napisao Linden kasnije je postao motor druge igre koju je u potpunosti razvio Linden -- Cyboid. Linden nam kaže da je "veliki dio koda" još uvijek izvorni ARM kod iz verzije Game Boy Advance. Ako želite isprobati Cyboid, starija verzija dostupna je u Google Play trgovini, ali službeni APK sada se distribuira na Amazon App Store jer igra ima puno 32-bitnog koda niske razine.

CyboidProgramer: R and R Digital, LLC.

Cijena: besplatno.

3.3.

preuzimanje datoteka

Linden je također podijelio s nama video svog koda koji se izvodi na iPod Video, koji je služio kao jedna od najranijih verzija Cyboida. Izgrađen je na istom kodu motora koji je korišten za njegov Quake port na Game Boy Advance.

Game Boy Advance port za Quake ne sadrži nijednu službenu imovinu igre, jer Linden nije obratio se id Software-u ili ZeniMaxu u vezi s distribucijom E1M1 verzije koja sadrži službeni Quake imovina.

Igra koja se trenutno distribuira također je verzija za otklanjanje pogrešaka. Držanje tipke R pri pokretanju dovest će igrača ravno do druge mape igre, a držanje lijevo na D-padu dovest će ga do treće. Zamjeni karte također se može pristupiti kada igrač umre, a čudovišta neće napasti igrača sve dok igrač prvi ne puca na njih.

Što se tiče glazbe, demo koristi javne .S3M datoteke, a mikser zvuka obrađuje i stereo glazbu i zvučne efekte.

Tehničke granice

Postojala su brojna ograničenja kada je u pitanju Game Boy Advance zbog kojih je ovaj prijenos bio težak. Neke od najvećih prepreka bile su niska brzina takta, nedostatak 3D grafičkih mogućnosti ručnog računala i nedostatak jedinice s pomičnim zarezom (FPU). Bilo je puno drugih na putu, ali ovo su bile posebne bolne točke koje mi je Linden ocrtao kao problematične. Prije nego što uđemo u to, važno je razumjeti izgled Game Boy Advancea.

Snimka zaslona korištena uz dopuštenje Modern Vintage Gamera

Game Boy Advance ima tri seta RAM-a -- jedan je interni radni RAM (IWRAM), drugi je vanjski radni RAM (EWRAM), a treći je video RAM (VRAM). 32kb IWRAM-a koristi se za pohranjivanje ARM instrukcija za brzo izvršenje, dok je 256kb EWRAM-a optimalno za pohranjivanje samo Thumb instrukcija i manjih dijelova podataka. Kao Rodrigo Copetti bilježi, pristup EWRAM-u može biti do šest puta sporiji od IWRAM-a. Većina memorije u obliku EWRAM-a dostupna je samo putem 16-bitne sabirnice, unatoč tome što se Game Boy Advance prodaje kao 32-bitni ručni uređaj. IWRAM-u se može pristupiti putem 32-bitne sabirnice. VRAM na Game Boy Advance dolazi u veličini od 96 kb, i dok prvenstveno služi za pohranjivanje grafičkih podataka, nalazi se u memorijskoj mapi CPU-a i može se koristiti i kao normalna memorija za pohranu.

Thumb instrukcije su podskup 32-bitnih ARM instrukcija i skup su instrukcija kodiranih u 16-bitne riječi. Imaju sve prednosti 32-bitnih instrukcija, a ne zauzimaju puno prostora, što ih čini učinkovitima za optimizirani razvoj. To znači da iako je EWRAM-u sporiji za pristup, Thumb upute koje su učinkovite često mogu završiti jednako brzo kao i pohranjene ARM instrukcije u IWRAM-u, iako je loša strana Thumb instrukcija to što ponekad ne postoji baš Thumb ekvivalent ARM instrukcije koju želite izvršiti. EWRAM je korišten za pohranjivanje izlaza logike 3D matematičke transformacije, što je u osnovi bio popis rubova poligona koji su zatim iscrtani redak po redak kodom za rasterizaciju.

Kao što mi Linden kaže, najsloženiji i najteži dio cijelog porta bio je scanline renderer. Sastoji se od više od 10 000 redaka visoko optimiziranog ARM sklopovskog koda koji je dizajniran za crtanje skupa piksela u VRAM. Scanline renderer je iskoristio većinu 32kb IWRAM-a. Rubovi najbliži kameri su aktivni i prikazani, a to je u biti veliko stablo binarne particije prostora (BSP). VRAM je korišten za pohranjivanje rezultata izlaza poligonalne transformacije u rubne tablice jer nije bilo dovoljno IWRAM-a, ali VRAM na Game Boy Advanceu još uvijek je brži od EWRAM-a. Ovdje su također bile pohranjene i izložene grafike.

Proveo je puno vremena fokusirajući se na optimizacije kako bi osigurao da je moguće postići najbrže moguće vrijeme izvršenja. Tri stvari koje je učinio kako bi ubrzao to vrijeme izvršenja uključivale su sljedeće:

  • Sam je izmijenio kod prije nego što je izvršen, tako da je bilo potrebno manje uputa
  • Koristio je niz tablica za pretraživanje za stvari kao što su recipročna vrijednost, sinus, kosinus, tangens itd.
  • Prebacio CPU "način" da dobije pristup dodatnim registrima (koji su poput "varijabli") bez potrebe za spremanjem i vraćanjem vrijednosti registara.

Promjena načina rada CPU-a za dobivanje dodatnih registara nevjerojatno je pametan manevar koji omogućuje brzi pristup vrijednostima blizu CPU-a tako da se mogu dohvatiti u jednom ciklusu takta. Kao što mi je Linden rekao, bilo je moguće promijeniti registre i dohvatiti vrijednost u jednom taktu, za razliku od pohranjivanja vrijednosti u RAM Game Boy Advancea, što traje duže. Sam CPU je procesor od 16,78 MHz, što znači da može izvršiti 16780000 ciklusa u sekundi. To zvuči puno, ali kada trebate izračunati i nacrtati svaki piksel na zaslonu, oni se brzo zbrajaju i postaje važno smanjiti što više operacija.

Gore je popis općih registara ARM7TDMI čipseta koji se nalazi unutar Game Boy Advance. Tipično, programeri bi samo ikada pristupili registrima unutar "Sustav i korisnik" moda i pribjegli korištenju normalnih varijabli izvan toga. Međutim, koristio je registre u svih sedam načina rada čipseta, a najbolji dio toga je da načini prebacivanja i dalje zadržavaju vrijednosti u registrima drugih načina, tako da se može prebacivati ​​između ih.

Zanimljivo, Linden je također spomenuo kako je njegova metoda promjene banke otkrila grešku u emulatoru Nanoboy Advance. Kako se pokazalo, taj emulator nije podržavao korištenje drugih modova CPU-a za spremanje u registre i prebacivanje, a njegov Quake demo bio je prva poznata igra koja je to doista radila.

Linden je s nama podijelio fotografiju nekih bilješki koje je napravio i objasnio kako je optimizirao svoje izračune s pomičnim zarezom u nedostatku odgovarajućeg FPU-a.

Gornja slika je ona koju je Linden podijelio s nama iz svojih bilješki, a ono što je posebno zanimljivo su "razne instrukcije ARM ciklusa". Osmislio je način optimiziranja ciklusa za izračune kako bi mogao smanjiti broj taktova za izračun. Kako mi je opisao, 8-bitni broj se može pomnožiti u jednom taktu, 16-bitni broj u dva takta, 32-bitni broj u tri takta, a 64-bitni broj u četiri takta. .

"Postojale su dvije ili tri faze izvršenja [u ARM procesoru]. Recimo, na primjer, da pomnožim registar jedan s registrom dva i stavim rezultat u registar tri. Kad bih znao da je registar dva 16-bitni broj umjesto da kažem pomnoži registar jedan s registrom dva, okrenuo bih ga i rekao bih pomnoži registar dva s registrom jedan jer bi mi to uštedjelo sat ciklus."

Rekao mi je da je razlog zbog kojeg je to učinio bio da iz Game Boya istisne svaki djelić performansi Unaprijed, budući da se ciklus sata koji se tu i tamo sprema doista pridonosi kada se radi mnogo izračuna izvedena. Što se tiče koda koji se sam mijenja, zamolio sam Lindena da ga objasni.

"Program dolazi iz [pohrane], prenosi veliki blok programa u interni RAM za izvođenje jer je brži. Svaki pristup RAM-u je puno, puno sporiji pa radim DMA [izravan pristup memoriji] velikog bloka iz ROM-a u RAM, a zatim mijenjam stvarni programski kod. Na primjer, ARM ima mogućnost pomicanja operanda lijevo ili desno ili može maskirati određene bitove kao dio skupa instrukcija. Uputa specificira koje bitove ćete maskirati ili za koliko ćete se bitova pomaknuti. Dakle, generirao bih kod koji bi modificirao ono što se upravo spremalo izvršiti na temelju toga koliko bitova trebam pomaknuti. Drugi primjer je u vezi s 3D matričnim množenjem. Tu je uključena cijela hrpa množenja. Generirao bih stvarne instrukcije koje rade množenja u unutarnjem RAM-u i zatim ih izvršio tako da je kod na neki način izgradio dijelove samog sebe dok se izvodi."

Kod koji se sam mijenja ima svoje nedostatke, osobito kada je u pitanju otklanjanje pogrešaka. Uklanja i potrebu za uputama za grananje, gdje bi kod preskočio na drugu sekvencu izvršavanja i glavnu nit mogao lišiti dragocjenog vremena izračuna. Linden nam je također rekao da su tablice pretraživanja savršeno poravnate u ROM-u tako da su savršen višekratnik osmobitne vrijednosti pomaknute ulijevo. Veličina tablice za pretraživanje je ogromna i ne stane u RAM, a poravnanje također izbjegava potrebu za dodatnom uputom za učitavanje da bi se dobila osnovna adresa tablice.

Sve u svemu, konačni prototip razvijan je gotovo dvije godine.

Budućnost Quake porta Randyja Lindena

Pitao sam Lindena što će se dogoditi s budućnošću Quake porta, a on mi je rekao da planira razmotriti pitati ZeniMax i id Software o izdavanju verzije sa službenim Quakeom imovina. Također mi je rekao da će u nekom trenutku objaviti izvorni kod, ali trenutno se ne nadograđuje jer zahtijeva starije računalo.

Postavka Randyja Lindena za povezivanje Game Boy Advancea s računalom za razvoj.

Pitao sam Lindena zašto je odabrao Quake, a on mi je rekao da mu se sviđa igra i da mu se sviđa izazov što je ovo "nemoguć projekt", budući da je izašao iz njegovog DOOM-a za SNES port. Također je spomenuo da iako ne vjeruje da se cijela igra mogla prenijeti zbog prostornih ograničenja, velika većina igre mogla je biti na istom motoru.

Ako ste zainteresirani za provjeru Quakea za Game Boy Advance, svakako pogledajte njegovo izdanje na Forest of Illusion, koje možete pogledati ispod.


Preuzmite sa Forest of Illusion