Разработка и ромхакинг > Ромхакинг и программирование
Замена музыки рома Sega Genesis
(1/2) > >>
Silver_Shadow:
Какими инструментами можно заменить музыку в роме Sega Genesis. (Если это конечно возможно) Мне надо заменить только музыку.
Ром для замены музыки выбрал Shinobi 3.
Инструменты, читал я тут некоторые темы:
1. Своя голова
2. Гугль
3. Goldwave - как сказал один человек, только как?
4. Win Hex и Асемблер - вроде как я понял для графики

Еще увидел один сайт с ресурсами



Есть что нибудь полезное там? Сии ресурсы с Хакинг Кат и emuxhaven.net
Некоторые форумчане вероятно меняли музыку на ромах Sega Genesis, не могли бы поделится алгоритмом как это делается?
Т.е. нужен для это Асемблер или ВинХекс, или только редактор звука. Нужно ли распаковывать ресурсы, какие ресурсы редактировать, с каким расширением, на какие команды обратить внимание, и какие вносить надо.
И насколько долго по времени?
Я так немного программирую на C++ и Visual Basic. Ну я думаю, я пойму немного в коде -)
Smoke:
Silver_Shadow, какую именно музыку хочешь заменить? Голоса(например как в RRR голос Larry) или чисто музыку(сэмплы). Если первое, то поможет GoldWave, надо будет только нужную частоту выставить, если второе, то это будет очень-очень сложно.
Silver_Shadow:
Smoke,
Ну вообще-то второе....то бишь музыку фоновую
Что неужто так сложно? какие идеи на этот счет?

Добавлено позже:
Ну вообще я трудолюбивый если что-то интересно, так что могу работать до потери пульса
Smoke:
Ну, я примерно знаю как строятся эти сэмплы. Там идут очереди из 6-ти инструментов, т.о. получается мелодия. Но чтобы ее изменить, придется сначала искать сами процедуры проигрывания. По ним найдутся сэмплы. Поэтому надо еще ассемблер M68k знать. Еще вроде в разных играх эти сэмплы могут по разному строится(процедуры проигрывания разные). Я добавлял музыку из мк1 в мк2, но там одинаковые плееры музыки и я ее просто перенес. Хотя искал нужный код долго и перелопатил очень много данных при этом. Можно конечно найдя сэмплы попробовать подобрать мелодию вручную побайтно, но это очень геморно, практически нереально на практике.
Silver_Shadow:
Smoke,
Ясно, есть 6 инструментов. И процедуры проигрывания. Как код процедуры в МК выглядит? И как ты по нему сэмпл нашел(а также как код выглядит). И искал ты их через ассемблер M68k? И в каком смысле там одинаковые плееры? Там что в роме еще плеер есть?
Последний вопрос, сами эти сэмплы имеют расширения, или они выглядят как код в программе?

Добавлено позже:
Да и еще как понять подобрать мелодию побайтно?
Silver_Shadow:
нашел подобную тему, и из изречение Segaman-а


--- Цитата: Segaman от 18 Июль 2009, 07:20:37 ---Я знаю как его заменить(хакинг). Берешь ром открываешь в Хексе. Ищешь 0603 или 0703. Когда нашел смотри совпадает он с примером заголовка внизу поста или нет, если нет ищешь дальше, если да смотришь, какой системой она обрабатывается. Если 68k то word(2байта) перед 0603(0703) должен быть меньше 8000. Если больше то Z80. Там уже посложнее будет. Короче теперь, когда мелодия найдена ищем его местоположение т.е.
89650: 054C 0603 0202 ...
Ищем 00089650 когда нашли смотрим, там впереди и/или сзади него должны быть такие адреса не превышающие размер рома
Пример
0008 9028 >0008 9650< 0008 9BCD 000B 4A12

Все эти поинты идут ко всем мелодиям. Берешь свою мелодию кидаешь в конец рома, а затем вместо местоположения той мелодии, которую хочешь заменить, вписываешь поинт на твою мелодию в конце рома.
Пример:
0008 9028 >0010 0000< 0008 9BCD 000B 4A12

А с случаями с Z80 я не сталкивался, но скажу одно, что word-y там задом наперед и с добавлением 8000 т.е. 2B DC => DC 2B => 5C 2A, и если в этом случае он еще и прикреплен к банку(основе) т.е. банк 60000, point 2B DC => 65C2B
bank 88000, point 2B DC => 8DC2B.
да и незабудь после замены checksum починить, для этого есть прога fixchecksum

Пример заголовка
054C 0603 0202 04BE   0000 0030 DCBC 0112
80B8 0208 DCB8 026C   DCD8 0320 BCB0 03AE
088C 0406 B0DC 0440   BOAC
054C-поинт на голоса(voices)

