Architektura Game Boya

Praktyczna analiza autorstwa Rodrigo Copetti

Przetłumaczone przez LunaDook & MoonbowPlushie

This is a volunteer translation of the original article. If you find any mistakes, please help improve it. Thanks!

Jeśli korzystasz z narzędzi ułatwień dostępu lub starszych przeglądarek, przełącz się na wersję 'klasyczną'.




Zdjęcia pomocnicze

Model

Image
Oryginalny Game Boy
Wydany 21.04.1989 w Japonii, 31.07.1989 w Ameryce i 28.09.1990 w Europie

Płyta Główna

Image
Płyta Główna
Pokazuję wersję '04'. Zwróć uwagę, że 'DMG' to identyfikator oryginalnego modelu Game Boya.
Image
Płyta główna z zaznaczonymi ważnymi częściami

Diagram

Image
Schemat głównej architektury

Szybkie wprowadzenie

Game Boya można sobie wyobrazić jako przenośną wersję NES o ograniczonej mocy, ale zobaczysz, że zawiera on bardzo interesującą nową funkcjonalność.


CPU

Zamiast umieszczać wiele gotowych chipów na płycie głównej, Nintendo zdecydowało się na pojedynczy chip do przechowywania (i ukrywania) większości komponentów, w tym procesora. Ten typ chipa nazywa się ‘System On Chip’ (SoC), a ten znaleziony na Game Boyu jest określany jako DMG-CPU lub Sharp LR35902 [1].

To powiedziawszy, głównym procesorem jest Sharp SM83 [2] i jest to mieszanka Z80 i Intel 8080. Działa z częstotliwością ~4,19 MHz.

Sam Z80 jest nadzbiorem 8080, więc co tak naprawdę SM83 ma, a czego nie ma z tych dwóch? [3]

Na koniec dodali także kilka nowych instrukcji, których nie ma ani w Z80, ani w 8080. Myślę, że wyjaśnianie ich pojedynczo wykracza poza zakres tego artykułu, ale główną ideą jest to, że optymalizują one pewne operacje uwarunkowane sposobem, w jaki Nintendo/Sharp rozmieścili sprzęt.

Dostępna pamięć

Nintendo zamontowało 8 KB RAM do użytku ogólnego (nazywanego przez nich Work RAM lub ‘WRAM’) [5]. Zauważ, że jest to czterokrotnie więcej niż ta, którą zawierał NES.

Dostęp sprzętowy

SM83 obsługuje 8-bitową magistralę danych i 16-bitową magistralę adresową, dzięki czemu można zaadresować do 64 KB pamięci. Mapa pamięci składa się z [6]:


Grafika

Wszystkie obliczenia graficzne są wykonywane przez procesor, a następnie renderowane są przez Picture Processing Unit lub ‘PPU’. Jest to kolejny komponent znajdujący się wewnątrz DMG-CPU i faktycznie jest oparty na PPU poprzednika.

Obraz jest wyświetlany na zintegrowanym ekranie LCD, który ma rozdzielczość 160×144 pikseli i może wyświetlać 4 odcienie szarości (biały, jasnoszary, ciemnoszary i czarny). Ale ponieważ oryginalny Gameboy ma zielony wyświetlacz LCD, grafika będzie wyglądać zielonawo.

Jeśli czytałeś wcześniej artykuł NES, być może pamiętasz, że PPU został zaprojektowany do podążania za wiązką CRT. Jednak (z oczywistych względów) w Gameboyu dostaliśmy ekran LCD. Nowy PPU nie zmienia tej części, ponieważ wyświetlacze LCD również wymagają odświeżenia. W rzeczywistości niektóre efekty specjalne uzyskane dzięki temu zachowaniu będą również obsługiwane na Gameboyu.

Organizowanie treści

Image
Architektura pamięci PPU.

