logo

Указатели NES

Сразу надо сказать, что эта дока не несёт почти никакого практического значения. А посему - все те методы о которых я говорю не стоит воспринимать как руководство к действию. Проще и, уж точно, в десятки раз быстрее найти и поинтеры и их значение простой отладкой кода, благо инструменты, которые появились в последнее время, отличнейшие. Не чета тем, что были во времена написания всех документов для начинающих.
Эта дока предназначена исключительно для лучшего понимания, что такое поинтеры на NES и просто раскрывает принципы действия всех тех методов, что описываются в литературе для начинающих. Она для тех, кто хочет по-настоящему понять что такое “указатель” (в дальнейшем, будем подразумевать, что поинтер и указатель - одно и то же).
Итак, начнём.

  1. Так всё-таки, что такое указатель?
    Сразу надо предупредить, что большая часть того, что здесь написано, успешно объяснена CaH4e3’ом в своей доке, поэтому я написал эту главу для тематической целостности документа. Еще, может, кому-то будет любопытно взглянуть на это под другим углом
    Для того чтобы загрузить текст на экран, его необходимо впервую очередь скопировать из РОМа в оперативную память приставки, чтобы с ним можно было работать (прочитать, скопировать, и т.д.)
    Начнём с азов: Оперативная память NES(далее будем называть RAM) имеет размер в 64Кб (0000-FFFF), причём вторая половина(8000-FFFF) зарезервирована под куски РОМа (далее ROM). Т.е. именно сюда и копируется текст прямо в том виде, как он находится в ROM’e. В далёкие времена Супер Марио этого пространства хватало, чтобы скопировать в него весь ROM и работать с ним дальше как заблагорассудится. Особенно это касалось PRG-ROMa (это весь код и неграфические данные, хранимые в ROM’e)Графические данные хранятся в CHR-ROMe. Просто рассматривайте образ, который загружается в эмулятор в виде двух файлов(CHR и PRG ROM’ов) сложенных вместе. Очень скоро разработчики столкнулись с тем, что данных становилось все больше, а память оставалась прежней - всё те же 32Кб. Поэтому были спроектированы специальные составляющие картриджей, которые на уровне железа разбивали целиковый большой PRG или/и CHR ROM’ы на части (в дальнейшем, будем называть их банками). Они же подсовывают те банки, которые нужны игре в данную наносекунду в разные части RAM’a. Что касается размеров банков, то PRG ROM’ы разбиваются на банки по 16Кб, а CHR ROM’ы - по 8Кб (по крайней мере, так дела обстоят в наиболее распространённой системе формата файлов ‘.NES’). Однако у разных мапперов возникают свои нюансы. Например, всеми любимый маппер MMC3 может оперировать двумя CHR банками по 8Кб. Итак, текст, стараниями маппера, оказывается в одном из банков RAM’a. Теперь, предположим, подошёл момент вывода этоготекста на экран. Как нам скопировать первую букву (точнее, её индекс) в область тайловых карт PPU? (что там происходит, нас не интересует - текст выведется на экран). Загрузить ячейку, содержащую эту букву. Однако адрес этой ячейки представляет собой 16 битное число (word/слово): как уже упоминалось выше, адреса могут быть 0х8000 - 0xFFFF. Которые представляются в виде двух байт: например 80 00 или FF FF. Как процессору узнать, какой адрес нужно загрузить? Для этого в системе команд процессора имеются команды типа LDA(##),Y LDA(##),X. Вместо решёток можно подставить любое восьмибитное число. Эта команда берёт значение этого байта, потом читает значение следующего сразу за ним байта, скажем##=0x0D, в котором содержится число 0x67, а в ячейке 0х0E содержится число 0x9A, в итоге имеем байты 67 и 9A, соединяя и переворачивая их, получим 0х9A67, и, в конце концов, загружаем в аккумулятор ячейку по данному адресу! (разумеется, если регистры X или Y равны нулю) Вот и выход: используем такую команду, чтобы загрузить первую букву строки: в данном случае она будет располагаться в ячейке RAM’a по адресу 0x9A67. Правда, теперь нам нужно иметь в адресах 0D и 0E два байта: $67 и $9А - непосредственно адрес начала строки в RAM’e.
    Так вот, эти два байта и является указателем! А указывает он ни на что иное, как на расположение первого символа строки в RAMe, чтобы процессор знал откуда ему загружать значение.

  2. Мифы о значениях поинтеров.

  1. Мифы о системах вычислений поинтеров.

    Судя по отечественным и зарубежным документам, различают от трёх до пяти систем вычислений поинтеров. По моему мнению, система-то вообще одна: SetOff X000 - всё остальное либо разновидности её, либо вообще от лукавого =), т.е. не являются системами вообще - просто особый случай нестандартного расположения поинтеров, коих можно найти гораздо больше, чем это описано в документах. Ещё раз повторюсь, что все системы довольно эмпирические, поэтому не несут никакой познавательной или полезной нагрузки. Однако, интересно узнать, откуда все эти системы пошли. Итак, перечислим все системы:

  1. Легенды о SO: