Chief-NET

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Chief-NET » Базовый хакинг » Вопрос о поинтерах


Вопрос о поинтерах

Сообщений 1 страница 11 из 11

1

Прочёл на форуме Шедевра следующее: "...это снесовская игра, абсолютных указателей тут и в помине нет."

Ничего не буду говорить в адрес автора (чтобы меня ещё раз неправильно поняли, нет уж увольте), расскажу о поинтерах NES и SNES.

NES:
так как адресное пространство приставки ограничено 64 килобайтами, то двухбайтовые указатели полностью его перекрывают и дают возможность сослаться на любую ячейку памяти, а отсюда следует вывод, что относительные ДВУХБАЙТОВЫЕ поинтеры здесь нерациональны, так как ведут к появлению дополнительных вычислений адреса (лично я ни разу не встречал в играх на NES относительных поинтеров).

SNES:
здесь немного сложнее, так как адресное пространство составляет 16 мегабайт и для его покрытия нужны трехбайтовые указатели, а в играх с большим количеством текста это приведёт к лишним затратам на третий байт указателя. Да, здесь используются относительные поинтеры. Но и трехбайтовых отсюда выкинуть нельзя, а так как структура памяти SNES, построена таким образом, что ром хранится не в начале, а в конце адресного пространства, обычно с адреса 0xC00000, то для того, чтобы привязать поинтеры к рому, от их значений следует отнять эту величину.
Но не стоит путать эти указатели с относительными, так как они указывают напрямую на ром в памяти приставки, а не на адрес в хекс-редакторе, относительные же потому и называются относительными, что указывают на место в памяти относительно определённого адреса, который явно должен присутствовать в памяти в момент использования относительного поинтера.
И вот, что я ещё хочу сказать: абсолютные поинтеры не только присутствуют в играх на SNES, но и интенсивно используются (особенно в больших играх).

Многие просто путают адресацию в памяти с адресацией в файле и вводят в заблуждение других.

2

Поправки:
NES: Относительнытельные указатели встречаются ОЧЕНЬ часто.
SNES: Может кто-то путает абсолютные указатели со смещением из-за заголовка с относительными?

3

NES: Относительнытельные указатели встречаются ОЧЕНЬ часто.

? Надо бы пример привести, а то я чувствую вы друг друга не поняли...

4

1: Да, HoRRoR, приведи, пожалуйста, пример относительных поинтеров на NES.

2: Нет, заголовок тут не причём. Игра не имеет заголовка (в идеале), в смысле когда она хранится в памяти никакого заголовка там нет. (и как я уже писал: поинтер - это значение адреса в памяти приставки, а не в хекс-редакторе)

5

1: Да, HoRRoR, приведи, пожалуйста, пример относительных поинтеров на NES.

LNB, FF1, EarthBound...

2: Нет, заголовок тут не причём. Игра не имеет заголовка (в идеале), в смысле когда она хранится в памяти никакого заголовка там нет. (и как я уже писал: поинтер - это значение адреса в памяти приставки, а не в хекс-редакторе).

Я имею ввиду, что может кто-то путает абсолютные указатели у файла с заголовком с относительными(из-за сдвига заголовка).

6

В LNB (как минимум) не используется банкование блока с текстом, впервые вижу игру такого типа.
Не мог бы поконкретнее описать, как используются поинтеры в FF1 и EarthBound?

Я имею ввиду, что может кто-то путает абсолютные указатели у файла с заголовком с относительными(из-за сдвига заголовка).

Может, но это совсем уже надо быть "того", так как относительные используются на большом расстоянии от начала адресации (и начинаются обычно с нулевого смещения), а не в 512-ти (или 16-ти!) байтах от него.

Да, и ещё: на SNES часто используются двухбайтовые указатели, которые приводятся к абсолютным без каких-либо арифметических действий, путем простой записи в память рядом со старшим байтом, указывающим нужный блок (например, XX XX F0, где "ХХ ХХ" - переменный поинтер).

7

В LNB (как минимум) не используется банкование блока с текстом, впервые вижу игру такого типа.
Не мог бы поконкретнее описать, как используются поинтеры в FF1 и EarthBound?

К поинтерам прибавляется/отнимается определённое значение.

8

К поинтерам прибавляется/отнимается определённое значение.

:o  НЕТ! В случае LNB поинтер указывает на абсолютный адрес в PPU памяти (поэтому биты имеют прямой порядок (как в чипах Мотороллы 6800, 6809, 68000) - о пайплайнинге тут речи не идёт. Уже из PPU текст копируется в RAM. Поэтому только для простоты можно считать, что к нему что-то прибавляется, но с технической точки зрения указатели абсолютные.

EarthBound: Там вообще всё нормально: поинтеры показывают непосредственно на начало данных в RAM. Всегда. Ну, кроме последнего случая, с которым ты разбирался - там поинтеры ни при чём.

FF1: Тут уж совсем не понял: всё же стандартно! Указатель на фразу самого первого охранника (The King is looking...): 0х28072, что соответствует расположению текста в RAM ($8E04)

9

FF1, указатель на фразу:
~
And so, their^
journey begins....\
Адрес указателя ~36810
Адрес фразы ~36842

10

Ну! Всё верно... Я, правда, замучался таблицы делать, поэтому буду говорить про байты:
Адрес фразы ~36842 - это фраза (01 8A 3B 24 B2 BF 1B 1D) в момент вывода текста располагается по адресу $a832 в RAM. Указатель по адресу 0x36810 имеет значение $32 $A8.
Указатель абсолютный.

11

Ладно, вам видней, не буду спорить :)


Вы здесь » Chief-NET » Базовый хакинг » Вопрос о поинтерах