Co wybrać: Monitor czy Assembler?

Czy takie porównanie jest w ogóle możliwe? Poniższy artykuł będzie próbą oceny obu platform. Zadanie, jakie postawił przede mną Webmaster (czytaj: Luc), jest nie lada wyzwaniem. Bo jako osoba z największym doświadczeniem w obcowaniu z C64 (jak to zgrabnie ujął), powinienem poradzić sobie z tym zadaniem śpiewająco…

Powiększ

Monitor – nie chodzi mi tu bynajmniej o ten stojący przed Wami na biurku 🙂 Jest programem maksymalnie okrojonym z wszelkich zbędnych wodotrysków (przynajmniej w ogólnym założeniu jego twórców). Zadanie, jakie przed nim stoi to przejęcie kontroli nad programami aktualnie rezydującymi w pamięci komputera.

 


Powiększ Asembler – język i program zarazem, jest tym, co tygrysy lubią najbardziej 🙂 Jako środowisko pracy dla kodera nie ma sobie równych. Cechą charakterystyczną jest odsunięcie Nas od zawiłości systemu operacyjnego i pewna beztroska w podejściu do tego tematu – nieraz przyjdzie nam przekonywać krnąbrny program, iż to my mamy rację…

Rozwijając, zatem myśl zawartą w tytule, trzeba obiektywnie stwierdzić o bezsensowności tego typu dywagacji. Można, bowiem zużyć wiele klawiatur na wychwalanie wyższości jednego nad drugim i nie osiągnąć literalnie nic. Każde, bowiem środowisko pracy, rządzi się swoimi prawami i ma jakieś wady oraz niezaprzeczalne zalety. Zamiast więc dyktować Wam, co warto wybrać? Postaram się pokazać, do czego daną platformę można wykorzystać i jakie programy mogą nam w tym wydatnie pomóc.

Monitor – czy aby na pewno ubogi krewny?

Wróćmy, zatem do pierwszego „podejrzanego” o ułatwianie kontaktu z C64. Mowa tu oczywiście o tzw. Monitorze Języka Maszynowego, zwanego potocznie Debugerem. Te drugie określenie oddaje chyba najlepiej przeznaczenie tych programów. Jak dyktuje mi moje niemal 15-letnie doświadczenie i stos literatury pod biurkiem – początkujący popełniają wiele nieraz bardzo wyrafinowanych błędów w swoich programach. A często ostatnim ratunkiem dla nich przed popełnieniem kolejnych jest właśnie debuger. To cudowne narzędzie pozwala na ustawienie tak zwanych „break-pointów”, czyli pułapek w kodzie programu. Teraz wystarczy już tylko odpalić kulejący program i przetestować poszczególne fragmenty jego kodu na obecność pluskiew. Tak w skrócie można opisać podstawowe zastosowanie monitorów. Oprócz tych czysto „morderczych” właściwości dysponują nieraz przeróżnymi ciekawymi funkcjami. Na ten przykład Master-Mon (50 KB) pozwala dodatkowo odsłuchiwać sample a Demo-Mon zdisasemblować pamięć stacji dysków do pliku!

Niestety forma tego artykułu nie przewiduje opisu samych programów, lecz czy nie będzie to fascynującym zadaniem na jakiś pochmurny i deszczowy dzień? Nic, bowiem nie daje większej satysfakcji niż samodzielnie rozpracowany program.

Powiększ

Dodatkowo monitory pozwalają na różnorakie przedstawienie danych z pamięci na ekranie monitora. Warto tu wspomnieć o swojskim disasemblingu, tu prym wiedzie wspomniany przeze mnie wcześniej Master-Mon, który poza standardowymi mnemonikami disasembluje także tzw. Niepublikowane! – niestety w tym temacie nie ma opisanego standardu, więc, czasem postać rozkazu ciut się różni od tej z Turbo Illegal Assemblera

 


Powiększ Czy interpretacji jako ciągi znaków ASCII w monitorze modułu Action Replay przez dyrektywy „I” oraz ” I*”. Nie można też zapomnieć o wspaniałym monitorze stacji dysków zawartym w tym module. Wychwalając konkurencyjne monitory wspomniałem o tzw. Break-pointach, otóż prawie nikt tego nie wie! Ale Action posiada również takie CUDO – o jego wykorzystaniu poczytacie wkrótce w CRACK PL. Będzie to temat wiodący w jednym z odcinków tej ciekawej sagi o crackowaniu.

 

 

 

Powiększ

Niekiedy program monitora jest prawdziwym kombajnem. Oddaje w ręce programisty niemal wszystkie zasoby komputera i jego peryferii – mowa tu oczywiście o programie Demo-Mon.

 

Powiększ Na koniec pozostaje wspomnieć o możliwości disasemblowania danych z pamięci jako matryc fontów i spritów. Takie możliwości posiada m.in. moduł Final 3 (co możecie ujrzeć na zdjęciu obok). Do czego to może być przydatne? To już oceńcie sami 🙂

Na tym zakończyłbym omawianie (bardzo pobieżne zresztą) możliwości i zastosowań programów zwanych Monitorami. Nie sposób przecież w kilku zdaniach opisać ich nieraz fenomenalnych udogodnień dla programisty. Jeżeli wyrazicie zainteresowanie w kontynuacji tego tematu, to postaram się nieco przybliżyć ciekawsze programy – swoje propozycje i sugestie wysyłajcie na adres maniac64@nostalgia.pl.

Assembler – kombajn nie dla wszystkich?

Powiększ O ile w przypadku monitorów mieliśmy duży wybór, to tu ograniczeni jesteśmy do kilku pozycji – bardziej lub mniej przyjaznych użytkownikowi. Sztandarowym produktem jest oczywiście Turbo Assembler oraz jego rozbudowana wersja Macro Assembler (patrz zdjęcie) i klon Turbo Ass’a o nazwie Turbo Illegal Assembler umożliwiający pisanie programów z wykorzystaniem mnemoników rozkazów niepublikowanych 🙂

Jeszcze mała dygresja odnośnie mnemoników assemblera. Istnieje obok monitorów i assemblerów, spora grupa programów, których jedynym zadaniem jest konwerterowanie, danych z pamięci komputera na zbiory SEQ – które potem możemy wczytać do Turbo Assemblera i poddać dalszej edycji. Przetestujcie sami ReAssembler Pack.


Powiększ Jest to jakby ogniwo pośredniczące pomiędzy tymi dwoma platformami. Wspominam o tym celowo, gdyż nie wszyscy wiedzą o ich istnieniu, a ich użycie zaoszczędzi nam niekiedy masę nerwów. W przypadku ręcznego przeklepywania treści programu do edytora – co jest wysoce irytującym sposobem spędzania wolnego czasu.

Do czego zatem służą programy zwane Assemblerami? Po tak postawionym pytaniu, nie jeden z Was mógłby się zapewne nabawić przepukliny, od studiowania instrukcji ich obsługi. Nie pozostaje mi, więc nic innego jak… Napisanie w tym temacie kilku zdań.

