В данной статье кратко рассмотрены видеоконтроллеры для следующих ретро-компьютеров: ZX Spectrum, Вектор 06Ц, Commodore 64, Commodore PET, Микроша, Радио-86РК, БК-0010, Агат (модели 7 и 9) и Апогей БК-01Ц.
Поскольку мой будущий самодельный компьютер их косвенно поддерживает, необходимо собрать информацию в одном месте.
Предыдущая статья про самодельный компьютер Coolsystem.
Статью пишет живой человек, основываясь на ответах от нейронной сети Google Gemini, поэтому в тексте возможны неточности. Хорошая новость в том, что шарящие читатели Хабрахабра часто поправляют технические моменты в комментариях и рассказывают о таких вещах, о которых не знает больше никто, и это реально помогает, заранее говорю Вам спасибо. Вычитка текста, замена иллюстраций на более четкие - всё это будет чуть позже, мне важнее выпустить статью.
Двигаемся от простого к сложному.
Все режимы можно сгруппировать по количеству бит на пиксель и количеству бит атрибута цвета (с помощью которого этот пиксель можно дополнительно раскрасить). Эти данные нам понадобятся при проектировании супер-клона.
Микроша & Радио-86РК
Символьный вывод. Монохромный (бело-черный) экран. Шрифты зашиты в ПЗУ (есть псевдографика).

С помощью портов можно давать команды управления довольно продвинутому видеоконтроллеру ВГ75, а также контроллеру прямого доступа к памяти ВТ57 (который тоже необходим для работы графики).
У Микроши номера портов будут другими, не такими как на Радио-86РК, поэтому для переноса программы с одного компьютера на другой эту программу нужно патчить. А так в целом эти компьютеры очень похожи.
Видеопамять обычно начинается с адреса 0x76D0, и этот адрес можно программно переназначить на любое другое место.
Из-за того, что начальный адрес видеопамяти можно менять, на Микроше можно сделать вертикальный (и горизонтальный) скроллинг.
Апогей БК-01Ц
Символьный вывод, такой же, как на Радио-86РК, только появляются атрибуты цвета.
Байты атрибутов смешаны с текстом, при появлении такого байта контроллер выводит на экран пробел (цвет фона строки), а все последующие символы будут выводиться новым заданным цветом.
То есть, перед каждой сменой цвета на экране должно идти пустое пространство. Денис Грачёв смог частично обойти эти ограничения в своей игре "Плюк" (1). Как именно — для меня это пока большая загадка.

Цветовые атрибуты затрудняют горизонтальный скроллинг, но вертикальный вполне работает, также как и на Микроше, нужно просто задать новый адрес начала графической памяти.
Commodore PET
Символьный вывод. Монохромный экран зеленого свечения. Графического режима нет, шрифты (с большим выбором псевдографики) зашиты в ПЗУ. Видеопамять начинается с адреса 0x8000, передвигать ее нельзя.
В более поздних PET появляется видеоконтроллер Motorolla 6845 (CRTC). В нем есть регистр начального адреса, позволяющий реализовать вертикальный скроллинг, но контроллер видит только свой небольшой регион памяти, который нельзя менять, потому что он на отдельной микросхеме.

ZX Spectrum
Графический режим. 1 бит на пиксель (8 пикселей в байте, одна плоскость). 8 бит атрибута.

Мой основной ретро-компьютер. Для него я создал прототип компьютерной игры The Night Train Deluxe (1) а также несколько демок (2).
Да, там можно управлять индивидуальными пикселями - то есть, это уже что-то похожее на графический режим. Пиксели упакованы по восемь штук в байт, старший бит зажигает пиксель слева. Бит установленный в 1 выводит на экран пиксель цвета INK, а 0 выводит пиксель цвета PAPER.
Дальше начинаются странности. Дело в том, что адреса этих байтов идут не подряд. Первые 32 байта — это предсказуемое перемещение слева направо, затем идет прыжок вниз, но не на следующую строку, а через семь строк.
Чтобы лучше это понять, вам нужно написать программу, заполняющую байты графической памяти по очереди, вы увидите на экране, в каком порядке эти байты расположены.
Графическая память всегда начинается с адреса 0x4000 (для основного экрана, если нужен Shadow Screen, то доступ к нему только через страницы). Экран весит 6144 байт.
Выбор цвета INK и PAPER задается для каждого знакоместа 8x8 пикселей с помощью байтов атрибутов. У каждого знакоместа будет свой один байт, содержащий упакованные RGB значения для текста (один из восьми цветов), RGB значения для фона (те же восемь цветов), также там есть флаг мигания и флаг повышения яркости.
Атрибуты находятся по адресу 0x5800. Их ровно 768 байт.
Итого разрешение экрана по пикселям 256x192, а по знакоместам 32x24.
Всё, что вокруг основной области — это цветной бордюр, цвет выбирается программно с помощью порта 0xfe.
Если 48 килобайт для вашей программы не достаточно, можно подключать дополнительные страницы и задействовать Shadow Screen - еще один экранный буфер. Вас ждет веселая отладка, связанная с переключением страниц памяти, я испытал все виды приключений, которые там можно найти, так что, ради Бога, если вы начинающий программист, не трогайте страницы, их время придет позже.
Вектор 06Ц
Один бит на пиксель (восемь пикселей в байте). Четыре плоскости, без атрибутов.

