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

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

ua6em пишет:

Окрнчание пошло в стиле Пола Морфи )))

Microchess стал играть весьма смело, хотя я все таки желал увидеть размен ферзей.
Но доиграть партию все же очень хочется. "Окончание электричества" :-) задержало, но не прекратило эту игру.
Я сейчас увлекся Rust-ом (почти как Go, только по субъективным ощущения интереснее, и тоже никаких классов, фабрик etc !!!). Так что или я сделаю раньше прототип эмулятора (пока без CP/M, чисто для шахмат) или переиграю партию на "нанокомпьютере", но результат таки я хочу узнать :-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

да там предсказуемо вроде как, думаю мат был неизбежен )))
Хотя кто знает, насколько микрочесс силён в окончаниях

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Эмулятор на Rust готов - выбираем из списка бинарных файлов в каталоге программы нужный (например, Бейсики, Минол или шахматы) и запускаем:

Rust - удобный инструмент для подобных задач.
In Rust we trust

Эмулятор успешно прошел знаменитого "экзесайзера":

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

В дополнение к предыдущему посту - т. Jonathan Pallant строит ретрокомпьютер на Кортексе, используя Эмбеддед Раст:
https://youtu.be/PXaSUiGgyEw

KPG
Offline
Зарегистрирован: 09.06.2019

Вот ещё близкий теме топика проект с Ардуино составляющей :)

RunCPM is a multi-platform, portable, Z80 CP/M 2.2 emulator.  https://github.com/MockbaTheBorg/RunCPM

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

KPG пишет:

Вот ещё близкий теме топика проект с Ардуино составляющей :)

RunCPM is a multi-platform, portable, Z80 CP/M 2.2 emulator.  https://github.com/MockbaTheBorg/RunCPM

Да, Arduino, но DUE  ;-) - это совсем другая весовая категория (32-битное ARM-ядро на 84 МГц), чем Nano.
 

 

Green
Offline
Зарегистрирован: 01.10.2015

Так вон люди SPI RAM кинулись покупать - чем не альтернатива? Ну да, скорость будет поменьше чем у Дуе, но куда нам спешить.)

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Green пишет:

Так вон люди SPI RAM кинулись покупать - чем не альтернатива? Ну да, скорость будет поменьше чем у Дуе, но куда нам спешить.)

Это да, но сейчас самый актуальный для меня проект (в наш город экспортировали на днях очень "популярную" сейчас  комбинацию РНК и белков) - "генератор" ультрафиолета на базе горелки ДРЛ-125 + умножитель + STM8 с реле в роли таймера (надоело мне с закрытыми глазами вилку вытаскивать, да и интереснее так, он еще и пищит, уменьшая период перед включением). Проект весьма опасный во многих смыслах, но выбирать не из чего. In ultraviolet machine, vitamin C and garlik we trust :-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

FoxyLab пишет:

Green пишет:

Так вон люди SPI RAM кинулись покупать - чем не альтернатива? Ну да, скорость будет поменьше чем у Дуе, но куда нам спешить.)

Это да, но сейчас самый актуальный для меня проект (в наш город экспортировали на днях очень "популярную" сейчас  комбинацию РНК и белков) - "генератор" ультрафиолета на базе горелки ДРЛ-125 + умножитель + STM8 с реле в роли таймера (надоело мне с закрытыми глазами вилку вытаскивать, да и интереснее так, он еще и пищит, уменьшая период перед включением). Проект весьма опасный во многих смыслах, но выбирать не из чего. In ultraviolet machine, vitamin C and garlik we trust :-)

и что? сожжёт?
 

 

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

ua6em пишет:

FoxyLab пишет:

Green пишет:

Так вон люди SPI RAM кинулись покупать - чем не альтернатива? Ну да, скорость будет поменьше чем у Дуе, но куда нам спешить.)

Это да, но сейчас самый актуальный для меня проект (в наш город экспортировали на днях очень "популярную" сейчас  комбинацию РНК и белков) - "генератор" ультрафиолета на базе горелки ДРЛ-125 + умножитель + STM8 с реле в роли таймера (надоело мне с закрытыми глазами вилку вытаскивать, да и интереснее так, он еще и пищит, уменьшая период перед включением). Проект весьма опасный во многих смыслах, но выбирать не из чего. In ultraviolet machine, vitamin C and garlik we trust :-)

