Введение

Режим отображения, используемый в компьютерах Commodore Amiga. Hold And Modify, обычно сокращенно HAM, — это режим отображения компьютера Commodore Amiga. Он использует весьма необычную технику для представления цвета пикселей, позволяя отображать на экране значительно больше цветов, чем было бы возможно в иных условиях. Режим HAM часто применялся для отображения оцифрованных фотографий или видеокадров, растровой графики и иногда анимации. В момент выхода Amiga в 1985 году подобное почти фотореалистичное изображение было невиданным для домашнего компьютера и широко использовалось для демонстрации графических возможностей Amiga.

Режим "Отложить и изменить"

Чипсет Amiga был разработан с использованием цветового пространства HSV (оттенок, насыщенность и яркость), как это было принято для ранних домашних компьютеров и игровых консолей, полагавшихся на телевизоры для отображения. HSV сопоставляется более напрямую с цветовым пространством YUV, используемым цветными телевизорами NTSC и PAL, что требовало более простой электронной схемы преобразования по сравнению с кодированием RGB. Цветное телевидение, при передаче по радиочастотному или композитному видеоканалу, использует значительно уменьшенную полосу пропускания цветности (кодируется как два компонента разности цветов, а не оттенок + насыщенность) по сравнению с третьим компонентом – яркостью. Это существенно снижает объем памяти и полосу пропускания, необходимые для заданной воспринимаемой точности отображения, за счет хранения и передачи яркости в полном разрешении, а цветности – в относительно низком разрешении – техника, используемая в методах сжатия изображений, таких как JPEG и MPEG, а также в других видеорежимах на основе HSV/YUV, таких как кодирование YJK видеочипа V9958 MSX (впервые использованного в MSX2+). Вариант кодирования HSV, использованный в оригинальной форме HAM, позволял приоритизировать обновление информации о яркости над оттенком и особенно насыщенностью, переключаясь между тремя компонентами по мере необходимости, в отличие от более регулярного чередования яркости полного разрешения с отдельными цветностями (+) половинного или четвертного разрешения, как это используется в более поздних стандартах цифрового видео. Это обеспечило значительные преимущества по сравнению с RGB. По мере того как дизайн Amiga эволюционировал от игровой консоли к более универсальному домашнему компьютеру, видеочипсет был изменен с HSV на современную цветовую модель RGB, что, по-видимому, нивелировало большую часть преимуществ режима HAM. Ведущий проекта Amiga Джей Майнер рассказывает:

Окончательная форма Hold And Modify, с точки зрения аппаратной реализации, была функционально идентична оригинальной концепции HSV, но вместо работы с этими тремя описательными компонентами (в основном отдавая приоритет компоненту V), она изменяет один из трех цветовых каналов RGB. HAM можно рассматривать как метод сжатия с потерями, аналогичный по принципу действия и эффективности JPEG, за исключением этапа DCT; в режиме HAM6 эффективное игровое поле с 4096 цветами (12 бит) кодируется в половине памяти, которая обычно требуется, а HAM8 еще больше сокращает этот объем, примерно до 40%. Однако за это упрощенное сжатие приходится платить: более высокая общая точность цветопередачи достигается за счет горизонтальных артефактов, вызванных невозможностью установить для любого отдельного пикселя произвольное 12 (или 18, 24) битовое значение. В крайнем случае для изменения цвета может потребоваться три пикселя, что снижает эффективное разрешение в этом месте с "320 пикселей" до примерно "106 пикселей" и вызывает размытия и тени, распространяющиеся вдоль строки сканирования справа от области с высоким контрастом, если 16 доступных регистров палитры окажутся недостаточными. "Декомпрессия" цветового пространства, закодированного HAM, выполняется в реальном времени аппаратным обеспечением дисплея по мере отображения данных графического буфера. Каждый закодированный пиксель действует либо как обычный индекс в регистры цветовой палитры, либо как команда для непосредственного изменения значения, хранящегося в выходном ЦАП (похоже на обновление только одной трети активного регистра палитры), и немедленно обрабатывается соответствующим образом при прохождении через чипсет.

