Powiększ

Action Replay – tajemnice cartridge’a cz. 3

Jakiś czas temu (a konkretnie jeszcze przed wakacjami) ukazały się dwa artykuły o tym module. Teraz nadszedł właściwy moment, aby wykorzystać zdobytą wiedzę i spróbować zrozumieć, a potem napisać samemu swój pierwszy program do opcji PARAMETERS.

Zestaw rejestrów sterujących macie już pewnie w małym palcu, więc teraz ograniczę się tylko do rzeczy nowych (z naszego punktu widzenia). Mam również nadzieję, że zapoznaliście się również z instrukcją obsługi modułu (patrz poprzedni odcinek). Gdyż teraz będziemy zajmować się już tylko pisaniem oprogramowania dla Action Replay…

1. Frezerka

Pewno nie raz zastanawialiście się, jak to możliwe że po wciśnięciu tego przycisku – gra czy też program zostaje zatrzymany. Nie wdając się w długie i nudne wyjaśnienia, powiem tylko że odbywa się to za sprawą przerwań. Zainteresowanych zaś odsyłam do mapy pamięci Commodore 64 – do częsci poświęconej sterowaniem przestrzeni adresowej procesora 6502. Podobnie jak przerwania NMI, taki i tego nie można zablokować programowo!!! Gdyż mają one wiele wspólnego – i to na razie tyle w tym temacie… Gdyż dalsze wyjaśnienia, schodzą na zagadnienia czysto elektroniczne.

Gdy już wdusimy ten guzik, sterowanie nad dalszym przebiegiem programu aktualnie uruchomionego w pamięci C-64, przejmuje na siebie moduł Action Replay – a konkretnie jego procedury zaszyte w pamięci ROM.

Co się zaś stanie potem, to już tylko zależy od nas samych. Możemy wprowadzić modyfikacje do programu np. nieśmiertelność do gry i wiele, wiele więcej rzeczy. Nawet po pobieżnym rozważeniu potencjalnych korzyści płynących z zamrożenia programu, doznamy uczucia panowania nad bezduszną maszyną.

PowiększJeszcze jedna uwaga, odnośnie wywoływania efektu frezowania. Niestety niektóre programy czy raczej gry są zabezpieczone przed działaniem frezerki. Jak to jest możliwe ? No cóż, doświadczeni włamywacze (crackerzy) szybko dostrzegli, że po powrocie do „życia” zamrożonego programu, Action pozostawia po sobie na stosie kilka charakerystycznych bajtów $99, $a7, $02, $88, $10, $fa, $8c, $19, $d0, $ea, $86 (nie zawsze są wszystkie, ale zwykle pierwsze 8 bajtów). Co ilustruje screen obok.

Teraz wystarczy tylko aby program sprawdzał sobie co jakiś czas stos i zawiesił komputer po opuszczeniu menu frezerki. Tą właściwość mają WSZYSTKIE wersje Actiona do 4-tej włącznie… Potem firma Datel, naprawiła te rażące niedociągnięcie i kolejne modele frezowały bez śladu 🙂

2. Po sfrezowaniu

W momencie wywołaniaPowiększ tej funkcji, moduł przerywa wykonywanie aktualnie uruchomionego programu i przy pomocy specjalnych procedur w języku maszynowym (tu znajomość Basic’a jest bezużyteczna) przepisuje do swojej pamięci – we wspomniany w poprzednim odcinku bank RAM – stan wszystkich ważniejszych rejestrów i komórek pamięci komputera, by potem bez przeszkód móc wznowić wykonywanie „zamrożonego” programu.

Nie będę ponownie przynudzał, ale polecam przeanalizowanie sobie procedur obsługi frezerki przez Actiona. Możecie posłużyć się tu programikami, jakie były opublikowane w poprzednich odcinkach (zapis i odczyt pamięci modułu). Gdzie ich szukać ? Wystarczy wysilić szare komórki, przecież znacie wartości sterujące modułem – więc poszukajcie podprogramów je wykorzystujących.

Warto wiedzieć, że z tych ważniejszych danych z pamięci C-64, moduł kopiuje do swego ramu:

– pamięc ekranu z atrybutami
– stronę zerową i wektory
– adres powrotu do programu
– rejestry procesora
– i parę innych rzeczy… ale to najlepiej prześledzić samemu 🙂

Dane sfrezowanego programu, zapisywane są zawsze w ten sam obszar pamięci modułu. Więc wkładając trochę pracy w rozgryzienie tych lokacji, otrzymacie olbrzymi zastrzyk wiedzy i potencjalnych możliwości jakie teraz się przed wami otwierają.

3. Procedury do manipulacji pamięcią frezerki

Na szczęście nie musimy piPowiększsać ich od podstaw. Gdyż projektanci Actiona pozostawili do naszej dyspozycji, dwie niezwykle użyteczne procedury (które nawiasem mówiąc są wykorzystywane przez samą frezerkę).

Przedstawiam to Wam w takiej formie, gdyż w ten sposób możecie na własne oczy je zobaczyć i jednocześnie porównać ze sobą.

Nie są one zbyt skomplikowane, wręcz banalne – ale w tym tkwi ich siła. Nie sposób czegoś tu nie zrozumieć…

Procedurą JSR $02B3 – czytamy dane, a zapisujemy poprzez JSR $02A7, korzystając tylko z akumulatora i ewentualnie rejestru Y

Wszystkie programy do operowania na pamięci zamrożonego programu je wykorzystują, więc i my się nimi posłużymy już w niedalekiej przyszłości, w celu stworzenia swojego programu ładowanego przez frezerkę.

Jak się zapewne słusznie domyślacie, działają one TYLKO podczas pracy frezerki. Bowiem w tym czasie oryginalna pamięć komcia jest kopiowana do ramu Action’a, i w tych samych obszarach jest już pamięć modułu – a konkretnie frezerki. Więc aby podejrzeć co to też te procedury robią, musicie uciec się do drobnego oszustwa…

4. Na zakończenie

Niestety ponownie nie zmieściłem się z zagadnieniem pisania własnych programów do opcji parameters – ale, proszę mi wierzyć. Ta odrobina teorii którą was teraz katuje, jeszcze nie raz okaże się przydatna. Musicie przełknąć te wszystkie niuanse, aby potem bez kompleksów móc pisać w 100% własne programy.

Uczymy się wprawdzie na cudzych przykładach, ale wkrótce to WY będziecie uczyć innych – podobnie jak Ja teraz, początkujących programistów – obsługi jedynie słusznego komputera jakim jest Commodore 64. Co mi zatem pozostaje? Zapraszam więc do kolejnego odcinka…

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *