11

Графическая архитектура Sega Mega Drive

Предупреждаю сразу: Пост будет понятен не всем, те кто не в теме - Добро пожаловать отсюда.

Графическая архитектура Sega Mega Drive Длиннопост, Sega, Ретро, Ценители, Видео

Центральный процессор



ЦП у сеги был Motorola 68000 (m68k) первого поколения. Несмотря на то, что он называется нередко 16–битным, это не совсем соответствует действительности. В действительно архитектура m68k с самого начала описывает полноценный 32–битный процессор с полноценными 32–битными операциями и линейным доступом к 32–битному адресному пространству (в первых моделях выведены наружу были только 24 линии шины, но сами адреса всегда были 32–битные и в регистрах и в памяти). Помимо этого он имел 16 (шестнадцать) 32–битных регистров общего назначения! Честно говоря, как по мне, так даже архитектура i386 выглядит немного убого по сравнению с m68k, по крайней мере в те времена. Но почему же m68k назывался 16–битным, а маркетологи сеги нигде не протащили волшебное словосочетание "32 бита"? Потому что в самых первых линейках 16–битным было арифметико–логическое устройство этого процессора — из экономии или из каких–то других соображений, но складывал (и делал прочие операции в АЛУ) 32–битные данные этот процессор в два захода — по 16 бит за раз, что снижало производительность и не давало повода говорить об "32–битной мощи". Однако сложение адресов — например при индексации массивов — уже в первых моделях было 32–битным (АЛУ при этом не задействовалось — складывал адреса блок собственно адресации). Более того, когда более поздние модели m68k обзавелись 32–битными АЛУ — они выполняли уже существующий код с удвоенной скоростью без необходимости перекомпиляции — для программиста 16–битность АЛУ сразу была вещью "за ширмой", скомпилированный код сразу был готов к полноценной 32–битности.


Поэтому у Sega Mega Drive и карта памяти была абсолютно линейной — в самое начало (адреса от $000000 по $400000) отображалось ROM картриджа (максимально — 4Мб), в самом конце (адреса от $FF0000 по $FFFFFF) сидели 64Кб ОЗУ, а между ними болтались неиспользованные диапазоны и порты ввода–вывода.



У конкурента же (вышедшего позднее) — SNES, был настоящий 16–битный процессор Ricoh 5A22, который является немного переработанным клоном WDC 65816, который в свою очередь является 16–битным потомком 8–битного MOS 6502 — того самого, который был ЦП в Famicom/NES/Денди. 16–битность тут подразумевала, например, сегментацию доступа к памяти и прочие неудобности в связи с чем интересно было прочитать один параграф из интервью 1993–его года с новоиспеченной тогда компанией Treasure: http://megadrive.me/2011/11/03/an–interview–with–treasure/


Компания эта вышла из Konami чтобы сделать для Sega Mega Drive нетленку Gunstar Heroes и в этом интервью с их боссом Masato Maegawa, уже после выхода игры, проскакивает такой вот момент (далее мой перевод):



Вопрос: Konami — большой партнёр Nintendo, почему же вы теперь делаете игры для Sega?


Ответ: Меня всегда очаровывало железо. Люди постоянно сравнивают Mega Drive со SNES, говоря, что у SNES больше цветов и тому подобное...


Но Mega Drive имеет процессором 68000, с которым программисту очень легко работать. Я был программистом годы, делая игры для SNES, и поверьте мне — железо это боль в заднице. Если потребитель смотрит на неподвижные скриншоты, то он может подумать, что SNES лучше, но на самом деле если бы вы попытались впихать Gunstar Heroes на SNES, то нифига бы не вышло. Видите этих боссов? На SNES они бы начали тормозить, эти движения требуют слишком много вычислений. Это может быть сделано только на железе Sega.

Графическая архитектура Sega Mega Drive Длиннопост, Sega, Ретро, Ценители, Видео

Впрочем, своё "авторитетное мнение" по теме специальной олимпиады "что круче — Sega Mega Drive или Super NES" я уже давно сформировал и поделюсь им с вами попозже — после аналогичной статьи про собственно SNES, а пока перейдём к графическому чипу.

Video Display Processor (VDP)



Разрешение в пикселях 320x224 в NTSC версии или 320x240 в PAL версии.


VDP имеет 64 Кб выделенной памяти, ЦП к ней может обращаться только через порты ввода–вывода или посредством DMA.


DMA может передать из памяти ЦП (ROM картриджа или RAM ЦП) в память VDP (VRAM) или из VRAM в VRAM, включая режим заливки.