Język Asemblera powstał na zapotrzebowanie szerokiego grona użytkowników pierwszych komputerów. Był alternatywą dla szeregu nic nie znaczących, dla laika znaków podczas układania programu… Któż, bowiem będąc przy zdrowych zmysłach 🙂 będzie się posługiwał hexem, pisząc np. A9 02 8D 21 D0 aby zmienić kolor ramki na czerwony? Czyż nie prościej jest wstukać LDA #$02, STA $D021… do tego właśnie służą programy zwane Assemblerami.

Choć nie sposób odciąć się tu całkowicie od monitorów, wszak one też potrafią zinterpretować zapis w asemblerze. Tym nie mniej ich zastosowanie ogranicza się tylko do drobnych poprawek, podczas gdy w Assemblerze budujemy cały program. Możemy w trakcie tego procesu korzystać z wszelkich udogodnień, jakie niesie za sobą użycie pełnoekranowego edytora. A wykorzystanie zmiennych czy etykiet – w przypadku monitorów możemy o tym udogodnieniu zapomnieć. Moja konkluzja będzie zatem następująca, swoje programy piszcie w Assemblerach a debugujcie pod monitorami.


Mapa Pamięci Commodore 64

 

Heksadecymalny

Dziesiętny

Opis

00c0

192

Znacznik dla silnika magnetofonu

00c1-00c2

193-194

Adres początkowy przy operacjach we-wy

00c3-00c4

195-196

Znacznik pomocniczy przy zapisie lub odczycie z taśmy

00c5

197

Numer poprzednio naciśniętego klawisza, 64=żaden

00c6

198

Liczba znaków w buforze klawiatury

00c7

199

Znacznik odwróconego tła ekranu

00c8

200

Wskaźnik liczby znaków w linii

00c9

201

Numer linii (logicznej), w której znajduje się kursor

00ca

202

Numer znaku, na którym znajduje się kursor

00cb

203

Numer ostatnio naciśniętego klawisza, 64=żaden

00cc

204

Znacznik migotania kursora, 0=migocze

00cd

205

Częstotliwość migotania kursora

00ce

206

Znak, na którym znajduje się kursor

00cf

207

Negatyw czy pozytyw znaku, na którym jest kursor

00d0

208

Wprowadzany znak z klawiatury czy z ekranu

00d1-00d2

209-210

Wskaźnik dla aktualnej linii w pamięci ekranu

00d3

211

Pozycja kursora w linii

00d4

212

Znacznik trybu cudzysłowowego, 0=nie

00d5

213

Maksymalna długość linii wprowadzanej z ekranu

00d6

214

Numer wiersza ekranu, w którym znajduje się kursor

00d7

215

Kod ostatnio wyświetlonego znaku

00d8

216

Liczba znaków do wstawienia

00d9-00f2

217-242

Znaczniki łączenia linii, adresy pomocnicze linii ekranu

00f3-00f4

243-244

Wskaźnik dla aktualnej linii w pamięci koloru

00f5-00f6

245-246

Wskaźnik dla dekodowania znaku

00f7-00f8

247-248

Adres początku bufora wejściowego dla RS-232C

00f9-00fa

249-250

Adres początku bufora wyjściowego dla RS-232C

00fb-00fe

251-254

Cztery wolne bajty, przeznaczone dla użytkowników

00ff-010a

255-266

Obszar używany przy zamianie liczby na łańcuch

0100-013e

256-318

Numery bajtów źle odczytanych z taśmy

0100-01ff

256-511

Stos (zajmowany z góry)

0200-0258

512-600

Bufor wejściowy

0259-0276

601-630

Tablice numerów kanałów, urządeń i adresów pomocniczych

0277-0280

631-640

Bufor klawiatury

0281-0282

641-642

Adres początku pamięci Basicu (po „zimnym starcie”)

0283-0284

643-644

Adres końca pamięci Basicu (po „zimnym starcie”)

0285

645

Znacznik dla interfejsu IEC-625

0286

646

Kod aktualnego koloru

0287

647

Kolor znaku

0288

648

Starszy bajt adres pamięci ekranu

0289

649

Maksymalna wielkość bufora klawiatury

028a

650

Znacznik – czy wszystkie klawisze powtarzalne

028b

651

Czas opóźnienia między powtórnymi odczytami

028c

652

Czas opóźnienia dla stwierdzenia powtarzalności

028d

653

Znacznik naciśnięcia klawiszy SHIFT, CTRL, COMMODORE

028e

654

Poprzednia wartość znacznika SHIFT

028f-0290

655-656

Wskaźnik dla dokodowania klawiatury

0291

657

Znacznik: małe litery czy znaki graficzne

0292

658

Znacznik: 0=przewijanie możliwe (ang. scroll)

0293-0294

659-660

Parametry transmisji dla RS-232C

0295-0296

661-662

Niestandardowe parametry transmisji

0297

663

Stan dla RS-232C

0298

664

Liczba bitów do wysłania (odebrania) przez RS-232C

0299-029a

665-666

Prędkość transmisji dla RS-232C

029b

667

Wskaźnik końca w buforze znaków odebranych

029c

668

Wskaźnik początku w buforze znaków odbieranych

029d

669

Wskażnik początku w buforze znaków wysyłanych

029e

670

Wskaźnik końca w buforze znaków wysyłanych

029f-02a0

671-672

Poprzednia wartość wektora przerwań, przed współpracą z taśmą

02a1

673

Znacznik NMI dla CIA 2

02a2-02a4

674-676

Znacznik dla CIA 1 przy współpracy z taśmą

02a5

677

Pomocniczy wskaźnik linii, gdy scroll

02a6

678

Znacznik: 1=PAL, 0=NTSC

02a7-02ff

679-767

Obszar wolny, przeznaczony dla użytkowników

02c0-02fe

704-766

(Duszek 11)

0300-0301

768-769

Adres procedury z komunikatami o błędach

0302-0303

770-771

Adres głównej pętli interpretatora Basic

0304-0305

772-773

Adres procedury wyszukującej tokeny

0306-0307

774-775

Adres procedury drukującej tokeny

0308-0309

776-777

Adres procedury realizującej następną instrukcję Basica

030a-030b

778-779

Adres procedury obliczającej wyrażenie arytmetyczne

030c

780

Zawartość akumulatora przed SYS

030d

781

Zawartość rejestru X przed SYS

030e

782

Zawartość rejestru Y przed SYS

030f

783

Zawartość rejestru wskaźników przed SYS

0310-0312

784-786

Skok dla USR

0313

787

Wolny bajt

0314-0315

788-789

Wektor dla procedury przerwań IRQ

0316-0317

790-791

Wektor dla instrukcji BRK

0318-0319

792-793

Wektor dla przerwania niemaskowalnego

031a-032d

794-813

Adresy procedur Kernala obsługujących we-wy

032e-032f

814-815

Wektor dla „gorącego startu”

0330-0333

816-819

Adresy procedur LOAD i SAVE Kernala

0334-033b

820-827

Osiem wolnych bajtów

033c-03fb

828-1019

Bufor używany tylko przy współpracy z magnetofonem

03fc-03ff

1020-1023

Cztery wolne bajty

0340-037e

832-894

(Duszek 13)

0380-03be

896-958

(Duszek 14)

03c0-03fe

960-1022

(Duszek 15)

0400-07e7

1024-2023

Pamięć ekranu

07e8-07e7

