Запуск компилятора языка Ada на Arduino Nano

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

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

54 комментария

avatar
а что значит "Я создал эмулятор для Arduino Nano, способный воспроизводить все команды процессора i8080"?
Сам написал?
  • VBI
  • 0
avatar
Да.
Статья с описанием — acdc.foxylab.com/node/76
Код — github.com/Dreamy16101976/cpm4nano
avatar
очень впечатляюще!
avatar
Спасибо!
avatar
Круто. Сколько же на это было отдано времени? Это же титаническая работа.
avatar
Спасибо! Работа интересная, хотя и иногда утомительная, например, редизайн шрифта 4x6 на 4x8 и добавление русских букв, чем я сейчас и занимаюсь. А время — не считал, конечно, но часов 100, наверно.
avatar
Отличный проект!
avatar
Рад, что проект понравился!
avatar
Интересно, а как реализован вывод на экран? только через BDOS или непосредственным доступом памяти?
avatar
Для консольного вывода я перехватываю обращение (из BDOS) к BIOS и делаю вывод в порт (я эмулирую порты «Альтаира» для совместимости) — при выполнении вывода в порт я делаю вывод на консоль (сейчас я использую для связи с эмулятором преобразователь USB-COM, в дальнейшем сделаю вывод на экран). Сами BDOS и CCP — оригинальные, от CP/M 2.2.
avatar
т.е. как в Apple I? Запись значения = вывод на экран?

оч. интересно.
avatar
пардон, Apple 3 вроде бы.
avatar
Не совсем так. В процессор 6502 (на котором построен Apple II) пространство ввода-вывода проецируется на адресное пространство памяти (ввод-вывод в определенную ячейку памяти = ввод-вывод в определенный порт). В Intel 8080 пространство ввода-вывода отделено от памяти, просто если исполнитель команд в моем эмуляторе видит, что нужно выполнить вывод байта в определенный порт, то он выводит этот байт на экран (в консоль).
avatar
Дело не в процессорах а в реализации. Интересно, а под cp/m ansi последовательности работают? Например, позиционирование курсора.
avatar
Реализация должна соответствовать тому, что ожидают прикладные программы, работающие на этом процессоре.
Там работают ESC-последовательности терминала VT-100.
avatar
P.S. Я же могу запустить на эмуляторе не только CP/M, но и программы, работающий без ОС — например, альтаировский BASIC.
avatar
версию PaloAlto?
avatar
Да, я для этого сделал порты консольного ввода-вывода как у двух разновидностей плат для «Альтаира». Но Ада, конечно, интереснее. Сейчас хочу Фортран (первый ЯВУ, с которым я познакомился) и Форт попробовать запустить.
avatar
Изменил подход к эмуляции НГМД — выделил на карточке область для хранения содержимого 100 дискет и командой монитора Z «вставляю» дискету в один из дисководов A, B, C или D
(например, команда ZB02 монтирует дискету с номером 02 в дисковод B)

Номера «вставленных» дискет запоминаются в EEPROM Arduino и восстанавливаются при повторном запуске эмулятора.
avatar
Я сделал эмуляцию устройства управления памятью (MMU) с переключением банков, что позволило иметь доступ к 256 КБайтам памяти.
Я разделил адресное пространство 0x0000...0xFFFF на 16 блоков (с номерами от 0x0 до 0xF) размером по 4 КБайта. Каждый блок может быть отображен в один из 8 банков (размер банка — 64 КБайта). Соответствие банков блокам определяется значениями (номерами банков от 0 до 7) в наборе из 16 регистров (при запуске эмулятора активен только банк 0).
Для задания номера банка для определенного блока используются две команды вывода в порт:
OUT D0, номер_блока
OUT D1, номер_банка
Также для переключения блока памяти X на банк памяти Y можно использовать команду монитора YXY.
avatar
Тестирование 8 банков (512 КБайт памяти):
avatar
cpm4nano Mk II
(использовал адаптер для подключения microSD-карточки)
avatar
Новый рекорд — я прогнал без сбоев 7400 проходов теста памяти (ардуинка непрерывно молотила больше двух суток):

Так что опасения в быстром выходе из строя карточки немного преувеличены.
avatar
Вот они какие, Гики…
avatar
Новости проекта:
— подключил два чипа FRAM (32 КБайта каждый), причем сделал автоконфигурацию чипов (их может быть до 8 ) по банкам, так что эти два чипа закрыли нулевой банк ОЗУ
— отвязал при этом аппаратный I2C от прерываний (отказавшись заодно от использования Wire.h)
— отвязал работу с UART от прерываний
— от прерываний я отвязался не зря — таймер 1 после этих ухищрений позволил генерировать частоту строчной развертки для вывода на ТВ; я смог подобрать набор ассемблерных команд, которые позволят выводить пиксел за 7 тактов процессора (причем знаки берутся из знакогенератора — массива во флэш-памяти, а не экранного буфера в ОЗУ), а это при 56 мкс активной части строки даст 128 пикселей, т.е. Arduino Nano (одна!!!) сможет и эмулировать, и выводить на экран через композитный вход ТВ, хотя и утратив несколько в производительности (но все же не до такой степени, как ZX80 сэра Клайва :-) )
— переписал код эмуляции, сэкономив несколько килобайт флэша
Продолжение (и новая версия кода на гитхабе, а также дополненное описание на acdc.foxylab.com/node/76) следует
avatar
И заметте, уважаемый VBI /, никто не париться зачем это сделано и кому это показать ;)
avatar
потому что — правильный проект!
avatar
Один англоязычный товарищ PDP на Arduino эмулирует, так что 8080 — не предел :-)
avatar
P.S. Добавил поддержку протокола XMODEM, так что теперь можно загружать файлы и диски в эмулятор из терминальной программы (например, Tera Term).
P.P.S. Причешу код и обновлю на гитхабе.
avatar
Ардуино запускает загруженный через XMODEM монитор (turnmon) от «Альтаир 8800» (я сделал эмулятор совместимым по портам с ним) — выполнена команда дампа памяти:

