Autor Wątek: Wyciąganie muzyki/grafiki z gier  (Przeczytany 12397 razy)

Micky

  • ***
  • Wiadomości: 157
  • Miejsce pobytu:
    Szczecin
Wyciąganie muzyki/grafiki z gier
« dnia: 2013.02.02, 17:17:02 »
Wziąłem plik binarny wyrzucony przez splitter, przepuściłem go przez dekompilator Z80 wynik przemieliłem własnym skryptem, który generuje etykiety i przetwarza kod do formatu zgodnego z pasmo.

Jakiego dekompilatora używasz? Czy byłbyś skłonny podzielić się swoim skryptem celem wzbogacenia własnej wiedzy?
Piwo przy najbliższym spotkaniu gwarantowane :)

Zainteresowala mnie ostatnio możliwość wyciągania muzyczek i grafik z gier (http://www.worldofspectrum.org/infoseekid.cgi?id=0019052).

Co do muzyczek, to rozumiem, że procedura jest następująca:
1) zaczynamy od debuggera i szukamy LD BC, 65533 lub 49149 a za nimi OUT (C),a (z reguły od 49152 jak pisał Tygrys)
2) zgrywamy obszar pamięci od znalezionego adresu do zalóżmy końca - 65535
3) traktujemy zrzucony obraz pamięci programem AYMakeR, który stworzy nam plik .ay
4) traktujemy plik .ay programem AYSplitR, który nam wskaże w pliku ini odpowiednie adresy (początku muzyczki, init'a i player'a)
5) zbieramy w ten sposób kolejne pliki z muzyczkami, łączymy je ze sobą do jednego pliku i następnie wywołujemy podstawiając najpierw adres bloku muzyki do playera.

Jeśli gdzieś się pomyliłem, to mnie poprawcie.
Interesuje mnie też jak to się robiło kiedyś - na 'gołym' Spectrum - bez wspomagaczy w postaci emulatorów i PC :)

Co do grafiki to jakie są sposoby na wyciąganie grafiki z gier? Spectrum Graphics Editor (pod warunkiem, że nie jest skompresowana lub w dziwnym/własnym formacie)? http://retrospec.sgn.net/game/sge

Może któryś z forumowiczów pokusiłby się o napisanie artykułu na powyższe tematy?

matofesi

  • *****
  • Wiadomości: 1879
  • Miejsce pobytu:
    Toruń/Poland
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #1 dnia: 2013.02.02, 17:55:31 »
Wziąłem plik binarny wyrzucony przez splitter, przepuściłem go przez dekompilator Z80 wynik przemieliłem własnym skryptem, który generuje etykiety i przetwarza kod do formatu zgodnego z pasmo.

Jakiego dekompilatora używasz? Czy byłbyś skłonny podzielić się swoim skryptem celem wzbogacenia własnej wiedzy?
Piwo przy najbliższym spotkaniu gwarantowane :)

Do disassemblacji używam z80dis - to jest disassembler w perlu ściągnięty z CPANa. Nie pamiętam jak dokładnie nazywał się pakiet - wydaje mi się, że PSCUST/CPU-Z80-Disassembler.

Skrypt (zzipowany) jest w załączniku - to kawałek basha, który bierze jako parametr plik wejściowy zrzucony z z80dis'a i plik wyjściowy. Na wylocie dostajesz plik nadający się do dalszej obróbki - ma wyczyszczone dane binarne z początku linii (przeniesione na koniec do komentarza i dodatkowo jako "db", dodane etykiety wszędzie tam, gdzie automatem da się je wyjąć, część etykiet jest odpowiednio poprzesuwana o jeden czy dwa bajty jeśli rozkaz trafia w środek innego rozkazu itp. Zasadniczo plik po przeczyszczeniu powinien się dać zassemblować przy użyciu pasmo i dać w wyniku identyczny z oryginałem plik binarny. Oczywiście nie zawsze to działa, ale parę razy narzędzie okazało się przydatne :)

Cytuj
Zainteresowala mnie ostatnio możliwość wyciągania muzyczek i grafik z gier (http://www.worldofspectrum.org/infoseekid.cgi?id=0019052).

Co do muzyczek, to rozumiem, że procedura jest następująca:
1) zaczynamy od debuggera i szukamy LD BC, 65533 lub 49149 a za nimi OUT (C),a (z reguły od 49152 jak pisał Tygrys)

