Набор для симулятора Altair 8800 на базе Arduino — сборка и программирование ретро-компьютера
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino Mega 2560 | 1 | Или Arduino Due (необходима только одна плата) |
| Arduino Due | 1 | Или Arduino Mega (необходима только одна плата) |
| Светодиоды (обычные) | 36 | Для индикаторов передней панели |
| Транзисторы NPN общего назначения | 36 | Для драйверов светодиодов |
| Резисторы 10 кОм | 36 | Базовые резисторы для транзисторов |
| Резисторы 150 Ом | 36 | Ограничительные резисторы для светодиодов |
| Мини-переключатели SPDT On-On | 17 | 16 для адресных переключателей (SW15-0) + 1 для питания |
| Моментарные переключатели SPDT (On)-Off-(On) | 8 | Для функциональных клавиш (RUN/STOP/EXAMINE и др.) |
| Лист металла для задней панели | 1 | Для крепления переключателей и светодиодов |
| Bluetooth-модем SparkFun BlueSMiRF Silver | 1 (опционально) | Позволяет использовать любой Bluetooth-устройство как последовательный терминал |
| microSD-карта с адаптером | 1 (опционально) | Только для эмуляции дисковода (необходима для Arduino Due) |
Программное обеспечение и онлайн-сервисы
- Arduino IDE — среда разработки
- Библиотека DueFlashStorage — для сохранения данных во флеш-память Arduino Due (данные удаляются при перепрошивке)
- Библиотека soft_uart для Arduino Due — программная реализация UART, позволяющая использовать любые пины как последовательный интерфейс (файлы включены в исходный код симулятора с небольшими изменениями)
О проекте
Давно хотел иметь компьютер Altair 8800 для экспериментов. Но работающие старинные Altair редки и дороги ($1500–2500). Существуют альтернативы (например, altairclone.com), но они стоят около $600 — слишком много для компьютера ограниченного применения. К счастью, Майк Дуглас, создатель Altair Clone, опубликовал все найденные им документы и ПО, что дало огромное количество информации об устройстве Altair и его периферии.
Изучая спецификации Arduino Mega 2560, я задумался: хватит ли его ножек ввода-вывода для прямого подключения светодиодов и переключателей передней панели Altair и написания собственного эмулятора? Оказалось, что у Arduino Mega в точности нужное количество ножек. Так родился этот проект.
Использование Arduino Mega работало нормально и было простым в настройке, но эмуляция шла лишь на ~25% скорости оригинала и обеспечивала всего 6 КБ эмулируемой ОЗУ (хотя в то время это было много). Постоянное хранилище (EEPROM) ограничено 4 КБ.
Arduino Due обладает достаточной памятью для полных 64 КБ эмулируемой ОЗУ и работает значительно быстрее. Кроме того, Due может сохранять данные во флеш-памяти во время работы. Это позволяет использовать любую незанятую симулятором часть 512 КБ флеш-памяти для постоянного хранилища.
С Arduino Due у меня получился симулятор Altair 8800, работающий на скорости оригинала, с 64 КБ ОЗУ, включающим множество ПО для Altair и предоставляющим 32 КБ полупостоянного хранилища для загрузки/сохранения программ и данных.
Цель — максимально приблизить ощущение работы с настоящим Altair 8800. Это включает точное поведение индикаторов передней панели. Один из критериев — возможность играть в игру «Kill-the-Bit» (Убей бит) на передней панели — и это работает:
Симуляция достаточно точна, чтобы даже работала демо-музыка Altair 8800. Обратите внимание: это основан на приёме электромагнитных помех от схемы Altair обычным AM-радиоприёмником!
В своё время компания Processor Technology выпускала небольшую плату-расширение (всего несколько конденсаторов и резисторов) с ПО, превращающим Altair в уважаемую музыкальную систему (на тот момент). Те же дополнения можно сделать и в симуляторе (см. документацию), что позволяет воспроизводить мелодии, созданные для той музыкальной системы. Пример:
Ещё одним исторически важным расширением была графическая плата Cromemco Dazzler. С помощью программного или аппаратного расширения симулятор также может эмулировать эту плату:
Другое расширение (программное/аппаратное) позволяет эмулировать видеокарту Processor Technology VDM-1:
Конечно, у меня нет оригинального Altair, поэтому вся информация взята из документов и видео (см. благодарности). Могут быть незначительные отличия, но в целом поведение воспроизводится хорошо. Один известный (и намеренный) отличия — индикатор HLDA: на оригинале он сигнализирует, что CPU подтвердил остановку внешним устройством. Эта функциональность не используется в симуляторе, поэтому здесь он показывает, что файл (последовательный/запись/воспроизведение на ленте) сейчас открыт.
Основные возможности
- Точно воспроизводит поведение элементов передней панели Altair.
- Работает на скорости оригинала (на Arduino Due) или на 25% скорости (на Arduino Mega).
- Эмулируемая ОЗУ: 64 КБ (Due) или 6 КБ (Mega).
- Включено множество программ для Altair, легко загружаемых в эмулятор: Pong, Altair 4K BASIC (первый продукт Microsoft), Altair Extended BASIC, MITS Programming System II (только Due), Altair Time Sharing BASIC (позволяет нескольким пользователям одновременно работать в BASIC).
- Примеры программ на BASIC и Ассемблере включены в ПО эмулятора и легко загружаются.
- Эмулирует одну плату 88-SIO, 88-2SIO и 88-ACR (интерфейс кассетного рекордера). Каждое последовательное устройство может быть отображено на последовательный интерфейс Arduino. По умолчанию два самых распространённых (88-SIO и 88-2SIO порт 1) отображены на основной последовательный порт Arduino на 115200 бод 8n1, доступный через USB-кабель. Рекомендую подключить Bluetooth-адаптер к пинам RX/TX — тогда любое Bluetooth-устройство может служить терминалом для Altair.
- На Arduino Due можно одновременно использовать основной последовательный интерфейс (USB) и Serial1 (пины 18/19).
- Данные, отправляемые на каждое последовательное устройство (включая кассетный интерфейс ACR), могут записываться и воспроизводиться в до 256 файлах, хранящихся во внутренней памяти Arduino (EEPROM или FLASH).
- Кассетный интерфейс поддерживает команды CSAVE/CLOAD в Extended BASIC (поддержка автоматическая, без участия пользователя). Отлично для разработки своих BASIC-программ!
- Эмулирует графическую плату Cromemco Dazzler (требует дополнительного железа/ПО, см. документацию).
- Эмулирует видеокарту Processor Technology VDM-1 (требует дополнительного железа/ПО, см. документацию).
- Эмулирует до 16 дисководов 88-DCDD (4 в конфигурации по умолчанию). Эмуляция дисководов опциональна, но требует подключения SD-карты к SPI-разъёму Arduino. Только для Arduino Due.
- Эмулирует контроллер жёстких дисков 88-HDSK с до 4 приводами (1 по умолчанию) и 4 пластинами на привод.
- Эмулирует плату 88-RTC-VI с часами реального времени и векторной обработкой прерываний. Это позволяет запускать Altair Time Sharing Basic.
- Страницы памяти по 256 байт могут сохраняться в постоянное хранилище и загружаться обратно. Простой способ сохранения программ, введённых через переключатели передней панели.
- Многие настройки легко меняются через встроенный редактор конфигурации.
Важно при использовании Due: все данные, захваченные или сохранённые в симуляторе, стираются при загрузке новой версии скетча, так как они хранятся во флеш-памяти, которая очищается при прошивке (у Due нет EEPROM). Если подключена SD-карта, данные сохраняются на неё и не теряются при перепрошивке.
Документация
Поскольку симулятор работает так же, как Altair 8800, оригинальная документация Altair (легко находится в Google) даёт всю информацию для работы с переключателями передней панели.
Однако симулятор включает дополнительные функции и встроенное ПО, доступные через переключатели AUX1/AUX2 на передней панели (они были на оригинале, но не использовались). Эта функциональность описана в отдельном документе, написанном в процессе разработки. Документ объёмный, поэтому смотрите файл Documentation.pdf в репозитории исходного кода.
Инструкции по сборке
Цель — минимизировать вспомогательную схемотехнику. И Arduino Mega, и Due имеют достаточно ножек для прямого подключения всех элементов передней панели. Дополнительная схема нужна только для драйверов 36 светодиодов (транзисторы + резисторы), иначе суммарный ток превысит допуски Arduino.
Полные схемы были бы утомительны и повторяющимися (36 одинаковых драйверов, проводка 32 переключателей). Вместо этого документ со схемами содержит подробные таблицы соответствия элементов пинам Arduino и схемы отдельных подсхем (например, драйверов светодиодов). Добавлен файл Fritzing, показывающий раскладку компонентов драйверов на монтажной плате.
Передняя панель сделана из качественного скана оригинальной панели Altair (найден на www.vintage-computer.com), распечатанного в копицентре на картоне. Для основы (чтобы держать переключатели и светодиоды) использован лист металла толщиной 22 gauge (ок. 0.6 мм), отверстия сверлены обычной дрелью. Драйверы светодиодов паяны на куски монтажной платы, которые припаяны прямо к светодиодам, закреплённым металлическим листом.
Передняя панель закреплена и держится вертикально простым деревянным ящиком. Ящик менее глубокий, чем у оригинального Altair (нужно разместить только панель и Arduino).
Для подключения выключателя питания на передней панели я добавил гнездо питания (такое же, как на Arduino) к коробу, соединил его с выключателем панели, а оттуда — штекер, вставляемый в Arduino.
При использовании Arduino Due эмуляция до 16 дисководов 88-DCDD включается подключением SD-карты к SPI-порту Due. Последняя страница документа со схемами показывает необходимую проводку подробно.
Перед загрузкой скетча в Arduino Due обязательно переключите оптимизацию компилятора на «performance» (быстродействие). По умолчанию стоит «size» (размер), что замедляет симулятор. Для этого отредактируйте файл:
c:\Users\[user]\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.9\platform.txt
Замените все вхождения -Os на -O3. Этот шаг можно пропустить, но симулятор будет работать значительно медленнее.
ПО симулятора может работать и на «голом» Arduino (Mega или Due) без подключённых элементов передней панели. Это позволяет запускать многие встроенные программы (те, что используют בעיקר последовательный терминал, а не элементы панели). Для этого в файле config.h установите #define STANDALONE 1 (вместо 0). См. раздел «Отладочные возможности» в документации, как управлять виртуальными элементами панели в таком режиме. Но это не основной сценарий использования. Если не хотите собирать железо, лучше использовать полноценные программные эмуляторы на ПК. Файл config.h содержит множество переключателей для включения/исключения функций симулятора. Настройки по умолчанию работают хорошо, но если хотите настроить — начинайте отсюда.
Благодарности
Так как у меня нет Altair, я полагался на информацию из интернета. Инструкционные видео Майка Дугласа (deramp5113) с altairclone.com были огромной помощью и очень интересны. Кроме видео, Майк собрал множество руководств по железу и ПО Altair и выложил их на своём сайте.
(Видео Майка очень полезны, чтобы понять, чем заняться с симулятором после сборки.)
Инструмент ADEXER Мартина Эберхард был незаменим для низкоуровневой отладки поддержки жёстких дисков. Он также написал два загрузчика, используемых в симуляторе: комбинированный загрузчик дисков (CDBL) для загрузки с дисков и мини-дисков, а также загрузчик жёсткого диска (HDBL), который короче и стабильнее оригинала.
Хотя весь код, включая эмуляцию CPU, написан мной, я черпал вдохновение в проекте i8080 core model при реализации вычисления полупереноса и инструкции DAA.
Симулятор включает оригинальное ПО для Altair 8800. Огромная благодарность Майку Дугласу, который потратил бесчисленные часы на поиск, сборку и запуск этого ПО, а затем сделал его доступным на altairclone.com:
- Altair 4K BASIC (MITS 1975)
- Altair Extended ROM Basic (MITS 1975)
- Altair Time Sharing Basic (MITS 1977)
- Игра Kill-the-Bit (Dean McDaniel, 1975)
- Pong с использованием передней панели (Mike Douglas)
- «Daisy, Daisy...» музыка (Steve Dompier, 1975)
- Music System (Processor Technology 1977)
- MITS Programming System II (MITS 1976)
- Altair Turnkey Monitor (MITS 1977)
- i8080 CPU Diagnostic (Microcosm Associates, 1980)
- i8080 CPU Exerciser (Frank D. Cringle 1994, Ian Bartholomew 2009)
Образы дисков и жёстких дисков (в подпапке «disks» архива исходников) также взяты с altairclone.com и deramp.com (личный сайт Майка Дугласа). В них есть CP/M, разные версии дисковых BASIC, Altair DOS (включая Fortran) и многое другое. Майк сделал невероятную работу по поиску всего этого ПО и созданию рабочих образов дисков для сообщества Altair. Я использовал только часть — загляните на altairclone.com или deramp.com за остальным.
Форум обсуждения
Крис Дэвис с Altairduino.com создал группу Google для обсуждения вопросов, связанных с Altair-Duino:
https://groups.google.com/forum/#!forum/altair-duino
Присоединяйтесь и участвуйте в обсуждении!
Исходный код
Код симулятора Arduino Altair 8800
https://github.com/dhansel/Altair8800
Схемы
Вместо полных схем (очень повторяющихся) документ описывает, какие пины подключать к каким элементам передней панели, и даёт схемы подсхем (например, драйверов светодиодов).
Попытка показать раскладку монтажной платы для подключения светодиодов. Немного перегружено, но достаточно, чтобы увидеть связи. Важно: компоненты для каждого светодиода занимают не более 5 отверстий на плате, чтобы светодиоды можно было разместить достаточно близко для оригинального размера панели.
ledstrip_4OVCpRyKQS.fzz
Производственный процесс
- Панель управления полётным симулятором 2020 на Arduino Nano: LCD и CDI-дисплеи
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Своё рулевое управление (джойстик) для игр на Arduino