forum speccy.pl

ZX Spectrum => MUZYKA => Wątek zaczęty przez: Micky w 2013.02.02, 17:17:02

Tytuł: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Micky w 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 (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 (http://retrospec.sgn.net/game/sge)

Może któryś z forumowiczów pokusiłby się o napisanie artykułu na powyższe tematy?
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: matofesi w 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 (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 (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 ;)

Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 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
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Micky w 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 (http://velesoft.speccy.cz/zx/divide/divide-fatware.htm)
p.s. znalazłem jakiś Z80dis.c - http://www.programmersheaven.com/download/1141/Download.aspx (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 (http://www.romhacking.net/?category=10&page=utilities)
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Micky w 2013.02.02, 20:47:44
@Abrimaal - dziękuję - popróbuje przy okazji.
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: RafalM w 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).
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Micky w 2013.02.02, 23:09:16
Przepraszam to przeze mnie.

W jaki sposob moge przeniesc kilka ostatnich wiadomosci do nowego watku?
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: matofesi w 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 :)

Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Micky w 2013.02.03, 00:12:24
Zalozylem nowy watek - http://speccy.pl/forum/index.php/topic,839.0.html (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 (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.
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 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
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 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ń.



Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Tygrys w 2013.12.29, 11:30:22
ściągnąłem, będę kombinować.
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 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.

Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 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.
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 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.



Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 2014.02.22, 03:29:13
OK, Elephant zrobiony. Podsumowując poprzednie posty pozostaje:
Blood Brothers 48k, Battle Valley 48k i Supernova 128k in-game.

Z kilku innych gier muzyka na beeper
Z GUTZ wybijany rytm w trakcie gry (przerwania), tytułowy utwór jest wyciągnięty.
z Kung-Fu Master - komu się uda, będzie godny tego tytułu.
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 2014.04.02, 22:40:53
Count Duckula - player jest pomiędzy 37962 a 38602
Tytuł: Odp: Wyciąganie muzyki/grafiki z gier
Wiadomość wysłana przez: Abrimaal w 2014.04.03, 04:25:15
Potrzebna muzyka na beeper (ZX48), adres uruchomienia i długość kodu
Decathlon - przy próbie uruchomienia USR 45241 coś piszczy, ale nie gra konkretnej muzyki. Może potrzebne jakieś wartości przy starcie.
Supertest - w każdej części jest inny utwór na beeper, pod 49013 są przerwania, ale nie dotyczą muzyki, tylko scrollującej bieżni podczas jej grania.
Tytuł: Odp: Wyciąganie muzyki z gier
Wiadomość wysłana przez: Abrimaal w 2014.05.12, 23:10:55
JAWS - Muzyka tylko na 128. Do znalezienia.

Jahangir - problem z kolejnością patternów, pewnie musi być podany jakiś adres w HiReg/LoReg. Grał w to ktoś? Jest jeden utwór czy więcej?
INIT=57742
INTERRUPT=56150
CODEADDRESS=56064, 7840

Motor Massacre - beeper, wygląda na ten sam engine, co Blood Brothers. Od 32768 tabela przerwań, możliwe adresy= 32826, 33114, 33600. Nie potrafię tego rozgryźć. Gra jeden dźwięk.