Итак, в прошлый раз я говорил о возможной совместимости гипотетического хайколорного видеорежима со старым кодом, рассчитанным на режимы с небольшим количеством бит на пиксель. С оговоркой, что старые режимы - безатрибутные, даже надо было уточнить - безпалитровые (глобальную палитру на весь экран можно считать условно одним большим атрибутом). Как же добиться совместимости с палитровыми?
Ясно, что активную палитру надо где-то хранить. Если вспомнить разные компы, то глобальные палитры традиционно держали в аппаратных регистрах видеоадаптеров, число которых доходило до 256 (может, где-нибудь и больше, но я не знаю); в случае же атрибутных режимов аппаратных палитровых регистров было немного (например, у Спектрума только два), но видеконтроллер регулярно обновлял их содержимое значениями из видеопамяти (что несколько увеличивало нагрузку на шину памяти по сравнению с растром той же битности без палитры, но всё равно обходилось экономнее режима "цвет на точку" с аналогичного размера глобальной палитрой).
Для совместимости со Спектрумом нам достаточно добавить в прошлую схему атрибутную сетку для всего растра 360x256 и 16-битные атрибуты (шина-то всё равно 16-битная, а кроме всех возможных значений спектрумовских атрибутов нам понадобится специальное значение для бордюра). Теперь часть 16-битных кодов цветов (выберем какие-то два, или пусть признаком "палитровости" будет установленный старший бит) будет отображаться со значением цвета атрибута, а не напрямую по коду цвета.
Но это слишком ограниченное решение, мало к чему еще пригодное, кроме имитации Спектрума. Почему бы не довести атрибутную схему до логического конца, а конкретно до уменьшения группы пикселей, связанных с одним атрибутом, до... одного-единственного пикселя?! Отображение может осуществляться так: прочитали слово, если старший бит нулевой - отображаем хайколорную точку по коду цвета, если единичный - прибавляем этот код как смещение к началу атрибутной таблицы и отображаем из неё хайколорный код. То есть без палитровых регистров имитируем палитру из 32768 цветов за счет некоторой дополнительной нагрузки на память (впрочем, небольшой и необязательной, если не используется палитра).
Схема "атрибут на пиксель" позволит имитировать вообще любые атрибутно-палитровые режимы, в том числе, конечно, и спектрумовский. Причем над картинкой, сформированной старым кодом, можно будет издеваться с помощью блиттера: вырезать и перемещать куски, отражать, поворачивать, прокручивать с любым шагом, атрибутные цвета при этом не "поплывут".
Организовать спектрум-совместимость можно примерно так: пиксели, попавшие на бордюр, все указывают на одну и ту же ячейку таблицы атрибутов видеокарты, а в квадраты, совпадающие по координатам со знакоместами Спектрума, по дефолту могут попадать лишь два кода-ссылки (для каждого квадрата свои значения). Флеш можно сделать при помощи двух атрибутных таблиц, переключаемых с нужной частотой: запись атрибута в zx-программе вызывает запись пары слов инк/пейпер в каждую атрибутную таблицу, при включенном флеше вторую пару записать в обратном порядке. Аналогично можно имитировать и спектрумовский аппаратный мультиколор, 15-битных смещений хватит даже для всего растра 360x256.


Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 




