Разработка и ромхакинг > Ромхакинг и программирование
Что из себя представляют ромы 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.
Навигация
Главная страница сообщений

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