Давным-давно, кажется в прошлую пятницу,… нет, не медвежонок. Мы общались с Moroz1999 на предмет в каком формате хранить графику для расширенных режимов ZX Spectrum. На сегодняшний день у нас есть несколько ZX Spectrum-совместимых компьютеров, которые могут отображать 16 или более цветов, без клешенга атрибутов, это ATM (Turbo), Profi, Scorpion+GMX, Sprinter, Pentagon SL 2.2 и конечно же любимец публики PentEvo, он же ZX Evolution от команды NedoPC.
Вот о последнем мне бы и хотелось поговорить подробнее.
В оригинальной (BaseConf) прошивке от NedoPC, так же как и у ATM на экране может быть отображено только 16 цветов из 64 жестко заданных в палитре.
Понятно, что в былые годы, когда создался АТМ, никто из разработчиков не советовался с художниками, как мол лучше реализовать расширенный графический режим. Да и была ли такая возможность, повлиять на архитектуру, мы уже не узнаем. В прочем да не суть. Как художнику такое ограничение было не по душе, это как «видит око да зуб неймёт». Мало того в цветовой палитре АТМ достаточно не просто рисовать, так и ещё ограничение видимой области всего-лишь 320x200 точек.
К счастью в своё время появился такой человек как TS-Labs, и несколько «раздвинул» границы возможностей PentEvo. Добавив нормальную, линейную структуру видеопамяти, расширив отображаемую область до 360x288 точек и самое главное сделав возможным отображение одновременно 64 цветов на экране.
Но и на этом работа не была закончена. Последняя прошивка (TS-Conf) на обычном ZX Evolution (без доработок железа и не смотря на ограничения в 6 bit) позволяет одновременно отображать до 15625 оттенков (по 25 градаций на каждый из основных цветов) за счёт видео-ШИМ.
С помощью ШИМ достигается большее количество оттенков путем создания мелкой текстуры из соседних градаций. (Размер суб-пикселя текстуры равен 1/8 размера спектрумского пикселя.) Это неплохо отображается на CRT-дисплеях (трубках), но на LCD, из-за оцифровки видеосигнала, происходит интерференция между суб-пикселями текстуры и частотой видео-АЦП; суб-пиксели превращаются в жирные линии.
Поэтому прошлым летом (2014) TSL была выпущена отдельная плата VideoDAC, которая вставляется вместо IDE (да пришлось чем-то пожертвовать).
Данная плата позволяет отображать 15625 цветов на любом мониторе без искажений, а также использовать полный диапазон палитрового ОЗУ 5 бит на компоненту - 32768 цветов.
Вот! Вот она рыба графика моей мечты. Но я немного отвлёкся вернёмся к нашим другим ZX Spectrum - совместимым компьютерам.
По причине скудной информации, да и вообще малой активности в данных направлениях (расширенная графика), отсутствия софта использующего данные режимы, Трудно сделать обзор остальных ZX Spectrum-cовместимых компьютеров. Исключение составляет, разве что Sprinter (ну он изначально был PeeCee-ориентирован) поэтому там графика VGA и Pentagon SL 2.2 с расширенным графическим режимом 256x192, где каждая точка может быть своим цветом. Разработке 16с и активному продвижению данного режима, мы обязаны не без известному Alone Coder'у. Хотя надо отдать должное, в своё время DDp доработал Pentagon SL 2.2 и сделал возможным задавать палитру. Жаль что это так и не пошло в массы.
Про Scorpion'овский GMX вообще сложно что-либо сказать вразумительное, ну а по поводу графических режимов Profi тоже оставляет желать лучшего. Да и собственно графических работ для этих платформ я так и не нашел.
Но вернёмся к собственно к теме разговора — «sXg: Spectrum eXtended Graphics». Итак получается, что потенциальными «клиентами» кому мог бы понадобится новый формат, или если хотите стандарт, это ATM и PentEvo. Поскольку в ATM очень хитро устроена структура видеопамяти, да и в добавок он имеет ограничение по цветам. Я решил смотреть в сторону TS-Conf и линейной адресации памяти.
В результате чего получилась такая структура файла:
- Code: Select all
+#0000 #04 #7f+"SXG" - 4 байта сигнатура, что это формат файла SXG
+#0004 #01 1 байт версия формата
+#0005 #01 1 байт цвет фона (используется для очистки)
+#0006 #01 1 байт тип упаковки данных (#00 - данные не пакованы)
+#0007 #01 1 байт формат изображения (1 - 16ц, 2 - 256ц)
+#0008 #02 2 байта ширина изображения
+#000a #02 2 байта высота изображения
(далее указываются смещения, для того, что бы можно было расширить заголовок)
+#000c #02 смещение от текущего адреса до начала данных палитры
+#000e #02 смещение от текущего адреса до начала данных битмап
Собственно начало данных палитры
+#0010 #0200 512 байт палитра
и начало данных битмап
+#0210 #xxxx данные битмап
Как видите ничего сверх естественного нет, но пытливый ум уже точит сомнения, для чего было «изобретать велосипед», когда есть замечательный формат BMP. Ну начнём с того, что это чудо-формат был изобретён дядей Биллом(?) ещё чёрти когда для PeeCee. У это формата есть ряд странностей, таких как, выравнивание отступов кратных четырём (например если у вас картинка шириной 26px, то внутри bmp каждая строка будет дополнена нулями до 32px), так же изображение хранится по умолчанию вверх ногами (конечно можно задать флаг и перевернуть изображение, но это опять же излишние телодвижения), ну и самое главное это формат в котом хранится палитра. Которая так же может быть дополнена нулевыми значениями (по усмотрению создающей программы). Вот и выходит, что для того что бы отобразить BMP на ZX Spectrum машинного времени потребуется гораздо больше, а мы, если вы ещё не забыли, на Z80.
Ну и в дополнение, ещё скажу, что по сути sXg это формат дампа видеопамяти, данные не требуют дополнительной обработки, то существенно сокращает их чтение с диска с последующим размещением в видеопамяти.
И ещё небольшой бонус. Поскольку изображение могут быть гораздо меньшего размера (не на весь экран) логично было бы задать цвет фона (перед очисткой). Для этого служит 5й байт, в котором хранится предпочтительный цвет фона изображения. Конечно программ отображающая картинку может смело игнорировать это и вместо этого сделать чёрный фон, например.
Итак формат готов, осталось как-то получить данные в этом формате. Для этого была написана небольшая консольная утилита для PeeCee — bmp2sxg:
Утилита проста в использовании. На вход задаётся имя файла в формате BMP(да да, никуда нам от него не деться) и на выходе получаем файл в формате SXG. Поддерживаются любые картинки в формате не больше 8бит (256ц) и размером не более 512x512.
При желании картинку можно ограничить палитрой ATM (64 цвета без шим) задав соответствующий ключ --64. По умолчанию цвет фона выставляется, как 0й цвет из палитры (это может быть не обязательно чёрный цвет), но можно задать его принудительно с помощью ключа --bg nn, где nn - соответственно номер из палитры файла.
Понятно, что все мы не идеальны и вполне возможно могут случаться ошибки преобразования. Для этих целей служит ключ --debug. Если задан этот ключ, то в консоль или в файл будет выгружена отладочная информация как и что было преобразовано:
Как видно из скриншота, некоторые программы на PeeCee могут так же «растягивать» палитру дополняя её не используемыми цветами, тем самым увеличивая его размер.
Не смотря на то, у sxg уже вторая версия header'а, это скорее пока прототип, нежели законченная версия, поэтому с радостью выслушаю пожелания предложения по улучшению данного формата.
Ну и осталось самое сладкое. Всё это хорошо и замечательно, но как нам всё это увидеть на реальном железе?
Как вы уже возможно знаете, одним из моих проектов является Command Line Interface (сокращенно CLI), поэтому именно под эту систему и была написана небольшая утилита loadsxg.
Данная утилита позволяет загружать в видеопамять файл в формате sxg, «центровать» (если изображение меньше), выставлять цвет фона, а так же можно включить режим вьёвера и скроллировать картинку если она больше чем 360x288 и не помещается на экран.
В качестве бонуса я приготовил вам артпак из 36 картинок в формате sxg:
Для просмотра на реальном железе вам понадобится распаковать архив в корень SD-карты. Прописать в wc.ini строчку в разделе [PLUGINS]:
- Code: Select all
CLI2 .WMF
или же можете просто переписать поверху файлы. Далее запускаем WildCommander (не ниже версии 0.62) и нажав F10 выбираем пункт CLI2:
Если вы сделали всё правильно, то после запуска вас встретит приглашение «1>».
Далее набираем строчку:
- Code: Select all
sh /demo/bramble/run.sh
После enter запустится скрипт, который и проиграет слайдшоу «Bramble». А если у вас есть карта NeoGS (или просто General Sound), то вы ещё и отличную мелодию послушаете.
Ну и на всякий случай я записал ещё видео с слайдшоу:
http://www.youtube.com/watch?v=fQdL0VF52Og
Ну и в заключении ссылка на сам архив «Cli2+Bramble.zip».
И утилиту для PeeCee «bmp2sxg.zip». Внутри архива вы найдёте саму утилиту, а так же бонусом bat-file create. При запуске он сканирует директорию на наличие bmp файлов и автоматически преобразует их все в sxg-формат.
На этом всё. Творите больше хорошего и разного. А я в свою очередь постараюсь и дальше развивать как данный формат, так и постараюсь обеспечить его поддержку на других ZX Spectum-совместимых компьютерах.
UPD: Сделал сборку настроенного Unreal с образом диска. Достаточно нажать F10 в Wild Commander и далее по тексту. Ссылка на архив «unreal.dev.zip»