Восьмеричная система… компьютер на год старше меня :-)
avatar
Похвастаюсь :-) Я научил свой «нанокомпьютер» выводить на экран ТВ без джиттера (!) 20 строк текста по 40 колонок в каждой:

На текущий момент в проекте cpm4nano одна (!) Arduino Nano (!):
— эмулирует процессор i8080;
— загружает ОС CP/M и выполняет ее программы;
— обменивается информацией по последовательному порту;
— выводит изображение на экран ТВ.
P.S. Шрифт надо подправить, некоторые символы не канают:-) Сдается мне, что спектрумовский сжатый шрифт смотрелся получше.
P.P.S. На очереди — PS/2 клавиатура, все-таки с регистрами сдвига не буду, наверно, заморачиваться, использую малую стмку.
avatar
Поздравляю!
Можно ли сделать меньше межбуквенное расстояние? с чем это связано?
avatar
Спасибо! Я использую символьный видеобуфер (хранит коды символов, а не биты изображения). Сами пиксели символов достаются из флэша командой lpm, а это три дополнительных машинных цикла. Так что это побочный эффект экономии памяти :-)
avatar
Текущая схема проекта:

В минимальной конфигурации требуется:
Arduino Nano 3.0;
SD-карточка с адаптером;
преобразователь USB-UART.
avatar
С добавление интерфейса PS/2 для подключения клавиатуры мой «нанокомпьютер» стал самодостаточным:
avatar
а арудинки уже не хватает? Или просто захотелось stm помучать :)
В любом случае, если уж отдельный контроллер ставить то приходит в голову мысль что клавиатуру можно и usb городить
avatar
Конечно, можно на регистрах сдвига построить схему и в остаток времени после генерации ТВ-строки считывать, но там слишком много заморочек. А эта STM-ка слабее, чем ATmega328, так что логике проекта не противоречит. А многие USB-клавиатуры имеют firmware, который позволяет подключить ее к PS/2 разъему напрямую, они просто переключаются в PS/2 режим, когда обнаруживают это.
avatar
P.S. У PS/2 протокола строгие тайминги, так как клок генерит сама клавиатура.
avatar
P.P.S. Привычные ардуинские библиотеки использовать нельзя — прерывание от клавиатуры нарушит генерацию ТВ-сигнала
avatar
Вид шрифта на экране ТВ после редизайна и добавления символов псевдографики и русских букв в кодировке КОИ-8:
avatar
Текущий вид проекта:
avatar
Добавил подстрочный «аппаратный» курсор:
avatar
Пора уже делать демо на этой штуке :)
avatar
В планах — запуск транслятора КОБОЛа и встраивание в монитор интерпретатора Брэйнфака :-)))
avatar
отличный выбор.
Ещё бы добавить АДА с Фортраном, и суперюзабельно было бы
avatar
Компилятор ADA для 8080 вполне себе работает на моем «нанокомпьютере», в самом верху этой статьи скриншоты запуска компилятора и самой скомпилированной программы.
avatar
Ну, я не совсем понимаю выбор языков, но — дело твоё! :)
avatar
Для 8080 (именно 8080, без команд Z80) выбор ЯП не такой уж и большой. А конкретно такой выбор во многом ностальгия, из первой половины 90-х. Тогда ADA была чем-то сверхестественным, «военный» язык. КОБОЛ — в книжках по программированию/информатике он упоминался как одна из первооснов, наряду с АЛГОЛом (кстати, надо поискать компилятор). ФОРТРАН — помню, как я рисовал перфокарты и вписывал в них команды (была такая умная синяя книжка, для школ :-) Еще можно поискать PL/I или PL/M (на нем, по меньшей мере, в конце 80-х было написано ПО для РВСН, некоторые мои одноклассники ходили в такой неофициальный кружок, где изучали этот язык и юзали перфокарты).
avatar
Успешно испытал на «нанокомпьютере» компилятор Бейсика:
компиляция

линковка

и запуск

Но линковка весьма неспешна :-).
avatar
Я смотрел разные языки для cp/m и больше всех понравился PL/1.
Там в примерах были шахматы на 900 строк и они откомпилировались в бинарь 12 или 16 кб, что вполне неплохо.
Компилятор алгола есть, то он не генерирает .com, а только какие-то файлы, которые надо запускать другой утилитой.
Есть еще Turbo Pascal, но там здоровенный рантайм (16 кб, а если с флоатами, то 25 кб)
avatar
Спасибо за информацию! Запустить шахматы было бы очень занимательно, учитывая, что те шахматы, что я видел (Sargon) — для Z80, а компилятор PL/I, скорее всего, все-таки для 8080. Обидно, что многие программы используют буквально несколько команд Z80, а уже не запустятся :-)
avatar
Да, много хороших программ, но для z80
avatar
Моим симулятором успешно пройден весьма сложный тест:
avatar
А вот и запуск эпической игры Star Trek (этот вариант написан на языке Ada и скомпилирован в моем эмуляторе):

Осталось разобраться с геймплеем, но вспоминая, как в былые времена сажал самолет переключателем Р/ГРД/Г (олдовые люди :-) поймут, о чем это я) — разве это проблема?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.