PPU ma 8 KB VRAM lub ‘RAM-u Wyświetlacza’, do której zarówno PPU, jak i procesor mogą uzyskać bezpośredni dostęp, ale nie w tym samym czasie. Te 8 KB będą zawierać większość danych potrzebnych PPU do renderowania grafiki. Pozostałe części będą przechowywane wewnątrz PPU, ponieważ będą wymagały szybszego dostępu.

Gra jest odpowiedzialna za wypełnianie różnych obszarów właściwymi typami danych. Co więcej, PPU ujawnia rejestry, dzięki czemu gra może poinstruować PPU, jak te dane są zorganizowane (jest jednak wiele reguł).

Konstruowanie klatki

Zobaczmy, jak PPU radzi sobie z rysowaniem rzeczy na ekranie. W celach demonstracyjnych jako przykład posłuży Super Mario Land 2:

Kafelki

Image
Wiele kafelków.
Image
Wiele kafelków oddzielonych siatką.
Image
Pojedynczy kafelek.
Kafelki znalezione w Tabeli Wzorów.

PPU używa kafelków jako podstawowego składnika renderowania grafiki, w szczególności spriteów i tła [7].

Kafelki to po prostu bitmapy 8x8 przechowywane w VRAM w regionie o nazwie Zestaw kafelków lub ‘Tabela wzorców kafelków’, i każdy piksel odpowiada jednemu z czterech dostępnych odcieni szarości. Na koniec kafelki są grupowane w dwie tabele wzorów.

Aby zbudować obraz, do kafelków odwołuje się inny typ tabeli zwany Mapa kafelków. Ta informacja powie PPU, gdzie renderować kafelki. Przechowywane są dwie mapy, aby skonstruować różne warstwy klatki.

W następnych sekcjach wyjaśniono, w jaki sposób mapy kafelków są używane do tworzenia warstw.

Warstwa Tła

Image
Przydzielona mapa tła w VRAM.
Image
Wybrany obszar mapy tła. Zauważ, że wybrana część zawiera kawałek górnej części, która będzie nałożona na warstwę okna.
Image
Wyświetlana mapa tła.
Proces renderowania mapy tła.

Warstwa tła to mapa 256x256 pikseli (32x32 kafelki) zawierająca statyczne kafelki. Pamiętaj jednak, że na ekranie widać tylko 160x144, więc gra decyduje, która część zostanie wybrana do wyświetlenia. Gry mogą również przesuwać widoczny obszar podczas rozgrywki, w ten sposób realizowany jest Efekt Przewijania.

Do zbudowania warstwy tła można użyć jednej z dwóch map kafelków.

Okno

Image
Przydzielona mapa okna.
Image
Wyświetlana mapa okna. Gra aktywuje ją podczas ostatnich linii skanowania. W związku z tym na dole ekranu renderowane są tylko pierwsze wiersze.
Proces renderowania mapy okna.

Okno to warstwa 160x144 pikseli zawierająca kafelki wyświetlane na górze tła i spriteów. Nie przewija się.

Pozostałą mapę kafelkową można przypisać do warstwy okna.

Na początku może to brzmieć jak głupia funkcja. W końcu warstwa okna nakłada się na wszystko inne, więc do czego jest przydatna? Cóż, zarówno Tło, jak i Okno mogą być używane jednocześnie w różnych częściach ekranu. Jest to realizowane przez zmianę rejestru LCDCONT podczas określonych linii skanowania.

Dlatego gry zwykle używają go do wyświetlania statystyk gracza, wyników i innych ‘zawsze włączonych’ informacji.

Sprite’y

Image
Renderowana warstwa Sprite.

Sprite’y to kafelki, które mogą poruszać się niezależnie po ekranie. Mogą również nakładać się na siebie i pojawiać się za tłem, widoczna grafika zostanie określona na podstawie atrybutu priorytetu.

Mają też dostępny dodatkowy kolor: Przezroczysty. Tak więc mogą wyświetlać tylko trzy różne odcienie szarości zamiast czterech. Na szczęście ta warstwa pozwala zdefiniować dwie palety kolorów, aby wykorzystać każdy kolor.

