Ссылки Команда Главная Форум Гостевая
МЕНЮ
Новости
01.01.2017
Переводы
01.01.2017
Проекты
10.05.2010
Программы
26.05.2012
Документация
26.11.2016
Прохождения
08.05.2011
Разное
07.06.2009
    rss
БАННЕРЫ
Наш баннер
Сайт JurasskPark
Griever Stuff
Новая реальность
Emu-Land
ConsolGames
CHIEF-NET
PSCD.RU
Langrisser
Battletoads
Valid HTML 4.01 Transitional
Правильный CSS!
 

 

 

 

 

Дока о пойнтерах от Xcalibur`a (перевод)

Вступление.


Ну вот, наконец-то я написал ещё одну доку, на этот раз она посвящена пойнтерам. Разговор пойдёт об изменении Lo-ROM SNES пойнтеров.
Чтобы понять, о чём это всё ты должен обладать базовыми знаниями в ромхакинге.

Что есть пойнтер?


Пойнтер - это строка шестнадцетиричных чисел (обычно 2 байта), которая говорит программе, где располагается какой-либо ресурс. Это напоминает команду GoTo в бэйсике. Изменяя пойнтер, ты меняешь место, в котором программа будет искать информацию. Пойнтеры - очень нужная штука, с их помощью можно более качественно переводить игры.

Всё это работает?


Пойнтер - это своего рода указатель. Программа прыгает по указанному адресу и читает байты до байта, означающего конец последовательности, давайте далее называть его стоп-байт.
Вот пример:

Stick[FF]Club[FF]Copper[FF]

Выделенная буква означает место, на которое указывает пойнтер, [FF] - стоп-байт. То есть программа прыгает на это место и читает байты до тех пор, пока не обнаружит стоп-байт.

Пойнтер указывает на первую букву первого слова строки. Например, если мы изменим пойнтер так, чтобы он указывал на букву "o" в слове "Copper", вместо "C", то в игре будет отображаться "opper". Надеюсь, вы поняли, к чему я клоню - с помощью пойнтеров можно изменять длину слов и делать переводы качественнее.

Поиск пойнтера на текст.


Теперь, когда ты знаешь, что такое пойнтер, научимся находить их.

Начнём с того, что у игр для SNES есть 200-байтовый заголовок, это очень важно знать, чтобы потом не ошибиться при поиске пойнтеров.

Теперь попробуем найти пойнтер для текста. Допустим, мы поковырялись в РОМ'е и нашли смещение, с которого начинается текст, пусть это будет 02A840. Теперь от этого смещения отнимем заголовок(200 байт). То есть 02A840 - 200 = 02A640. Теперь убираем первые два символа и получаем A640. И меняем местами оставшиеся два байта (реверс), т.е. у нас было A640, а стало 40A6 - это наш пойнтер!
Теперь ищем 40A6 как шестнадцетиричное значение в РОМ'е, пока не наткнёмся на таблицу пойнтеров. "Как же я её отличу от всего остального!?" - спросишь ты, да очень просто, второй байт будет больше, например:
40A6 40A9 и т.д.

А, вот ещё! Все значения пойнтеров ДОЛЖНЫ быть между 8000 и FFFF. К примеру, 016438. Пусть у тебя получилось 6238. Вот блин это меньше 8000. Тогда нужно добавить 8000 к этому значению. 6238 + 8000 = E238. Теперь сделаем реверс 38E2. Вот и всё, наш пойнтер 38E2.

Физическое расширение SNES ROM'а.


SNES РОМ'ы очень легко расширить. Всё что нужно - это открыть файл в шестнадцетиричном редакторе и добавить необходимое количество байт(FF). Важно, чтобы место, которое добавляешь ДОЛЖНО ПРЕВЫШАТЬ 32Кб или $8000 шестнадцетиричных байт, или 1 банк.

РОМ'ы расширяемые таким способом будут более устойчивы, если будут более 80,000 шестнадцетиричных байт. Ниже, маленькая диаграмма, которая показывает соотношение смещения с пойнтерами и размера РОМ'а:

(Указанные адреса включают 200-байтовый заголовок)

Смещение Размер РОМ'а(Мб)

0801FF 0.5
1001FF 1.0
1801FF 1.5
2001FF 2.0
2801FF 2.5
3001FF 3.0

Ну, вот мы и добрались до конца этого документа, я больше ничего не могу написать. И думаю, что этот документ будет полезен многим начинающим ромхакерам.

Перевёл Jim DiGriz, (С) 2004
Оригинал написал Xcalibur

Xcalibur's Pointer Document
Версия 1.1
Copyright 2000 Excalibur Translations

==========
Версии
==========
1.1 - Документ более понятен для простых смертных
1.0 - Первый релиз