--- Конец цитаты ---

Что нибудь наподобие этого?

Добавлено позже:
Ну еще нашел хороший сайт по посту Мифистофеля
http://bhlady.narod.ru/references.htm
chameleoncyborg:
Silver_Shadow, вот бы ещё кириллицей он писал... :-\
Smoke:
Silver_Shadow, да, наподобие этого кое-что есть. Только малость посложнее будет. Сейчас привести пример не могу, буду вечером напишу обязательно примерчик из мк2  :)
Silver_Shadow:
Smoke,
Круто, спасибо =) Сам начну изучать пока доки по ссылке http://bhlady.narod.ru/references.htm
Как я понел одной из основ является 16ричный код, я более менее с ним знаком, т.к. на досе вырос. Ну я думаю изучение ассемблера за неделю продвинусь.
Тоже почитал, и еще один вопрос возник, допустим я нашел сэмпл, мне нужно заменить его на свой файл, который в формате mp3. Каким образом его вписывать туда, или надо просто как ресурс добавить? И конвертировать его надо в какой-то другой формат? И еще вопрос о размере, какой максимальный размер рома может быть, и есть ли ограничение по объему какого-то mp3 файла на 1 сэмпл? Или же сколько хочешь столько вставляй?
Smoke:

--- Цитата: Silver_Shadow ---Тоже почитал, и еще один вопрос возник, допустим я нашел сэмпл, мне нужно заменить его на свой файл, который в формате mp3. Каким образом его вписывать туда, или надо просто как ресурс добавить? И конвертировать его надо в какой-то другой формат?
--- Конец цитаты ---
Как из мп3 сделать сеговскую мелодию я к сожалению не знаю. Segaman может знает, попробуй у него спросить.

--- Цитата: Silver_Shadow ---И еще вопрос о размере, какой максимальный размер рома может быть, и есть ли ограничение по объему какого-то mp3 файла на 1 сэмпл? Или же сколько хочешь столько вставляй?
--- Конец цитаты ---
Чтобы ром запустился на реальной приставке и на эмуле Kega Fusion размер рома должен не превышать 4мб. Ограничение на размер сэмпла я даже и не знаю. Да и не так важно это, мелодия же это набор сэмплов => их просто большее кол-во будет при необходимости.


--- Цитата: Silver_Shadow ---И в каком смысле там одинаковые плееры? Там что в роме еще плеер есть?
--- Конец цитаты ---
Плеер это я так называю группу процедур, которые проигрывают музыку. :)

--- Цитата: Silver_Shadow ---Последний вопрос, сами эти сэмплы имеют расширения, или они выглядят как код в программе?
--- Конец цитаты ---
Нет, сэмплы выглядят как набор бессмысленных байтов.


--- Код: ---loc_40488:                              ; CODE XREF: sub_40478+4j
                lsl.w   #2,d0
                lea     (dword_38022).l,a1
                adda.w  d0,a1
                movea.l (a1),a1
                move.w  ($FFFFB192).w,d0
                sub.w   0(a5),d0
                add.w   d0,d0
                adda.w  d0,a1
                moveq   #0,d0
                moveq   #0,d1
                move.b  (a1)+,d0
                move.b  (a1)+,d1
                cmpi.b  #$FF,d1
                bne.s   loc_404BA
                tst.b   d0
                beq.s   loc_404B6
                move.w  d0,2(a5)

loc_404B6:                              ; CODE XREF: sub_40478+38j
                moveq   #0,d0
                moveq   #0,d1

loc_404BA:                              ; CODE XREF: sub_40478+34j
                tst.w   $A(a5)
                bne.s   loc_404FA
                tst.w   8(a5)
                beq.s   loc_404F2
                move.b  d1,d2
                lsr.b   #1,d2
                cmpi.b  #$7C,d2 ; '|'
                bcc.s   loc_404F2
                moveq   #0,d3
                move.b  d0,d2
                move.b  d1,d3
                lsl.w   #8,d3
                or.b    d2,d3
                andi.w  #$1F0,d3
                bne.s   loc_404EE
                moveq   #0,d2
                move.b  6(a5),d2
                lsl.w   #1,d2
                or.b    d2,d0
                lsr.w   #8,d2
                or.b    d2,d1

loc_404EE:                              ; CODE XREF: sub_40478+66j
                clr.w   8(a5)

loc_404F2:                              ; CODE XREF: sub_40478+4Cj
                                        ; sub_40478+56j
                move.b  d0,4(a5)
                move.b  d1,5(a5)

