
Некоторые компьютеры предназначены для того, чтобы двигать прогресс вперёд. Я собрал Daisy, чтобы двинуть его в прошлое!
Это самодельный персональный компьютер, изготовленный из трёх плат Arduino, резисторов и большой любви. Он не пытается быть мощным. Он старается быть интересным: портативным, ограниченным в возможностях и милым. За таким компьютером можно провести ночь, рисуя простые картинки, сочиняя музыку или создавая маленькую игру. Такие машины когда-то были в изобилии, но теперь их практически нет: Timex Sinclair 1000, Commodore PET, TRS-80 MC-10.
Но Pinecone Daisy — это ещё и нечто иное: артефакт из альтернативной истории. У него есть название, производитель, номер модели и печатное справочное руководство по программированию на BASIC. Моё руководство стилизовано под книги Abacus Software для Amiga; источником вдохновения для него стала реклама DASH-80 в журнале, а напечатано оно было якобы существующей компанией Pinecone Computer. Всё это не совсем реально, но реально достаточно. Машина работает. Руководство точно её документирует. Медведь (капибара из начала статьи) присутствовала почти при всём процессе сборки, как помогающий в отладке «резиновый утёнок».
Название собрано из двух частей: вымышленной компьютерной компании из фильма 1985 года «Электрические грёзы» и клички моей собаки Дейзи. Модель называется DAISY-1.
Творческий, авантюрный дух домашних компьютеров 1970-х и 80-х был неотделим от ограничений. Сорок столбцов, пара цветов (если повезёт), несколько звуковых каналов и BASIC. Это были не изъяны, которые нужно преодолевать, а сама среда.
Оборудование
Pinecone Daisy собран из трёх плат Arduino, в каждой из которых работает отдельная прошивка:
Видеопроцессор: Arduino Mega.
Аудиопроцессор: Arduino Uno.
ОС/интерпретатор BASIC: Arduino Due.
Главный контроллер (Due) общается с платами видеопроцессора и аудиопроцессора по UART при помощи легковесного пакетного протокола сообщений. I²C и SPI невозможно применять для коммуникаций между платами, потому что тайминг прерываний NTSC на видеоплате настолько строгий, что оба эти протокола оказываются ненадёжными. В пакеты включена контрольная сумма. Если пакет утерян, то он утерян навсегда, логики повторений нет. Для однопользовательской машины с платами, соединёнными короткими кабелями, это правильное решение.
Также Due обрабатывает матрицу клавиатуры, сканируя встроенную клавиатуру компьютера Lazer 50. На оригинальной клавиатуре отсутствуют клавиши курсора и Backspace, поэтому эта проблема решается комбинациями с контрольными клавишами. Shift+Space — это Backspace. Кажется, что это будет неудобно, но на практике всё вполне быстро и комфортно. Руки быстро привыкают к комбинациям.

