Собираем 8-битный компьютер: как уменьшить количество микросхем до шести

Сочетание старого трюка с кодированием цветов в NTSC и современного железа позволяет собрать на удивление работоспособную машину

В 8-битных системах есть что-то перманентно притягательное: вы можете собрать автономную систему, достаточно мощную, чтобы поддерживать адекватное взаимодействие с пользователем, но достаточно простую, чтобы собрать и запрограммировать её самостоятельно. Большинство современных 8-битных машин, созданных любителями, завязаны на классических процессорах, которые жили в золотой век домашних компьютеров 1980-х годов, когда в качестве дисплеев использовали миллионы телевизоров. Вначале была идея собрать свою машину на базе процессора Motorola 6809 из той же эпохи. Я пытался использовать как можно меньше микросхем, но несмотря на мои старания, мне всё ещё нужно было 13 дополнительных микросхем для работы с ОЗУ и последовательной передачи данных. Тогда я задумался: а что, если я использую более современный 8-битный процессор? Насколько сильно при этом я смогу снизить количество необходимых мне микросхем?


В результате я собрал на нём машину, которая получила название Amethyst. Как любой домашний компьютер, он имеет встроенную клавиатуру и может выдавать аудио и видео. Он также имеет встроенный язык программирования высокого уровня, чтобы пользователи могли писать на нем собственные программы. Мне удалось сократить количество микросхем до шести: ATMEGA1284P CPU, USB-интерфейс и четыре простые интегральные схемы.

ATMEGA1284P (или 1284P) 2008 года выпуска имеет 128 килобайт флеш-памяти и 16 килобайт ОЗУ. Он может работать с частотой до 20 мегагерц. У него на борту есть встроенные контроллеры последовательного интерфейса и 32 цифровых входа / выхода.



Благодаря встроенной памяти и последовательным интерфейсам пропала необходимость в использовании многих вспомогательных чипов. Я мог напрямую генерировать аудио, прерывая и подавая сигнал на ввод / вывод с разной частотой. Таким образом я научился выдавать тон, который, правда, обладал характерной резкостью прямоугольной волны. Но как насчёт генерации аналогового видеосигнала? Неужели для этого потребуется специальное оборудование?

Стандартный трюк


В конце 2018 года я увидел трюк, который Стив Возняк использовал в 1970-х годах, чтобы реализовать в Apple II поддержку цветной графики. В США этот трюк применялся для цветного телевещания в системе NTSC ещё в 1950-х годах.

Изначально американское телевидение было только чёрно-белым и использовало довольно простой стандарт NTSC (разработанный Национальным комитетом по телевизионным системам). Для формирования изображения на экране электронный луч прорисовывал точки на его поверхности, ряд за рядом. Амплитуда принимаемого видеосигнала определяла яркость луча в любом заданном месте вдоль ряда. Затем в 1953 году NTSC был модернизирован для поддержки цветного телевидения, с сохранением совместимости с существующими чёрно-белыми телевизорами.

Инженеры решили представить информацию о цвете в виде высокочастотного синусоидального сигнала. Для этого поднесущая разделялась на два компонента с фазовым сдвигом 90°, каждая из которых подвергалась модуляции. В результате получался сигнал, модулированный и по амплитуде, и по фазе. Амплитуда сигнала определяла насколько ярким должен быть цвет. Этот высокочастотный сигнал цветности затем добавлялся к низкочастотному сигналу яркости для создания так называемого композитного видеосигнала. Такой метод до сих пор применяется для многих телевизоров и более дешевых дисплеев.



«Цифровой аналог»: аналоговый композитный цветной видеосигнал, используемый американскими телевизорами [вверху слева], совместим с чёрно-белыми ТВ, поскольку сигнал яркости маскирует высокочастотный синусоидальный сигнал цветности [пунктирная линия]. Фильтрующие контуры разбивают сигнал внутри телевизора. При достаточно высокой скорости передачи битов цифровой сигнал [внизу слева] будет восприниматься так, как если бы он был аналоговым сигналом: разные битовые комбинации дают разные цвета. В этом примере с двумя битами на пиксель можно получить шесть цветов [показано четыре], но более высокая скорость передачи битов позволяет использовать больше цветов.


