Мне интересно, как NES отображает графическую мышцу. Я исследовал материал в Интернете и читал его, но мне интересно об одном последнем: Nametables.
В принципе, из того, что я прочитал, каждый блок 8x8 в NES nametable указывает на местоположение в таблице шаблонов, в котором содержится графическая память. Кроме того, в nametable также есть таблица атрибутов, которая устанавливает определенную цветовую палитру для каждого блока 16x16. Они связаны между собой следующим образом:
(предполагая 16 8x8 блоков) Nametable, с A B C D = указатели для указания данных:
ABBB
CDCC
DDDD
DDDD
Таблица атрибутов, с 1 2 3 = указателями на данные цветовой палитры, с < ссылаясь на значение слева, ^ вверху и 'слева и выше:
1<2<
^'^'
3<3<
^'^'
Итак, в приведенном выше примере блоки будут покрашены таким образом
1A 1B 2B 2B
1C 1D 2C 2C
3D 3D 3D 3D
3D 3D 3D 3D
Теперь, если у меня это на фиксированном экране - он отлично работает! Потому что разрешение NES составляет 256x240 пикселей. Теперь, как эти таблицы настраиваются для прокрутки?
Так как Nametable 0 может прокручиваться в Nametable 1, и если вы продолжаете прокручивать, Nametable 0 снова обернется. Это я получаю. Но я не понимаю, как прокручивать таблицы атрибутов, а также. Из того, что я читал онлайн, блоки 16x16, которые он назначает атрибутам, будут вызывать цветовые искажения на граничных плитах экрана (как видно при прокрутке влево и вправо и наоборот в SMB3).
У меня есть проблема в том, что я понимаю, как прокручивать nametables, но как вы прокручиваете таблицу атрибутов? Для intsance, если у меня есть зеленый блок в левой части экрана, перемещение экрана вправо должно теоретически приводить к тому, что плитки справа должны быть зелеными, пока они больше не перейдут в рамку, к которой они вернутся их нормальные цвета.
~~~~ EDIT: Я хочу отметить, что я знаю о сканированных линиях X и Y. Эта мысль просто пробежала мой разум.
Скажем, я на scanline Y из 10. Это означает, что я читаю 10 значений в своих nametables, по горизонтали. Это означало бы, что мой первый столбец отключен от экрана, так как он имеет ширину пикселя 8. Однако атрибут цвета остается, так как он имеет ширину 16.
Предполагая, что атрибут цвета для всего столбца зеленый, было бы правильным, если предположить, что для пользователя первые 6 пикселей слева от экрана будут окрашены в зеленый цвет, а самый правый 10 на экране должен быть зеленым также? Итак, был бы ли я прав в своем предположении, что в соответствии с экраном слева?