Палитра для ZX Spectrum
Alone Coder
За эти годы появилось множество допол─
нительных графических девайсов,которые мо─
жно подключить к Speccy (речь, конечно, не
идёт об "ускорителях", которые агрессивно
раскручиваются в контексте Спектрума, но
которые подключить реально нельзя, речь
только о настоящих устройствах): Eva V9990
(2009), IPVC (2011), SPECTRA interface
(2012), METEOR-2013 (2013), ZXM-VideoCard
(2014).Возможности у этих видеоконтрол─
леров весьма широкие, но на Спектруме
не хватает разработчиков, чтобы поддержи─
вать всё это разнообразие в софте.
Единственными реально поддерживаемыми
расширениями графики остаются простейшие
растровые - в основном режимы ATM Turbo,
под которые есть десятки игр и дем.
Ещё поддержаны мультиколор и hires Timex'а
(или допаянного Pentagon/Scorpion; hires
512x192 есть ещё в Байте ). Появился ещё
ULAplus, он он пока существует только вир─
туально (понятно, что он может быть реали─
зован паяльником, но нет схемы - есть то─
лько эмуляторы и прошивки FPGA некоторых
плат-конструкторов).
А вот палитра - это такая вещь, которая
особо не влияет на сложность разработки и
совместимость, но является приятным допол─
нением к функционалу компьютера. В этой
статье описана реализация палитры на ATM
Turbo, которая с успехом используется в
ZX Evo и Pentagon 2.6ббLE, а также в рас─
ширенной вариации от DDp подсоединялась
к Pentagon 1024 SL2.x. Схема палитры от
DDp может быть подключена в принципе к лю─
бому Speccy, но пока страдает из-за отсут─
ствия поддержки в эмуляторах.
* * *
При разработке ATM Turbo в 1991 году и
Turbo 2/2+ в 1993 ставилась цель сделать
на Спектруме графику "как на IBM", что вы─
ражалось в копировании геометрии одного из
видеорежимов EGA (а именно320x200, но по
пожеланию разработчиков - с квадратными
пикселями). К геометрии EGA прилагалась
EGAшная же палитра в 64 цвета,которую было
несложно реализовать на 1SSPY2 (SN7489),
причём без каких-либо лишних ЦАП.
Как работает палитра?
Палитра организована как внешнее уст─
ройство - номер ячейки и на отрисовку,и на
запись определяется поступающим с компью─
тера RGBI сигналом, а данные записи для
ячейки берутся из шины данных процессора
при обращении к порту#FF. Поскольку в па─
литре 6 бит, два бита в байте не использу─
ются. Порядок цветов в байте был выбран
довольно оригинальный -%grbG11RB.
RGBI здесь - это не цвет бордера, а
именно цвет текущего выдаваемого пикселя
(без гашения). Но писать в палитру рекоме─
ндуется именно выбирая цвет бордера, в на─
чале развёртки экрана. Поскольку порт#FE
не поддерживает яркость бордера (доступны
толькоRGB ), был добавлен такой же порт
#F6, запись в который включает на бордере
яркость(I) - так мы можем выбрать на бор─
дере любой из 16 цветов.
В 2009 году появилась схема 12-битной
палитры на 4096 цветов от DDp (http://
realddp.narod.ru/zx/palЧЧ4/index.htm ) -
изначально довесок для Pentagon 102ЧSL2.x,
но её можно припаять и к другим спектру─
мам. Сделана она так же,как оригинал. Раз─
ница в том,что дополнительные младшие биты
цветов берутся из старших разрядов шины
адреса. При короткой адресации портов
(OUT (#FF),A - в существующем софте как
раз короткая адресация) старшие разряды
шины адреса соответствуют шине данных.
DDp написал несколько демонстрационных
программ под свою схему: PALCLC (выбор
цвета), RADIAL (анимация с помощью палит─
ры), SHOWPAL (показ нескольких палитр),
GIRL (мультиколорная картинка) и ART (сбо─
рник картинок под цвет на точку на весь
диск).
По умолчанию на ATM Turbo 2 запись в
порт#FF запрещена (порт спрятан в область
портов TR-DOS, единички в данных - на мес─
те сигналов FDC reset и FDC halt, но дос─
туп к палитре отключаемый). В схеме DDp -
разрешена. Но схему DDp можно сделать сов─
местимой,в простейшем случае инвертировав
сигналDOS (если мы не будем реализовывать
защиту порта). На Pentagon 2.6ббLE выбран
совмещённый вариант доступа к палитре -
чтобы можно было кроме АТМовских программ
запускать и демонстрационные программы от
DDp без их доработки.
Как управлять палитрой?
Шаг 0.HALT
Шаг 1. Включить теневые порты и доступ
к палитре:
LD A,%10101011;6912 screen, turbo
;LD A,%10100011 ;6912 screen, noturbo
LD BC,#BD77
LD HL,#2A53 ;out (c),a:ret в TR-DOS
PUSH HL
JP #3D2F ;nop:ret в TR-DOS
Шаг 2. Выбрать изменяемый цвет методом
выдачи его номера на бордер (цвета 0..7 -
OUT (#FE), цвета 8..15 -OUT (#F6) ).
Шаг 3. Записать данные цвета через порт
#FF:
D0 B (Blue)(инверсный)
D1 R (Red)(инверсный)
D2 не используется, должен быть 1
D3 не используется, должен быть 1
D4 G (Green)(инверсный)
D5 b (младший бит Blue)(инверсный)
D6 r (младший бит Red)(инверсный)
D7 g (младший бит Green)(инверсный)
A8-A15 управляют дополнительными млад─
шими битами цветовых составляющих для 12-
битной палитры (если она есть), в том же
порядке.
Повторять шаги 2-3 для всех цветов.
Шаг 4. Закрыть теневые порты:
LD A,%10101011;6912 screen, turbo
;LD A,%10100011 ;6912 screen, noturbo
LD BC,#FF77
OUT (C),A
Пример процедуры установки 6-битной па─
литры:
SETPAL
HALT
LD HL,TZXPAL+15
LD DE,#ABOF;6912,turbo
;(D=%1010t000 for EGA,
;%1010t010 for multicolor)
LD BC,#BD77;open ports and palette
CALL OUTDOS
SETPALO
LD A,E
BIT 3,E
RES 3,A
OUT (#FE),A
JR Z,$+4
OUT (#F6),A
LD A,(HL);most significant bits
DEC HL
OUT (#FF),A
DEC E
JP P,SETPALO
LD BC,#FF77;close ports and palette
OUT (C),D
RET
TZXPAL
;%grbG11RB
DB #FF,#FE,#FD,#FC,#EF,#EE,#ED,#EC
DB #FF,#DE,#BD,#9C,#6F,#4E,#2D,#0C
Пример процедуры установки 12-битной
палитры (для теневых портов):
SETPAL12
HALT
LD HL,TZXPAL+31
LD DE,#ABOF;6912,turbo
;(D=%1010t000 for EGA,
;%1010t010 for multicolor)
LD BC,#BD77;open ports and palette
CALL OUTDOS
LD C,#FF
SETPAL120
LD A,E
BIT 3,E
RES 3,A
OUT (#FE),A
JR Z,$+4
OUT (#F6),A
LD B,(HL);least significant bits
DEC HL
LD A,(HL);most significant bits
DEC HL
OUT (C),A
DEC E
JP P,SETPAL120
LD BC,#FF77;close ports and palette
OUT (C),D
RET
TZXPAL
;%grbG11RB
DW #FFFF,#FEFE,#FDFD,#FCFC
DW #EFEF,#EEEE,#EDED,#ECEC
DW #FFFF,#DEDE,#BDBD,#9C9C
DW #бFбF,#ЧEЧE,#2D2D,#OCOC
OUTDOS
PUSH HL
LD HL,#2A53
EX (SP),HL
JP #3D2F
* * *
Долгое время не было утилиты для редак─
тирования палитры, поэтому палитра редко
использовалась в режиме 6912. Я набросал
такую утилиту в начале 2014 года и с небо─
льшими именениями представляю здесь.
Итак, Palchanger (и Palchanger12, о ко─
тором ниже) - программа настройки палитры
и запуска BGE (или другой программы) с
этой палитрой.
Состоит, как водится, из бейсик-загруз─
чика и кодового блока. Бейсик-блок занима─
ется дисковыми операциями - его можно от─
редактировать, чтобы приклеить настройщик
палитры к нужной вам программе.
У кодового блока две точки входа:32768
- редактировать палитру, 32771 - просто
установить палитру. То есть вы можете за─
менить редактор просто на установку палит─
ры, если исправите бейсик.
Пример использования Palchanger'а как
установщика палитры - раскрашенная игра
AMC1:http://alonecoder.nedopc.com/zx/
AMC1pal.zip. Для раскрашивания старых игр
совершенно не нужно их ломать :)
Кроме программы под стандартную 6-бит─
ную палитру "PALCHG" прилагается программа
под полную 12-битную палитру "PALCHG12". У
PALCHG кодовый блок называетсяpalchg, а
палитра pal (палитра в 16 байт в формате
%grbG11RB ). У PALCHG12 кодовый блок назы─
вается palchg12, а палитра pal12 (палитра
в 32 байта, каждый цвет хранится в порядке
старший-младший). На самом деле это две
разных программы, они компилируются из
разных исходников, которые вы тоже можете
найти на диске.
Палитра грузится бейсиком при старте
программы.
Управление:
-стрелки- выбор цвета.
-r- изменить красную составляющую.
-CS+R- изменить младшую часть красной
составляющей (только в PALCHG12).
-g- изменить зелёную составляющую.
-CS+G- изменить младшую часть зелёной
составляющей (только в PALCHG12).
-b- изменить синюю составляющую.
-CS+B- изменить младшую часть синей
составляющей (только в PALCHG12).
-0- обнулить цвет.
-Enter- выход в бейсик-блок (грузит
BGE или другую программу,которую вы впише─
те в последней строчке бейсик-блока).
-s- выход в бейсик-блок с сохранением
палитры в файл.
Для примера прилагается сконвертирован─
ная картинка"lisa". Чтобы загрузить кар─
тинку при старте Palchanger'а, держите
Space во время загрузки, потом введите имя
картинки. Так вы сможете редактировать па─
литру на фоне картинки.
Чем сконвертирована картинка? Всё тем
же конвертором con18:http://
alonecoder.nedopc.com/zx/con18pal.rar
К сожалению, конвертор пока не умеет
находить лучшую палитру сам. Для конверсии
с палитрой создайте 16-цветную палитру в
формате.act (Photoshop) и загрузите её с
помощью кнопки "Pal".
В старых версиях эмулятора Unreal
Speccyимеется баг - 8-й цвет выглядит как
0-й. Будьте бдительны :)
Other articles: