Intro od środka
część 1 część 2 część 3
Każdy użytkownik C64 widział kiedyś intro. To taka "wizytówka" pojawiająca się przed samą grą lub programem.
Standardowo pojawiało się tam logo grupy, scroll z informacją o twórcy, kontakcie, podziękowaniami + dodatkowe efekty specjalne. Oczywiście do tego wszystkiego, w tle przygrywa nam muzyka. Często intro było o wiele lepsze (ładniejsze, ciekawsze) niż sama gra! W tym tekście pomówimy o tym, jak zmienić takie intro (tekst scrolla, muzykę, czcionkę... a czasem coś więcej!
Najlepiej uczyć się na przykładach, więc... dzisiejszym celem jest gierka First Division Manager. Co będzie nam potrzebne do pracy? Emulator C64 na PC wyposażony w monitor (czyli program umożliwiający dokonywanie zmian oraz przeglądanie pamięci Commodore). Ja korzystam z Vice - jest naprawdę dobry (wszystkie skróty klawiaturowe będą się do niego odnosić). Ponadto załączam programik mojego autorstwa, potrzebny do zmiany tekstu. Bez niego zmiana tekstu jest żmudna. Zakładam, że posiadasz pewną podstawową wiedzę na temat działania komputera Commodore, monitora, itp. Jeśli nie, to także przeczytaj poniższy tekst!
1. Zaczynamy!
Odpalamy Vice, z menu File wybieramy Autostart disk/tape image i uruchamiamy gierkę. Gra ładuje się, uruchamia, i mamy niebieski ekran z krótkim info, wciskamy spację... Wow! Świetne, tradycyjne commodorowskie intro! Zobaczmy, co my tu mamy: logo (to na górze z ruchomą obwódką), muzyka, scroll (środek ekranu) z pozdrowieniami oraz na dole zmieniający się napis. Co można by zmienić? Praktycznie wszystko - tekst scrolla, tekst na dole, muzykę, czcionkę oraz logo (lecz to już nie jest takie proste). Aby dokonać jakichkolwiek zmian, musimy użyć monitora. Nie mam na myśli tego monitora, na którym wyświetlany jest obraz! :) Monitorem nazywane jest wbudowane narzędzie służące do edycji pamięci C64. W Vice wywołuje się go skrótem Alt-M. Listę jego komend wywołamy poleceniem help lub "?" (więcej informacji o poleceniach można znaleźć w dokumentacji).
Zmienianie intra zaczniemy od znalezienia adresu, spod którego się ono uruchamia. W jakim celu? Gdyż chcemy mieć możliwość uruchamiania naszego intra z naszymi zmianami, zapisania go w formacie akceptowanym przez emulator C64 (np. jako plik *.d64) i automatycznego uruchamiania - ale o tym później.
Znalezienie miejsca odpalenia nie jest łatwe: dobrym sposobem jest przejrzenie zawartości pamięci od adresu 0800 (początek pamięci Basica). Przejdźmy wiec do monitora Alt-M i zobaczmy, co widać, wpisując: m 0800.... Na pierwszy rzut oka - nic sensownego, masa powtarzających się znaczków... wpisując "m" [enter] widzimy dalszą część pamięci. No i skąd wiedzieć, gdzie jest początek programu? Właściwie potrzebne jest duże wyczucie i intuicja. Szukamy bloku danych występujących zaraz po ciągu zer, albo desasemblujemy pamięć (komenda "d" [adres startowy] wyświetla zawartość pamięci jako ciąg rozkazów asemblera poczynając od adresu startowego - tu trzeba wiedzieć, jak wyglądają rozkazy asemblera; więcej informacji znajdziesz w dziale Assembler naszego serwisu. Szukamy sensownego ciągu instrukcji pomiędzy ciągiem porozrzucanych krzaków i rozkazów typu brk (przerwij) i nop (nie rób nic). Wpisz np. d 0800 - tak właśnie wyglądają krzaki :). Znajdowanie startu programu odbywa się trochę w ciemno... Nie od razu to się udaje!
Są oczywiście też pewne ułatwienia. Aby nie szukać kompletnie po omacku, proponują zrobić tak: komenda step pokazuje, gdzie aktualnie (w którym miejscu pamięci) jest wykonywany program. Wpisz je kilka razy. Jak widać mamy do czynienia z pętlą od 2d4d do 2d50 - co to oznacza? Pętla sprawdza, czy jest naciśnieta spacja, jeśli nie - intro trwa dalej. Przeważnie jest tak, że przed pętlą znajduje się program odpowiedzialny za wyświetlenie (zainicjowanie) intra, a tego właśnie szukamy. Wpisz np. d 2c00, a potem kilka razy d Na początku zobaczysz krzaki, ale potem interesujące jest to, co dzieje się od 2c78 - dla mnie wygląda to na sensowny kod programu. Jeśli widzisz kod, który wykonuje operacja na rejestrach o adresach d000 i większych np. d011 (pamięć przeznaczona na grafikę), to jest to najprawdopodobniej to, czego szukamy!
Sprawdźmy tą teorię! Wychodzimy z monitora, restartujemy C64 wciskając Alt-R (ten reset nie kasuje zawartości pamięci), przechodzimy do monitora i wpisujemy g 2c78 (komenda g [adres] powoduje uruchomienie programu w asemblerze zaczynającego się w komórce pamięci o podanym adresie!). OK, intro się odpaliło, właściwie wszystko jest w porządku, ale na scrollu mamy lekkie krzaki. Nie martw się, to niestety skutek uboczny restartu. Po zrestartowaniu do adresów 0800 - 0803 wstawione zostały wartości 00 (sprawdź!), a wcześniej były tam wartości ff.
Wyjaśnienie i sposób naprawy: w 0800 zaczyna się blok informacji o czcionce (jeśli zmienimy te dane, to zmienią się również litery - wpisanie trzech zer spowodowało zmianę znaku pustego - aby temu zaradzić, należy zmienić wartość komórek pamięci o adresach od 0800 do 0803 na ff (tak, jak było przed restartem). Zrobi to komenda: fill 0800 0803 ff. Mamy już adres startowy, wiec połowa roboty za nami! Co dalej?
2. Zmiana tekstu.
To akurat nic trudnego - trzeba znaleźć blok pamięci, gdzie jest przechowywany tekst (jego adres startowy i końcowy) i wpisać tam nowe dane. Jak to zrobić? Zaczynamy od przeczytania tekstu z oryginalnego scrolla, zwracamy uwagę na pojawiające się tam cyfry, przecinki, wykrzykniki, spacje. To dość ważne, bo przeglądając pamięć nie zobaczymy wyrazów, tylko te znaki oraz cyfry, i prawdopodobnie dużą ilość wartości szesnastkowych 20 (co oznacza spację).
Blok pamięci zawierający tekst znajdujemy właśnie przez przeglądanie pamięci (czasem całej) w poszukiwaniu tych typowych znaków. W tym konkretnym przykładzie proponuje komendę m 3000. Już widzisz? Tak, to tutaj! Spróbuj zmienić kawałek tego obszaru pamięci np. wpisując tam wartość szesnastkową - 01 (litera "a"). Umieszczając tu swój napis spowodujemy jego wyświetlenie! Przestrzeń przeznaczona na tekst ciągnie się aż do bloku zer (czyli do 338a). Korzystając z kalkulatora Windows albo innego kalkulatora szesnastkowego obliczamy:
338a - 3000 = $038a (szesnastkowo)
...Czyli w systemie dziesiętnym 906 - to jest maksymalna liczba znaków możliwych do umieszczenia w naszym scrollu. Modyfikujemy wiec ten obszar wstawiając odpowiednie dane. Wstawianie nowego tekstu do scrolla ręcznie, znak po znaku jest na dłuższą metę żmudne i bezsensowne, dlatego polecam mały programik C64 Text Converter, który rozwiązuje ten problem. Jak go używać? Odpal programik, ustal ilość liter (tutaj 906), wpisz swój tekst (nie przekrocz ilości liter) wciśnij przycisk Convert and save! W katalogu z programem znajdziesz plik out.txt - to Twój napis odpowiednio skonwertowany. Teraz w monitorze wpisz load "sciezka_do_pliku_out.txt" [adres startowy], co spowoduje załadowanie tekstu do odpowiedniego miejsca w pamięci - w naszym przykładzie load "out.txt" 3000. Zresetuj jeszcze raz C64 przez Alt-R, przejdź do monitora Alt-M i wpisz g 2c78. Intro powinno się odpalić ze zmienionym tekstem!
Na dziś to wszystko, poniżej krótkie podsumowanie i lista plików do ściągnięcia. Ciąg dalszy już wkrótce! Uwagi, komentarze kieruj na mój adres.
3. Download
Oryginalna wersja intra - tutaj.
Zmieniona wersja intra - tutaj.
Programik do konwersji tekstu - tutaj.
4. Podsumowanie
Krótka lista wykorzystywanych rozkazów monitora:
m [adres] - wyświetla zawartość pamięci od zaczynając od podanego adresu. Samo m bez adresu wyświetla dalszą zawartość pamięci.
d [adres] - wyświetla kod programu jako ciąg asemblerowych rozkazów poczynając od podanego adresu
g [adres] - uruchamia program asemblera od podanego adresu
fill [start_adress] [end_adress] [value] - wypełnia pamięć od - do określoną wartością
load [filename] [startadress] - ładuje do pamięci C64 zawartość pliku, zaczynając od podanego adresu
step - wykonuje następny krok (rozkaz) programu.
|