Mniej więcej, choć OUTa na port można zrobić na kilka różnych sposobów. Mój program przerabiający odwołania z ZXS128 na Unipolbrita w końcowej fazie miał ponad kilobajt kodu i w większości były to kawałki wyszukujące konkretne sposoby odwołań do portów. Ale zasadniczo tak - najpierw szukasz, gdzie program pisze do AYgreka i cofasz się szukając początku procedury.

Cytuj
2) zgrywamy obszar pamięci od znalezionego adresu do zalóżmy końca - 65535

Można tak a można się pokusić o znalezienie poprawnego końca - większość muzyczek po kompilacji jest stosunkowo krótka.

Cytuj
3) traktujemy zrzucony obraz pamięci programem AYMakeR, który stworzy nam plik .ay

Oooo... To nie jest takie proste ;) AYMakeR wymaga stworzenia pliku INI w którym musisz mieć podane parametry jakich wymaga muzyczka - adres stosu, adres inicjalizacji, adres prodcedury grającej pojedynczą ramkę, adresy portów AYgreka itp.

Po podaniu tych danych AYMaker zrobi ci z INI i binarnego kawałka plik .AY.

Cytuj
4) traktujemy plik .ay programem AYSplitR, który nam wskaże w pliku ini odpowiednie adresy (początku muzyczki, init'a i player'a)

Nieee... Albo inaczej - owszem, o ile używasz cudzego pliku i chcesz go użyć w swoim kodzie albo zrobić z nim jakieś inne ciekawe rzeczy. Jak masz samodzielnie zrobiony plik AYMakeRem to nie jest ci potrzebne splitowanie, bo wszystkie potrzebne dane już masz ;)

Cytuj
5) zbieramy w ten sposób kolejne pliki z muzyczkami, łączymy je ze sobą do jednego pliku i następnie wywołujemy podstawiając najpierw adres bloku muzyki do playera.

Yyyy... A tego to nie rozumiem... Co dokładnie chcesz uzyskać? Bo plik .ay zawiera fizyczny nie relokowany kawałek kodu i danych a player na fizycznej maszynie po prostu wciąga go do pamięci i odpala zgodnie z podanymi parametrami.

Cytuj
Jeśli gdzieś się pomyliłem, to mnie poprawcie.

Interesuje mnie też jak to się robiło kiedyś - na 'gołym' Spectrum - bez wspomagaczy w postaci emulatorów i PC :)

Tak samo ;) Tyle, że bez extra narzędzi trwało to ciut (ale na prawdę tylko ciut) dłużej.

Cytuj
Co do grafiki to jakie są sposoby na wyciąganie grafiki z gier? Spectrum Graphics Editor (pod warunkiem, że nie jest skompresowana lub w dziwnym/własnym formacie)? http://retrospec.sgn.net/game/sge

Nie znam programu. W większości starszych gier grafika była zapisana bez żadnych kombinacji i kompresji. Do jej wyciągania używało się jakiejś przeglądarki do pamięci z regulacją adresu, szerokości offsetów itp. Myśmy używali EMona, który miał wbudowaną przeglądarkę, ale było mnóstwo innych programów robiących takie rzeczy.

A po namierzeniu właściwego kawałka pamięci i tak zwykle będziesz musiał pobawić się kodem, żeby na przykład namierzyć gdzie są trzymane (albo w jaki sposób są generowane) atrybuty dla bitmapy itp.

Cytuj
Może któryś z forumowiczów pokusiłby się o napisanie artykułu na powyższe tematy?

Na mnie nie licz ;) Mam za dużo rozgrzebanych projektów, żeby kombinować z kolejnym - zwłaszcza takim, który mnie nie specjalnie interesuje ;)


Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #2 dnia: 2013.02.02, 19:43:29 »
AY emulator sam znajdzie muzykę w grze lub demie i ją wyekstraHuje do pliku .ay
Trzeba jednak mieć "czysty" kod gry, nieskompresowany ani nie zakodowany np. przez XOR.
http://bulba.untergrund.net/emulator_e.htm
AY Music, ULA plus.

Micky

  • ***
  • Wiadomości: 157
  • Miejsce pobytu:
    Szczecin
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #3 dnia: 2013.02.02, 20:46:42 »
Do disassemblacji używam z80dis - to jest disassembler w perlu ściągnięty z CPANa. Nie pamiętam jak dokładnie nazywał się pakiet - wydaje mi się, że PSCUST/CPU-Z80-Disassembler.
Dziękuję za skrypcik - przy okazji się odwdzięcze

Ja się bawiłem IDA Dissasembler'em - bardzo wygodny w użyciu. Nim obrabiałem Fatware'a  zanim Baze udostępnił źródła (dodałem obsługę klawiszy Timex'a oraz przewijanie po stronie)

wersja 0.12a http://velesoft.speccy.cz/zx/divide/divide-fatware.htm
p.s. znalazłem jakiś Z80dis.c - http://www.programmersheaven.com/download/1141/Download.aspx

Cytuj
Oooo... To nie jest takie proste ;) AYMakeR wymaga stworzenia pliku INI

A to w takim razie źle zrozumiałem, bo byłem przekonany, ze to właśnie AYMakeR sam stworzy plik .ini na podstawie zrzuconego obszaru pamięci

Cytuj
Cytuj
5) zbieramy w ten sposób kolejne pliki z muzyczkami, łączymy je ze sobą do jednego pliku i następnie wywołujemy podstawiając najpierw adres bloku muzyki do playera.

Yyyy... A tego to nie rozumiem... Co dokładnie chcesz uzyskać? Bo plik .ay zawiera fizyczny nie relokowany kawałek kodu i danych a player na fizycznej maszynie po prostu wciąga go do pamięci i odpala zgodnie z podanymi parametrami.
Miałem na myśli 'sklejenie' kilku plików z muzyczkami i jednym playerem do jednego kawałka.

Cytuj
Nie znam programu. W większości starszych gier grafika była zapisana bez żadnych kombinacji i kompresji. Do jej wyciągania używało się jakiejś przeglądarki do pamięci z regulacją adresu, szerokości offsetów itp. Myśmy używali EMona, który miał wbudowaną przeglądarkę, ale było mnóstwo innych programów robiących takie rzeczy.

No to własnie SGE to potrafi :)
Czy te edytory o których wspominasz to 'tile edytory'?
http://www.romhacking.net/?category=10&page=utilities
« Ostatnia zmiana: 2013.02.02, 21:06:17 wysłana przez Micky »

Micky

  • ***
  • Wiadomości: 157
  • Miejsce pobytu:
    Szczecin
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #4 dnia: 2013.02.02, 20:47:44 »
@Abrimaal - dziękuję - popróbuje przy okazji.

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #5 dnia: 2013.02.02, 21:46:47 »
Cytuj
Nie znam programu. W większości starszych gier grafika była zapisana bez żadnych kombinacji i kompresji. Do jej wyciągania używało się jakiejś przeglądarki do pamięci z regulacją adresu, szerokości offsetów itp. Myśmy używali EMona, który miał wbudowaną przeglądarkę, ale było mnóstwo innych programów robiących takie rzeczy.

Cytuj
No to własnie SGE to potrafi

Też używam SGE i muszę stwierdzić że jest to obecnie chyba najlepsze narzędzie (zwykle się na taki program mówi "ripper") pod Windows do wyciągania grafiki z pamięci Spectrum. Co nie znaczy rzecz jasna że nie mógł by być lepszy ;)

Inne zalinkowane programy wpierające konsolę NES itp. nie będą oczywiście zbyt przydatne na Spectrum z uwagi na zupełnie inny format danych sprajtów.

Sporym problemem SGE jest tam to że w ogóle nie oferuje on wsparcia dla atrybutów - można wydobywać piksele ale ich koloru już nie.

No i nie poradzi on sobie rzeczywiście z jakimś dziwacznym formatem danych sprajta. A widziałem podczas grzebania w cudzym kodzie już np. takie przypadki gdzie do następnego bajtu sprajta przechodziło się przez INC H ;) (dane rozrzucone w odstępach co 256 bajtów).

Micky

  • ***
  • Wiadomości: 157
  • Miejsce pobytu:
    Szczecin
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #6 dnia: 2013.02.02, 23:09:16 »
Przepraszam to przeze mnie.

W jaki sposob moge przeniesc kilka ostatnich wiadomosci do nowego watku?

matofesi

  • *****
  • Wiadomości: 1879
  • Miejsce pobytu:
    Toruń/Poland
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #7 dnia: 2013.02.02, 23:41:14 »
Cytuj
Dziękuję za skrypcik - przy okazji się odwdzięcze

Napisz na forum do czego ci się przydał jak się przyda. Innego odwdzięczania się nie wymagam :)

Cytuj
Ja się bawiłem IDA Dissasembler'em - bardzo wygodny w użyciu.

