Автор Тема: [NES] Contra. Вопросы.  (Прочитано 5308 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
[NES] Contra. Вопросы.
« : 26 Август 2010, 13:33:45 »
Взял принципиально пожатый ром. Хочется потренироваться.
Процедуру декомпрессии нашел. Ей пожато все - и графика, и тайловые карты.
Написал программку для распаковки. Удалось вытащить непосредственно из рома
%40 графики. Остальное - не пойми как. Вообще складывается впечатление, что
загрузка графики работает так. Есть базовый набор спрайтов для уровня и есть
кусочки, что раскиданы по рому и не обязательно хранятся вместе с основным базовым
набором спрайтов. Значит, где-то в роме, должна быть таблица (массив указателей)
на смещения для НАЧАЛА распаковки этих самых порознь лежащих кусочков.
Не очень понятно, как осуществляется загрузка самого РОМА?
(ясно, что он грузится с адреса 0x8000, но что происходит потом,
и почему IDA не может дизасмить там байты)
Как можно найти адрес первой выполняемой инструкции?
Загрузил ром в ida, через загрузчик CaH4e3'а. Он показал голые данные.
Как я понял, IDA не может дизасмить ром непосредсвенно.
Но коли так, то как используя отладчик FCEUD (или его модификации)
можно ей подсказать?
Что смущает - не понятно, как и когда мэппер осуществляет переключение данных в картридже?
Хорошо бы (я искал) найти какой-нибдудь мануал по работе в NES и IDA.
Тот что описан здесь http://griever.magicteam.net/doc/?doc=NES_IDA
не очень понятен. Более того, у меня не получилось сделать дизассемблирование
указанными там методами. Может руки кривые, может я не догоняю?
Наверно, это особенность IDA на x64 системах. В x32 все
продизасемблировалось, плагин отработал нормально.
По крайней мере все можно прочесть или проанализировать.
« Последнее редактирование: 27 Август 2010, 00:35:28 от wizzard »

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #1 : 27 Август 2010, 15:42:51 »
Я про НЕС мало знаю, но не думаю что прям с адреса $8000 начинается, как мне казалось первая идет с $8001.  Наверно это от маперров зависит, а учитывая что мапперы железные, и их было много разных -> везде по-своему.  Насчет неможет дизасмить  - у меня может. (может в том роме с другого банка КОД начинался).
Если интересует именно ром Contra'ы, можешь попрбовать на буржуйских инфу поискать (редактор уровней контры Red Falcon(создатель Trax)).
Насчет FCEUD  - это код/дата логгер как и в fceux214?, мне бы тоже было интересно как прикрутить полученный файл к IDA. (или к чему они его прикручивали?)

Добавлено позже:
Наверно, это особенность IDA на x64 системах. В x32 все
а ты посмотрел что в папке IDA/loaders  по 2штуки их?  *.ldw и *.l64.   По-крайней мере те лоадеры, что уменя 32 битные.  (хотя может ты из сорса компилил?)

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #2 : 28 Август 2010, 11:05:15 »
Поковырявшись обнаружил такую интересную закономерность. Не вся графика ей подчиняется, но кое-что подчиняется.
Идет сжатый кусок. Он заканчивается байтом 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_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #3 : 28 Август 2010, 11:19:36 »
А можно ли как-то в отладчике узнать, что
происходит чтение именно с этого смещения в РОМЕ? То есть задача: есть смещение в роме, нужно найти смещение в памяти.

И много чего не достает в отладочных целях.
не совсем понял что ты имеешь ввиду, но мне больше всего не хватало раздельно чтение данных (read), а не pc (кода), также как на Сеге в Gens'.  Там дебаг на PC срабатывает только на код, а дебаг на чтение только на данные (при этом показывает оффсет с какого чтение прошло и оффсет кода), а вот на nes нельзя так.

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #4 : 28 Август 2010, 11:42:08 »
Как я понял, Сега не "сегментирует" память. Там есть 4 мегабайта - и все это в 1 сегменте. Оно и понятно - процессор 16 бит, может адресовать все сразу.
А на NES максимум 1 сегмент - 0хFFFF, или 64К. Вот по этому мэпперы и придумали. Он как бы "подсовывает" процессору нужный кусок кода.
В ROMе они идут 1 за другим, а вот в память загружаются....причем за 1 кадр может быть и 100 переключений между разными кусками (банками) кода.
И как определить откуда он читает?....
Я знаю, что есть исходники того же GENS, и можно дописать что нужно. Или сдампить нужные куски.
Но я не особо вникал, как устроена Сега. Мне кажется очень похоже на NES.
« Последнее редактирование: 28 Август 2010, 11:44:59 от wizzard »

Оффлайн ZURG

  • Пользователь
  • Сообщений: 22
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #5 : 28 Август 2010, 12:23:59 »
Цитата
И все равно нужного функционала не достает! Например, везде в манах пишут - щелкните
правой кнопкой на 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

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #6 : 28 Август 2010, 12:48:01 »
В SPR-RAM (она 256 байт) хранятся атрибуты спрайтов. 64 записи по 4 байта каждая. Именно этим объясняется лимит спрайтов на 1 строку развертки.
За совет спасибо. Я думал там смещения в РОМе, (гыыыыы). А ROM же в памяти! И грузится с адреса 0x8000.
А я уж хотел было байты портить.

Оффлайн ZURG

  • Пользователь
  • Сообщений: 22
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #7 : 28 Август 2010, 13:28:22 »
В SPR-RAM (она 256 байт) хранятся атрибуты спрайтов. 64 записи по 4 байта каждая. Именно этим объясняется лимит спрайтов на 1 строку развертки.
Область в RAM $200-$300?

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #8 : 28 Август 2010, 15:51:16 »
Она на прямую в память не отображается. К ней доступ только через регистры PPU или через DMA.
Это память внутри PPU.
> RAM $200-$300?
Не уверен. Но думаю, что логика работы такая. Сначала формируется буфер в обычной памяти,
затем он целиком перекидывается в SPR_RAM через DMA. Может адрес буфера и такой, но в общем случае
может отличаться.

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #9 : 28 Август 2010, 16:43:05 »
Что смущает - не понятно, как и когда мэппер осуществляет переключение данных в картридже?
И как определить откуда он читает?....
У меня их всего 6. И все программные (есть еще CHR-ROM, но в случае моего рома, этого нет.
ну ты же сам говоришь программные, значит в коде игры есть инструкции обращения к мапперу, правильно я понимаю суть программных банков? вот наверное сразу после их выполнения и переключается.  то есть вопрос в том как их найти?



Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #10 : 28 Август 2010, 16:47:03 »
Читайте и не гадайте: http://dendy.migera.ru/

Оффлайн wizzard

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #11 : 28 Август 2010, 18:26:15 »
Читал я мигеру. Он пишет, что мэппер один из простейших и обращение к памяти выше 0x8000 есть его рук дело.
И что с того?

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: [NES] Contra. Вопросы.
« Ответ #12 : 28 Август 2010, 19:05:25 »
Плохо читал, раз остались вопросы.