Jeśli chodzi o NES (i przede wszystkim SNES), oto podstawowy przegląd. Nie pisałem żadnych gier NES, ale napisałem emulator NES (Graybox) i wykonałem sporo przeróbek starych kart.
Co do języka programowania: tak, to wszystko było asembler. Programowanie NES oznaczało bezpośrednią pracę z przerwaniami sprzętowymi, portami DMA, przełączaniem banków itp. Na szczęście programowanie 6502 (a raczej 2A03) jest dość łatwe [1]:
- rejestrów jest niewiele: głównie A, X i Y, przy czym dwa ostatnie są przydatne tylko do indeksowania i iteracji
- zestaw instrukcji jest mały i przeważnie prosty
- mało pamięci: główna pamięć RAM to 2 KB, z opcjonalnym zasilanym bateryjnie rozszerzeniem 8 KB. Z tego 2 KB, 256 bajtów jest zarezerwowanych dla stosu, a strona 0 (pierwsze 256 bajtów) była miejscem, w którym chcesz przechowywać najczęściej używane wskaźniki i wartości ze względu na niektóre specjalne tryby adresowania
Te trzy rzeczy razem tworzą środowisko, które można łatwo zapamiętać podczas pracy z nim. Tak, sam zarządzasz całą pamięcią, ale to w zasadzie oznaczało, że stworzyłeś pełną mapę, gdzie wszystko idzie do przodu, a ta mapa nie jest bardzo duża, ponieważ musisz się martwić tylko o 2K, więc możesz wykreślić to na kawałku papier milimetrowy. Trzeba było zaplanować nieco więcej i statycznie przypisać zmienne i stałe do lokalizacji RAM i ROM (na kartridżu).
Robi się nieco trudniej, gdy dane naboju wykraczają poza adresowalne limity procesora. To 64 KB, z czego niższe 32 KB jest ustawione w kamieniu i odwzorowane na wszelkiego rodzaju porty sprzętowe i pamięć RAM. Tutaj zaczyna się przełączanie banków, co oznacza mapowanie części pamięci ROM na (część) wyższej przestrzeni adresowej 32 KB.
Można tego użyć, jak chce programista, ale przykładowym zastosowaniem może być gra z 3 poziomami, z wszystkimi danymi poziomu, metadanymi i kodem dla każdego poziomu wciśniętymi w osobne obszary pamięci 8 KB na kartridżu. Poziom może mieć wywołania zwrotne np. Inicjalizacji, aktualizacji ramki itp. „Ładowanie” poziomu oznaczałoby mapowanie tego fragmentu pamięci o wielkości 8 KB na np. 0xC000. Następnie można określić, że procedura inicjująca ma zawsze wartość 0xC000, procedura aktualizacji ramki ma wartość 0xC200, a dane poziomu zaczynają się od 0xC800. Główny kod gry mieści się w innym fragmencie pamięci, a następnie kontroluje zmiany poziomu, po prostu zamieniając odpowiedni fragment i przeskakując na adresy bezwzględne 0xC000 i 0xC200 w odpowiednich momentach.
Zapis danych graficznych: dane kafelków NES to 2-bitowe mapy 8 x 8 pikseli. Jako tło łączy się je z 2-bitową warstwą o rozdzielczości 1/4. Te 4-bitowe wartości zostały następnie zindeksowane do 16-wejściowej palety, przy czym uważam, że dostępnych jest 53 skuteczne unikalne kolory. Duszki również używały 2-bitowych danych pikselowych, a każdy duszek określał swój własny 2-bitowy indeks grupy, ponownie tworząc 4-bitowy indeks pal. Obraz BG na ekranie to tablica 32x30 numerów indeksów kafelków.
Zasadniczo, mając mnóstwo powtórzeń i indeksy do indeksów, możesz utrzymać dane bardzo małe. Dane o poziomie często były przechowywane jako pionowe słupki indeksów płytek, a ponieważ te pionowe słupki również zostały ponownie wykorzystane, zostały one również zindeksowane i zapisane tylko raz na kartridżu. Proste techniki kompresji danych działają podobnie. To pozwoliło Mario 1 na 32 KB danych (z miejscem na zapas) i 8 KB danych bitmapowych.
Jeśli chodzi o środowiska deweloperskie, widziałem kilka zdjęć, na których ludzie pracowali na niektórych certyfikowanych komputerach podłączonych do nagrywarki EEPROM do pracy. Debugowanie wspomagane narzędziami nie było tak naprawdę możliwe aż do wieku SNES [2]. Jest to główny powód, dla którego tak wiele starych gier ma „oczywiste” błędy i dlaczego rzeczy takie jak Gameshark mogą robić to, co robią; zdrowie gracza zawsze znajdowałoby się w miejscu pamięci X, więc możesz zmusić go do 100.
Jeśli uznasz te rzeczy za interesujące, zachęcam do zapoznania się np. Z http://wiki.nesdev.com/w/index.php/Nesdev_Wiki
Istnieje wiele kursów programowania dla NES, które można znaleźć również w Internecie.
Mam nadzieję, że ten uproszczony przegląd dał wgląd w rozwój gier z lat 80-tych.
[1] Względnie mówiąc. Jestem również stronniczy, gdy napisałem sam Graybox w około 85% zestawie PowerPC. [2] Zobacz artykuł na temat tworzenia FF6: http://www.edge-online.com/features/the-making-of-final-fantasy-vi/