IDA jest fajna do niektórych zastosowań - zwłaszcza do bardziej skomplikowanych platform do których masz (rozumiem, że kupione ;)) IDSy. Strzelanie z niej do Z80 to takie sobie rozwiązanie - plik wynikowy trzeba czymś przerobić, żeby dał się przeassemblować. Dlatego używam mojego "combo" - po disassemblacji i czyszczeniu skryptem dostaję ASMa, który od razu daje się assemblować i daje identyczny plik binarny co na wejściu.

Cytuj
Cytuj
Cytuj
5) zbieramy w ten sposób kolejne pliki z muzyczkami, łączymy je ze sobą do jednego pliku i następnie wywołujemy podstawiając najpierw adres bloku muzyki do playera.

Yyyy... A tego to nie rozumiem... Co dokładnie chcesz uzyskać? Bo plik .ay zawiera fizyczny nie relokowany kawałek kodu i danych a player na fizycznej maszynie po prostu wciąga go do pamięci i odpala zgodnie z podanymi parametrami.
Miałem na myśli 'sklejenie' kilku plików z muzyczkami i jednym playerem do jednego kawałka.

Problem w ty, że plik .ay zawiera w środku player. Żeby zmontować coś takiego o czym piszesz musiałbyś każdy player i jego dane (logiczne) zrelokować a najlepiej zdisassemblować i zmontować z nich z powrotem logiczny kawałek kodu. Złożenie tego do kupy tak "na wprost" to pierwsze stare dema - wyripowane z gier muzyczki (razem z playerami oczywiście) zmontowane z kodem robiącym scrollery itp. Największy problem takiego rozwiązania to było zgranie adresów tak, żeby poszczególne muzyczki dały się odpalać mimo pokrywania się adresów - przerzucało się kawałki binarnego kodu tak, żeby własny kod nie kolidował z tym, na co nie było wpływu. Kolejna sztuka nie związana z disassemblacją itp. ;)

Cytuj
No to własnie SGE to potrafi :)
Czy te edytory o których wspominasz to 'tile edytory'?

Nie. To o czym piszę to proste przeglądarki ewentualnie (jak w wypadku Summera - tak się nazywał nasz debugger, EMon to moja wersja dla Sama Coupe... pamięć zawodzi po tylu latach ;)) spięte z debuggerem. Dzięki takiemu programikowi mogłeś przeglądać zawartość pamięci przekładając liniową organizację na fizyczny ekran. W ten sposób można było ustalić gdzie siedzi grafika i jak jest zorganizowana (maskowanie co bajt/co szerokość sprite'a itp.). A potem można już było wyjąć dane i przekodować tak, jak były potrzebne do twojego własnego kodu. Sam zrobiłem to raz - demo Running Man z animacją z gry o tym samym tytule. Przeglądarki używałem częściej do szybkiej orientacji w kodzie np. do wyszukiwania, gdzie leży player do muzyki - większość zawierała tablicę przekodowującą nuty na częstotliwości i dało się ją "wypatrzeć" w przeglądarce grafiki ;)

Jako ciekawostkę zupełnie bez znaczenia dorzucę, że taka przeglądarka do grafiki to jedyny program, który napisałem na Amstrada CPC bardzo dawno temu u jednego z dwóch znajomych, którzy wtedy mieli takie komputery. I nie, nie mam kodu, prawie na pewno program się nie zachował - kumpel chwilę później wyjechał do reichu i jakiś rok czy dwa później przestał mówić po polsku ;)

Cytuj
Przepraszam to przeze mnie.

W jaki sposob moge przeniesc kilka ostatnich wiadomosci do nowego watku?

Nie możesz. Mógłby to zrobić admin (Tygrys albo ja), ale wątek jest tak pokręcony, że nie wiem w którym miejscu miałbym zrobić cięcia, żeby było dobrze ;)

edit: Ok. Przeciąłem wątek. Teraz zastanawiam się czy zostawić go w tym dziale czy przenieść do innego. Na razie zostawiam :)

« Ostatnia zmiana: 2013.02.02, 23:54:08 wysłana przez matofesi »

Micky

  • ***
  • Wiadomości: 157
  • Miejsce pobytu:
    Szczecin
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #8 dnia: 2013.02.03, 00:12:24 »
Zalozylem nowy watek - http://speccy.pl/forum/index.php/topic,839.0.html

Co do IDA to tak mi sie udalo poustawiac opcje, ze po disassemblacji i assemblacji Sjasmplusem
otrzymalem Identyczny kod :)
A komfort pracy z IDA jest rewelacyjny.

IDA wystepuje w wersji freeware (starsza-obecnie 5) jak i Evaluation.
https://www.hex-rays.com/products/ida/support/download.shtml
Kazdy znajdzie cos dla siebie :)

