Программирование NES — таблицы имен?

Мне интересно, как NES отображает свою графическую мускулатуру. Я исследовал материал в Интернете и прочитал его, но мне интересно последнее: Nametables.

По сути, из того, что я читал, каждый блок 8x8 в таблице имен NES указывает на место в таблице шаблонов, в которой хранится графическая память. Кроме того, в таблице имен также есть таблица атрибутов, которая устанавливает определенную цветовую палитру для каждого блока 16x16. Они связаны между собой следующим образом:

(при условии, что 16 блоков 8x8) Таблица имен, где 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 пикселей. Теперь, как эти таблицы настраиваются для прокрутки?

Потому что таблица имен 0 может прокручиваться в таблицу имен 1, и если вы продолжите прокручивать таблицу имен 0, она снова перевернется. Это я понимаю. Но чего я не понимаю, так это того, как прокручивать таблицу атрибутов. Из того, что я читал в Интернете, блоки 16x16, которым он назначает атрибуты, будут вызывать искажения цвета на краевых плитках экрана (как видно при прокрутке слева направо и наоборот в SMB3).

Меня беспокоит то, что я понимаю, как прокручивать таблицы имен, но как вы прокручиваете таблицу атрибутов? Например, если у меня есть зеленый блок в левой части экрана, перемещение экрана вправо должно теоретически привести к тому, что плитки справа также будут зелеными, пока они не переместятся больше в кадр, к которому они вернутся. нормальные их цвета.

~~~~ РЕДАКТИРОВАТЬ: Я хочу отметить, что я знаю о линиях развертки, X и Y. Эта мысль только что пришла мне в голову.

Допустим, я нахожусь на строке Y из 10. Это означает, что я читаю 10 значений в свои таблицы имен по горизонтали. Это означало бы, что мой первый столбец находится за пределами экрана, так как его ширина равна 8 пикселям. Однако атрибут цвета остается, так как его ширина равна 16.

Предполагая, что атрибут цвета для всего столбца зеленый, правильно ли я предположил бы, что для пользователя первые 6 пикселей слева на экране будут окрашены в зеленый цвет, а крайние 10 пикселей на экране также должны быть зелеными? Итак, прав ли я в своем предположении, что судя по экрану, левый?


person Jeffrey Kern    schedule 09.06.2010    source источник
comment
+1 за крутость. Понятия не имею, но ты потрясен, просто спросив об этом.   -  person Stephen Furlani    schedule 10.06.2010


Ответы (5)


Этот сайт Я уверен, что вы уже очень и очень знакомы с ним. Начну с того, что мне никогда не приходилось программировать для NES, но я очень хорошо разбираюсь во всем аппаратном обеспечении Gameboy, которое когда-либо выпускалось, а у NES много общего с GB/DMG. Держу пари, что вам нужно сделать одну из нескольких вещей:

  1. Не прокручивайте таблицу атрибутов. Убедитесь, что все ваши уровни имеют одинаковые цветовые блоки вдоль направления вашего движения. Я предполагаю, что многие игры первого поколения сделали это.

  2. Идите вперед и разрешите ограниченную прокрутку атрибутов — просто убедитесь, что области, в которых происходят изменения, либо частично разделены цветом, либо достаточно разрежены, чтобы изменение не было заметным.

  3. Достаньте свой старый школьный таймер atari 2600 и засеките время записи, чтобы зарегистрировать $2006 в конце обновления HBlank, чтобы выполнить необходимую замену цвета, подождите несколько тиков, затем вернитесь в течение периода возврата HBlank, чтобы левый край следующего линия не затрагивается. У меня есть ощущение, что это решение используется чаще всего, но без действительно хорошего эмулятора и терпения это будет занозой в заднице. Это также немного поглотит ваше общее использование ЦП, так как вам придется ждать в прерываниях на нескольких строках сканирования, чтобы добиться эффекта.

Хотелось бы, чтобы у меня был более конкретный ответ для вас, но, надеюсь, это немного поможет. Слава богу, у GB/DMG была немного более продвинутая система прокрутки. :)

person Michael Dorgan    schedule 11.06.2010
comment
На самом деле, ничего из вышеперечисленного. Атрибуты прокручиваются вместе со своими таблицами имен, поэтому настройка прокрутки так же проста, как запись в два регистра. Большинство игр обновляют свои таблицы имен по шву, т.е. совсем не сложно. Игры, которые прокручиваются вдоль одной оси, помещают этот шов за пределы экрана, но игры, которые прокручиваются по двум осям (например, SMB3), не имеют достаточно памяти для этого, поэтому их шов проходит вдоль видимых краев экрана. Из-за этого края выглядят блестящими. - person Pubby; 31.05.2016
comment
Ах, старое оборудование и его причуды - спасибо за этот комментарий. - person Michael Dorgan; 04.06.2016

Как в Super Mario Bros. 3, так и в Kirby's Adventure при прокрутке отображаются цветовые артефакты на краю экрана. Я считаю, что обе игры устанавливают бит, который закрывает левые 8 пикселей экрана, поэтому 0-8 пикселей будут затронуты в любом кадре.

Если я правильно помню, Kirby's Adventure всегда пытается поместить столбцы с цветными сбоями на той стороне экрана, которая прокручивается, чтобы сделать их менее заметными. Я не думаю, что эти артефакты можно предотвратить, не переключаясь на вертикальное зеркальное отображение, которое само по себе создает трудности.

Отказ от ответственности: прошло пять лет с тех пор, как я написал код для NES.

person mvanbem    schedule 11.06.2010

Каждая таблица имен имеет свою собственную таблицу атрибутов, поэтому при прокрутке от одной таблицы имен к другой не должно быть графических артефактов. Тип сбоя цвета, о котором вы говорите, на самом деле является проблемой только в том случае, если ваша игра прокручивается как по вертикали, так и по горизонтали. У вас есть только две таблицы имен, поэтому прокрутка в обоих направлениях требует каннибализации видимого экрана. Существуют различные решения этой проблемы, краткое изложение которых можно найти в этом посте nesdev:

http://nesdev.parodius.com/bbs/viewtopic.php?p=58509#58509

person tummai    schedule 30.12.2010

Этот сайт может чем-то помочь. http://www.games4nintendo.com/nes/faq.php#4

(Найдите «Что случилось с $2005/2006?» и начните читать в этой области.)

По сути, кажется, что невозможно добиться идеального пикселя, однако это будут те моменты, которые вам, вероятно, придется изучить.

Хотел бы я быть более полезным.

person FWishbringer    schedule 11.06.2010

Каждая таблица имен имеет свою собственную таблицу атрибутов. Если вы ограничите свой игровой мир двумя экранами, вам нужно будет написать таблицы имен и таблицы атрибутов только один раз. Сложности возникают, когда вы пытаетесь сделать мир больше двух экранов. Super Mario Bros. 1 делал это, прокручивая вправо, оборачиваясь по мере необходимости и отображая уровень по одному столбцу блоков за раз (16 пикселей) непосредственно перед тем, как этот столбец появлялся в поле зрения. Я не знаю, как можно было бы эффективно кодировать это (имейте в виду, что у вас есть только миллисекунда времени vblank).

person BenW    schedule 30.07.2012