2024-2039

Szesnaście wolnych bajtów

07f8-07ff

2040-2047

(Wskaźniki duszków)

0800-9fff

2048-40959

Pamięć Basica

8000-9fff

32768-40959

Zewnętrzna pamięć ROM (ang. cartridge) – ewentualnie

a000-bfff

40960-49151

ROM: interpretator Basica

c000-cfff

41952-53247

Pamięć przeznaczona na programy w asemblerze

d000-d02e

53248-53294

VIC

d400-d41c

54272-54300

SID

d800-d8ff

55296-56319

Pamięć kolorów

dc00-dc0f

56320-56335

CIA 1

dd00-dd0f

56576-56591

CIA 2

d000-dfff

53248-57343

Generator znaków (alternatywnie)

e000-ffff

57344-65535

ROM: system operacyjny Kernal

ff81-fff5

65409-65525

Tablica skoków Kernala

Stąd możesz pobrać o wiele obszerniejszą i pełniejszą wersję Mapy Pamięci C64.

Upiększanie listingu

Tej sztuczki nauczyłem się dość dawno temu… Po prostu listingi programów w BASICU wygladają dzięki temu ładniej, a program dalej działa tak jak powinien 😉 I jeszcze jedno – ja naprawdę nie umiem asemblera – wszystko to powstało na podstawie własnych doświadczeń z pracy w monitorze pamięci C64 😉 Jako, że używam CCS64 w emulacji C64, to właśnie na podstawie tego emulatora opieram ten tekst.

Co nam będzie potrzebne:
– C64 albo emulator z dostępem do monitora pamięci
– kilkanaście minut czasu
– dyskietka z przykładem
– program do upiększenia 😉

Jak to zrobić

Najpierw wgrywamy nasz program, który chcemy troszkę upiększyć. Wiadomo, że na początku programu są różne REMy z danymi kto dany program napisał, kiedy go napisał i jak można się z nim skontaktować – po prostu jakaś wizytówka autora programu. Wygląda to mniej więcej tak:

1 REM WRITTEN BY GEMBOY
2 REM CTX:MASTER64@POCZTA.ONET.PL
3 REM TODAY IS 26 V 2002
(zobacz 'KROK 1' na dyskietce z przykładami)

A co my z tym zrobimy? Obetniemy te ‚niepotrzebne’ początki wierszy, dzięki czemu nasza notka będzie ładniejsza, a ludzie będą się dziwić, jak to możliwe, że to obcięliśmy 😉 No więc piszemy parę takich REMów na początku naszego programu i zapisujemy go dla bezpieczeństwa 🙂 Liczymy ile znaków jest od początku wiersza do pierwszej litery tekstu w REMie. W powyższym przykładzie jest to 6 znaków, czyli numer wiersza (1 znak) + REM (3 znaki) + 2 spacje. Teraz przerabiamy nasze REMy aby było w nich tyle miejsc wolnych ile nam wyszło w obliczeniach. Trochę zakręciłem, ale chodzi o to, aby te znaki dodać na poczatku REMa. Będzie to wyglądać mniej wiecej tak:

1 REM 123456WRITTEN BY GEMBOY
2 REM 123456CTX:MASTER64@POCZTA.ONET.PL
3 REM 123456TODAY IS 26 V 2002
(zobacz 'KROK 2' na dyskietce z przykładami)

Jak widać znaki, które dodałem to ciąg 123456. Wziąłem akurat taki ciąg, ponieważ łatwo się go szuka. Teraz wchodzimy do monitora pamięci – w CCSie służy do tego kombinacja ALT+M. W monitorze piszemy ‚M 0800 0880’ i szukamy naszej kombinacji 123456. W przykładzie są trzy takie kombinacje i zaczynają się one od adresów 0807h 0825h i 0853h. Zamieniamy ten ciąg znaków na znaki o kodzie 14h (otrzymujemy T w odwróconych kolorach). Teraz już tylko ESC (wyjście z monitora) i sprawdzamy LIST:

WRITTEN BY GEMBOY
MASTER64@POCZTA.ONET.PL
TODAY IS 26 V 2002
(zobacz 'KROK 3' na dyskietce z przykładami)

I o to nam chodziło!!! (14h to kod BACKSPACE :)) Mam nadzieję, że wszystko jest wyjaśnione w miarę jasno… Jeśli będą z tym problemy to mailujcie. I nie zapomnijcie zapisać programu po skończonej pracy ;))
A jeśli zamiast kodu 14h wpiszemy 1Dh to kursor przesunie się o jedno miejsce w prawo, jeśli wpiszemy 11h to kursor zjedzie linię w dół, a jeśli wpiszemy kod 20h to pojawi się spacja. Te kilka znaków wystarczy do dobrej zabawy z listingami 😉

Co to jest język maszynowy?

W środku każdego mikrokomputera jest mikroprocesor, specjalna kość, która jest mózgiem komputera. W Commodore 64 znajduje się mikroprocesor oznaczony symbolem 6510. Każdy mikroprocesor rozumie tylko swój własny język – zestaw instrukcji – nazywany językiem maszynowym. Mikroprocesor 6510 należy do rodziny mikroprocesorów oznaczonych symbolem 65xx. Jednym z pierwszych w tej rodzinie był mikroprocesor 6502, wykorzystywany m.in. w Commodore VIC-20. Wszystkie mikroprocesory należące do tej samej rodziny mają ten sam język maszynowy lub języki różniące się bardzo nieznacznie. Zbliżone języki mają mikroprocesory 6800 w robotach edukacyjnych oraz 68000 używane w Amidze 500.

Jak to się dzieje, że Commodore 64 – rozumiejący tylko język maszynowy – rozumie również zestaw poleceń, nazywany językiem Basic? Jeżeli Basic jest językiem maszynowym, to co powoduje, że Commodore 64 rozumie takie polecenie jak PRINT lub LIST?

Aby odpowiedzieć na te pytania zobaczmy najpierw co się w nim dzieje, gdy włączymy go do sieci i ustawimy przełącznik sieciowy w pozycji ON (włączony).

W tym czasie, gdy na jednej z linii mikroprocesora zarejestruje się wzrost napięcia, na tzw. stos przesyłany jest adres pamięci nazywanej ROM, w której zapisany jest zestaw poleceń w języku mikroprocesora, niezbędnych do zainicjowania pracy mikrokomputera takich, jak na przykład: ustawienie wskaźników dla Basic’a, wyczyszczenie pamięci ekranu, wyprowadzenie informacji o nazwie mikrokomputera, a na końcu przejście do tzw. stanu oczekiwania – oczekiwanie na polecenia użytkownika. Pamięcią ROM nazywa się taką pamięć, której zawartość nie znika z chwilą wyłączenia komputera z sieci i której nie można zmienić. W pamięci zwanej RAM, przechowuje swoje dane komputer i użytkownik. Dane zapisane w tej pamięci mogą być w dowolnej chwili modyfikowane.