Co do muzyczek, to zrozumialem, ze jeden z programow z Project AY rozdziela plik 'sna' na player i muzyczke w osobnych plikach, ale z tego. Co piszesz to to jest zawsze razem.
« Ostatnia zmiana: 2013.02.03, 00:15:08 wysłana przez Micky »

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #9 dnia: 2013.08.30, 06:00:28 »
Czy znacie jakąś alternatywę dla AYMaker? Już któryś z kolei plik kodu (dla beepera) próbuję z niego zrobić .ay i za każdym razem są błędy. Temat zacząłem tu: http://speccy.pl/forum/index.php/topic,1107.0.html
AY Music, ULA plus.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #10 dnia: 2013.12.28, 23:58:23 »
Kto pomoże wyciągnąć muzyke na beeper z Blood Brothers i Super Scramble Simulator?
Obie gry mają skomplikowane loadery, wystarczy wspomnieć, że ta pierwsza wyświetla instrukcję gry podczas ładowania.
Muzyka wygląda na ten sam player/tracker. Główna pętla chodzi w kółko i czeka na klawisz.
W BB ta pętla jest pod 64064, w SSS pod 33600, stamtąd skacze poniżej tych adresów, grając muzykę.
Szukam adresu od którego startuje sama muzyka od początku, jakie są wartości rejestrów (jeśli to wymagane) i przybliżonej długości kodu (lepiej trochę więcej niż za mało).
Pliki .bin to zrzut części pamięci podczas grania muzyki, ładowane pod adres zawarty w nazwie pliku. Długość - do końca RAM (pamiętamy o CLEAR w Basic).
Problem w tym, że próbowałem uruchomić kod z Basic od różnych adresów i nigdy nie zagral więcej niż jeden dźwięk, więc może potrzebne są jakieś ustawienia rejestrów i/lub wyłączenie przerwań.



AY Music, ULA plus.

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4308
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #11 dnia: 2013.12.29, 11:30:22 »
ściągnąłem, będę kombinować.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #12 dnia: 2014.01.04, 02:26:58 »
Kolejna beeper'owa zagadka (przynajmniej dla mnie) - Battle Valley (w trybie 48k)
Gra startuje od 45265, sprawdza ROM (zawartość 14446) i w zależności od wykrytego modelu wykonuje rożne LDIR, CALL itp i wtedy startuje ekran tytułowy i muzyka.
Zależy mi na utworze na beeper. Tego samego autora, to samo brzmienie, bez problemu wyciągnąłem ze Stormlord i Turbo Boat (adres ładowania=adres startowy, dołączam gdyby ktoś chciał porównać kod), a tutaj cos sie miesza. Pewnie dlatego, że gra zmienia ekrany podzas odtwarzania i przez to skacze gdzieś. Player muzyki znajduje się około 61300.
Testowy plik .ay zrobiony z całego kodu gry gra dobrze  ;D :( :D
Powalczę jeszcze z tym, jeśli uda się okroić go do 10 lub mniej kB w jednym lub kilku blokach, nie będzie źle. Najważniejsze to usunąć niepotrzebne skoki do przerzucania ekranu.

« Ostatnia zmiana: 2014.01.04, 02:35:50 wysłana przez Abrimaal »
AY Music, ULA plus.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #13 dnia: 2014.01.16, 00:16:52 »
Supernova, muzyka na AY w czasie gry (na beeper jest już wyciągnięta).
Pętla jest pod 65129. Załadowana binarnie od ~32768 do końca RAM, uruchomiona od 65129 nic nie gra. Nie używa procedury PLAY z ROM, bo chodzi na ZX48.
Pomoże ktoś znaleźć adres inicjacji muzyki i potrzebne fragmenty kodu. Koniec playera około 65415.
AY Music, ULA plus.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Wyciąganie muzyki/grafiki z gier
« Odpowiedź #14 dnia: 2014.02.06, 04:49:49 »
Super Scramble Simulator na beeper - zrobiony (znaleziony w sieci) - 3 bloki kodu
 32826,1632 ; 46441,23 ; 92,617
init=46444, interrupt=27

CJ Elephant Antics
, muzyka chodzi tylko na 128k, czyli pewnie rezyduje w którymś banku - w kodzie gry jest OUT 32765
Pętla jest pod 45232, stamtąd m.in. wykonuje CALL 54528
pod 55582 są instrukcje OUT dla AY.



AY Music, ULA plus.