Object Attribute Memory lub ‘OAM’ to mapa przechowywana w PPU, która określa kafelki, które będą używane jako sprite’y. Gry wypełniają ten region, wywołując jednostkę DMA znajdującą się w chipie, DMA pobiera dane z głównej pamięci RAM lub ROM gry do OAM.

Każdy wpis oprócz indeksu kafelka zawiera następujące atrybuty: pozycja X-Y, paleta kolorów, priorytet i flagi odwracania (umożliwiające obracanie kafelka w pionie i poziomie).

PPU jest ograniczone do renderowania do 10 sprite’ów na linię skanowania i do 40 na klatkę, przepełnienie spowoduje to, że sprite’y nie zostaną narysowane.

Sprite’y

Image
Renderowana warstwa Sprite.

Gdy klatka jest gotowa, czas przejść do następnej! Jednak procesor nie może modyfikować tabel, gdy PPU czyta z VRAM, więc system zapewnia zestaw przerwań wyzwalanych, gdy PPU jest bezczynny. Możesz pamiętać to zachowanie z czasów NES.

Po zakończeniu pojedynczej linii skanowania wywoływane jest przerwanie H-Blank. Pozwala to pobawić się częścią klatki, która nie została jeszcze narysowana.

Gdy wszystkie linie skanowania zostaną zakończone, wywoływane jest przerwanie V-Blank. Gra może teraz zaktualizować grafikę do następnej klatki.

Istnieje dodatkowy stan zwany wyszukiwanie OAM, który jest wyzwalany na początku linii skanowania, w tym momencie PPU przetwarza, które sprite’y będą wyświetlane w tej linii skanowania, dzięki czemu gra może aktualizować dowolny region z wyjątkiem OAM.

Sekrety i Ograniczenia

Włączenie warstwy okna i dodatkowych przerwań pozwoliło na wprowadzenie nowych rodzajów treści i efektów.

Efekt chybotania

The Legend of Zelda: Link’s Awakening (1993). Spoilery!

Poziome przerwania pozwoliły zmienić klatkę przed zakończeniem. Oznacza to, że w każdym wierszu można zastosować inną wartość przewijania, co spowoduje, że każdy wiersz ramki zostanie przesunięty w inny sposób.

Osiągnęło to efekt chybotania (nie jestem pewien, czy to oficjalna nazwa).


Dźwięk

System audio jest realizowany przez Audio Processing Unit (APU) — czip PSG z czterema kanałami [8].

Funkcjonalność

Każdy kanał jest zarezerwowany dla typu fali:

Impuls (Pulse)

Spojrzenie na kanał Impuls 1 przez Oscyloskop.
Spojrzenie na kanał Impuls 2 przez Oscyloskop.
Spojrzenie na wszystkie kanały przez Oscyloskop.
Pokemon Red/Blue (1996).

Fale impulsowe mają bardzo wyraźny dźwięk bip, który jest używany głównie do melodii lub efektów dźwiękowych.

APU rezerwuje dwa kanały dla jednej fali impulsowej każdy. Wykorzystują one jeden z czterech różnych tonów zbudowanych przez zmianę szerokości impulsu. Pierwszy kanał ma dostępną wyłączną kontrolę sweep.

Ze względu na ograniczoną liczbę kanałów melodia często jest przerywana, gdy efekty muszą być odtwarzane jako część rozgrywki. Jest to bardzo widoczne w grach takich jak Pokemon Red/Blue, kiedy podczas bitwy dźwięk Pokemona będzie nakładał się na wszystkie kanały używane do odtwarzania muzyki.

Szum (Noise)

Spojrzenie na kanał Szum przez Oscyloskop.
Spojrzenie na wszystkie kanały przez Oscyloskop.
Pokemon Red/Blue (1996).