Pod względem funkcjonalnym pamięć ROM dzieli się na dwie części – system operacyjny i interpreter Basic’a. Programy do tej pamięci, opracowywane przez twórców komputerów, zapisywane są przez specjalne urządzenia – programatory. Zaawansowani użytkownicy Commodore 64 rozszerzają jego możliwości przez doczytanie do pamięci RAM dodatkowych programów z tzw. pamięci zewnętrznej – dyskietki lub kasety magnetofonowej – lub włączenie tzw. cartridge’y, które są rozszerzeniami pamięci typu ROM. Zaletą tych ostatnich jest to, że programy w nich zawarte są tak samo szybko dostępne jak procedury systemu operacyjnego lub interpretera i nie przestają być dostępne z chwilą wyłączenia komputera z sieci.

Stan oczekiwania w Commodore 64 na polecenia użytkownika sygnalizowany jest przez mikrokomputer wyświetleniem na ekranie monitora informacji READY – z mrugającym pod tym napisem kwadracikiem, nazywanym kursorem lub znakiem zachęty.

System operacyjny w Commodore 64 obsługuje m.in. klawiaturę oraz edytor ekranowy, który umożliwia pisanie znaków oraz kontroluje przesuwanie kursora.

W drugiej wspomnianej wyżej pamięci ROM zapisany jest w języku maszynowym program, nazywany interpreterem Basic’a. Ma on za zadanie rozpoznanie wydawanych przez użytkownika poleceń i ewentualne ich wykonanie. Nazywa się go interpreterem, gdyż rozpoznaje on i wykonuje każde polecenie za poleceniem, w zapisanej przez użytkownika kolejności chyba, że napotka takie polecenie, którego nie jest w stanie zrozumieć. Wtedy na ekranie monitora jest wyprowadzany komunikat:

?SYNTAX ERROR 
READY.

i obsługa dalszych poleceń, jeśli takowe były, jest przerywana.

CRACK PL, czyli zostań crackerem! Cz. 4

Odcinek 4 – Nasz pierwszy trainer.

Aby móc napisać trainer do jakiejś gry, musimy posiadać (poza stosowną wiedzą) jeszcze zestaw adresów z danej gry do poprawki. Sama zaś budowa kodu trainera jest prosta jak budowa cepa – tzn. trudniejsza niż się z pozoru wydaje.

Na początek, o czym bardzo wielu zapomina! Musimy wygospodarować kilkaset wolnych bajtów na kod trainera. Istnieje wiele metod umieszczania tego wielce pomocnego programiku:

1. Przed grą (potem grę relokujemy)
2. Za kodem gry (często problematyczne)
3. W samej grze – bardzo trudne, ale możliwe!

Za pierwszym razem proponuje metodę numer 1, co pozwoli mi pokazać jak możemy sobie zrelokować grę i podawać adresy względne tzw. offsety w kodzie trainera.

Część 1 – Piszemy trainer.

PowiększZastanówmy się przez chwilę, co chcielibyśmy umieścić w treści naszego trainera, po jego uruchomieniu – na ekranie? Wielu zapewne swoją xyvkę do tego tytuł gry (z dodatkami np. +2H – co oznacza 2 trainery i HighScore saver) i zestaw kilku pytań odnośnie naniesienia poprawek do gry, które uczynią ją łatwiejszą.

Jako, że żyjemy już w XXI wieku, nie będziemy wyważać otwartych drzwi. Do celów edukacyjnych zaprezentuje Wam, nie za duży ale funkcjonalny trainer mojego autorstwa. Zassijcie Trainer.zip i uruchomcie TurboAsembler.

 

Powiększ

Trainer jest już leciwy, lecz nic nie stracił ze swej funkcjonalności. Teraz musicie nanieść w nim konieczne poprawki tzn. swoją xyvkę, nazwę gry itp. Oraz adresy odpowiedzialne w grze za nieśmiertelność. Przyjrzyjcie się obrazkowi poniżej.

Wprowadziliśmy oba wyszukane i zmodyfikowane bajty odpowiedzialne za ilość żyć i czasu oraz JMP-a do samej gry.

 


Teraz garść wyjaśnień co Powiększby rozwiać niejasności. Po wprowadzeniu poprawek do treści trainer a, zauważyliście zapewne iż jest adresowany pod $0A00 – to było konieczne do samej kompilacji i testów. Na nasz użytek musimy zmienić adres kompilacji  na np. wolny obszar ekranu lub ram powyżej interpretera Basic’a $c000-$d000. Ponownie staniemy przed wyborem miejsca dolinkowania kodu trainera. Ze względu na długość gotowego cracka, preferuje się upychać trainer przed grą. Czyli mamy powiedzmy od $0801-$0A00 trainera, $0A00-$B400 grę i teraz zaczynają się schody.

 

1. Jako pierwszy uruchamia się trainer i przepisuje się w obszar ekranu i/lub stosu.
2. Następnie można od razu relokować grę we właściwe miejsce lub wstawić do trainera adresy jako offset (tzn. np. jeżeli oryginalnie mamy $1000 a gra leży teraz w pamięci od $0A00 to nasz adres to $1000+($0A00-$0801) da $11FF – zrozumiałe?).
3. Trainer modyfikuje treść gry i ją uruchamia.

W praktyce (na potrzeby tego kursu i gry Ghost’n Goblins) zrobimy to tak:

– skompilujemy kod trainera na $0810 (ze względu na jego długość) zajmie nam miejsce do $0B00
– grę wladujemy za trainerem od $0B01, zajmie nam do $B501
– offset dla adresów wynosi teraz $0300

Przed uruchomieniem gry skopiujemy nasz relokator gry na stos i tam go uruchomimy – przepisze on kod gry na właściwe miejsce, zainicjuje wektory dla Basic’a, VIC-a i Kernala po czym uruchomi samą grę. Uff… ale namotałem 🙂

Część 2 – Piszemy relokator.

W porównaniu z trainerem, będzie to bułka z masłem. Kompilując trainera robiliśmy to od adresu $0810 (2064 dziesiętnie), już śpieszę z wyjaśnieniem. W wolne miejsce od $0801-$0810 wstawimy jedyna linię w Basic’u: 10 SYS2064 w postaci szesnastkowej (tak najłatwiej – zobaczcie sami), aby interpreter odpalił nam cracka po RUN. Jeżeli będziemy chcieli od razu spakować cracka, wówczas ta linia jest zbędna.

Przestudiujcie jeszcze raz poprzedni odcinek (3) kursu i zobaczcie jak pisze się relokatory. Poniżej przedstawię prosty przykład aby zobrazować inicjowanie Basic’a i jego zmiennych.

SEI
LDA #$34 ;włącz tylko pamięć ram
STA $01

LDX #$10 ;ilość bloków do przepisania (1 blok = 256 bajtów)
LDA #$01 ;początek $0801
STA $FB
LDA #$08
STA $FC
LDA #$01 ;dane od $0C01
STA $FD
LDA #$0C
STA $FE

LDY #$00 ;przepisz blok
LDA ($FD),Y ;tu wracają BNE (-5 i -12)
STA ($FB),Y
INY
BNE *-5
INC $FC ;czy wszystkie dane
INC $FE
DEX
BNE *-12

LDA #$37 ;włącz ROM (Basic itd.)
STA $01
JSR $E518 ;pełen init Basic'a
JSR $FDA3
JSR $FD15
JSR $E3BF
CLI
JMP $0810 ;do gry