loc_404FA:                              ; CODE XREF: sub_40478+46j
                move.b  d1,d2
                lsr.b   #1,d1
                cmpi.b  #$7C,d1 ; '|'
                bcc.s   loc_40514
                roxr.b  #1,d2
                roxr.b  #1,d0
                andi.b  #$F8,d0
                beq.s   locret_40512
                move.b  d0,6(a5)

locret_40512:                           ; CODE XREF: sub_40478+94j
                rts

--- Конец кода ---
Это часть плеера музыки в мк2, нужная инструкция это lea     (dword_38022).l,a1. По ней идет загрузка адреса сэмплов в регистр а1. То есть метка dword_38022 и есть место в роме($38022) где лежат указатели на сэмплы.

--- Код: ---dword_38022:    dc.l $38C8E, $38C90, $38C9C, $38CA0, $38CA6, $38CAA, $38D12
                       dc.l $38D2E, $38D5E, $38D78, $38DF8, $38E2E, $38E36, $38E3E
                       dc.l $38E46, $38E7C, $38E96, $38F00, $38F08, $38F22, $38F26
                       dc.l $38F6C, $38F86, $38FA2, $38FD8, $39014, $39082, $39092
--- Конец кода ---
Это часть указателей. Самый первый($38D2E) как бы имеет порядковый номер 0, следующий 1, ну и т.д. При построении мелодий как раз и используются номера этих сэмплов. Размер мелодии всегда кратен 6, т.к. там чередуются серии из 6-ти инструментов. Вот к примеру мелодия:

--- Код: ---dc.w 3, 4, 0, 0, 0, 0, 0, 0, $C, $B, $D, 9, 0, 5, 6, 0, 0, 9  ; в роме по адресу $38590
--- Конец кода ---

Silver_Shadow:
Smoke,
Круто =) Но и в то же время тяжело) А как ты потом другую мелодию туда вписал?

Добавлено позже:
оператор lea это (Load Effective Address) Загрузка эффективного адреса

а dword как я понел это тип значения оператора переопределения.
А как ты понел что это имено адрес сэмплов? Что на это указывает? Сам адрес 38022?
Или же об этом показывает еще начало кода плеера? Если так можешь засветит начало кода? -)


--- Цитата ---А как ты потом другую мелодию туда вписал?
--- Конец цитаты ---
Разве надо mp3-шник дизасемблировать, и код в это место вставлять?

И еще вопрос (надеюсь я тебя не сильно загружаю  :) )
Что все работу проводить, надо сам ром, через ассемблер открывать, или же через дисасемблер?


Добавлено позже:

--- Цитата --- Размер мелодии всегда кратен 6
--- Конец цитаты ---
Как это в коде показано? -)

Добавлено позже:
P.S.
chameleoncyborg,
Я исправил на кирилицу пост Segaman-a
Smoke:

--- Цитата: Silver_Shadow ---А как ты потом другую мелодию туда вписал?
--- Конец цитаты ---
Ну, я не заменял мелодии, а добавлял. Из МК1 копировал сэмплы и дописывал на них указатели в их массив. Потом также и мелодию составлял из этих сэмплов.

--- Цитата: Silver_Shadow ---а dword  как я понел это тип значения оператора переопределения.
--- Конец цитаты ---
Почти, dword_38022 это так IDA метку назвала. 38022 потому что смещение по которому находится данная метка в роме -- $38022. А dword потому что по этой метке идут данные типа word.

--- Цитата: Silver_Shadow ---А как ты понел что это имено адрес сэмплов? Что на это указывает? Сам адрес 38022?
--- Конец цитаты ---
Почти простым методом тыка :) Ну, и еще я знал, что у каждой мелодии есть свой порядковый номер(как у сэмплов, что я в пред. посте писал), т.к. с помощью него указывается какая мелодия будет проигрываться. Поэтому искал массивы данных в которых адреса прописаны. Нашел что-то подобное, начал там мусорить. Смотрю -- кое-где музыка исчезла, ну думаю, нашел :)

--- Цитата: Silver_Shadow ---Разве надо mp3-шник дизасемблировать, и код в это место вставлять?
--- Конец цитаты ---
мп3 если побайтно вставить, ничего не выйдет. Это ж совсем разные форматы :)

--- Цитата: Silver_Shadow ---Что все работу проводить, надо сам ром, через ассемблер открывать, или же через дисасемблер?
--- Конец цитаты ---
Вообще по-хорошему надо дизассемблировать ром с помощью IDA Pro, так хоть ром читабельный вид примет. В хекс-редакторе неудобно все это смотреть. А вот изменения небольшие можно и в нем делать. Просто чтобы получить полностью дизассембленный файл, который потом компилятором будет собираться без проблем, надо много чего сделать(из-за одного загона иды).