Szum to w zasadzie zestaw losowych kształtów fal, które brzmią jak biały szum. Przydzielony jest dla niego jeden kanał.

Gry używają go do efektów perkusyjnych lub ambient.

Ten kanał ma do dyspozycji tylko 2 tony, z których jeden generuje czysty szum, a drugi wytwarza robotyczny szum. Jego częstotliwość również może być kontrolowana.

Fala (Wave)

Spojrzenie na kanał Fala przez Oscyloskop.
Spojrzenie na wszystkie kanały przez Oscyloskop.
Pokemon Red/Blue (1996).

APU umożliwia zdefiniowanie niestandardowego kształtu fali, który ma być słyszalny z czwartego kanału. Fala składa się z 32 4-bitowych próbek, które są przechowywane w tablicy fal.

Kanał ten pozwala również kontrolować jego częstotliwość (umożliwiając wytwarzanie różnych nut muzycznych z tej samej próbki) i głośność.

Sekrety i Ograniczenia

Mikser wyprowadza dźwięk stereo, więc kanały można przypisać do lewej lub prawej strony. Można to jednak usłyszeć tylko w słuchawkach! Głośnik jest monofoniczny.

Co więcej, układ miksera jest również podłączony do dedykowanego pinu na kartridżu, co umożliwia strumieniowe przesyłanie dodatkowego kanału pod warunkiem, że kartridż musi faktycznie wyprowadzać dźwięk analogowy (możliwe tylko z dodatkowym sprzętem). Żadna gra na rynku nie korzystała z tej funkcji.


Gry

Gry są napisane w asemblerze i mają maksymalny rozmiar 32 KB, jest to spowodowane ograniczoną dostępną przestrzenią adresową. Jednak przy użyciu Memory Bank Controllera (mappera) gry mogą osiągać większe rozmiary. Największy dostępny na rynku kartridż ma 1 MB ROM.

Kartridże mogą zawierać zegar czasu rzeczywistego i zewnętrzną baterię wraz z pamięcią SRAM do przechowywania zapisów.

Komunikacja zewnętrzna

Po raz pierwszy gry mogą komunikować się z innymi konsolami za pomocą kabla Game Boy Link, który zapewnia funkcję gry wieloosobowej. Interfejs wykorzystuje bardzo prymitywny typ połączenia szeregowego.


Przeciwdziałanie-Piractwu

Ta konsola zawiera 256 bajtów ROM ułożone w stos w procesorze, które jest używane do ładowania ROM kartridża. Jednak nie uruchamia gry od razu. Najpierw wykonuje serię testów, które zapobiegają wykonaniu nieautoryzowanych kartridży, a także upewniają się, że kartridż jest prawidłowo włożony.

Aby przejść te kontrole, gry musiały zawierać kopię logo Nintendo (w postaci kafelków) w nagłówku ROM [9], w ten sposób Nintendo mogło wykorzystać przepisy o Prawach Autorskich i Znakach Towarowych do regulowania dystrybucji. Mądre, co? Bootowy ROM Gameboya zawiera również kopię logo, aby móc je porównać.

Biorąc to pod uwagę, proces uruchamiania wygląda następująco [10]:

  1. Po włączeniu konsoli procesor zaczyna czytać pod adresem 0x00 (lokalizacja ROM Gameboya).
  2. RAM i Dźwięk są inicjowane.
  3. Logo Nintendo jest kopiowane z ROM-u Kartridża do RAM-u Wyświetlacza, a następnie rysowane przy górnej krawędzi ekranu. Jeśli nie ma włożonego kartridża, logo będzie zawierało kafelki śmieci. To samo może się zdarzyć, jeśli jest źle włożony.
  4. Logo jest przewijane w dół i odtwarzany jest słynny dźwięk po-ling.
  5. Logo Nintendo gry jest dopasowywane do tego przechowywanego w ROM konsoli, jeśli test się nie powiedzie, konsola zawiesza się.
  6. Szybka suma kontrolna jest wykonywana na nagłówku ROM kartridża, aby upewnić się, że kartridż jest prawidłowo włożony, jeśli test się nie powiedzie, konsola zawiesza się.
  7. ROM konsoli jest usuwany z mapy pamięci.
  8. Procesor rozpoczyna grę.