Использование

Когда Amiga была выпущена в 1985 году, режим HAM предлагал значительное преимущество перед конкурирующими системами. HAM позволяет отображать одновременно все 4096 цветов, хотя и с вышеупомянутыми ограничениями. Этот псевдофотореалистичный дисплей был беспрецедентным для домашнего компьютера того времени и позволял отображать оцифрованные фотографии и отрисованные 3D-изображения. Для сравнения, тогдашний стандарт IBM PC EGA позволял 16 цветов на экране из палитры в 64 цвета. Преемник EGA, VGA, выпущенный в 1987 году с его флагманским игровым режимом Mode 13h, обеспечивал 256 цветов на экране из палитры в 262 144 цвета. Режим HAM часто использовался для демонстрации возможностей Amiga на выставках в магазинах и торговых презентациях, поскольку конкурирующее оборудование не могло обеспечить такую же цветовую глубину. Из-за описанных выше ограничений HAM в основном использовался для отображения статических изображений, и разработчики в основном избегали его использования в играх или приложениях, требующих анимации. Примеры: The Challenge Of Golf, Overdrive (Infacto), Kang Fu, AMRVoxel, RTG, Zdzislav: Hero Of The Galaxy 3D, OloFight и Genetic Species. С появлением Advanced Graphics Architecture обычное плоское изображение могло иметь палитру из 256 цветов, предлагая значительно более высокую точность цветопередачи. Оригинальный режим HAM, с его ограниченным цветовым разрешением, стал гораздо менее привлекательным для пользователей машин AGA, хотя он и был сохранен для обратной совместимости. Новый режим HAM8 был гораздо менее полезен для чипсета AGA, чем режим HAM для оригинального чипсета, поскольку более простые индексированные 256-цветные (а также более производительные плоские 128- и 64-цветные) режимы значительно расширили возможности художников, не имея недостатков HAM. Хорошо запрограммированный режим с "разбитой" палитрой мог оказаться более полезным, чем HAM8, предлагая до 256 уникальных цветов на строку – достаточно для прямого назначения отдельного цвета каждому пикселю при видеорежиме шириной 256 пикселей, а в более высоких разрешениях даже одна 256-цветная палитра для всего экрана, не говоря уже о каждой строке, позволяла гораздо более эффективно и точно имитировать большую цветовую глубину с помощью дизеринга, чем это было возможно с использованием только 32 цветов. Изначальная цель HAM – обеспечить большее цветовое разрешение при ограниченном размере видеобуфера и пропускной способности памяти – в значительной степени утратила свою актуальность благодаря снятию этих ограничений. Поскольку современные компьютеры изначально способны отображать изображения truecolor с высоким разрешением без каких-либо специальных приемов, в таких методах отображения, как HAM, больше нет необходимости. Поскольку графические карты в стиле PC, предлагающие режимы, такие как 800x600 SVGA в hi color (16 бит на пиксель, или 65536 непосредственно выбираемых цветов), уже были доступны для Amiga в последние дни существования платформы, маловероятно, что дальнейшее развитие этой техники было бы востребовано, даже если бы она дожила до наших дней.

Ограничения