и что? сожжёт?

линия ртути 254 нм - сильный бактерицидный эффект

линия ртути 185 нм - "генерирует" озон - дополнительный бактерицидный эффект

Но, естественно, потом требуется проветривание.

Вот такие самоходные УФ-роботы на front line, как принято сейчас говорить https://spectrum.ieee.org/automaton/robotics/medical-robots/autonomous-robots-are-helping-kill-coronavirus-in-hospitals

 

compdue
Offline
Зарегистрирован: 23.04.2020

Хоть и давно увлекаюсь компьютерными шахматами, но историю микрочесс узнал только сейчас. А история очень интересная!

Программа написана для компьютера KIM-1, сделанном на 6502. Дисплея у компа не было, был только 6-ти разрядный цифровой индикатор. (77й год таки!) Это сейчас у программы есть интерфейс, а первые игроки смотрели на циферки ))

Программа умещается в 1 кб памяти! И при этом вполне сносно играет, не опытного новичка так и победит.

FoxyLab мое уважение за проект! Все здорово!

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

compdue, спасибо!!!

Выполнил редизайн проекта, теперь он выглядит вот так:

Провести что-ли забавный эксперимент и сразиться с MICROCHESS? ;-) Сам-то я в шахматах от Остапа Бендера очень недалеко ушел :-))))

Оценил влияние размера кэша инструкций на реальную скорость работы "нанокомпьютера" на примере скорости обдумывания машиной первого хода в MICROCHESS (результаты для TURBO-режима, видеокартинка не отрисовывалась):

без кэша - 291 секунда;
кэш 4 байта (слишком маленький, накладные расходы не окупаются и ухудшают скорость) - 580 секунд;
кэш 8 байт (оптимум) - 21 секунда !!!;
кэш 16 байт (слишком большой, накладные расходы не окупаются) - 26 секунд.

 

 

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Добавил индикацию обращения к шине I2C (а так как кроме памяти там сейчас ничего не висит, то фактически обращения к ОЗУ) - светодиод, загорающийся при низком уровне линии SCL. Quick-and-dirty подход повесить светодиод через резистор 2 кОм не проканал совсем - не нашлось не одного модуля памяти на шине - слишком сильный pull-up оказался, через 4,7 кОм хоть и работало, но в 7407 есть свободные ноги, так что через повторитель получилось надежнее.
Теперь "модуль" ОЗУ выглядит так:

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Экран начальной загрузки на кинескопном ТВ:

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Повозился с кэшами (для меня проектирование кэша - одна из самых увлекательных сторон этого проекта, такой себе косплей проектировщика CPU :-) Теперь имеется кэш инструкций в 6 линий по 16 байт и кэш данных в 4 линии по 8 байт, для инструкций кэшируется только чтение, запись напрямую в память, для данных кэшируется и чтение, и запись, "грязный" флаг, все дела :-) Кэш - LRU, но реализация похожа на FIFO, если промах - последние данные добавляются в хвост, голова выталкивается, если попадание - нужные данные обмениваются с хвостом. Кэширование заметно ускорило работу, особенно отзывчивость CP/M. Теперь время инициализации ОС от окончания загрузки до появления A> в FAST режиме (без прорисовки картинки) - менее 2 секунд.