Co ciekawe, logo Nintendo wyświetlane na ekranie nie jest usuwane z VRAM, więc gry mogą zastosować animacje i efekty, aby wprowadzić własne logo.

20y, demo homebrew, które bawi się logo.

W grach można zastosować więcej środków antypirackich, takich jak sprawdzanie rozmiaru SRAM (zwykle jest on większy w Bootlegach) i sprawdzanie sum kontrolnych pamięci ROM w losowych punktach gry.


To wszystko ludziska


Współpraca

Ten artykuł jest częścią serii Architektura Konsol. Jeśli uznałeś go za interesujący, rozważ darowiznę. Twój wkład zostanie wykorzystany na sfinansowanie zakupu narzędzi i zasobów, które pomogą mi poprawić jakość istniejących i przyszłych artykułów.

Donate with PayPal
Become a Patreon

Możesz także zakupić wydanie e-bookowe w języku angielskim. Zyski traktuję jako darowizny.

Image

Lista pożądanych narzędzi i najnowsze nabytki do tego artykułu są śledzone tutaj:

### Interesting hardware to get (ordered by priority)

- An original Gameboy (~£30 ?)
- A Dev cartridge (couldn't find one, yet)

Możesz też pomóc proponując zmiany i/lub dodając tłumaczenia.


Copyright and permissions

This work is licensed under a Creative Commons Attribution 4.0 International License. You may use it for your work at no cost, even for commercial purposes. But you have to respect the license and reference the article properly. Please take a look at the following guidelines and permissions:

Article information and referencing

For any referencing style, you can use the following information:

For instance, to use with BibTeX:

@misc{copetti-gameboy,
    url = {https://www.copetti.org/writings/consoles/game-boy/},
    title = {Game Boy / Color Architecture - A Practical Analysis},
    author = {Rodrigo Copetti},
    year = {2019}
}

or a IEEE style citation:

[1]R. Copetti, "Game Boy / Color Architecture - A Practical Analysis", Copetti.org, 2019. [Online]. Available: https://www.copetti.org/writings/consoles/game-boy/. [Accessed: day- month- year].
Special use in multimedia (Youtube, Twitch, etc)

I only ask that you at least state the author’s name, the title of the article and the URL of the article, using any style of choice.

You don’t have to include all the information in the same place if it’s not feasible. For instance, if you use the article’s imagery in a Youtube video, you may state either the author’s name or URL of the article at the bottom of the image, and then include the complete reference in the video description. In other words, for any resource used from this website, let your viewers know where it originates from.

This is a very nice example because the channel shows this website directly and their viewers know where to find it. In fact, I was so impressed with their content and commentary that I gave them an interview 🙂.

Appreciated additions

If this article has significantly contributed to your work, I would appreciate it if you could dedicate an acknowledgement section, just like I do with the people and communities that helped me.

This is of course optional and beyond the requirements of the CC license, but I think it’s a nice detail that makes us, the random authors on the net, feel part of something bigger.

Third-party publishing

If you are interested in publishing this article on a third-party website, please get in touch.

If you have translated an article and wish to publish it on a third-party website, I tend to be open about it, but please contact me first.


Źródła / Czytaj Dalej

Audio

CPU

Gry

Grafika

System Operacyjny

Fotografia


Rodrigo Copetti

Rodrigo Copetti

Mam nadzieję, że podobał Ci się ten artykuł! Jeśli chcesz dowiedzieć się więcej o autorze, kliknij tutaj a jeśli chcesz go wesprzeć, zamiast tego kliknij tutaj

rsslinkedintwittergithub facebookreddit