| Разработка и ромхакинг > Ромхакинг и программирование |
| Что из себя представляют ромы NES? |
| (1/1) |
| Go6a:
Что из себя представляют ромы NES? 1. Каких они бывают форматов, кроме iNES? И какие форматы ромов встречаются чаще всего? 2. Отсюда http://nesdev.parodius.com/neshdr20.txt я понял, что формат iNES содержит заголовок, состоящий из нескольких секций и сам дамп картриджа. Но я не совсем понял, сколько байт отводится для заголовка. |
| Guyver(X.B.M.):
Размер "заголовка" на NES - 10h |
| Go6a:
Я открыл в HEX-редакторе ром Battle City (во вложении), значит первые 16 байт - заголовок, а байты начиная с 10h - это уже пошёл дамп картриджа? Получается, что первые адреса дампа картриджа занимает предложение "COPYRIGHT 1981 1985 NAMCO LTD. ALL RIGHTS RESERVED RYOUITI OOKUBO TAKEFUMI HYOUDOUJUNKO OZAWA "? Я правильно понимаю? |
| Guyver(X.B.M.):
Да... |
| Go6a:
Каким образом процессор (CPU) NES начинает выполнение заданной программы? Как я понял, сразу после включения приставки, программный счетчик (PC) устанавливается в какое-то исходное значение, которое затем изменяется согласно ходу программы/ветвлениям/прерываниям. 1.Каково же это исходное значение программного счетчика? 2.Существует ли какой-нибудь эмулятор/дизассамблер/отладчик, позволяющий просмотреть содержимое регистров просессора NES, содержимое адресного пространства процессора? Который может пошагово выполнять операторы. |
| HoRRoR:
1. http://dendy.migera.ru/nes/g01.html - прерывание RESET. При включении/сбросе PC устанавливается на указанный в векторе этого прерывания адрес. 2. FCEUXDSP, например. |
| Go6a:
Спасибо! Запустил в отладчике всё ту же Battle city в пошаговом режиме. После выполнения прерывания RESET PC становится равным C070. До выполнения команды, расположенной по адресу c073 все понятно. Дальше есть пара непоняток: 1. Результатом команды STA $2000 должно стать появление по адресу $2000 значение, находящееся в аккумуляторе ($10). А в результате все значения с $2000 до $3fff приняли значение $10 (кроме 8 и 16 байтов в каждом наборе из 16 байтов). Почему? Это первая непонятка. 2. По адресу с07с находится команда BPL c079 (если флаг N == 0, тогда переход по адресу c079). Но флаг N всегда равен нулю, для пробы нажал на кнопку STEP отладчика наверно больше сотни раз и ничего. Программа крутится в цикле c07c < - > c079. Почему так получается? Систему команд брал отсюда: http://dendy.migera.ru/nes/g11.html |
| HoRRoR:
1. Смотри всё по той же ссылке карту памяти. Адрес $2000 представляет собой регистры видео (8 байт), далее до $4000 идёт отражение этой памяти. Здесь про регистры PPU. 2. Видимо, ждёт прерывания NMI. Смотри в регистрах значение $2002. |
| Go6a:
Ага, с видео-регистрами и их отражением вроде разобрался, но там же 8 видео-регистров и мы командой STA $2000 явно обращаемся к первому видео-регистру, записывая в него $10. Почему 2-7 регистры тоже заполняются значениями $10? Никакой команды для их заполнения не было. |
| HoRRoR:
А хз, может вьювер так показывает. У меня в другой версии эмуля по-другому. Всё-таки это не память, а регистры. |
| DeniSS:
--- Цитата: Go6a от 18 Июнь 2011, 16:03:29 ---Ага, с видео-регистрами и их отражением вроде разобрался, но там же 8 видео-регистров и мы командой STA $2000 явно обращаемся к первому видео-регистру, записывая в него $10. Почему 2-7 регистры тоже заполняются значениями $10? Никакой команды для их заполнения не было. --- Конец цитаты --- Потому что там всё отзеркалено 7 раз. |
| Go6a:
Отзеркалены - значит во всех 8 видео-регистрах всегда могут быть только одинаковые значения? Зачем тогда 8 регистров, если бы хватило одного? |
| HoRRoR:
Порты $2000, $2001, $2003, $2005, $2006 вообще только для записи, так что не знаю, что там может отображаться. Возможно, последнее записанное в любой порт значение. Ничего там не отзеркалено, иначе бы запись/чтение любого из 8-ми байт давало бы один эффект. |
| perfect_genius:
Есть ли стандарт структуры рома? Типа, первая треть - RAM, вторая - VRAM...? Читал, но так и не понял - от маппера может зависеть строение-расположение данных? Просто я собираюсь восстановить исходники одной игры, вот и интересно, есть ли какие-то общие элементы или каждый ром уникален. Заранее спасибо. Добавлено позже: А, вот типа так: --- Цитата ---Маппер - MMC3, PRG-ROM 512Bytes, CHR-ROM 256KBytes, W-RAM 8KBytes --- Конец цитаты --- Т.е. узнав маппер, я смогу сразу перейти к этим разделам, "поделить" ром на части? Добавлено позже: Удивительно, но кажется нашёл в соседней теме :lol: Так вот, когда процессор получает 16 битов некоего адреса, ему надо их расшифровать и определить, к какому виду памяти это относится (ОЗУ, ПЗУ, порты, а может вообще SRAM для сэйва). Так что процессор по первым нескольким битам определяет тип устройства, а по оставшимся битам - адрес ячейки внутри этого устройства. Расшифровка идёт слева направо (со старшего бита к младшему). Если самый первый бит (на позиции A, см. выше) равен единице, то мы явно имеем дело с ROM, так что отбрасываем старший бит и оставшиеся 15 битов являются адресом ячейки на картридже. В итоге на картридже можно адресовать 0000-7FFF - это 32 килобайта. Если 32к игре мало, она использует мапперы, ловко подменяя содержимое этих тридцати двух килобайтов. Но если бит на позиции A равен нулю, то надо расшифровывать дальше. Берём бит на позиции B. Если он равен единице то мы имеем дело либо с портами звуковухи, либо с карточкой сохранения (это уже определяется по биту на позиции C - если он равен 1, то используем SRAM, если 0, то APU). А вот если бит B равен нулю, то мы имеем дело либо с оперативной памятью, либо с портами видеокарты. Это можно определить по биту C - если он равен 1, то используем PPU, если 0, то RAM. |
| Навигация |
| Главная страница сообщений |