P. S. И недавно снятое (тогда кэш данных еще был однолинейный) видео с экрана кинескопного ТВ в винтажном стиле  :-)
https://youtu.be/qHOl7t_PkfQ

 

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Я начал компаньон-проект по расширению графических возможностей своего "нанокомпьютера". Еще одна обычная Arduino Nano выступает в роли видеокарты, обеспечивающей вывод на ТВ монохромной картинки с разрешением 320 x 244 (как у Sega Genesis, формат 240p) ! Причем это не рисование линий в формате демки, это модуль с полноценной пиксельной видеопамятью - в качестве нее я использую SPI RAM 23K256. Как основной вариант я хочу сделать разделенный по времени доступ к этому чипу - во время 244 активных пиксельных линий им владеет видеопроцессор, а остальные 68 линий - память может юзать основной процессор. Ну а сейчас я просто для "proof-of-concept" реализовал управление через UART. Вот какую картинку выдает моя видеокарта после загрузки через UART в видеопамять - я сконвертировал в монохром скриншот из игры FoxyLand для Sega Genesis - картинка снята посредством тв-тюнера (я откопал в закромах свой старенький 609-й Бехолдер):

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Добавил в прошивку "нановидеокарты" рисование линий Брезенхемом (на ассемблере) - так что теперь это поделие, наверно, один из немногих, если не единственный 2D-видеоускоритель на Arduino Nano :-)

Экран, заполненный символами шрифта (снимок с ТВ-тюнера):
nanovideo_font_tuner.png

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

FoxyLab пишет:

Добавил в прошивку "нановидеокарты" рисование линий Брезенхемом (на ассемблере) - так что теперь это поделие, наверно, один из немногих, если не единственный 2D-видеоускоритель на Arduino Nano :-)

Экран, заполненный символами шрифта (снимок с ТВ-тюнера):
 

какая у людей интересная жизнь! :-)))

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Попиксельный и посимвольный скроллинг вверх и вниз силами моей "нановидеокарты" (снято с помощью ТВ-тюнера) - как оказалось, мой подход аналогичен Roller RAM в 8-битных компьютерах Amstrad PCW:

https://youtu.be/-9w_FPTiY3o

P.S. На саму операцию скроллинга (безразлично, на пиксел или на символ) требуется время меньше периода строчной развертки, паузы между операциями добавлены для наглядности.

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

8-битный МК эмулирует 8-битный компьютер - это увлекательно, но эмуляция 32-битного RISC-V процессора и запуск Linux-программ в user mode на Arduino Nano - еще интереснее.

riscv4nano project is currently in active development :)

Пока я ограничился эмуляцией RV32I (прототип готов, осталось тестировать, там заморочек тоже хватает). Но gcc позволяет задать -march=rv32i -mabi=ilp32 и он сам уже будет эмулировать все остальные RISC-V-расширения.

С памятью сложнее - если не использовать printf/scanf, а использовать варианты попроще, то небольшая C-программка вполне вмещается в 32 Кбайта SPI RAM-ки 23K256. А так - или "SD" RAM как в начале cpm4nano (с кэшированием должно шевелиться, и памяти будет много-много-много) или SRAM через I2C-размножители пинов (на али сейчас продается 256-килобайтная платка с IS62WV12816BLL).

Линюксовые системные вызовы (syscalls) пока read(stdin)/write(stdout)/sbrk/exit.

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

 Наконец то удалось зафиксировать (на ТВ-тюнере) все этапы прохождения широко известного в узких кругах теста 8080-го - "экзорциста" -
[IMG]
Таким образом, мой эмулятор можно считать полностью верным.

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Мой компьютер на базе Arduino Nano в действии
(запись с помощью ТВ-тюнера):
включение, тест оперативной памяти, загрузка CP/M, выполнение команды DIR, переключение виртуальных экранов, тест процессора, ввод и выполнение программы на BASIC:
https://youtu.be/NxQ2Omf0swM

 

Green
Offline
Зарегистрирован: 01.10.2015

Ну, ОЧЕНЬ медленно.) У меня всё руки не дойдут до своего. Уже даже z84c00 подарили для творчества.

FoxyLab
FoxyLab аватар
Offline
Зарегистрирован: 10.06.2015

Green пишет:

z84c00


Это Вы хорошо напомнили - не откладывая, заказал две CMOS-версии 6502-го (он меня давно интересовал, а CMOS-версия позволяет останавливать тактирование).

Green
Offline
Зарегистрирован: 01.10.2015

6502 очень интересный проц., у меня товарищ с ним плотно работал, масса впечатлений. Касательно 84С - у меня и без него получается, просто времени, эдак, раз в год находится и то непродолжительно.)