Видео
Процессор дисплея работает на отдельной Arduino Mega, генерирующей монохромное композитное видео NTSC 40x25 с разрешением символов 8x8; сигнал при помощи bit-banging передаётся через контакт SPI. Чёрно-белое текстовое изображение — всё соответствует нужному временному периоду. Фундаментом стала работа Дейва Шменка, усовершенствовавшего библиотеку TVout; я адаптировал и расширил её под нужды Daisy.
У компьютера два набора символов, каждый по 256 символов. Первый (charram) заполнен ASCII плюс набором глифов для рисования. Второй (gfxram) пуст: это чистый холст для тайловой графики, собственных битовых карт и всего того, что понадобится пользователю. Оба можно полностью переопределить. Каждой строке дисплея можно независимо указать отрисовку из любого набора, благодаря чему можно в одном и том же кадре отрисовывать UI и графическое поле. Это не режим растрового изображения, но он и не должен им быть.
Решение на основе символов — это не какой-то стилистический выбор. Полный буфер растрового изображения при таком разрешении просто был бы невозможен для Mega: для его хранения недостаточно ОЗУ, а для его отправки недостаточен бюджет таймингов прерываний NTSC. Символы — это единственный способ отображения. Два набора символов позволяют выжать из этой системы максимум: один всегда заполнен глифами текста и рисования, второй свободен и готов к созданию наборов тайлов и битовых карт.
Оба набора символов хранятся только в ОЗУ, но их можно сохранять и загружать с накопителя по сети.
Дисплей также поддерживает полуграфический слой в традициях Sinclair ZX81 и TRS-80. Каждая ячейка символа размером 8x8 разделена на сетку пикселей 2x2, обеспечивая фактическое разрешение 80x50 пикселей. Пиксели могут быть сплошными, отсутствующими или с дизерингом (паттерн шахматной доски). Последний вариант полезнее, чем может показаться: на маленьком ЭЛТ-мониторе при обычном расстоянии просмотра пиксели с дизерингом оптически сливаются и создают что-то близкое к значению серого. Это тот же принцип, что и при полутоновой печати, а с монохромным композитным сигналом изображение выглядит откровенно хорошо. Мы получаем на чёрно-белом дисплее три тоновых значения.
Также существует набор команд пиксельной графики:
PPLOTрисует отдельные пиксели.PLINEрисует линии Брезейнхэма и прямоугольники с заливкой и без.PCIRCLEработает с эллипсами, дугами и их вариантами с заливкой и без; опционально можно указывать начальный и конечный углы.PFILLвыполняет заливку по четырём соседям.PPOLYотрисовывает соединённые полигоны из массива 2D-координат и принимает два массива одновременно для удаления и перерисовки за одно видеосообщение, чтобы избежать мерцания при анимации.
Сигнал тестировался на маленьком чёрно-белом мониторе радионяни, Commodore 1084 и преобразователе композитного сигнала в HDMI. Во всех трёх случаях проблем не возникало.
Аудио
Аудиопроцессор работает на Arduino Uno, генерирующем три канала на 31,25 кГц при помощи Timer1 ISR: две импульсные волны и один канал шума. Три цифровых вывода микшируются через резистивный лестничный ЦАП; аналогичное решение могло использоваться и в 1982 году.
Импульсные волны поддерживают переменную широту импульсов и ШИМ-развёртку, управляемую НЧ-генератором, которая оживляет и уплотняет звук, делая его качественнее, чем это возможно при использовании статического квадратного сигнала. Оба канала также поддерживают плавный переход между нотами с изменением высоты тона между нотами с частотой примерно 244 раз в секунду. Канал шума — это не какой-то обобщённый белый шум, он реализует 23-битный LFSR SID 6581 с оригинальной схемой отводов, придающей ему ту самую характерную текстурную окраску, которую сразу узнают пользователи Commodore.
DaisyBASIC
Сердцем машины стал DaisyBASIC, исполняемый на Arduino Due. Его предками можно назвать Commodore/Microsoft BASIC, Applesoft, GW-BASIC, TI BASIC. Он добавляет оригинальные расширения, предназначенные для создания реальных программ на этой машине. Я не стремился выбрать какого-то одного предка, а хотел воссоздать воспоминания о работе с ретрокомпьютерами разных программистов.
READMATодной командой загружает весь массив напрямую из конструкций DATA. Все, кому приходилось писать цикл FOR для заполнения таблицы поиска на Commodore BASIC, знают, зачем создана эта команда.SWAPARRпоэлементно меняет местами два массива или выполняет трёхстороннюю ротацию, позволяя менять местами буфер отрисовки и дисплея без копирования.CLEARARRодной командой обнуляет массив или его конец, начиная с указанного смещения.RETURNпозволяет передавать значения вызывающей стороне, предоставляя подпрограммам чёткий механизм возврата без побочных эффектов глобальных переменных.TRAPиRESUMEобеспечивают структурированную обработку ошибок.TIMERзапускает GOSUB с указанным интервалом, что полезно для игровых циклов и анимаций, позволяя не блокировать опрашивающий цикл.CHUNKпо указанным разделителям превращает строку в массив.RENUMBERавтоматически перенумерует строки и обновляет все ссылки GOTO и GOSUB.
Для работы со звуком есть две парадигмы. PLAY принимает строки MML в традиции Commodore 128 BASIC 7 и GW-BASIC, позволяя сочинять музыку. SOUNDPGM выгружает пары «частота-длительность» напрямую в аудиопроцессор, разгружая основной цикл; больше подходит для звуковых эффектов. Эти парадигмы сосуществуют, потому что в разных машинах звук реализовывался по-разному, да и все программисты думают по-своему.
Ещё в компьютере есть встроенный клон Space Invaders, потому что почему бы и нет?

Сеть
WiFi реализована через ESP8266 с прошивкой running ZiModem Бо Циммера, это Hayes-совместимый модем через WiFi. Pinecone Daisy даже может обращаться к BBS! В компьютере полностью реализован встроенный эмулятор терминала VT52 с перемещением курсора, очисткой экрана, графическим режимом, поддержкой клавиш со стрелками ANSI и панелью состояния с датой и временем.

