МЕНЮ
Новости
Переводы
Проекты
Утилиты
Прохождения
Документация
Разное
БАННЕРЫ
Наш баннер
Новая реальность
Emu-Land
RSP - проект по русификации приложений для Symbian
SkatePark
Игры и мультики на FinikPro.narod.ru!
Сайт о легендарной онлайн игре Ultima Online
Langrisser
Сайт об играх от Technos Japan
HotLog
 

 

 

 

 

 

XCALIBUR'S POINTER DOCUMENT
ВСТУПЛЕНИЕ
Ну вот, наконец-то я написал ещё одну доку, на этот раз она посвящена пойнтерам. Разговор пойдёт об изменении 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 - Первый релиз

Перевёл: Jim DiGriz
ICQ: 276340136