Запуск компилятора языка Ada на Arduino Nano
На моем эмуляторе cpm4nano компьютера с процессором Intel 8080 и ОС CP/M (https://acdc.foxylab.com/node/76) на Arduino Nano 3.0 я запустил компилятор языка Ada!!! -
компиляция программы TOWERS.ADA для решения задачи о «Ханойской башне»:

запуск скомпилированной программы TOWERS.COM:
компиляция программы TOWERS.ADA для решения задачи о «Ханойской башне»:

запуск скомпилированной программы TOWERS.COM:

72 комментария
Сам написал?
Статья с описанием — acdc.foxylab.com/node/76
Код — github.com/Dreamy16101976/cpm4nano
оч. интересно.
Там работают ESC-последовательности терминала VT-100.
(например, команда ZB02 монтирует дискету с номером 02 в дисковод B)
Номера «вставленных» дискет запоминаются в EEPROM Arduino и восстанавливаются при повторном запуске эмулятора.
Я разделил адресное пространство 0x0000...0xFFFF на 16 блоков (с номерами от 0x0 до 0xF) размером по 4 КБайта. Каждый блок может быть отображен в один из 8 банков (размер банка — 64 КБайта). Соответствие банков блокам определяется значениями (номерами банков от 0 до 7) в наборе из 16 регистров (при запуске эмулятора активен только банк 0).
Для задания номера банка для определенного блока используются две команды вывода в порт:
OUT D0, номер_блока
OUT D1, номер_банка
Также для переключения блока памяти X на банк памяти Y можно использовать команду монитора YXY.
(использовал адаптер для подключения microSD-карточки)
Так что опасения в быстром выходе из строя карточки немного преувеличены.
— подключил два чипа FRAM (32 КБайта каждый), причем сделал автоконфигурацию чипов (их может быть до 8 ) по банкам, так что эти два чипа закрыли нулевой банк ОЗУ
— отвязал при этом аппаратный I2C от прерываний (отказавшись заодно от использования Wire.h)
— отвязал работу с UART от прерываний
— от прерываний я отвязался не зря — таймер 1 после этих ухищрений позволил генерировать частоту строчной развертки для вывода на ТВ; я смог подобрать набор ассемблерных команд, которые позволят выводить пиксел за 7 тактов процессора (причем знаки берутся из знакогенератора — массива во флэш-памяти, а не экранного буфера в ОЗУ), а это при 56 мкс активной части строки даст 128 пикселей, т.е. Arduino Nano (одна!!!) сможет и эмулировать, и выводить на экран через композитный вход ТВ, хотя и утратив несколько в производительности (но все же не до такой степени, как ZX80 сэра Клайва :-) )
— переписал код эмуляции, сэкономив несколько килобайт флэша
Продолжение (и новая версия кода на гитхабе, а также дополненное описание на acdc.foxylab.com/node/76) следует
P.P.S. Причешу код и обновлю на гитхабе.
Восьмеричная система… компьютер на год старше меня :-)
На текущий момент в проекте cpm4nano одна (!) Arduino Nano (!):
— эмулирует процессор i8080;
— загружает ОС CP/M и выполняет ее программы;
— обменивается информацией по последовательному порту;
— выводит изображение на экран ТВ.
P.S. Шрифт надо подправить, некоторые символы не канают:-) Сдается мне, что спектрумовский сжатый шрифт смотрелся получше.
P.P.S. На очереди — PS/2 клавиатура, все-таки с регистрами сдвига не буду, наверно, заморачиваться, использую малую стмку.
Можно ли сделать меньше межбуквенное расстояние? с чем это связано?
В минимальной конфигурации требуется:
Arduino Nano 3.0;
SD-карточка с адаптером;
преобразователь USB-UART.
В любом случае, если уж отдельный контроллер ставить то приходит в голову мысль что клавиатуру можно и usb городить
Ещё бы добавить АДА с Фортраном, и суперюзабельно было бы
компиляция
линковка
и запуск
Но линковка весьма неспешна :-).
Там в примерах были шахматы на 900 строк и они откомпилировались в бинарь 12 или 16 кб, что вполне неплохо.
Компилятор алгола есть, то он не генерирает .com, а только какие-то файлы, которые надо запускать другой утилитой.
Есть еще Turbo Pascal, но там здоровенный рантайм (16 кб, а если с флоатами, то 25 кб)
Осталось разобраться с геймплеем, но вспоминая, как в былые времена сажал самолет переключателем Р/ГРД/Г (олдовые люди :-) поймут, о чем это я) — разве это проблема?
Успешные испытания подключения PS/2-клавиатуры через STM8-переходник сделали мой «нанокомпьютер» автономным.
Итак, cpm4nano Mk V:
Arduino Nano 3.0 — эмулирует систему команд i8080, обеспечивает работу с памятью и дисками, выполняет вывод видеоизображения и обмен по последовательному каналу
ОЗУ — 2 x 32 Кбайтных I2C-чипа FM24C256-G
FDD — SD-карточка
ввод — PS/2-клавиатура через STM8S103F3P6-переходник
вывод — параллельно на видеовыход (20 строк x 45 колонок, шрифт 4 x 8) и последовательный порт (USB-UART преобразователь)
P.S. Испытал подключение к кинескопному ТВ (четкость изображения хуже, чем на LCD, но синхронизация не нарушается и шрифт читаем).
«Привет, мир!»;
Длительность прогона 32768 команд:
(при выборке из памяти было включено кэширование)
NOP
без выборки из памяти — 0,6 сек
с выборкой из памяти — 2,1 сек
MOV A,A
без выборки из памяти — 0,7 сек
с выборкой из памяти — 2,2 сек
DAA
без выборки из памяти — 0,8 сек
с выборкой из памяти — 2,3 сек
Без кэша заметно медленнее — например, прогон NOP требует больше 6 секунд.
YouTube
на экране LCD-телевизора:
на экране ЭЛТ-телевизора:
Дополнительные опции -
страничный режим (блокировка прокрутки) — управление клавишей Scroll Lock с индикацией светодиодом;
ввод русских букв в кодировке КОИ-8 — переключение языка комбинацией клавиш Alt-Shift с индикацией светодиодом;
аппаратная перезагрузка сочетанием клавиш Ctrl-Alt-Del
Содержимое текущего виртуального экрана хранится в видеопамяти (ОЗУ микроконтроллера), а содержимое другого виртуального экрана — в основной памяти (I2C-чипах).
Они расположены горизонтально, разрешение виртуального экрана — 40 колонок и 19 строк + 1 строка статуса:
Таким образом, виртуальные экраны эмулируют физический экран с 80 колонками (Osborne эмулировал физический экран со 128 колонками посредством перекрывающихся виртуальных экранов шириной 56 колонок).
Переключение режимов (физический экран/виртуальные экраны) осуществляется из программы-монитора.
Переключение между виртуальными экранами осуществляется комбинацией клавиш CTRL-O.
Пример:
левый виртуальный экран
правый виртуальный экран
На мой первый ход пешкой
программа, подумав три минуты, ответила лошадью ;-)