Чёрно-белый телевизор воспринимает сигнал цветности как шум и игнорирует его. Но цветной телевизор может отделить сигнал цветности от сигнала яркости с помощью фильтрующих контуров.

В 1970-х годах инженеры поняли, что эта схема фильтрации может быть очень полезна для домашних компьютеров, поскольку она позволяет цифровому прямоугольному сигналу имитировать большую часть композитного аналогового сигнала. Поток нулей, отправленный компьютером на телевизор будет воспринят как постоянное низкочастотное аналоговое напряжение, то есть, чёрный цвет. Поток единиц будет рассматриваться как постоянное высокочастотное напряжение, то есть белый цвет. Но при достаточно высокой скорости передачи битов возникнут более сложные двоичные структуры, которые схемы высокочастотной фильтрации распознают как сигналы цветности. Этот трюк позволил Apple II отображать до 16 цветов.

Сначала я подумал, что нужно очень быстро переключать пин ввода / вывода, чтобы напрямую генерировать видеосигнал. Однако вскоре я понял, что с моим 1284P, работающим на тактовой частоте 14,318 МГц, я не смог бы переключать его достаточно быстро, чтобы отобразить более четырех цветов. Дело в том, что его встроенным последовательным интерфейсам потребовалось бы два тактовых цикла для отправки одного бита, что ограничило бы мою тактовую частоту до 7.159 МГц. Apple II для подключения своей внешней микросхемы к видеовыходу использовал быстрый прямой доступ к памяти, в то время как его ЦП был занят внутренней обработкой. Но, поскольку оперативная память моего компьютера интегрирована в микросхему, я не мог использовать этот подход.

Поэтому я заглянул в свои ящики и вытащил четыре микросхемы серии 7400 — два мультиплексора и два параллельно-последовательных сдвиговых регистра. Я смог параллельно установить восемь выводов 1284P и отправлять с них данные одновременно в мультиплексоры и регистры сдвига, которые преобразуют их в высокоскоростной последовательный поток битов. Таким образом, я научился генерировать биты достаточно быстро, чтобы отображать на экране около 215 различных цветов. Однако мне пришлось заплатить за это своей вычислительной мощностью: обработка видеосигнала постоянно съедает 75% ресурсов процессора.



Компактный компьютер


Amethyst — это одноплатный компьютер. Он собран всего из шести интегральных микросхем — процессор, USB-интерфейс и четыре микросхемы серии 7400, которые служат для создания 215-цветного изображения. Клавишные переключатели припаяны непосредственно к плате, которая также поддерживает аудио и четыре последовательных соединения ввода / вывода для периферийных устройств, таких как игровые контроллеры и устройства хранения данных. Писать программы и запускать их можно благодаря встроенной виртуальной машине Forth.

Мне нужна была легковесная среда программирования для пользователей, что и заставило меня выбрать Forth вместо традиционного Basic. Forth — это старый язык программирования для встраиваемых систем, он поддерживает интерактивность и способен эффективно компилировать код. С ним вы можете сделать достаточно много, используя минимальное количество ресурсов. Поскольку 1284P не позволяет выполнять скомпилированный машинный код непосредственно из его ОЗУ, пользовательский код вместо этого компилируется в промежуточный байт-код. Этот байт-код затем подаётся в качестве входных данных на виртуальную машину, запущенную из флэш-памяти 1284P. Код виртуальной машины был написан на ассемблере и оптимизирован вручную, чтобы сделать его максимально быстрым.

Как инженер, работающий в компании, которая производит лазерные 3D-принтеры, я имею доступ к передовым станкам для лазерной резки. Так что я легко спроектировал и изготовил деревянный корпус (подсмотрел отделку под дерево у Atari 2600). Механические переключатели клавиатуры были припаяны непосредственно к одиночной печатной плате Amethyst. У этой клавиатуры есть одна любопытная особенность — отсутствие привычного всем большого пробела. Вместо него — просто кнопка, скромно расположившаяся над клавишей Enter.

Полная схема, PCB-файлы печатной платы и исходный код доступны в моем репозитории на GitHub. Так что вы можете создать свой собственный Amethyst или даже улучшить мой проект. А вдруг вы сможете придумать, как сэкономить ещё парочку микросхем?