Вообще VDP является сильным апгрейдом видеочипа из 8–битной консоли Sega — Sega Master System, который в свою очередь является апгрейдом видеоконтроллера Texas Instruments TMS9918. В чипе поэтому присутствуют разные видеорежимы, но все они являются устаревшими и в играх на консоли не используются. Поэтому ниже будет описание именно этого "16–битного" видеорежима.



Палитра состоит из 64 слотов в отдельной памяти (Color RAM или CRAM), каждый слот в формате RGB содержит всего 3:3:3 бита, что ограничивает все возможные цвета всего 512 значениями и не более 64 цвета на экране за раз. Хотя есть еще спец–эффект затенения/просветления, что немного расширяет цветовые диапазоны, но в ограниченном числе мест применения. Так как все тайлы всегда 16–цветные, а палитра содержит 64 слота, то её можно воспринимать как массив из 4–х независимых 16–цветных палитр — в спрайтах и плитках фона (в каждой отдельно) содержатся 2ух–битные селекторы из этих 4–х палитр.



Тайлы 8x8 как фонов так и спрайтов располагаются с начала VRAM в 16–цветном режиме (4 бита на пиксель), что требует 32 байта на тайл 8x8 и таким образом всё VRAM может восприниматься как массив из 2048 тайлов. Поэтому индексы тайлов указываемые как в плитках фона так и в спрайтах 11–битные, что позволяет как раз указывать 2048 значений. Нулевой цвет в тайлах обозначает прозрачность, поэтому фактически тайлы хранят 15 цветов — и только если ни спрайты ни плитки фона не закрасили пиксель, то отображается цвет "заднего фона" — его индекс в палитре задаётся в специальном регистре.


Вся VRAM не может быть занята тайлами — нужно еще выделить место под собственно таблицы плиток фонов, таблицу спрайтов и разные вспомогательные вещи — как правило их местоположение внутри VRAM может в широких пределах меняться программированием портов VDP.



Спрайтов возможно 80 штук — их описания хранятся в таблице спрайтов в VRAM — это массив из 8–байтных элементов. Размерности спрайтов по каждой из осей (независимо) могут составлять от 1 до 4 плиток, таким образом от 8 до 32 пикселей. В каждом сканлайне может быть отрисовано не более 20 спрайтов. Забавно что спрайты образуют связный список — каждый хранит в себе индекс следующего спрайта к отрисовке, последний хранит 0.



Всего возможны 2 независимо скроллируемых задних фона/слоя (A и B), которые из себя представляют двумерные массивы плиток по 2 байта на плитку — 11 бит на индекс тайла, 2 бита на селектор палитры, 2 бита на вертикальное/горизонтальное зеркалирование и еще 1 бит на порядок приоритета. Слои плиток могут иметь незавимимые размерности по вертикали и горизонтали кратные 32, но общий объём каждого слоя не должен превышать 8Кб. При скроллинге на экране они проворачиваются через края, что позволяет реализовывать неограниченный скроллинг, как это на консолях принято.


Но сам скроллинг реализован довольно таки любопытно.


Горизонтальный скроллинг каждого из слоёв может производится одним из трёх вариантов на выбор:


1а) указывается смещение прокрутки для всего слоя как целого


1б) указывается смещение прокрутки для каждой линии тайлов (массивом)


1в) указывается смещение прокрутки для каждого сканлайна (тоже массивом)


Вертикальный скроллинг так же предлагает варианты:


2а) смещение всего слоя как целого


2б) массив из 20 смещений отдельно для каждых смежных двух колонок тайлов (то есть образуется 20 столбцов на экране с независимым скроллингом), причём так, как к этому массиву требуется обращаться каждые 16 пикселей, то он для скорости вынесен в отдельный блок памяти — так называемый VSRAM (Vertical Scroll RAM).


Комбинированием типов скроллинга можно добиваться визуально чего то весьма похожего на Mode 7 из SNES, хотя и в гораздо более скромных масштабах.


Вот, например, первый босс из игры Puggsy (если само не начнётся с нужного места — перемотать на 0:15):

Кроме того присутствует еще одна любопытная деталь — псевдослой "WINDOW", который можно прилепить к любому краю слоя A и который будет перебивать его изображение и при этом никак не скроллится — что предполагалось использовать для всяких прилепленных к краю экрана статус–баров и прочих окошек с информацией и текстом.

Если сложить это с "посканлайновым скроллингом", то становится ясно, что разработчики видеочипа всячески пытались его программистов избавить от необходимости использовать технику HBlank–отсечения. Тем не менее судя по интернету псевдослой WINDOW мало кем использовался.



Таким образом, если сравнивать с Famicom/NES/Денди, то графика в 16–битной Sega Mega Drive это "x2" основных характеристик — два задних фона вместо одного, четыре бита на пиксель вместо двух и более тысячи тайлов в кадре вместо 512.

Чтобы оставить комментарий, необходимо или