Кроме работы в терминале, DaisyBASIC предоставляет доступ к сети непосредственно программам. Команды NETPRINT, NETGET и NETINPUT позволяют запущенной программе на BASIC отправлять и получать данные по TCP-соединению, побайтно или построчно, в блокирующем или неблокирующем режиме. Этого достаточно для удалённого управления другой машиной, обмена состоянием игры между двумя Daisy или общения по сети с любыми системами, понимающими голый TCP. Очевидно, что можно использовать компьютер для сетевых игр или задействовать в качестве бэкенда более мощную машину, в то время как Daisy будет работать с UI.
Накопитель
Работа с накопителем реализована через небольшой сервер на Python (daisyfile.py), способный работать на любом подключённом к сети компьютере: ноутбук, Raspberry Pi — подойдёт что угодно. Программы, определения наборов символов и последовательные файлы можно сохранять, загружать, удалять, переименовывать и упорядочивать по папкам. Команды файлового ввода-вывода (FOPEN, FCLOSE, FPRINT, FINPUT, FGET, FPUT, FSEEK) предоставляют программам на BASIC прямой доступ к файлам на хосте в виде последовательных потоков.
Работа с компьютером
Строчный редактор ведёт себя точно так же, как на 8-битном Commodore. Перемещаем курсор на предыдущую строку, редактируем, нажимаем Return, и изменение внесено. Вот и всё. Никаких команд EDIT, никаких таинственных последовательностей курсорных клавиш, как на Apple II. Просто естественный, непосредственный процесс редактирования, который привычен пользователям Commodore BASIC, и должен бы быть привычен всем остальным.
Звуки клавиш по умолчанию включены, а-ля Atari 400/800: при каждом нажатии раздаётся короткий вибрирующий писк. Для подобной машины он подходит идеально. Если вы предпочитаете тишину, отключить его можно одной командой.
Также есть команда MORE для чтения текстовых файлов; её идея позаимствована у такой же команды AmigaDOS. Можно загружать файл с сервера и постранично читать его на экране. Всё это мелочи, но в итоге мы получаем машину, которой можно на самом деле пользоваться, а не просто писать код.
Главное — интерес и душа
Pinecone Daisy — это игрушка в лучшем смысле этого слова. Он живёт в корпусе персонального компьютера Lazer 50 и использует его оригинальную клавиатуру. Он загружает BASIC. Его назвали в честь фильма и собаки.
Эта машина предназначена для одиночного компьютерного творчества, когда-то бывшего привычным, но столь редкого сегодня. Подключаем, запускаем BASIC и пишем что-нибудь маленькое, странное и своё.

Скоро я выпущу полный проект, все три образа прошивки и файловый сервер на Python!
Кстати, компьютер не просто так называется Daisy ОДИН...
Комментарии (13)

dlinyj
01.06.2026 13:38Не хочу критиковать чужой проект, каждый развлекается как хочет. И концептуально это походит на мотивы ретро, в части звука и видео. И, нет ничего плохого в ардуино.
Но, 32-х разрядное ядро и делать вид что это ретро, нууу, такое себе. Можно взять какие-то другие архитектурные решения. То есть, это забавно, хорошая студенческая поделка, но ретродуши у ней нет. В общем, мой ретродух протестует против таких вот миксов.
strvv
01.06.2026 13:38Я думаю - что пусть будет 1000 разных решений.

NetBUG
01.06.2026 13:38Согласен.
Плюс к тому, тут есть нормальное сохранение – которого не было у большинства пользователей восьмибиток

Yamazaki123
01.06.2026 13:38Будет ещё один ретро-компьютер, для которого нативно никто ничего не пишет, кроме его создателя. Ладно, на нем работает бейсик, но он работает почти на всех ретро-компьютерах.
Играться в песочнице одному быстро надоедает. В этом смысле повезло тем, кто смог вокруг своего проекта собрать живое сообщество.

strvv
01.06.2026 13:38Как бы то не было, учиться на кошках тоже надо. То что сообщество нужно - люто плюсую, тому же @Андрей237 с его сначала наколенным русефи очень помогает.

j-b
01.06.2026 13:38Схемка будет?
Была когда-то у меня индейка, нечто подобное, но на парочке fpga соорудить, да оказалось что уже давно придумано и реализованно...

Rikimortuy
01.06.2026 13:38Нормальный франкенштейн получился, главное что сам процесс сборки доставил автору удовольствие. Писать свой бейсик поверх 32-битного камня это конечно своеобразное хобби, но почему нет)
evasokol
Напомнило подход Commodore и ZX Spectrum, где каждая экономия памяти превращалась в фичу
Rikimortuy
В спектруме это была суровая необходимость из-за цены на память, а не фича. Мы тогда трюкачили с регистрами просто чтобы игра вообще влезла в эти несчастные 48 килобайт