Некоторые аппаратные и программные решения 8-битной и 16-битной эпох иногда огорчают или обескураживают, а иногда вызывают изумление.
В этой теме предлагаю собрать коллекцию таких "фичебагов", кто что знает, кто что помнит, кто что прочитал или подсмотрел в ютубчике.
ОГЛАВЛЕНИЕ
Видеостраницы в NES/Dendy
VBlank и HBlank на примере Famicom/NES/Денди
Mode 7 (SNES)
Архитектура памяти в NES/Dendy
Мапперы NES/Dendy
О количестве тайлов и спрайтов в NES/Dendy
Видережим HAM в компьютерах Amiga
Sega Mega Drive против Super Nintendo Entertaiment System с точки зрения разработчика / процессор
Имитация двух задних фонов на NES/Dendy
Чипы расширений на SNES
Имитация двух вращающихся слоёв в SNES
Чип расширения Sega Mega Drive
Архитектура видеочипа Sega Mega Drive (+трюки с ним в нескольких играх)
Архитектура видеочипа SNES (+сравнение с Sega Mega Drive)
Сосуществование RAM и ROM в Commodore 64
О музыке
Про звук на примере Sega Mega Drive и SNES
О видеочипе ПК Apple 1
История архитектуры популярных микропроцессоров — семейство Intel/Zilog
История архитектуры популярных микропроцессоров — семейство Motorola/MOS/WDC
Раскладка видеопамяти в аркадном автомате Pacman
Графическая архитектура Famicom/NES/Денди
Небольшое исследование Hisoft-C на ZX Spectrum
Механизмы программно-аппаратного расширения ZX Spectrum
Процессор Sharp LR35902 из Game Boy
Библиотека калькулятора ZX Spectrum
Gigatron TTL microcomputer
Почему у ZX Spectrum нелинейная раскладка видеопамяти
Скроллинг в Commodore 64
Мощь бейсика BBC Micro
Переключение банков видеопамяти в Famicom/NES/Денди на примере игры Contra Force
Обзор архитектуры Game Boy и Game Boy Color
Ссылка на набор программистских трюков и приёмов для ZX Spectrum
Краткое описание видеорежимов ZX Spectrum Next
Законорожденные дети и внуки Zilog Z80
Подводные камни скроллинга на Famicom/NES/Денди
SWEET16
Новые инструкции процессора в ZX Spectrum Next
Виртуальный байткод Koei
Искра-226 и Wang-2200
Как ZX-Spectrum хранил данные на кассетной ленте
Famicom/NES/Денди: битва за Status Bar
Обзор архитектуры бортового компьютера КК Аполлон
(помните, что иногда текст не влазит в один комментарий и растягивается на два и даже более)
Аналогичная тема про 32/64-битные консоли находится тут: http://www.gamedev.ru/flame/forum/?id=231027
Филиалы так же есть на дирти и http://hype.retroscene.org/
На сеге некоторые игры умудрялись менять палитру во время hblank прерывания, и все что ниже рисовалось с другой палитрой.
=A=L=X=
> Однако без особого труда можно вспомнить и игры с произвольным скроллингом
Я помню, что в Adventure Island экран мог скроллиться в двух направлениях - при подъеме на гору, к примеру, и при этом в углах экрана появлялся мусор.
Видеостраницы в NES/Dendy
Некоторые аппаратные и программные решения 8-битной и 16-битной эпох иногда огорчают или обескураживают, а иногда вызывают изумление.
В этой теме предлагаю собрать коллекцию таких "фичебагов", кто что знает, кто что помнит, кто что прочитал или подсмотрел в ютубчике.
Затравочную фичу зачну с незабвенной Денди/NES/Famicom:
По моим всем впечатлениям её когда создавали, то не предполагали, что она будет использоваться для тех игр, которые на ней с середины срока жизни появились - произвольные скроллеры, черепашки и черные плащи - это явно было за гранью воображения людей, которые аппаратный дизайн денди сотворили. Смотрели они и думали в реалиях своего года, когда только-только отмерли всякие ColecoVision и прочие "видеотеннисы".
По сути те китайские многоигровки, которые с приставками обычно в комплекте в коробке шли - они содержали именно игры о которых думали и заботились разработчкики платформы - все эти танчики, галаксианы, бомбермены, лоад раннеры и т.п.
Так, например, видеочип денди мог делать плавный скроллинг заднего фона, но в сердце видеочипа он мог это делать бесшовно либо по вертикали либо по горизонтали, но не оба метода сразу.
Причём как это всё выглядело технически... выглядело вот так:
+--+--+ |01|02| +--+--+ |03|04| +--+--+
Что тут изображено: каждый экран вмещал 32x30 тайла 8x8 пикселей каждый.
Но в видеопамяти было места под целых 4 "видеостраницы" такого размера (32x30 байта + доп. информация, которая здесь неважна, всего 1024 байта на страницу), каждый байт содержал индекс выводимого тайла собственно от 0 до 255, таким образом одновременно фоны не могли отображать больше 256 разных тайлов одновременно без модернизации консоли (которая была возможна, но об этом в следующий раз).
Так вот - при всём при этом можно было "прокручивать" отображение видеостраниц на экран и если сильно выйти за пределы одной видеостраницы, то на экран начинало выводится содержимое соседней - ровно как изображено на рисунке выше, 4 видеостраницы образовывали виртуальную сетку 64x60 тайла, т.е. правее видеостраницы 01 находится видеостраница 02 и она станет видна, если немного проскроллить экран вправо от начальной позиции.
Однако проблема была в том, что в денди было встроено памяти только на первые 2 видеостраницы - 01 и 02, плюс к этому можно было включить альтернативный режим маппинга, который располагал видеостраницы иначе:
+--+--+ |01|03| +--+--+ |02|04| +--+--+
...и вот так и получилось, что либо так либо эдак, но скроллить бесшовно можно или влево-вправо или вверх-вниз, если проскроллить так чтобы стали видны все 4 видеостраницы, то в двух из них будет содержаться мусор, т.к. в консоли просто не выделено под них было видеопамяти.
Если повспоминать, то хвосты этого факта вылезут в очень многих играх, например - Черном плаще - она всегда скроллилась только в одном направлении, лишь иногда меняя направление скролла в особых переходных угловых экранах. То же самое было в контре, чипе и дейле и многих других. В моменты "перегиба" видепамять перестраивалась под 01/02 или 01/03 для горизонтального или вертикального скроллинга соответственно, только быстро, чтобы сохранить иллюзию бесшовности.
Однако без особого труда можно вспомнить и игры с произвольным скроллингом - такие были. Как же так?
И секрет тут довольно таки лобовой, но несколько неожиданный - в таких играх картриджи содержали в себе 2Кб RAM, которая маппилась ими на 3-ью и 4-ую отсутствующих в самой консоли памяти видеостраниц. Вот и всё. Т.е. для произвольного скроллинга картридж должен был расширять аппаратную недоработку консоли содержа необходимую память в себе.
Вообще эмуляция денди невозможна без эмуляции аппаратной начинки еще и картриджей - их центральным чипом являлся так называемый "маппер", который как раз, помимо своего прямого назначения - маппинга ROM картриджа в адресное пространство консоли мог содержать довольно замысловатую логику для аппаратного расширения возможностей консоли.
VBlank и HBlank на примере Famicom/NES/Денди
Видеочип Famicom/NES/Денди формировал изображение для электронно–лучевой трубки телевизора, поэтому это самое изображение формировалось в нескольких чередующихся фазах. Сперва начинали рисоваться строки пикселей сверху–вниз слева–направо — при этом период пока рисуется весь набор строк называют VDraw (vertical draw — вертикальная отрисовка). Каждый период VDraw циклически состоит из отрисовок отдельных строк — HDraw (horizontal — горизонтальная отрисовка), каждая из которых сменяется периодом возврата луча на следующую строку (HBlank — обратный ход строчной развёртки). Когда же все строки кадра отрисовались следует период VBlank (обратного хода луча), пока кинескоп "отдыхает", после чего начинает рисоваться следующий кадр.
Видеочип денди настолько плотно занимал шину видеопамяти во время VDraw, что почти полностью блокировал доступ к ней центральному процессору, поэтому последнему приходилось успевать обновлять содержимое её во время периода VBlank — если он не успевал это сделать, то фпс падал минимум в 2 раза — что можно было заметить в такой игре как Contra Force.
Характерно, что периоды VDraw/VBlank из–за этого факта использовались во всех играх в качестве таймера отсчитывающего темп хода игры и даже скорости воспроизведения музыки — отчего игры разных регионов могут работать со слегка разной скоростью — дело в том, что у американской системы телевидения NTSC обновления кадров происходят 60 раз в секунду, в то время как у европейской PAL — 50 раз.
С HBlank же связана одна весьма распространённая техника, как я её называю для себя "HBlank–отсечения".
Видеочип денди был несколько ограничен — он мог отрисовывать только один скроллящийся фон состоящий из плиток тайлов, а над ним до 64 спрайтов 8x8 или 8x16, но при этом еще не более 8 спрайтов в одной строке — превышения терялись. Чтобы побороть проблему 8 спрайтов в строке игры нередко начинали рисовать их в разном порядке, тогда они характерно "перемигивались", но были видны все (хоть и по очереди).
Единственный задний фон тоже создавал проблемы — так как он скроллился как единое целое, то возникал вопрос — как, например, реализовать панель с игровой информацией — "status bar"? Вот для этого и был использован период HBlank — во время него центральный процессор мог успеть изменить то как и куда прокручен задний фон и в результате создать горизонтальный "разрыв" его отображения, что выглядело как независимо скроллящиеся куски изображения.
Например в игре Bomberman задний фон в видеопамяти выглядел вот так:
Но изображение на телевизоре выглядело вот так:
Здесь видно, что первые три строки тайлов "приклеены" к верхней части экрана для вывода статистики, на границе же с полем происходит "разрыв" через HBlank–отсечение и параметры прокрутки меняются во время обратного хода луча, чтобы выводить плоскость с лабиринтом в нужном месте.
В железе самой денди возможно было сделать только одно HBlank–отсечение за кадр с помощью так называемого zero–sprite–hit. Чтобы делать сразу много HBlank–отсечений за кадр приходилось расширять способности консоли посредством чипов на картриджах — так называемых мапперов.
Самый известный такой эффект — так называемый "параллакс" — когда части заднего фона прокручиваются по горизонтали с разной скоростью, видно на первой гифке этой статьи на примере игры Vice (Gundec). Там же видно, что в Vice кроме этого на данной технике еще сделали эффект колыхающейся воды — перехват HBlank у неё происходит в каждой строчке.
Как должно быть понятно такие "нарезки слоёв" могли были быть выполнены только по горизонтальным границам, поэтому применения HBlank–отсечений нередко были довольно изобретательны. Вот, например, босс в игре Chip & Dale 2 (если сам не перемотает — перемотать на 9:22):
Спрайты такого большого размера на денди невозможны — на самом деле босс этот это большой кусок заднего фона, выводящийся над полом с другими параметрами прокрутки, создающими иллюзию его самостоятельного движения. Это объясняет почему этот босс не выводится поверх другого заднего фона — это просто невозможно. Другой босс игры — привидение идёт чуть дальше (если сам не перемотает — перемотать на 5:35):
Тут задний фон со свечами подменяется опять таки подвижным слоем с боссом, чтобы создать ненавязчиво иллюзию, что этот задний фон есть — но на самом деле эти "выключения света" созданы исключительно из–за технических ограничений консоли.
Аналогичным образом был сделан босс–самолёт в игре Contra Force (если сам не перемотает — перемотать на 11:20):
В общем перехват HBlank был существенным инструментом для придания играм на денди зрелищности (и не только на ней).
У спектрума дисплейный адаптер вообще под игры не проектировался, от слова совсем... правда, после смерти платформы, умельцы умудрились запилить вот такое, в том числе и через мухлёж с цветовыми атрибутами во время hblank
0iStalker
Да ладно не проектировался под игры? Просто игры, под которые он проектировался, далеки от "платформеров". Под маникминеров он проектировался ;)
Dexus
Ну что правда то правда - в ZX Spectrum 16/48 не было ни одной чёртовой аппаратной особенности, которая бы помогала делать видеоигры. Ни одной. Наоборот - все его аппаратные особенности как правило мешали делать видеоигры, являлись своеобразными препятствиями разной степени.
В пику этому можно вспомнить его прямого конкурента на поприще массовых и дешевых 8-битных персоналок - Commodore 64.
В коммодоре под RAM могли быть отведены все 64Кб памяти ПК (вместе с видеопамятью), верхние 24Кб могли просто переключаться на банки ПЗУ - причём по отдельности каждый - 8Кб под простейшие процедуры ввода-вывода (считай что BIOS), 8Кб под дефолтный charset ASCII и 8Кб под интерпретатор бейсика. Т.е. по пожеланию игра могла отключить ненужный ей BASIC и перевести занятую им память в режим ОЗУ или дефолтную кодировку символов или BIOS.
В то же время видеоадаптер коммодора поддерживал целых 5 разных видеорежимов три из которых по сути своей были тайловыми видеорежимами с аппаратно скроллящимся тайловым задним фоном и 8 аппаратными спрайтами - довольно таки похоже на денди - причём можно было в вышеупомянутом HBlank эти 8 спрайтов можно подменять на лету в разных строках и иметь больше 20 независимых аппаратных спрайтов на экране.
Т.е. скроллеры - да ради бога. Спрайты - да вот они. Аппаратно,
Спектруму такое не снилось - графоний в играх был очень дёрганным, 16Кб памяти было намертво "откушено", видеорежим один единственный и неудачный для скроллеров, очень большой и неповоротливый по объёму.
Ну и не говоря еще о звуковом чипе, который сейчас называют чиптюном, тоже был сразу в коммодоре-64, а у спектрума появился только в старшей модели с 128Кб, а до того он щеголял однобитовым спикером, который редко мог чего кроме потрескивания в видеоиграх.
Так что да, Spectrum явно делался по принципу "дешево и сердито" - он был дешевле коммодора и видеоиграм в процессе проектирования внимание если и уделялось, то по остаточному принципу.
=A=L=X=
Спектрум именно что разрабатывался как "дёшево и сердито", и никакие доп. сопроцессоров не было - все эти штуки были за счёт CPU. В то же время сам CPU был быстрее чем коммодоровский, благодаря этому он и тянул игры. И благодаря этому те же 3D игры в нем куда играбельнее. Нельзя сказать что он не проектировался для игр. Просто таких узко специализированных архитектурных решений не было. Ради удешевления. Те же приставки у нас имело гораздо меньше подростков, чем спектрумы. А клммодор вообще был у единиц - больше штуки баксов в те времена.
Просто к слову- порты игры R-Type. Сравни. Как раз с к спектруму с его биперными шедеврами как в Chronos, "блеск и нищета" относится как нельзя лучше чем любая другая платформа, бывшая в России.
Dexus
> Спектрум именно что разрабатывался как "дёшево и сердито",
Настолько дёшево и настолько сердито, что видеопамять работала на пониженной частоте, что добавляло разработчикам фана, в процессе работы. Этот недостаток, выправили только в модели с 128к оперативки и музыкальным сопроцессором. В общем-то, разрабатывали его как офисный комп, отсюда заточка под знакоместа и аппаратное мерцание для реализации текстового курсора.
Dexus
> В то же время сам CPU был быстрее чем коммодоровский
А вот нет, по сути MOS6510 это расширенный 6502, который таки даже на меньших частотах был быстрее, чем Z80 за счёт режимов адресации в первой странице оперативки.
Dexus
> Те же приставки у нас имело гораздо меньше подростков, чем спектрумы.
ЧОООООООООООООООООООООО
в каком году?
SuperInoy
Начало 90х.
0iStalker
> Настолько дёшево и настолько сердито, что видеопамять работала на пониженной частоте,
Да, такова цена дешевизны. Память одноканальная, для развёртки когда читается, процессор ставится на HALT. И в 128к версии это неизменно. Единственное что вторую страницу добавили, но это вообще мало кто использовал.
> который таки даже на меньших частотах был быстрее, чем Z80 за счёт режимов адресации в первой странице оперативки.
Ерунда.
Это очевидно на любых 3D играх. И не помогает даже двойная ширина пикселей (что их почти в 2 раза меньше чем в спекки)
Dexus
> Начало 90х.
Ну в начале да, а уже ближе к середине приставок было в разы больше.
SuperInoy
> Ну в начале да, а уже ближе к середине приставок было в разы больше.
Может во всяких столицах.
Dexus
> Может во всяких столицах.
Cкажу по другому, не приставок, а конкретно dendy. Их было дохренилион.