| Разработка и ромхакинг > Ромхакинг и программирование |
| [NES] Contra. Вопросы. |
| (1/1) |
| wizzard:
Взял принципиально пожатый ром. Хочется потренироваться. Процедуру декомпрессии нашел. Ей пожато все - и графика, и тайловые карты. Написал программку для распаковки. Удалось вытащить непосредственно из рома %40 графики. Остальное - не пойми как. Вообще складывается впечатление, что загрузка графики работает так. Есть базовый набор спрайтов для уровня и есть кусочки, что раскиданы по рому и не обязательно хранятся вместе с основным базовым набором спрайтов. Значит, где-то в роме, должна быть таблица (массив указателей) на смещения для НАЧАЛА распаковки этих самых порознь лежащих кусочков. Не очень понятно, как осуществляется загрузка самого РОМА? (ясно, что он грузится с адреса 0x8000, но что происходит потом, и почему IDA не может дизасмить там байты) Как можно найти адрес первой выполняемой инструкции? Загрузил ром в ida, через загрузчик CaH4e3'а. Он показал голые данные. Как я понял, IDA не может дизасмить ром непосредсвенно. Но коли так, то как используя отладчик FCEUD (или его модификации) можно ей подсказать? Что смущает - не понятно, как и когда мэппер осуществляет переключение данных в картридже? Хорошо бы (я искал) найти какой-нибдудь мануал по работе в NES и IDA. Тот что описан здесь http://griever.magicteam.net/doc/?doc=NES_IDA не очень понятен. Более того, у меня не получилось сделать дизассемблирование указанными там методами. Может руки кривые, может я не догоняю? Наверно, это особенность IDA на x64 системах. В x32 все продизасемблировалось, плагин отработал нормально. По крайней мере все можно прочесть или проанализировать. |
| Ti_:
Я про НЕС мало знаю, но не думаю что прям с адреса $8000 начинается, как мне казалось первая идет с $8001. Наверно это от маперров зависит, а учитывая что мапперы железные, и их было много разных -> везде по-своему. Насчет неможет дизасмить - у меня может. (может в том роме с другого банка КОД начинался). Если интересует именно ром Contra'ы, можешь попрбовать на буржуйских инфу поискать (редактор уровней контры Red Falcon(создатель Trax)). Насчет FCEUD - это код/дата логгер как и в fceux214?, мне бы тоже было интересно как прикрутить полученный файл к IDA. (или к чему они его прикручивали?) Добавлено позже: --- Цитата: wizzard от 26 Август 2010, 13:33:45 ---Наверно, это особенность IDA на x64 системах. В x32 все --- Конец цитаты --- а ты посмотрел что в папке IDA/loaders по 2штуки их? *.ldw и *.l64. По-крайней мере те лоадеры, что уменя 32 битные. (хотя может ты из сорса компилил?) |
| wizzard:
Поковырявшись обнаружил такую интересную закономерность. Не вся графика ей подчиняется, но кое-что подчиняется. Идет сжатый кусок. Он заканчивается байтом FF. Потом идут 2 байта (зачем?), потом опять сжатый кусок до байта FF. IDA дизасмит на Win x32 нормально. Можно и разобраться. У меня вот какой вопрос. По рому я полазил. Нашел таблицу имен (name table, тайловую карту) в пожатом виде для начальной заставки. Её начало и конец. Разжалась правильно. А можно ли как-то в отладчике узнать, что происходит чтение именно с этого смещения в РОМЕ? То есть задача: есть смещение в роме, нужно найти смещение в памяти. Может есть какие-нибудь алгоритмы? > а ты посмотрел что в папке IDA/loaders по 2штуки их? *.ldw и *.l64. По-крайней мере те лоадеры, что уменя 32 битные. (хотя может ты из сорса компилил?) Я не компилил, скачал с какого-то сайта, засунул и забыл. Потом просто через виртуалку разжал, сохранил и все. Вот видео прохождения демо уровня, только парень создал Red Falcon под MAC. http://www.youtube.com/watch?v=_42lhQTY-no Мне интересно самому покопать - поковырять. Потому что много интересного узнаешь о создателях-программистах. > Я про НЕС мало знаю, Если есть мэппер, как правило 1 банк остается в памяти всегда. Остальные переключаются по ходу. У меня их всего 6. И все программные (есть еще CHR-ROM, но в случае моего рома, этого нет. > Насчет FCEUD Их так много версий, что я путаюсь, где какая. Вот эту я собрал прям из сырцов - fceux214. Там под все студии есть проекты, под мак и unix. И все равно нужного функционала не достает! Например, везде в манах пишут - щелкните правой кнопкой на hex редакторе и выберите Go To Rom Ofsset (или как-то так), но такого пункта вообще нет, а чем он заменен непонятно. Почему я не могу посмотреть в том же hex редакторе SPR-RAM? CPU могу, PPU могу, а SPR-RAM - нет? Очень много игр в NES пожато именно RLE. Пришлось написать свой просмотрщик - распаковщик. Могли бы за 10 лет эмуляции такую тулзу внедрить. И много чего не достает в отладочных целях. |
| Ti_:
--- Цитата: wizzard от 28 Август 2010, 11:05:15 ---А можно ли как-то в отладчике узнать, что происходит чтение именно с этого смещения в РОМЕ? То есть задача: есть смещение в роме, нужно найти смещение в памяти. И много чего не достает в отладочных целях. --- Конец цитаты --- не совсем понял что ты имеешь ввиду, но мне больше всего не хватало раздельно чтение данных (read), а не pc (кода), также как на Сеге в Gens'. Там дебаг на PC срабатывает только на код, а дебаг на чтение только на данные (при этом показывает оффсет с какого чтение прошло и оффсет кода), а вот на nes нельзя так. |
| wizzard:
Как я понял, Сега не "сегментирует" память. Там есть 4 мегабайта - и все это в 1 сегменте. Оно и понятно - процессор 16 бит, может адресовать все сразу. А на NES максимум 1 сегмент - 0хFFFF, или 64К. Вот по этому мэпперы и придумали. Он как бы "подсовывает" процессору нужный кусок кода. В ROMе они идут 1 за другим, а вот в память загружаются....причем за 1 кадр может быть и 100 переключений между разными кусками (банками) кода. И как определить откуда он читает?.... Я знаю, что есть исходники того же GENS, и можно дописать что нужно. Или сдампить нужные куски. Но я не особо вникал, как устроена Сега. Мне кажется очень похоже на NES. |
| ZURG:
--- Цитата ---И все равно нужного функционала не достает! Например, везде в манах пишут - щелкните правой кнопкой на hex редакторе и выберите Go To Rom Ofsset (или как-то так), но такого пункта вообще нет, а чем он заменен непонятно. Почему я не могу посмотреть в том же hex редакторе SPR-RAM? --- Конец цитаты --- Go To Rom Ofsset - пункт появляется если щёлкать в hex редакторе на адреса более $8000, что естественно, так как именно по этому адресу загружается ROM. А что такое SPR-RAM? Точно не знаю, но вроде у НЕС есть только СPU и PPU RAM. Всё остальное будет внутри их адресных пространств. Если что, тут есть русскоязычная дока по НЕС: http://tv-games.narod.ru/library/nes.htm --- Цитата ---А можно ли как-то в отладчике узнать, что происходит чтение именно с этого смещения в РОМЕ? То есть задача: есть смещение в роме, нужно найти смещение в памяти. Может есть какие-нибудь алгоритмы? --- Конец цитаты --- Тут лучше почитать форум и сайт шедевра, там вроде это разбиралось. Могу объяснить только по нубски. Мапперы оперируют банками памяти определённого размера, которые грузятся в окна начиная с адресов $8000 и $C000. Если к примеру адрес в роме $500, то нужно ставить бряк на чтение по адресам $8490 и $C490 (учитывая заголовок). Но лучше меня не слушать, а дождаться кого по опытнее :). Ti_, про раздельные бряки Санчез тебе вроде подробно отвечал. Бряки прекрасно работают раздельно (read - чтение данных, Exute\PC - исполнение кода). А вообще со всеми этими вопросами лучше на форум шедевра. Или дождаться пока здесь отпишется Санчез или ещё кто. |
| wizzard:
В SPR-RAM (она 256 байт) хранятся атрибуты спрайтов. 64 записи по 4 байта каждая. Именно этим объясняется лимит спрайтов на 1 строку развертки. За совет спасибо. Я думал там смещения в РОМе, (гыыыыы). А ROM же в памяти! И грузится с адреса 0x8000. А я уж хотел было байты портить. |
| ZURG:
--- Цитата: wizzard от 28 Август 2010, 12:48:01 ---В SPR-RAM (она 256 байт) хранятся атрибуты спрайтов. 64 записи по 4 байта каждая. Именно этим объясняется лимит спрайтов на 1 строку развертки. --- Конец цитаты --- Область в RAM $200-$300? |
| wizzard:
Она на прямую в память не отображается. К ней доступ только через регистры PPU или через DMA. Это память внутри PPU. > RAM $200-$300? Не уверен. Но думаю, что логика работы такая. Сначала формируется буфер в обычной памяти, затем он целиком перекидывается в SPR_RAM через DMA. Может адрес буфера и такой, но в общем случае может отличаться. |
| Ti_:
--- Цитата: wizzard от 26 Август 2010, 13:33:45 ---Что смущает - не понятно, как и когда мэппер осуществляет переключение данных в картридже? --- Конец цитаты --- --- Цитата: wizzard от 28 Август 2010, 11:42:08 ---И как определить откуда он читает?.... --- Конец цитаты --- --- Цитата: wizzard от 28 Август 2010, 11:05:15 ---У меня их всего 6. И все программные (есть еще CHR-ROM, но в случае моего рома, этого нет. --- Конец цитаты --- ну ты же сам говоришь программные, значит в коде игры есть инструкции обращения к мапперу, правильно я понимаю суть программных банков? вот наверное сразу после их выполнения и переключается. то есть вопрос в том как их найти? |
| HoRRoR:
Читайте и не гадайте: http://dendy.migera.ru/ |
| wizzard:
Читал я мигеру. Он пишет, что мэппер один из простейших и обращение к памяти выше 0x8000 есть его рук дело. И что с того? |
| HoRRoR:
Плохо читал, раз остались вопросы. |
| Навигация |
| Главная страница сообщений |