Режим HAM накладывает ограничения на значения соседних пикселей на каждой горизонтальной строке игрового поля. Для отображения двух произвольных цветов рядом может потребоваться до двух промежуточных пикселей для изменения до нужного цвета (если необходимо изменить все компоненты красного, зеленого и синего). В худшем случае это уменьшает эффективное горизонтальное разрешение по цвету вдвое, с 320–360 пикселей до 106–120. Тем не менее, это сравнимо с современными видеотехнологиями, такими как VHS, у которой разрешение по цвету составляет около 40 телевизионных линий, что примерно эквивалентно 80 пикселям. Отображение таких изображений через композитное видео обеспечивает некоторое горизонтальное сглаживание, которое минимизирует цветовые артефакты. Однако при использовании RGB-монитора артефакты становятся особенно заметными в областях резкого контраста (сильные горизонтальные градиенты изображения), где может появиться нежелательный многоцветный артефакт или "ореол". Для минимизации влияния "ореола" использовались различные методы рендеринга, а дисплеи HAM часто проектировались с учетом тонких горизонтальных цветовых градиентов, избегая вертикальных краев и контрастов. Отображение полноцветного изображения в режиме HAM требует тщательной предварительной обработки. Поскольку HAM может изменять только один из компонентов RGB за раз, быстрые цветовые переходы вдоль строки сканирования лучше всего достигаются с использованием одного из предустановленных цветовых регистров для этих переходов. Чтобы отобразить произвольное изображение, программист может сначала проанализировать исходное изображение на предмет наиболее заметных переходов, а затем назначить эти цвета одному из регистров – метод, известный как адаптивная палитра. Однако, поскольку в оригинальном режиме HAM доступно всего 16 регистров, некоторая потеря цветовой точности является обычным явлением. Кроме того, режим HAM затрудняет произвольную анимацию дисплея. Например, если произвольную часть игрового поля необходимо переместить в другое положение на экране, значения Hold и Modify могут потребоваться пересчитать для всех исходных и целевых строк, чтобы правильно отобразить изображение (операция, не очень подходящая для анимации). В частности, если крайний левый пиксель анимированного объекта содержит пиксели "modify", или если изображение, расположенное непосредственно справа от объекта, содержит пиксели "modify", то значения Hold и Modify необходимо пересчитать. Попытка переместить объект по экрану (например, с помощью блиттера) приведет к заметному ореолу на левой и правой границах этого изображения, если графика специально не разработана для его предотвращения. Чтобы избежать пересчета значений Hold и Modify и обойти ореол, программист должен убедиться, что крайний левый пиксель каждого объекта блиттера и крайний левый пиксель каждой строки прокручиваемого поля являются "установленными" пикселями. Палитра должна быть спроектирована таким образом, чтобы она включала каждый такой крайний левый пиксель. В качестве альтернативы, дисплей HAM можно анимировать, генерируя значения пикселей процедурным способом, хотя это обычно полезно только для синтетических изображений, например, для эффектов "радуги", используемых в демо. Обратите внимание, однако, что значения Hold и Modify применяются только к пикселям игрового поля. 128 пикселей спрайтовых данных (в режиме DMA) на строку сканирования все еще доступны для размещения поверх игрового поля HAM.

Оригинальный чипсет HAM-режим (HAM6)

Режим HAM6, названный в честь 6 бит данных на пиксель, был представлен с оригинальным чипсетом и сохранен в более позднем расширенном чипсете и расширенной графической архитектуре (AGA). HAM6 позволяет одновременно отображать до 4096 цветов при разрешениях от 320×200 до 360×576. Кодирование HAM6 использует шесть бит на пиксель: два бита для управления и четыре бита для данных. Если оба контрольных бита установлены в ноль, четыре оставшихся бита используются для индексации одного из 16 предустановленных цветовых регистров, работающих как обычная индексированная растровая карта. Другие три возможных комбинации контрольных битов указывают, что следует использовать цвет предыдущего пикселя (слева) на строке развертки, а биты данных – для изменения значения красного, зеленого или синего компонента. Соответственно, существует четыре возможности: также доступен режим, использующий только 5 бит данных на пиксель. Поскольку только синий компонент может быть изменен без команды SET, эффект ограничен умеренным увеличением количества отображаемых оттенков сине-желтой гаммы. Этот режим менее гибкий, чем HAM6, и не получил широкого распространения. Control bitData bitsEffect0XXXXSet: используйте 4 бита данных для выбора цвета из 16-цветной палитры. Примените этот цвет к текущему пикселю.1BBBBModify Blue: Сохраните значения красного и зеленого компонентов предыдущего пикселя. Используйте 4 бита данных в качестве нового значения синего компонента текущего пикселя. На чипсете AGA режим HAM5 больше не поддерживается.