To jest prosty relokator – zbudowany jako relokowalny, tzn. nie występuje w nim żadna instrukcja odwołująca się do konkretnej lokalizacji w pamięci. Dzięki czemu można go umieścić w dowolnym miejscu i zawsze będzie działał poprawnie. Aby zakończyć już ten temat, przypomnę tylko, że należy umieścić taki relokator w miejscu gdzie będzie „bezpieczny”, tzn. nie zostanie zamazany przez przepisywany przez siebie program.

Powyższy relokator przepisuje dane w DÓŁ, czyli dokładnie tak jak obecnie potrzebujemy je przenieść. Zaproponowany w nim INIT jest, a raczej powinien być stosowany tylko wówczas gdy odpalona gra nie działa poprawnie. Gdyż prawie żadne programy w asemblerze nie wymagają do szczęścia poprawnie skonfigurowanej pamięci i zmiennych – gdyż robią to samodzielnie.

Podsumowując moje wywody, otrzymamy naszego pierwszego prawdziwego cracka z trainerem. Żeby jednak nie było Wam za słodko, nie opublikuje gotowego rozwiązania. Po przebrnięciu przez wszystkie odcinki kursu, dokonacie tego sami.

CRACK PL, czyli zostań crackerem! Cz. 3

Odcinek 3 – Tniemy intro.

Pora by odsłonić kolejny element układanki, na którą składa się własnoręczne crackowanie. Pragnę zapoznać Was z zagadnieniem ‚crackowania’ tzw. gotowych programów do rozpowszechniania (np. już wstępnie ‚obrobionych’ przez crackerów, lub po prostu wersji dystrybucyjnych firm software’owych).

Jako, że najlepiej uczyć się na przykładach – tak przynajmniej się mi wydaje 🙂 Pociągnijcie sobie proszę, grę GHOST’N GOBLINS.zip aby za jej pomocą przećwiczyć wstępnie odcinanie intra i dorabianie nieśmiertelności. Trainer do niej napiszemy już w kolejnym odcinku tj. 4.

Część 1 – Odpakowujemy grę.

Uruchom emulator VICE z podpiętym Action Replay’em, w trybie TRUE DRIVE EMULATION dla stacji dysków. Załaduj do pamięci grę Ghost’n Goblins np. klawiszem F5, i uruchom poprzez F3. Na ekranie zobaczysz migające znaki ASCII w górnej połówce ekranu (naoczny dowód działania packera). Po chwili uruchomi się crackerska notka (stare dobre text-writery), w której to wyczytacie kto wprowadził ten program na scenę. Po chwili też uruchomi się sama gra…

Zagalopowałem się teraz, sorry! Oczywiście gra się nie uruchomi – bo ma skopany depacker, gryzie się on z softem modułu Action Replay w pamięci komody. My jednak skwitujemy to uśmiechem i wdusimy RESET (dla przypomnienia ALT + R) i ponownie załadujemy gierkę do pamięci.

Zrobiliśmy to celowo, aby rozpoznać teren przed naszymi zmaganiami. Przecież podobnie jak przy szukaniu nieśmiertelności, musimy zapoznać się z kolejnymi fazami działania programu. Wyłuskajmy najpierw dane o jego położeniu w pamięci:

Początek $0801
Koniec w $B751

Po komendzie list (wpisujemy LIST i naciskamy ENTER) ujrzymy, pierwsze (dość proste) zabezpieczenie przed crackowaniem w postaci zagmatwanego argumentu komendy SYS (483.284856^2)*sin(13)/asc(„/”) nie będziemy się tu biedzić i wyliczać tego cuda – poszperamy w pamięci klawiszem F2. W czasie listowania począwszy od adresu $0801 szukajmy ciągu zer $00, a zanim normalnego kodu.

Znajdziemy go szybko pod adresem $082c – po przeanalizowaniu, trafimy na prostego relokatora pamięci:

LDY #$00
LDA $0848,y
STA $03FF,y
DEY

…który przepisuje właściwy relokator (ten od adresu $0848) w obszar pamięci ekranu Commodore 64 (od $0400-$07f8) i uruchamia go JMP $0400. Pora na odbezpieczenie tego drugiego relokatora autostartu. Zrobimy to modyfikując instrukcje JSR $A659 na CLI i RTS.

Powiększ . $0882 20 59 A6 JSR $A659
na
.$0882 58 CLI
.$0883 60 RTS

…co da nam zatrzymanie programu. Teraz mała dygresja odnośnie wyłączania autostartu. Przed wyłączeniem musimy ustawić KONIECZNIE komórkę $01 (odpowiedzialną za konfigurację pamięci) na $37 – aktywny KERNAL i interpreter Basic’a, potem włączyć przerwania CLI i dać RTS. Jeżeli relokator nie robi tego sam, musimy go tak zmodyfikować by to zrobił.

Pełen sukces, wywaliło grę do Basic’a – z wcześniejszej analizy kodu reklokatora wyczytaliśmy nowy adres końca i początku programu w pamięci (można to odczytać analizując zawartość komórek $2E i $2F oraz $AE i $AF – obejrzyj uważnie obrazek powyżej), i jest on ustawiony na $B6C9. Zapobiegawczo zgrajmy teraz ten obszar pamięci na dysk:

.S”GHOST – DANE”, 8 , 0801 , B6C9

Część 2 – Odcinamy notkę.

Wejdźmy ponownie do monitora (F2) i pooglądajmy pamięć komendą I*0800. Ujrzymy xyvkę osoby która sklepała te ‚interko’ i poprawny dalszy ciąg kodu od adresu $0820. Wydedukujemy z niego iż notka jest odpalana spod $C000. Wstawmy zatem jeszcze raz RTS w adres $08B1 i uruchomimy przez SYS 2080.

Analizując komórki $2E-$2F dostaniemy koniec gry w pamięci – początek oczywiście w $2B-$2C. Nagrajmy tak odszukaną grę na dysk:

.S”GHOST’N GOBLINS OK.”, 8 , 0801 , B201

Mamy więc obecnie postać wyjściową gry, do dalszych eksperymentów naukowych – zrobimy teraz w niej nieśmiertelność wg schematu z drugiego odcinka kursu. Nim jednak zaczniemy szukać ‚istoty bitu’ wspomnę, że podobny schemat postępowania obowiązuje prawie do każdej gry i programu posiadającego intro. Czasami przyjdzie nam zdepakować grę ręcznie kilka razy zanim dobierzemy się do oryginału – potrzeba nam tylko anielskiej cierpliwości i dużo wolnego czasu…

Część 3 – Nieśmiertelność w GHOST’N GOBLINS.

Powiększ Dla ułatwienia wspomogę Was teraz pełną wersją (już wyrypaną) GHOST’N GOBLINS OK.zip (zassijcie ją jeżeli macie problemy z własnoręcznym wycięciem). Po chwili relaksu, czyli obowiązkowym zagraniu – zauważymy że przydałoby się zablokować licznik czasu i ilość żyć. By tego dokonać posłużymy się już wypróbowanymi metodami…

Policzmy, ile mamy żyć? Na ekranie są cztery, plus to którym gramy – czyli w sumie mamy pięć. Aby się upewnić straćmy jedno, tak zgadza się! Załadujemy więc program ponownie…


