Arduino Nano 3.0 - эмулятор компьютера под управлением ОС CP/M

Тема в разделе "Глядите, что я сделал", создана пользователем FoxyLab, 23 мар 2017.

  1. FoxyLab

    FoxyLab Гик

    Приветствую всех любителей Arduino! В стародавние восьмибитные времена мой "Байт" не позволял загружать бывшую тогда де-факто стандартом ОС CP/M. И я через двадцать лет решил исправить сей недостаток - сделать свой CP/M компьютер из ... Arduino Nano 3.0
    Я сделал эмулятор процессора i8080 для Arduino Nano (он проходит тест от MICROCOSM) и адаптировал CP/M. Основная проблема - в ардуинке всего 2 (!) кбайта ОЗУ. Но у нас же есть SD-карточка - я сделал 8-линейный кэш (по 64 байта) к этой карточке, а сама карточка эмулировала все 64 кбайта ОЗУ.
    Скорость работы не такая уж и плохая:


    Заодно эта карточка эмулирует и четыре гибких диска.
    Вот quick-and-dirty ;) прототип моего поделия:
    [​IMG]
    Да, я не использовал адаптер для карточки, я вставил ее в разъем шлейфа от пятидюймового дисковода. :)
    Для связи с компьютером я использую терминальную программу (в будущем планирую PS/2-клавиатуру и ЖК-экран либо подключение к телевизору).
    Вот скриншот проверки памяти:
    [​IMG]
    Загрузка CP/M:
    [​IMG]
    Тест процессора:
    [​IMG]
    А вот моя первая программа на Бейсике за прошедшие двадцать :) лет:
    [​IMG]
    (я запустил на своем поделии TinyBASIC).
    Более подробное описание я начал делать здесь - https://acdc.foxylab.com/node/76
     
    BAR__MEN, Igor68, Egony и ещё 1-му нравится это.
  2. FoxyLab

    FoxyLab Гик

    Я выгрузил очень сырую версию кода моего проекта на Github:
    https://github.com/Dreamy16101976/cpm4nano

    Также я сделал эмуляцию портов 0 и 1 в стиле "Альтаира". Это позволило мне запустить Альтаировский TinyBASIC без (!) CP/M.
     
    BAR__MEN, Igor68 и Egony нравится это.
  3. FoxyLab

    FoxyLab Гик

    Для упрощения настройки CP/M под актуальный размер ОЗУ я извлек образ CCP и BDOS из MOVCPM.COM и проанализировал (с помощью программы, конечно) различия между этим шаблонным образом и реальным образом системы с 62 КБайтами. Результатом стал проект getcpm - https://github.com/Dreamy16101976/getcpm .
    При запуске программы getcpm.exe требуется указать размер памяти в килобайтах (XX) и желаемый серийный номер системы CP/M (6 байтов в 16-ричном виде, YYYYYYYYYYYY), после выполнения настройки создается файл CPMXXK.SYS и указывается его восьмибитная контрольная сумма:

    [​IMG]

    Программа, используя файл CPMDIFF.SYS, корректирует адреса в файле CPM00K.SYS, выполняя настройку CCP и BDOS на заданный объем оперативной памяти:

    [​IMG]

    Сама программа написана на Go и компилируется командой go build getcpm.go
     
    BAR__MEN, Un_ka и Igor68 нравится это.
  4. FoxyLab

    FoxyLab Гик

    Я нашел и исправил ошибку в эмуляции команд INR N/DCR M.:)

    Теперь команда TYPE работает правильно!!!:)

    Эмулятор почти готов к применению, я напишу для интересующихся инструкцию, как "приготовить" SD-карточку.

    P.S. Гарри знал свое дело, его система загружалась и выполняла многие команды даже при неверно работающих довольно часто встречающихся командах процессора!!!
     
    BAR__MEN, Un_ka и Igor68 нравится это.
  5. Airbus

    Airbus Радиохулиган Модератор

    MS DOS ради MS DOS?
     
  6. FoxyLab

    FoxyLab Гик

    :) Нет, конечно, какой же фан от MS-DOS ?! Это CP/M! Но я не спорю, это интерес представляет только для "олдовых" людей IMHO :)
     
    Igor68 нравится это.
  7. ostrov

    ostrov Гуру

    Эмулятор РК-86 получится?
     
  8. FoxyLab

    FoxyLab Гик

    РК-86 - один из CP/M-совместимых компьютеров. Ядро системы одинаково, но BIOS у моего проекта свой, поэтому нет, не эмулятор РК-86.
     
    Igor68 нравится это.
  9. Igor68

    Igor68 Гуру

    Наверное выгоднее применить набор из статических ОЗУ (Советских ещё). Помню они были по 2 кБайт каждая. Кушают мало и в корпусе DIP (по моему 24)... питание 5 В. Можно для доступа по шине адреса и данных применить порты ввода-вывода ардуины. Всё-таки для CS придётся дешифратор (ИД3 вполне). Если посчитать, то 16*2=32 Кбайт.... как младшие из этого семейства. А SD оставьте для CP/M-80. В принципе туда можно и "монитор" (bios низкого уровня), как в Радио 86 РК и ORION-128. Думаю необходимость в ОЗУ всё-таки есть... ведь область экрана тоже в озу, а жизнь SD карты коротка... впрочем как и SSD дисков. они же не FRAM! Кстати FRAM по SPI тоже выход и относительно не дорого. Можете спокойно работать при этом и с 64 кБайт как и положено... если учесть, что для I8080 требовалось всего 2 МГц.
    Удачи во всём! Надеюсь это не первоапрельская шутка:)!!!!!
     
    FoxyLab нравится это.
  10. FoxyLab

    FoxyLab Гик

    Спасибо!!!!!!!!
    Нет, не шутка:) Первый пост я разместил 23 марта:) Да и весь проект - на гитхабе, и постоянно обновляется.
    Сдшка как ОЗу - это для фана:) Но реакция на ввод с клавиатуры и у интерпретатора Бейсика, и у самой системы вполне приемлемая. Другое дело, что операции с интенсивным использованием памяти весьма неспешны, кэш маловат.
    Мне приехала SPI SRAM 23K256. Ее и подключу как ОЗУ (она 32 Кбайт, я поэтому и перегенерил ядро системы под 32-кбайтное ОЗУ). А через месяц-два и ФРАМки приедут, правда они I2C-шные оказались:) Ну да ладно.
    Монитор я сделал, он при запуске и стартует, и из него уже загружается сипиэмка, форматируются диски, отладка там, все дела:)
    P.S. Я адаптировал процедуры биоса под альтаир, бейсик его запустился (я об этом выше писал), хочу другой его софт (не требующий CP/M) (там даже шахматы были) попробовать.
    P.P.S. Я стал использовать при записи/чтении данных ОЗУ на карточку LRC-контрольную сумму. Пока не было ошибок.
     
    Последнее редактирование: 1 апр 2017
    BAR__MEN, Un_ka и Igor68 нравится это.
  11. Igor68

    Igor68 Гуру

    Про i2c FRAM поделитесь мнением... если не затруднит! Даташит...только не на китайском!
    Спасибо!
     
    FoxyLab нравится это.
  12. FoxyLab

    FoxyLab Гик

    Конечно, когда приедет.
    Еще одна забавная вещь о FRAM - "ферроэлектрик" - это зарубежный синоним "сегнетоэлектрика". Но встретил недавно в описании заказанного мной чипа в глубинах сети: "ферритовая память" - наверно, автор полагал, что там 262144 ферритовых колечка :)
     
    Последнее редактирование: 1 апр 2017
    Igor68 нравится это.
  13. Igor68

    Igor68 Гуру

    Нет... это просто гистерезис электризации материала (ранее был только на основе органических соединениях - полимерах) - сегнетоэлектрики. Гистерезис похож на это самые ферритовые (с "прямоугольным" - кпутым "фронтом") колечки. Но магнитный принцип не используется... жаль, что идея ЦМД (цилиндрические магнитные домены) умерла... практически настоящие HD, только без механических элементов.
     
    FoxyLab нравится это.
  14. FoxyLab

    FoxyLab Гик

    Конечно, я про это и написал.
    Наверно, это профессиональная деформация :), но я придрался к "ферритовая".
     
    Igor68 нравится это.
  15. FoxyLab

    FoxyLab Гик

    Сделал ввод с консоли более универсальным - через прерывания - с прицелом на подключение в дальнейшем PS/2-клавиатуры + добавил команду R монитора для сброса ардуинки.
     
    Igor68 нравится это.
  16. FoxyLab

    FoxyLab Гик

    Сделал 200 прогонов теста памяти (добавил команду в монитор) - сбоев не обнаружено:
    [​IMG]
     
    BAR__MEN, Aleks_NN и Igor68 нравится это.
  17. FoxyLab

    FoxyLab Гик

    С помощью эмуляции шин адреса и данных, а также внутренних регистров (W, Z, ACT, TMP), сделал эмуляцию микроопераций как можно ближе к "железному" процессору + с помощью #define сделал код эмуляции намного более наглядным. Новый код уже выложен на GitHub.
     
    Igor68 нравится это.
  18. FoxyLab

    FoxyLab Гик

    По результатам тестов время случайного доступа к эмулируемой картой оперативной памяти составило около 7 миллисекунд.
     
    Igor68 нравится это.
  19. FoxyLab

    FoxyLab Гик

    Из-за применения кэширования среднее время доступа при последовательном доступе к памяти составляет около 80 микросекунд.
    Я использовал тест на Бейсике (в интерпретаторе TINYBASIC) для оценки влияния кэша на быстродействие в реальной задаче:
    [​IMG]
    (размер линии кэша составляет 64 байта)
    кол-во линий кэша время выполнения теста (секунды)
    2 ................................... 345
    4 ................................... 155
    6 ................................... 80
    8 ................................... 60
     
    Igor68 нравится это.
  20. FoxyLab

    FoxyLab Гик

    FRAMки приехали, осталось дождаться DIP-переходников.
    [​IMG]
     
    Igor68 нравится это.