HAM4

Также можно использовать режим HAM с 4 битовыми плоскостями. Практическое применение ограничено, но эта техника использовалась в демо-сценах. На чипсете AGA режим HAM7 больше не существует, равно как и SHAM-режим, также известный как динамический HAM. SHAM изменяет некоторые или все цветовые регистры на выбранных строках развертки, чтобы динамически менять палитру во время отображения. Это позволяло каждой строке развертки иметь свой собственный набор из 16 базовых цветов. Это снимает некоторые ограничения, вызванные ограниченной палитрой, которую теперь можно выбирать для каждой строки, а не для всего изображения. Единственными недостатками этого подхода являются дополнительные тактовые циклы, потребляемые чип-памятью для изменения регистров в Copperlist, то, что изображение перестает быть растровым, и повышенная сложность настройки режима SHAM. Эта техника не ограничивается HAM и широко использовалась с более традиционными графическими режимами этой машины. Dynamic HiRes использует аналогичную технику изменения палитры для получения 16 цветов на строку в режимах высокого разрешения, в то время как HAM ограничен низким разрешением, но позволяет использовать как 16 индексированных цветов, так и их модификации. Идея SHAM устарела с появлением HAM8 на чипсете AGA, поскольку даже несжатое изображение HAM8 обладает гораздо большим цветовым разрешением, чем сжатое изображение HAM6. Однако SHAM остается лучшим доступным режимом HAM на Amiga с чипсетами OCS или ECS.

Модуль HAM (HAM8) для архитектуры продвинутой графики

С выпуском Advanced Graphics Architecture (AGA) в 1992 году оригинальный режим HAM был переименован в "HAM6", а новый режим "HAM8" был введен (нумерованный суффикс обозначает битплоскости, используемые соответствующим режимом HAM). С AGA вместо 4 бит на цветовой компонент, у Amiga теперь было до 8 бит на цветовой компонент, что давало 16 777 216 возможных цветов (24-битное цветовое пространство). HAM8 работает аналогично HAM6, используя два бита "управления" на пиксель, но с шестью битами данных на пиксель вместо четырех. Операция "Set" (Набор) выбирает цвет из палитры, состоящей из 64 цветов вместо 16. Операция "Modify" (Изменить) изменяет шесть старших битов красного, зеленого или синего цветового компонента; два младших бита цвета не могут быть изменены этой операцией и остаются такими, какими были установлены последней операцией "Set".

| Control bits | Data bits | Effect |
|---|---|---|
| 00 | XXXXXX | Set: Используйте 6 бит данных для выбора цвета из 64-цветной палитры. Используйте этот цвет для данного пикселя. |
| 01 | BBBBBB | Modify Blue: Сохраните компоненты красного и зеленого цвета предыдущего пикселя. Используйте 6 бит данных в качестве нового компонента синего цвета этого пикселя. |
| 10 | RRRRRR | Modify Red: Сохраните компоненты зеленого и синего цвета предыдущего пикселя. Используйте 6 бит данных в качестве нового компонента красного цвета этого пикселя. |
| 11 | GGGGGG | Modify Green: Сохраните компоненты красного и синего цвета предыдущего пикселя. Используйте 6 бит данных в качестве нового компонента зеленого цвета этого пикселя. |