PowiększPoszukajmy zatem rozkazu LDA #$05, po wgraniu gry do pamięci – ale przed jej uruchomieniem. Monitor odnalazł 10 prawdopodobnych adresów z taką ilością żyć. Sprawdźmy co one kryją… Tak, pierwszy odnaleziony jest tym właściwym. O czym przekonamy się zmniejszając np. do 3 i odpalając grę.

Czas na zablokowanie tego licznika! Jak pamiętacie, wystarczy zazwyczaj odszukać DEC $359A. Poszukiwania były nad wyraz owocne, w pamięci jest tylko jeden taki DEC pod adresem $0A6E. Teraz by uczynić naszego rycerza nieśmiertelnym, wystarczy aby zamienić go na LDA $359A (o kodzie $AD).

Kolejnym poszukiwanym cheatem był czas. Podczas straty życia, jego licznik jest zerowany – pierwszy punkt zaczepienia. Drugą znaną metodą jest poszukiwanie SBC #$01. Zatrzymajmy się jeszcze na moment przy pierwszej. Na pierwszy rzut oka jest najłatwiejsza do naszych potrzeb – niestety nieraz ilość adresów do przeanalizowania, sięga kilkudziesięciu. Więc jeżeli zawiedzie poszukiwanie SBC to ta metoda jest wówczas najkorzystniejsza. Opiera się ona na mozolnym śledzeniu wszystkich odwołań (podprogramów) występujących po naszym DEC. Bo któryś z nich skrywa nasz licznik czasu. To już pozostawiam Wam. Poszukiwany SBC #$01 kryje się pod adresem $1060. Zablokowanie go polega na zmianie wartości argumentu z $01 na $00 – co jest dziecinnie łatwe.

CRACK PL, czyli zostań crackerem! Cz. 2

Odcinek 2 – Nadrabiamy zaległości.

Spotykamy się w trzecim odcinku – niestety brak wolnego czasu spowodował to karygodne niedociągnięcie czasowe z mojej strony. Muszę zatem w niniejszym odcinku nadrobić zaległości, aby potem zapoznać Was z zagadnieniem „crackowania” tzw. gotowych programów do rozpowszechniania (np. już wstępnie „obrobionych” przez crackerów). Będzie więc krótko ale treściwie! Dokończenie poprzedniego odcinka kursu nt. gry „Giana Sisters”…

Część 1 – czyli uwagi na temat sposobów zapisu czasu.

Nim jednak pochłonie nas nowe dość frapujące zajęcie, podrzucę jeszcze kilka rzeczy nt. Giany Sisters. Po uporaniu się z limitem żyć (patrz: odcinek 1) zostało już tylko właściwie zastopowanie upływającego czasu i zlikwidowanie pozbawiania naszej bohaterki z takim trudem zdobywanych power-upów. Z tym pierwszym pójdzie łatwiutko – jak zapewne zwróciliście uwagę, czas jest liczba dziesiętną pomniejszaną o 1. By to uzyskać wystarczy użyć komendy SBC #$01.

Poszukiwanie $E9 $01 (kod sbc #01) przyniesie nam zatrzęsienie odnalezionych adresów… My jednak pomni ‚światłych’ rad z poprzedniego odcinka kursu, poszukamy reprezentacji LICZBOWEJ tego czasu w pamięci. Po kilku próbach odnajdziecie adres, który to przechowuje – $0449. Reszta już banalna, zmienimy SBC #$01 na $00 dla tego adresu i już po kłopocie. Te poszukiwane SBC wyłuskacie w $1D19.

Czas jest jak widać zapisany w jednym bajcie, w większości przypadków będzie jednak zapisany w 2 czy 3-ech. Reprezentacja zapisu w pamięci np. dla 37 sekund może być taka: $33 $37. Ogólna zasada jest więc taka, aby szukać kodów ASCII cyfr licznika lub wprost $03 $07. Jeżeli jednak te poszukiwania nic nie wnoszą, poszukajmy po prostu bajtu o takiej wartości, jak wskazania licznika czasu.

By jednak te poszukiwania nie trwały za długo, użyjemy małego sprytnego TOOLsa mojego autorstwa, przeznaczonego jako procedura wgrywana do pamięci naszej frezerki (po frezowaniu programu) – podobne narzędzia stosuje się w klepaniu trainerów do gier na PC. Gdzie nawiasem mówiąc jest to o niebo prostsze…

Część 2 – czyli uwagi na temat ‚ulepszaczy’ do frezerki Action Replay.

PowiększJak je pisać ? Najlepiej samemu… A poważnie mówiąc, to zapoznajcie się ze stosownym artykułem na ten temat pt. Action Replay w dziale ASEMBLER, czyli w tym gdzie znajdziecie CRACK PL.

Teraz skrócony kurs obsługi tego ‚maleństwa’ Action Bytes Searcher (pobierz), gdyż NAZWA musi być poprzedzona przedrostkiem E i kropką – czyli e.byte searcher – i zawierać tylko 15 znaków (patrz rysunek). Wyjaśnienia co i dla czego musimy robić, szukajcie w przytoczonym już artykule.


Powiększ 1. Wgrywamy grę w celach edukacyjnych
2. Frezujemy (dla przypomnienia ALT + Z lub ALT + F)
3. Wkładamy dysk z ulepszaczem nasze frezerki
4. Wciskamy P (parameters)
5. Wprowadzamy nazwę E.BYTE SEARCHER
6. Wciskamy F1 (poszukiwanie) i podajemy co ma znaleźć
7. Teraz program zrzuci na dysk (plik …byte!…) podejrzane lokacje
8. Wkładamy ponownie dysk z gra i gramy dalej do utraty np. życia
9. Ponownie frezujemy i po wgraniu ulepszacza, wciskamy F3 (porównywanie) z zadaną wartością – czyli na jaką zmieniła się poprzednio
poszukiwana

10. Program wyświetli na ekranie wszystkie podejrzane o to lokacje. I będziemy mogli dokonać kosmetycznych poprawek w tych adresach

Część 3 – kończymy z cheatowaniem Giany Sisters.

Obecnie do pełni szczęścia brakuje nam tylko poprawienia tej ‚niedoróbki’Powiększ, który objawia się utratą wszystkiego co do tej pory zdobyliśmy, gdy tracimy życie. Podam teraz wam tylko same adresy, dla czego akurat te – dojdziecie do tego już sami – bo to jest w końcu kurs crackowania.

STA $0434 na 3 x NOP
w $0A4E
nie znikają nam diamenty

 

 

JSR $2041 na 3 x NOP
w $0C17
STA $22 na 2 x NOP
w $20A0
nie tracisz power-upów

Można jeszcze wiele rzeczy poprawić, ale to już inna bajka…


CRACK PL, czyli zostań crackerem! Cz. 1

Odcinek 1 – Trudne początki

Powiększ Spotykamy się już po raz drugi 🙂 Pora więc zakasać rękawy i przystąpić do pracy. Odpalcie więc emulator C64 np. VICE, podepnijcie Action Replay’a w wersji 7H oraz przygotujcie sobie papier & coś do pisania – może być i dłuto 🙂

Zanim przejdziemy do omawiania innych rzeczy niezbędnych każdemu crackerowi, proponuje abyście zaopatrywali się (powoli) w to wszystko o czym piszę – w tej chwili ten model Action’a. Gdyż nie ma przecież sensu wyważać otwartych drzwi, korzystajcie więc ze sprawdzonych narzędzi… Będąc jeszcze w tym temacie, pragnę Wam drodzy internauci przypomnieć, że kilka lat temu na ten temat (crack, crackowanie) ukazały się stosowne artykuły w popularnych wówczas magazynach papierowych jak Commodore & Amiga czy scenowy FUZZ. Nie były wprawdzie adresowane dla początkujących, ale czasami będę się tu posiłkował materiałami w nich zawartymi. Choć np. do FUZZ’a sam je pisałem 🙂 to trzeba uszanować! wysiłek intelektualny ich autorów i uczciwie zaznaczyć skąd pochodzą ciekawsze rozwiązania. Niestety C&A już nie istnieje – upadło prawie 6 lat temu, jednak magazyn FUZZ choć z pewnymi „oporami” ukazuje się nadal 🙂

ARCHIWALIA – temat crackowania z taśmy omówiłem szczegółowo w magazynie FUZZ. Tam też odsyłam wszystkich, którzy nie mają tzw. „zielonego” pojęcia o co w tym chodzi. Kontakt z redaktorem naczelnym to: pawel.bol@inetia.pl z dopiskiem FUZZ – Numery archiwalne. Polecam się w nie zaopatrzyć, gdyż często będę się do nich odwoływał. Koszt nie jest duży, bo te kilka zł, okaże się świetną inwestycją na przyszłość.

PowiększTak, więc już zapewne umiecie podłączyć wirtualny cartdridge do równie wirtualnego C64. Wrzućcie jeszcze do „opiekacza” (potoczne określenie floppa 1541) dysk z gierką Giana Sisters (pierwsza część tej sagi, z paka kolekcji GIANA SISTERS COLLECTION.ZIP) i załadujcie do pamięci, np. tak jak na picku obok. Po chwili, ach te kilka sekund cudownego oczekiwania… załaduje się do pamięci, wstukujemy RUN i wciskamy ENTER (lepiej jednak nie dajcie sobie wciskać tej gazetki i czytajcie NAS:)

Powinniście zobaczyć interko, więc ponownie zrobimy użytek z klawiatury – tym razem wciskając SPACE. Po dłuższej chwili, ujrzycie ekran tytułowy chyba z najbardziej kultowej gry na komódkę. Teraz obowiązkowo pograjcie sobie choć godzinkę. Wszak złamanie gry, zaczynamy od przyjrzenia się potencjalnej ofierze. Wzruszenie po prostu odbiera głos, w takie gry to się pogrywa godzinami. A tu praca nas czeka – więc może jeszcze z godzinkę…

Zastanówmy się, co najbardziej nam doskwiera ? Ja na pierwszym miejscu bym postawił ilość „żyć” – te początkowe 3, starczają zwykle do 8 levelu – choć jak dla mnie nawet do samego końca (I LOVE THIS GAME). Więc ułatwmy sobie zadanie i uczyńmy naszą dziewczynkę nieśmiertelną 🙂 Jak się do tego zabrać pokaże na mocno skróconym przykładzie, po szczegóły zaś odsyłam do następnego odcinka, gdzie powiem co i dla czego tak trzeba było robić/szukać.

Problem 1 – życia gdzie je szukać.

PowiększMamy na początku gry 3 życia, aby to zapisać w pamięci zwykle posłużymy się „nieśmiertelną” parą LDA/STA. Zobaczmy więc czy autor rozumował podobnie do nas. Wciśnij teraz FREEZER’a w module, w zależności od wersji emulatora będzie to odpowiednio ALT + Z lub ALT + F (o ile pamięć mnie nie myli:). Na ekranie powinieneś zobaczyć mniej więcej coś takiego jak obok. Teraz wduś klawisz ‚M’, znajdziemy się w trybie monitora języka maszynowego naszej frezerki. W tej chwili mam dla Was kolejną propozycję, musicie się zaopatrzyć w listę wszystkich rozkazów procesora 6502 (w tym i niepublikowanych) który jest sercem naszej maszynki. Stosowne rzeczy „wygrzebiecie” na naszej witrynie w dziale o programowaniu w asemblerze, lub przygotowywanym przeze mnie zbiorczym zestawieniu wszystkich komend procka 6502 (ukaże się zapewne w sierpniu).Wracając do tematu, jesteśmy już w monitorze, teraz poszukajmy owych „żyć” w następujący sposób:

  • wpisujemy H 0000 FFFF A9 03

  • po chwili otrzymujemy na ekranie listę adresów gdzie występuje LDA #$03

podpowiedź:
(H) rozkaz HUNT, czyli szukaj
(0000/FFFF) adresy początku i końca pamięci do przeszukania
(A9 03) mnemonik LDA #$03

Ja otrzymałem na ekranie nieco ponad 10 podejrzanych o ukrywanie „żyć” lokacji. Najszybszy sposób to disasemblacja każdej i wpisywanie zamiast ’03’ np. ’05’ jako argumentu dla LDA. Teraz radzę spisać sobie na kartkę te wszystkie podejrzane adresy i testować na wszystkich nowe wartości w LDA. Po zmianie każdego wracamy do gry, wychodząc do menu frezerki „X” i naciskając enter. Samą frezerkę opuścimy wciskając klawisz F7 (restart) i jeżeli po ponownym uruchomieniu gry, nic się nie zawiesi i liczba żyć się zwiększy, to prawdopodobnie jesteśmy w domu. Gdy coś pójdzie nie tak, wciskamy ponownie frezerke i przywracamy poprzednią wartość dla LDA. W najgorszym przypadku załadujemy grę ponownie…

U mnie sukces nastąpił już po trzeciej próbie, podejrzany adres to $098E. Przyjrzyjmy się więc co on skrywa:

. 098E A9 03 LDA # $03
. 0990 8D 73 15 STA $1573
. 0993 8D 74 15 STA $1574
. 0996 8D 3C 04 STA $043C

Widzimy więc, że podejrzane są trzy lokacje. Teraz pokaże jak małym kosztem sprawdzić gdzie te „lives” się podziewa. Wejdźcie do gry i straćcie jedno życie, teraz powrót do frezerki i za pomocą instrukcji ‚M’ podejrzyjcie zawartośc tych adresów. Ponownie za 3 razem pełen sukces:) Komórka pamięci o adresie $043C przechowuje ilość żyć. Podpowiedź dla mniej rasowych wyjadaczy asemblera:

 

  • piszemy M 043C i wciskamy enter

  • na ekranie otrzymujemy 8 wartości, z czego interesuje nas tylko ta pierwsza

Problem 2 – blokada licznika.

Połowa roboty za nami, teraz czeka nas mordercze wyszukanie DEC-a. Piszę o zbrodniczych skłonnościach, gdyż wiele razy z przyjemnością będziecie chcieli utopić autora danego programu, w łyżce wody – za jego maskowanie kodu gry. Zaletą programowania w asemblerze jest jego mnogość trybów adresowania, co tym bardziej nie ułatwia nam pracy. Zwykle szukajmy jednak pewnych rzeczy wprost, bowiem ludzie są z natury leniwi 🙂 Do dzieła panowie i panie (o ile i płeć piękna nas czyta:)

