[Перевод] Как собрать 8-битный домашний компьютер на 5 чипах
Комбинируя старые хаки, типа побочных цветов NTSC, с современным оборудованием, можно собрать удивительно мощную машину
Есть что-то привлекательное в 8-битных компьютерах. Можно собрать самодостаточную систему, которая достаточно мощная для того, чтобы быть дружественной к пользователю, но достаточно простая, чтобы её можно было собрать и запрограммировать самостоятельно. Большая часть 8-битных машин, собранных любителями, работает на классических CPU героической эпохи домашних компьютеров 80-х, в то время, когда миллионы лишних телевизоров были превращены в мониторы. Я и сам собрал такой, на базе Motorola 6809. Я пытался использовать минимальное количество чипов, однако всё равно мне потребовалось 13 вспомогательных ИС для обработки таких вещей, как RAM или последовательный интерфейс. И я задумался: что, если отказаться от классического CPU в пользу чего-то более современного, но всё же 8-битного? Насколько сильно можно сократить количество используемых чипов?
Так появился Amethyst. Как и у классического домашнего компьютера, у него встроенная клавиатура, и он может выдавать аудио и видео. У него есть встроенный язык программирования высокого уровня, чтобы пользователи могли писать свои программы. И он использует всего шесть чипов — один ATMEGA1284P CPU, интерфейс USB и четыре простых ИС.
ATMEGA1284P (или 1284P), появившийся в 2008 году, есть 128 Кб флэш-памяти для хранения программ и 16 Кб RAM. Он работает на частотах до 20 МГц, у него есть встроенные контроллеры на последовательном интерфейсе и 32 цифровых контакта ввода-вывода.
Благодаря встроенной памяти и последовательным интерфейсам я мог отказаться от целого ряда вспомогательных чипов. Я мог выдавать базовые звуки, просто включая I/O контакт с разной частотой, выдавая определённые ноты, хотя и с характерной резкостью квадратной волны. А что насчёт выдачи аналогового видеосигнала? Для этого наверняка же потребуется специальное оборудование?
А потом в конце 2018 года я наткнулся на хак, который в 1970-х использовал Стив Возняк, чтобы обеспечить Apple II вывод цветов. Он известен, как побочные цвета NTSC, и полагался на тот факт, что само цветное телевидение в США было своего рода хаком, родом ещё с 1950-х.
Изначально телевещание в США было чёрно-белым, и использовало относительно простой стандарт NTSC (National Television System Committee). Электронно-лучевые трубки обводили лучом поверхность экрана, ряд за рядом. Амплитуда получаемого видеосигнала задавала яркость луча в каждой конкретной точке ряда. Затем в 1953 году NTSC обновили для поддержки цветного телевидения, так, чтобы система оставалась совместимой с чёрно-белыми телевизорами.
Совместимость достигли путём кодирования информации о цвете в виде синусоиды высокой частоты. Фаза сигнала в определённый момент относительно референсного сигнала («сигнала цифровой синхронизации»), передаваемого перед началом каждого ряда, определяла базовый оттенок цвета. Амплитуда определяла насыщенность. Этот высокочастотный сигнал затем добавлялся к относительно низкочастотному сигналу яркости, создавая т.н. композитное видео, которое по сей день используется на входе множества телевизоров и дешёвых дисплеев для самоделок.
Хитрости телевидения: аналоговый композитный цветной видеосигнал, используемый в телевизорах США (слева вверху) совместим с чёрно-белыми телеприёмниками поскольку высокочастотный синусоидальный цветовой сигнал накладывается на сигнал яркости (пунктиром), определяющий яркость строки развёртки. Фильтрующие элементы отделяют сигналы внутри телевизора. Фаза цветового сигнала по отношению к сигналу цифровой синхронизации определяет оттенок цвета на экране. При достаточно высокой частоте цифровой сигнал (слева внизу) отделяется так, будто это аналоговый сигнал, а различные последовательности битов будут давать различные цвета. В данном примере на один пиксель приходится по два бита, и можно выдавать шесть цветов (видно четыре), но увеличение скорости передачи битов увеличивает возможное количество цветов.
На чёрно-белом телевизоре цветовой сигнал выглядит как шум, и по большей части игнорируется. Но цветной телевизор может разделять сигнал цвета от сигнала яркости при помощи фильтрующей схемы.
В 1970-х инженеры поняли, что эту фильтрующую схему можно с большой пользой применить в потребительских компьютерах, поскольку цифровой сигнал с квадратной волной мог воспроизводить большую часть возможностей композитного сигнала. Поток нулей, отправляемый компьютером на телевизор во время прохода луча ЭЛТ по горизонтали телевизор будет интерпретировать как постоянное низкое аналоговое напряжение, обозначающее чёрный цвет. Поток единиц будет выглядеть как постоянно высокое напряжение, белый цвет. Увеличив битовую частоту можно отправлять более сложные двоичные последовательности, на основе которых фильтрующая схема будет выдавать цветовой сигнал. Такой трюк позволил Apple II показывать до 16 цветов.
Сначала я думал очень быстро переключать I/O контакт, чтобы напрямую генерировать видеосигнал. Но вскоре понял, что мой 1284P, работающий с тактовой частотой 14,318 МГц, не сможет работать достаточно быстро для того, чтобы выводить больше четырёх цветов — у встроенных последовательных интерфейсов уходит по два такта на отправку одного бита, что ограничивает мою частоту величиной 7,159 МГц. Apple II использовал быстрый прямой доступ к памяти, чтобы объединить чип внешней памяти с видеовыходом, пока процессор обрабатывал свои данные, однако у моего компьютера RAM интегрирована в чип, поэтому такой подход бы не сработал.
Я порылся у себя в шкафу и нашёл четыре чипа 7400 — два мультиплексора и два параллельно-последовательных сдвиговых регистра. Я мог настроить восемь контактов 1284P на параллельную работу и одновременно отправлять данные на мультиплексоры и сдвиговые регистры, что превратило бы их в высокоскоростной последовательный поток битов. Таким образом я мог генерировать биты достаточно быстро, чтобы выдавать на экран 215 различных цветов. Однако ценой этого стала большая загрузка процессора — свободными остаются порядка 25% его мощностей.
Amethyst — одноплатный компьютер. Он использует шесть встроенных интерфейсов — CPU, USB, четыре чипа 7400, обеспечивающих графику из 215 цветов. Клавиатурные переключатели припаяны прямо к плате, которая также поддерживает аудио и четыре последовательных I/O порта для периферии, типа игровых контроллеров или устройств хранения. Встроенная виртуальная машина на Forth обеспечивает среду программирования.
Следовательно, мне потребовалось легковесное программное окружение для пользователей, из-за чего я предпочёл стандартному Basic язык Forth. Это старый язык для встроенных систем, и его плюс в том, что он как предоставляет интерактивность, так и эффективно компилирует код. Можно сделать очень многое в очень ограниченных рамках. Поскольку 1284P не позволяет исполнять скомпилированный машинный код напрямую в памяти, код пользователя компилируется в промежуточный байткод. Затем он в виде данных поступает в виртуальную машину, запущенную с флэш-памяти 1284P. Код виртуальной машины написан на ассемблере и настроен для максимально быстрой работы.
Я работаю инженером в Glowforge, и у меня есть доступ к передовым лазерным резакам, поэтому спроектировать и собрать деревянный корпус для компьютера было просто (получился своего рода кивок в сторону деревянной отделки Atari 2600). Механические клавиатурные переключатели припаяны прямо к плате; у клавиатуры есть странность в виде отсутствия длинного пробела, эта клавиша расположена над кнопкой Enter.
Все схемы, файлы для PCB, системный код я выложил на GitHub — вы можете собрать свой Amethyst или улучшить мою систему. Получится ли у вас уменьшить количество используемых чипов?