Компьютер с очень красивой 16-цветной ретро-графикой и программируемой палитрой.
Именно под него заточена аппаратная часть моего самодельного компьютера, и это, в теории, должно также упростить работу с другими режимами.
Вектор хранит пиксели упакованные по восемь штук в байт, точно также, как и на ZX Spectrum. И эти байты идут подряд — 32 байта в строке — 256 пикселей. Строки тоже идут подряд, но при этом их адреса увеличиваются снизу вверх. Всего 256 строк, соответственно буфер весит 8 килобайт.
Знакомест тут нет, но зато есть возможность задавать цвет каждого пикселя по отдельности. Для этого служат ... дополнительные три буфера экрана, точно такие же, как и основной. Всего получается четыре буфера по 8 килобайт каждый.
На самом деле не существует основного буфера, все они полностью взаимозаменяемы и могут быть отключены в любой момент.
Вернее, отключить их нельзя. Но можно запрограммировать палитру определенным образом, чтобы исключить влияние определенных буферов на цвет. Этим достигается гибкость использования памяти. Вы можете разместить программу в освободившемся буфере, и это не повлияет на содержимое экрана. Также можно мгновенно переключаться между буферами с помощью всё той же палитры, либо использовать все четыре буфера для достижения максимальной глубины цвета 16 цветов.
Для всего этого хозяйства доступен плавный аппаратный скроллинг по вертикали.
БК-0010
Два би��а на пиксель (четыре пикселя в байте, два байта в машинном слове). Без атрибутов.
Биты идут в обратном порядке, обычная микросхема 74hc165 не подойдет. Младшая половинка машинного слова выводится первой (на экране выглядит слева).

Популярный в СССР школьный компьютер с большим количеством демок и игр. Не смотря на 16-битную шину данных, сам по себе довольно медленный.
В оригинальной машине биты видеопамяти читаются через мультиплексор, поэтому порядок бит идет от 0 до 15. Я думал, что это серьезно усложнит мою схему видеовыхода, но нейросеть подсказала мне парочку неплохих программных трюков.
Агат
Много режимов. Количество бит на пиксель: 1, 2, 4. Упакованные пиксели. Без атрибутов. Цветной текстовый режим с атрибутами, атрибуты упакованы внутрь байта символа хитрым образом, сокращенный набор символов.

Агат — это сложный компьютер в плане графики. При необходимости, он даже может быть клоном компьютера Apple II.
Commodore 64
Два бита на пиксель в режиме Multicolor. Один бит на пиксель в режиме hi-res. Четыре либо двенадцать битов атрибутов плюс фон. Всего на экране 16 заданных цветов. Переключения режимов на лету в разных частях экрана + аппаратные спрайты с прозрачностью. тайловый режим с аппаратным скроллиингом.
А вот это по настоящему проклятый компьютер. Реализовать все функции его отдельного продвинутого чипа VIC-2 будет очень непросто.
Но это того стоит.

Порядок бит такой же, как и у спектрума - старший бит на экране зажигается слева.
Если я не откажусь от этой затеи, обязательно расскажу, как я смог победить этот видеорежим. Возможно, он будет реализован не до конца.
NINE
Есть такая замечательная демка для Commodore 64, она называется NINE.

Незамысловатый волшебник выводит девять аппаратных спрайтов, когда на компьютере возможно всего восемь.
Бордюры слева и справа вообще-то нельзя отключать, спрайты должны были быть под бордюром, а не над. Я не знаю, может быть если полностью отключить графику и оставить только спрайты, то бордюры пропадут? Видимо, тут так и есть.
А потом волшебник делает вот так.

А затем вот так.

А теперь представьте, что вы делаете эмулятор этого компьютера на кастомном железе, который воспроизведет эту демку в точности как настоящий коммодор. По моему, задача почти невыполнимая.
Coolsystem — самодельный компьютер на чипе ATmega128, который всё это умеет
Можно было просто взять один чип STM и не мучаться. Но это не спортивно, я хочу именно связку atmega + vs23s010d. Почему? Пока сам не знаю. Что-то в этом есть. Вот Артём Кашканов делает компьютер на холодных декатронах, и это принесло ему известность, почему бы и мне не попробовать?

Компьютер Coolsystem, спустя несколько итераций, в очередной раз полностью поменял свою схему. Теперь это машина с пятью чипами памяти и сдвиговыми регистрами.
Система видео-вывода способна перестраиваться в зависимости от выбранного гостевого компьютера. Некоторые режимы даются легко, Вектор 06Ц — лучше всех, некоторые тяжелее других, например Агат имеет разную ширину бит в разных режимах, и так получилось, что четыре упакованных бита подряд сдвиговые регистры уже не могут коммутировать, придется считать их на основном ядре — а это медленно. Про эпопею с Commodore 64 я пока промолчу.
Проект любительский, не исключено, что из-за какой-то мелочи разработка Coolsystem встанет на долгую паузу, как уже не раз бывало с другими проектами. Вполне возможно, что Coolsystem — всего лишь еще одна плохая идея. Посмотрим, что будет.
Оффлайн-встреча
Никита nikhotmsk стабильно, раз в пол-года, проводит свой фестиваль самодельной электроники и компьютерного искусства Undefined. Вход на фестиваль условно-свободный. Технические доклады и участие в выставке всячески приветствуются, тематика почти ничем не ограничивается. Информация, как всегда, на сайте и в телеграм-канале.
