ZX Spectrum > GRAFIKA

Wyciaganie grafiki z gier/dem/binarek

<< < (2/6) > >>

Tygrys:
To może powstałby z tego interesujący artykuł w dziale Technikalia? ;-)

RafalM:
Zatwierdzamy breakpoint (emulator spyta czy na pewno) i zaczynamy grę

Emulator powinien prawie od razu wejsc do debuggera. Okazuje się że najpierw ustrzeliliśmy coś takiego:

   ld hl, 16384       ; 40521
   ld de, 16385       ; 40524
   ld bc, 6144       ; 40527
   ld (hl), l                     ; 40530
   ldir          ; 40531

Tutaj niestety trzeba znać assembler. Jak ktoś nie zna to nic dalej nie zrobi, ale jak zna to widzi że jest to czyszczenie ekranu. Dajemy "Kontynuuj" i za chwilę powinniśmy mieć coś takiego:

39481: ld ix, (24444)
39485: ld de, 22528
39488: ld c, 32
39490: push de
39491: ld b, 17
39493: push bc
39494: push de
39495: ld l, (ix+0)
39498: set 7, l
39500: ld h, 127
39502: ld a, (hl)
39503: ld (de), a
39504: ld a, d
39505: and 3
39507: rlca
39508: rlca
39509: rlca
39510: add a, 64
39512: ld d, a
39513: res 7, l
39515: ld h, 16
39517: add hl, hl
39518: add hl, hl
39519: add hl, hl
39520: ld b, 8
39522: ld a, (hl)    <------------- tutaj mamy kopiowanie bloczka
39523: ld (de), a
39524: inc l
39525: inc d
39526: djnz 39522
39528: pop de
39529: ld hl, 32
39532: add hl, de
39533: ex de, hl
39534: inc ix
39536: pop bc
39537: djnz 39493
39539: pop de
39540: inc e
39541: dec c
39542: jr nz, 3949

I tu się muszę chwilę zastanowić :) Widzimy że kopiowanie 8 bajtów bloczka jest w adresie 39552 i dane są kopiowane spod adresu 33432 pod adres 16384 (trzeba spojrzeć na wartości rejestrów w debuggerze)

RafalM:

--- Cytuj ---To może powstałby z tego interesujący artykuł w dziale Technikalia? ;-)
--- Koniec cytatu ---

Można pomyśleć ;) Na razie mam wenę więc jadę dalej ;)

RafalM:
Trochę przeanalizowałem kod i wyszło mi że:

- w 39480 jest RET więc nowa procedura zaczyna się w 39481

- DE jest na początku procedury ustawiane na 22528 - początek pamięci atrybutów

- w rozkazie pod adresem 39503 kopiujemy do wspomnianych atrybutów wartość przechowywaną w HL

-wartość w HL jest wyliczana tak że czytamy L z (IX+0), ustawiamy 7 bit a H ustawiamy na sztywno H=127; Intuicja podpowiada mi tutaj że na każdym poziomie jest możliwych 128 bloczków i L czytane z (IX+0) może mieć wartości 0-127

- patrzę w okienko z rejestrami i widzę że IX=31892, czyli tam muszą się zaczynać dane mapy!!!



--- Kod: ---39481: ld ix, (24444) -------pod adresem 24444 musi być początek danych mapy !!!
39485: ld de, 22528
39488: ld c, 32   ------------------32 kolumny bloczków
39490: push de
39491: ld b, 17  -------------------17 bloczków w każdej kolumnie
39493: push bc
39494: push de
39495: ld l, (ix+0)  --------- L musi być numerem bloczka !!!!
39498: set 7, l
39500: ld h, 127
39502: ld a, (hl)  ------------czytaj spod adresu 127*256+128+L=32640+L
39503: ld (de), a  ------------pisz atrybut bloczka (bo de=22528 a to obszar atrybutów)
--- Koniec kodu ---

RafalM:
Można to zresztą sprawdzić czy tam rzeczywiście dane mapy zaczynają się od 31892

W tym celu będać dalej w debugerze zatrzymanym na breakpoincie zmienie parę wartości zaraz po adresie 31892

Widzę że w Spinie robi się to jakoś niewygodnie więc może nie będę tego opisywał. W tym momencie możemy z resztą zrobić tak:

- uruchamiamy dowolny emulator i wczytujemy Renegade

- ustawiamy breakpoint (tym razem już najzwyklejszy) na adresie 39481 który już poznaliśmy

- uruchamiamy grę

- gdy emulator wejdzie do debuggera zmieniamy kilka wartości komórek po adresie 31892. Ja zmieniałem je na wartość 20.

-Dajemy "Kontynuuj"

Efekt:


Działa ! :) Widzimy teraz wyraźnie że plansza jest rysowana kolumnami, od góry do dołu i od lewej kolumny do prawej.

Pojawiają  się teraz dalsze pytania - czy adres mapy gry który znaleźliśmy to już ostateczny adres pod którym jest ona przechowywana, czy też jest to jakiś bufor do którego zostały one skopiowane/rozpakowane jeszcze spod jakiegoś innego adresu.

Ale ja już zatrzymam się w tym miejscu.... ;)

I tak to wygląda. Programista który napisał Renegade miał koncepcję i zamienił ją na instrukcje, my poruszamy sie w drugą stronę - na podstawie instrukcji próbujemy odgadnąć jego koncepcję. Jest to trochę żmudne i nie da się ukryć że trzeba się orientować w assemblerze ale też daje satysfakcję.

KONIEC :)


Nawigacja

[0] Indeks wiadomości

[#] Następna strona

[*] Poprzednia strona

Idź do wersji pełnej