По сравнению с HAM6, HAM8 может отображать значительно больше цветов на экране. Максимальное количество цветов на экране при использовании HAM8 обычно указывалось как 262 144 цвета (18-битное RGB цветовое пространство). Фактически, максимальное количество уникальных цветов на экране может быть больше 262 144, в зависимости от двух младших битов каждого цветового компонента в 64-цветной палитре. Теоретически, все 16,7 миллиона цветов можно отобразить на достаточно большом экране с соответствующей базовой палитрой, но на практике ограничения в достижении полной точности означают, что два младших бита обычно игнорируются. В целом, воспринимаемая глубина цвета HAM8 примерно соответствует высокоцветному дисплею. Вертикальные разрешения дисплея для HAM8 такие же, как и для HAM6. Горизонтальное разрешение может быть 320 (360 с overscan), как и раньше, удвоено до 640 (720 с overscan) или даже увеличено вчетверо до 1280 пикселей (1440 с overscan). Чипсет AGA также представил еще более высокие разрешения для традиционных планарных режимов отображения. Общее количество пикселей в изображении HAM8 не может превышать 829 440 (1440 × 576) при использовании режимов PAL, но может превышать 1 310 720 (1280 × 1024) при использовании стороннего оборудования отображения (например, фиксера Indivision AGA). Как и в оригинальном режиме HAM, экран HAM8 не может отображать любой произвольный цвет в любом произвольном положении, поскольку каждый пиксель опирается либо на ограниченную палитру, либо на до двух цветовых компонентов предыдущего пикселя. Как и в случае с оригинальным режимом HAM, дизайнеры также могут выбирать "разбиение" (slice) дисплея (см. выше), чтобы обойти некоторые из этих ограничений.

Эмуляция HAM

HAM уникален для Amiga и её специфических чипсетов. Для непосредственного отображения устаревших изображений, закодированных в формате HAM, были разработаны программные эмуляторы HAM, не требующие оригинального оборудования отображения. Версии AmigaOS до 4.0 могут использовать режим HAM при наличии нативного чипсета Amiga. AmigaOS 4.0 и более поздние версии, разработанные для принципиально иного оборудования, предоставляют эмуляцию HAM для использования с современным графическим оборудованием с блочной структурой. Специализированные эмуляторы Amiga, работающие на неродном оборудовании, способны отображать режим HAM посредством эмуляции аппаратного обеспечения дисплея. Однако, поскольку ни одна другая компьютерная архитектура не использовала технологию HAM, просмотр изображения HAM на любой другой архитектуре требует программной интерпретации файла изображения. Точное программное декодирование обеспечит идентичные результаты, не считая различий в цветопередаче между различными настройками дисплея. Если же целью является просто отображение изображения SHAM на платформе, отличной от Amiga, необходимые цветовые значения могут быть предварительно вычислены на основе записей палитры, программируемых через Copperlist, независимо от того, изменяется ли палитра в середине строки развертки. Всегда возможно без потерь преобразовать изображение HAM или SHAM в 32-битную палитру.

Внедрение HAM третьей стороной

Устройство, разработанное Black Belt и известное как HAM E, позволяло создавать изображения с цветовой глубиной HAM8 при низком горизонтальном разрешении на Amiga с оригинальным чипсетом. Amiga настраивалась для вывода изображений высокого разрешения (640 пикселей в ширину, 720 с overscan). Это требовало использования четырех битплоскостей со временем доступа 70 нс на пиксель. Первые несколько строк изображения содержали информацию для конфигурации устройства HAM E. Затем каждая пара пикселей кодировалась информацией для HAM E, который преобразовывал её в один пиксель со временем доступа 140 нс (формируя изображение шириной 320 пикселей или 360 с overscan, с цветовой глубиной в восемь битплоскостей). Таким образом, качество HAM E было сопоставимо с изображением HAM8 низкого разрешения. Техника HAM E использовала тот факт, что изображение высокого разрешения с четырьмя битплощадками обеспечивает на треть большую пропускную способность памяти и, следовательно, на треть больше данных, чем изображение низкого разрешения с шестью битплощадками. Эта техника HAM также была реализована в режимах HAM256 и HAM8x1 ULAplus / HAM256 / HAM8x1 для ZX Spectrum, где она позволяла отображать 256 цветов на экране за счет модификации базовой 64-цветной палитры. HAM, очень похожий на Amiga HAM8, является частью HGFX – плоской графической системы, реализованной в виде FPGA-расширения оригинальной видеосхемы (ULA) для компьютеров ZX Spectrum. Предложен и протестирован с эмулятором LnxSpectrum как HGFX/Q, а затем реализован на компьютере eLeMeNt ZX в 2021 году.