--- Цитата: Silver_Shadow ---Как это в коде показано? -)
--- Конец цитаты ---
Кол-во пар байтов кратно шести в мелодии.
dc.w 3, 4, 0, 0, 0, 0, 0, 0, $C, $B, $D, 9, 0, 5, 6, 0, 0, 9   ; дизассембленный вид
0003 0004 0000 0000 0000 0000 0000 0000 000С 000B 000D 0009 0000 0005 0006 0000 0000 0009 ; в байтовом виде
Silver_Shadow:
Smoke,
Ладно пока начну, искать сэмплы и мелодию, попутно изучая hex и ассемблер. Попробую найти Сегамена, вдруг он чо знает про mp3 файлы(хотя я больше прихожу к мысли что туда их засунуть не получится)


--- Цитата ---Просто чтобы получить полностью дизассембленный файл, который потом компилятором будет собираться без проблем, надо много чего сделать(из-за одного загона иды).
--- Конец цитаты ---
А что за загон иды?
sergi:
mp3 можно переконвертить в wav и играть их :-\
Silver_Shadow:

--- Цитата: sergi от 30 Июль 2009, 18:56:23 ---mp3 можно переконвертить в wav и играть их :-\

--- Конец цитаты ---
В каком смысле? т.е. wav можно вставить?
Smoke:

--- Цитата: Silver_Shadow ---А что за загон иды?
--- Конец цитаты ---
Там она одну инструкцию малость не так пишет как это надо компилятору. Размер ее получается больше и множество коротких переходов может не уместиться в свои диапазоны. И следовательно ром скорее всего не соберется.

--- Цитата: Silver_Shadow ---В каком смысле? т.е. wav можно вставить?
--- Конец цитаты ---
Можно оцифрованные звуки вставлять с помощью GoldWave. Но они будут очень много весить, и качество будет не ахти. Так что этот вариант подходит только для коротких звуков.
Segaman:
Pro mp3 neznaju, esli ktoto znaet kak rabotaet mp3 mozhno budet i shtonibud' pridumat', a tak mozhno toka wav maximum v 22khz 16bit. u menja kak raz driver est', toka ja im nepol'zovalsja i ne znaju kak on rabotaet, no u mja gdeto manual valjalsja magu dastat', toka ehto budet drudojomko a znachit i ne skora. pishi v lichju razberjomsja. prosto u meoja opera na tele paletela, v zakladli ne zahodit a na novuju $ nuzhny
Silver_Shadow:
Segaman,
Ясно, если что мануал найдешь кидай в личку или сюда -)

P.S. Кстати не дадите маленькую вводну как засовывать туда wav -файлы?
sergi:
mp3 не потянет сега скорее всего, его и 486 то еле тянет, там же распаковываются данные вычислений много

проще ADPCM сделать - алгоритм попроще - принцип - передаются не абсолютные значения сигналов а только их разница, т.е. получается сжатие 4:1 - wav допустим весит 1 мегабайт, ADPCM будет весить всеголишь 256 килобайт при том же качестве и дискретизации, ну сходство не абсолютное конечно, но на слух не слышиться особая разница - думаю многие видели такие файлы с расширением wav но размером с mp3 и при этом там довольно качественная и долгая песня игралась - это и есть ADPCM - их разных много вариантов, ну Майкрософтовский обычно на винде юзают - собственно к нему и стоит обратится ;)

А принцип как сделать ориентировочно я так вижу:
есть исходный уже файл, вы его частями берете ну там по 256 байт можен 1024 и также кусками в память кладете уже как распакованный wav, далее синтезатор его играет, короче синтезатор играет то что в конкретном участке памяти лежит а уж откуда его возьмете это ваше дело

можно попробовать сначала просто wav из картриджа в память кусочками и играть его, как будет результат то уже жать исходник и также кусочками правильно распаковывать

Ну или сами алгоритм сжатия предумайте без потери качества - вдруг придумаете и сможете 30 минутные композиции жать до 4-х мегабайт при частоте дискретизации 22 килогерца, вам нобелевскую премию дадут ;)
Segaman:
Mozno perepisat' z80 driver esli takovoj imeetsja, esli zhe net, to napisat', kotoryj budet chitat' WAV iz svoej pamjati. predpolozhim iz A1200-A1A00. I napisat' drajver na 68k shtob tot pereovodil vash format, bud' to mp3, wav ili szhatyj wav ili eschjo kakaja-hren' i vykladyval ego po adresu A1200, a potom zapuskal z80 i tot proigryval ego. kogda on zakonchit povtorit'. srazu govorju - mne takoe ne po silam, ja prosto v ehtom dele sharju
Навигация
Главная страница сообщений
Следующая страница

Перейти к полной версии