Модернизация Tandy Model 100
Год назад я купил на распродаже Tandy Model 100 примерно за 90 долларов. Выпущенный в 1983 году, он был предшественником современных ноутбуков и имел качественную клавиатуру и ЖК-дисплей. А ещё мог работать 20 часов от четырёх батареек типа АА и месяц в режиме ожидания.
К сожалению, приобретение вскоре перестало работать. Мне удалось определить неисправный компонент, и вместо того, чтобы пытаться найти новую запчасть, я купил ещё один M100, который за копейки продавался под запчасти на eBay. Вынул из материнки нужный компонент, успешно вставил в оригинальный Tandy Model 100, и всё заработало. А я задумался, глядя на второй, ещё сильнее сломанный M100, у которого сохранилась прекрасная клавиатура и экран. С этим симпатягой явно можно было что-то сделать. Не пора ли проверить, насколько сложно заменить 8-битный процессор 8085 и материнскую плату 40-летней давности на что-то более современное?
Конечно, я не первый, кто начал ломать голову над этим вопросом. В интернете можно встретить примеры, как люди переделывали M100. Но чаще всего там меняли монохромный экран с разрешением 240 на 64 пикселя на что-то более цветное и с высоким разрешением или сохраняли исходный ЖК-экран, но использовали его только как текстовый дисплей.
Мне же хотелось сохранить оригинальный экран с его суровыми пикселями и низким энергопотреблением, а также добиться поддержки графики и разных шрифтов (как в оригинальном M100). Если это сделать, то можно будет использовать любое количество сменных процессоров, используя библиотеку displayio от CircuitPython и другому ПО. Кстати, благодаря энтузиастам из Club 100 любой желающий может получить доступ к целому миру программного обеспечения, написанного для M100.
Впрочем, я быстро обнаружил, что есть серьёзная проблема, стоящая на моём пути: нестандартный и странный ЖК-экран M100.
Оказалось, что дисплей M100 представляет собой 10 отдельных экранчиков, каждый из которых управляется собственной микросхемой драйвера HD44102. Каждая микросхема драйвера отвечает за область экрана размером 50x32 пикселя, за исключением двух микросхем с правой стороны, которые контролируют 40x32 пикселя. Это обеспечивает общее разрешение экрана 240x64 пикселей. Внутри каждой области пиксели разделены на четыре ряда или группы, каждая из которых имеет высоту восемь пикселей. Каждый вертикальный столбец из восьми пикселей соответствует одному байту в локальной памяти драйвера.
Чтобы задать произвольный пиксель, вы определяете область экрана, в которой он находится, включаете соответствующую микросхему драйвера, сообщаете чипу, что отправляете команду, отправляете команду для выбора банка и столбца, сообщаете чипу, что теперь отправляете пиксельные данные, а затем записываете байт данных, который устанавливает восемь пикселей сразу, включая тот, что вы хотите, и семь других, которые будут вспомогательными.
Причина такого расположения заключается в том, что оно значительно ускоряет отображение текста. Если у вас есть шрифт высотой семь пикселей плюс один пустой пробел внизу, вы можете копировать растровое изображение шрифта прямо из памяти байт за байтом. Последовательные байты часто могут быть отправлены без дополнительных команд, потому что микросхема автоматически продвигает индекс столбца после получения байта данных. Порядок отображаемых банков также можно изменить для быстрой прокрутки.
Эта схема адресации банка/столбца до сих пор используется, например, в некоторых современных OLED-дисплеях, но охватывает весь дисплей, то есть по одному чипу на экран. Мне пришлось бы самому управлять каждой областью и драйвером.
Но были и хорошие новости. Во-первых, М100 отлично ремонтировался. Драйверы экрана расположены на плате, которая взаимодействует с материнской платой через разъем 15 на 2 контакта, который можно просто вытащить. Клавиатура использует простую матрицу 10 на 10, а подключается через легкосъемные разъемы.
Существует фантастическое руководство по обслуживанию, в котором подробно описаны все цепи. С ним, техническим описанием HD44102 и некоторыми полезными советами других людей я смог наладить взаимодействие между дисплеем и Arduino Mega 2560. Тот факт, что старые устройства были крайне терпимы к неправильному обращению, здорово помог мне в экспериментах. Не было никаких модных нынче историй про "волшебный дым", когда устройству дают на полвольта больше требуемого, и оно выпускает из себя всю магию.
Перебил провод? Нет проблем, просто исправь это и повтори попытку. Подал необработанный сигнал с широтно-импульсной модуляцией (ШИМ) вместо постоянного аналогового сигнала? Хорошо, я просто посижу здесь и немного поморгаю.
Моё решение обеспечивает -5 В, необходимое ЖК-дисплею в дополнение к +5 В. Там также установлен RC-фильтр нижних частот для сглаживания сигнала PWM, который имитирует выходной сигнал потенциометра от 0 до 4 В, используемый для регулировки угла обзора. Другие контакты подключаются к цифровому входу/выходу Mega или линиям питания.
Я написал кой-какой код для хранения фреймбуфера размером 240 на 64 пикселя и обработки сопоставления его пикселей с соответствующими областями экрана. Программное обеспечение выбирает соответствующий чип, банк и столбец, отправляет данные и управляет различными тактовыми и другими управляющими сигналами. Ардуинка предстаёт как драйвер современного монохромного дисплея, принимающий растровые данные в виде строк (или столбцов) пикселей, занимающих весь экран, — именно с этим может справиться библиотека displayio.
ЖК-дисплей теперь можно подключить к микроконтроллеру по моему выбору через параллельное или последовательное подключение к Mega, который копирует входящие данные в буфер кадров. Я намерен использовать Teensy 4.1, который позволит мне напрямую общаться с матричной клавиатурой, иметь достаточную вычислительную мощность для некоторых базовых прошивок для редактирования текста и предоставить последовательный интерфейс терминала VT100, который может быть подключён к вычислительному модулю Raspberry Pi 4, также установленному внутри M100. Это обеспечило бы Wi-Fi, 64-разрядную ОС и до 8 гигабайт оперативной памяти — большой шаг вперёд по сравнению с 8-24 килобайтами, которые изначально размещались в корпусе!
Вот такая переделка. Спасибо за внимание!