Zdjęcia pomocnicze
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]
- Ani rejestry
IX
iIY
Z80, ani instrukcjeIN
lubOUT
8080 nie są dołączone: Oznacza to, że porty WE/WY nie są dostępne. Nie jestem pewien, czy to tylko środek do redukcji kosztów, ale jedno jest pewne: komponenty będą musiały być całkowicie zmapowane w pamięci [4]. - Zaimplementowano tylko zestaw rejestrów 8080.
- Zawiera rozszerzony zestaw instrukcji Z80. Chociaż znajdują się tylko instrukcje manipulacji bitami.
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]:
- Miejsca na kartridż.
- WRAM i RAM Wyświetlacza.
- WE/WY (joypad, dźwięk, grafika i LCD)
- Kontroli przerwań.
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
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
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
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
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
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
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
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)
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)
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)
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]:
- Po włączeniu konsoli procesor zaczyna czytać pod adresem 0x00 (lokalizacja ROM Gameboya).
- RAM i Dźwięk są inicjowane.
- 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.
- Logo jest przewijane w dół i odtwarzany jest słynny dźwięk po-ling.
- Logo Nintendo gry jest dopasowywane do tego przechowywanego w ROM konsoli, jeśli test się nie powiedzie, konsola zawiesza się.
- 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ę.
- ROM konsoli jest usuwany z mapy pamięci.
- 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.
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.