Вступление.
Ну вот, наконец-то я написал ещё одну доку, на этот раз она посвящена пойнтерам. Разговор пойдёт об изменении
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 - Первый релиз