Rozkaz DEC w trybie bezpośrednim jest reprezentowany kodem $CE. Szukajmy więc CE 3C 04. Wykrzykniecie teraz zapewne, co za ‚buga’ tu wam wciskam – przecież adres to $043C a nie 3C04. Otóż moi drodzy kursanci, w pamięci najpierw się zapisuje starszy bajt adresu, potem młodszy – choć na ekranie otrzymujemy odwrotnie… Do poszukiwań skorzystamy ponownie z usług HUNT, pisząc H 0000 FFFF CE 3C 04 i naciskając enter. Jako wynik otrzymamy tylko jeden adres $2041. Wylistujmy więc ten kawałek pamięci:

. 2041 CE 3C 04 DEC $043C

Najprostszy sposób zablokowania polega na podmianie DEC na LDA, uczyńmy więc to bez wahania. Obecna postać tej komendy (lokalizacji pamięci) to:

. 2041 AD 3C 04 LDA $043C

Odpalamy grę i cieszymy się bezproblemowym przejściem gry (polecam to samo bez cheat’owania:) czego i sobie teraz życzę, gdyż bez granatu nic mnie teraz od Gianny Sisters nie oderwie… o wyłączyli skubańce prąd, kij im w oko – zagram se przy świeczkach :)))

CRACK PL, czyli zostań crackerem! Wstęp

Odcinek 0 – Zapoznanie z tematem.

Wraz z tym artykułem, rusza nowy dział naszego kompendium o C64. Tematem wiodącym będzie szeroko rozumiane crackowanie, od prostych porad (może nawet FAQ) do bardziej złożonych spraw, jak np. napisanie własnego trainera. Szykuje się więc nie mała gratka dla wszystkich tych, którym nie obce jest ‚POSZUKIWANIE ISTOTY BITU’.

Nim jednak, przez szereg kolejnych odcinków CRACK PL, będę Was próbował zarazić ideą własnoręcznego ‚cheat’owania’, powiem jeszcze parę słów co to jest crack i czym zajmuje się sam cracker oraz wyjaśnię kilka innych pojęć z nimi związanych.

ACTION REPLAY – nazwa najlepszego modułu (cartridge) do podpięcia w expansion porcie C64. Wnosi on szereg udogodnień, co w kolejnych odcinkach CRACK PL wykorzystamy do własnych ‚niecnych’ celów.

 

ASSEMBLER – język programowania i sam program, przy jego pomocy ‚sklepiemy’ nasze trainery oraz loadery. Polecam do tego celu wersję Turbo Assembler, gdyż jest najbardziej przyjazna dla użytkownika, a opis możecie przeczytać w naszym kompendium.

CHEAT – udogodnienie, celowo wprowadzona modyfikacja ułatwiająca nam życie. Przez cheat należy rozumieć np. wyłączenie czasu itp.

CRACK – program ‚łatka – z angielskiego patch’ który omija zabezpieczenia np. przed kopiowaniem czy próbami cheat’owania. Jako taki, jest po prostu zbiorem podprogramów realizujących nie przewidziane przez autora (oryginału) usprawnienia. Czasami przez crack’a rozumie się też program z naniesionymi poprawkami.

CRACKER – innymi słowy pirat (nawiasem mówiąc nigdy nie lubiłem tego określenia) komputerowy odpowiedzialny za tzw. łamanie zabezpieczeń oryginałów – czyli po prostu ‚zbędnych’ udziwnień jakie naniósł autor w swoim programie. Wielu z czołowych crackerów poprawiało nawet błędy w cudzych programach, gdyż rasowy cracker jest również świetnym programistą. Profesja jako taka, jest już powoli na wymarciu, gdyż wymaga wiele samozaparcia i nie przynosi przynajmniej na początku żadnych wymiernych korzyści, no może poza satysfakcją!

CRUNCHER – program kompresujący. Używany w celu zmniejszenia objętości programu/danych. Z grubsza dzielimy je na tzw. Bitowe i Znakowe. Po szczegóły odsyłam do naszego kompendium, gdzie ukaże się stosowny artykuł na ten temat.

FREEZER – przycisk zamrażający zawartość pamięci komputera (w module Action Replay). Przez co możemy nanieś zmiany i obserwować reakcje programu. Wykorzystywany również często do ‚szybkiego’ crackowania.

IFFL/MFL – specjalny rodzaj crunchera do crackowania. Pozwala czytać dane bezpośredio ze ścieżek dysku, z pominięciem katalogu. Dodatkowo czyni to o wiele szybciej.

INTRO – zapęd twórczy crackera (dawniej) a obecnie reklama jego grupy. Umieszczane zwykle przed każdym crackiem. Gdzie w scrollu wyczytamy kto ‚popełnił’ tego cracka i komu dziękuje.

 

 

 

 


MONITOR – rzecz nieodzowna (nie mam tu na myśli odbiornika TV) do nanoszenia naszych poprawek. Najlepszy występuje w Action Replay, i tylko nim będziemy się tu posługiwać.

 

 

 

 

 

TRAINER – program odpowiedzialny za aktywację wybranych cheatów przez użytkownika.

Mini słowniczek jest już za nami, przedstawię teraz pokrótce co będzie Wam dane tu przeczytać. Każdy kolejny odcinek będzie jakby fragmentem większej całości, dopiero przebrnięcie przez wszystkie pozwoli zaznajomić się z tematem. Brzmi to może enigmatycznie, ale crackowanie to temat rzeka i nie sposób wszystkiego się od razu nauczyć. Nie mniej postaram się ‚poprowadzić Was za rękę’ po najistotniejszych zagadnieniach. Przy reszcie będę wymagał jednak od Was pewnej znajomości asemblera czy choćby zasad poprawnego programowania. Przyjrzymy się trochę DOS’owi i innymi przemilczanymi w tego typu publikacjach rzeczami, napiszemy np. własnego wirusa!

Z początku poznacie podstawy cheatowania, aby móc od razu wykorzystywać praktycznie zdobyte informacje. W trakcie ‚nauki’ będziemy eksperymentować na programach które możecie zassać z naszej witryny, co pozwoli wyrównać szansę. Gdyż przecież nie wszyscy mają to samo na HDD swoich blaszaków. Uchylę rąbka tajemnicy i powiem, że pierwszą grę którą weźmiemy na tapetę będzie nieśmiertelna Giana Sisters. W której to uczynimy naszą ‚dziewczynkę’ nieśmiertelną, zatrzymamy czas… i dla zabawy zmienimy jej jeszcze kolor włosów (będzie brunetką:).

Jak zapewne wiecie obowiązuje u nas w kraju (nareszcie po latach) ustawa o poszanowaniu praw autorskich. Zmuszony więc jestem Wam przypomnieć czy raczej uświadomić, że chociaż nie dotyczy ona programów na naszego komodorka, to starajmy się ją respektować. Tak więc jeżeli spodobał się Wam jakiś program to dla świętego spokoju i czystego sumienia wejdźcie w jego posiadanie legalną drogą. O ile będzie to możliwe 🙂