Мне могут возразить — это уже дорого, можно купить Raspberry или другой Linux board на эти деньги, однако реализация на STM32 имеет несколько выигрышных черт, таких как:
- Время готовности при включении меньше пары секунд.
- Лаг на клавиатуру меньше одного фрейма (20 миллисекунд, примерно как на настоящем, железном спектруме).
- Эмулятор на STM мне нравится больше, так как у эмуляторов на Linux, а также и других эмуляторов есть фатальный недостаток — их писал не я.
- Можно питаться от батареек.
Подробнее о реализации.
Подсистема звука
2 ШИМ канала 16 bit, на частоте 44100, работают постоянно и вытягивают из Fifo звук. С другой стороны в Fifo пишет текущий процесс. Это или ZX spectrum (Z80 эмулятор), или MP3 player decoder. Если нет места для звука, то процесс ждет сканируя клавиатуру. Z80, в свою очередь, отрабатывает один кадр и пишет эвенты связанные со звуком в очередь событий звука такие как speaker ON-OFF и AY 8910.С каждым эвентом идет и счетчик клоков Z80. По окончании кадра в 20 миллисекунд симуляции (4-8 миллисекунд stm32), рендерится кадр на экран(только изменения) и события звука из очереди рендерятся соотвественно в Fifo звука. Если он забит — значит мы торопимся, и нужно подождать. Таким образом осуществляется синхронизация времени между симулируемой и симулирующей системами. При чтении ТAP файлов (виртуального магнитофона), звук рендерится плотнее, с более коротким шагом, в 3-5 раз, и виртуальное время течет быстрее, соотвественно загрузка скорее чем с физического магнитофона. Впрочем можно ускорение отключить, с клавиатуры (F11-F12).
ШИМ, а не DAC, для звука выбран специально. Он позволяет уменьшить помехи от питания и вынести усилитель класса D наружу и организовать регулировку громкости питающим ключи напряжением. Даже простейший, на паре транзисторов, дает более качественный звук, чем просто усиление сигнала с шумного DACa (плата STM покупная, китайская, готовая. С ошибками.)
Чип AY-3-8910 не то что бы сильно сложный, но документация на него скорее предназначена для пользователей и интеграторов, а не для эмуляции/симуляции. О многом приходилось скорее догадываться и смотреть по коду разных эмуляторов, чем просто сесть и написать по документации. Возможно, что где-то и не угадал… И фокус написать его нетребовательным к СPU ресурсам. Вроде получилось.
Подсистема видео
Изменения цвета бордера (если они были) записывается в специальную очередь с клоками процессора. Это будет видно при загрузке с магн. Ну и некоторые игры обновляют его на ходу, для спецэффектов.
После этого, когда «z80» отработал свои такты на 20 миллисекунд кадр рендерится. То есть трюки с изменением кадра на ходу в демках работать будут не все. Но с играми проблем не замечено.
Контроллер обычный, параллельный 16bit FSMC <-> ILI9341 c SPI тачем (работает, но нигде не используется).
z80: это эмуляция CMOS версии Z80. Салат из разных мест, но большей частью из FUSE и немного моего творчества тоже (в основном на обьем и скорость). Тест zexall проходит.
Клавиатура
USB host HID device контроллер от STM. C USB роутерами работать не будет. Все претензии к ST, они поленились и я тоже. Конкретно на том боарде, что я использую нужно удалить резистор R21 1.5K: 3.3v<->USB D+.
Disk
Примерно так отформатирован у меня, но думаю, что не все критично:
Partition 1 type Start 2048 : W95 FAT32 (b)
Attributes: 80
Filesystem UUID: xxxx-xxxx
Filesystem: vfat
Корневые директории(для этого кода именно так):
Z48 — сюда класть программы для spectrum48. Форматы: .TAP,.Z80,.SNA
Z128 — сюда класть программы для spectrum128. Форматы: .TAP,.Z80,.SNA
MP3 — попробуйте угадать? И форматы?
Видео тест Спектрума:
Бонус. Реализован слой согласования с CP/M 2.2 от Grant Searle's.
Мужик сделал отличную работу по реализации CP/M на Z80 (отдельно) и FPGA (другая система). Там и BIOS и образ диска с дофига программ, утилит и компиляторов:
Си, Лисп, Ада, Паскаль, Cobol, Алгол, Forth, APL, Fortran, PL/I, Basic всякий, muMath & muSimp (CAS math package), игры, редакторы… всего 240 мега. Это сегодня пару страниц текста, а тогда, во времена CP/M, столько не было ни у кого. Подробнее здесь.
Ну и видео тест CP/M:
Я немного добавил к эмулятору z80 на STM32 слой обращения к диску и терминал экрана: клавиатуры, микс ANSI и VT100. Надо будет допроверить и доделать. В основном работает, CATCHUM и Turbo Pascal исправны. Запускается CP/M когда видит диск отсюда, по первым двум байтам образа. Если диска вообще нет, то запускается в режиме Spectrum 128 в меню.
Что не сделано:
- Чтение и запись с физического магнитофона, магнитофон купил, жду пустые кассеты с Али.
- Вообще любая запись в спектруме не написана.(В CP/M — есть запись)
- ".TGZ" формат?
Что еще:
Хм. Положил перед собой железо, выбираю:
Слева направо, сверху вниз:
Stm32h743, программер на stm32f103, Xilinx XC6SLX16, на ней программер для альтеры, Altera ep2c5 & PSRAM 8M, Zynq7010 (на али распродажи по $15!), W600-pico (60MHz m3+280 ram $2), ESP32-CAM with PSRAM 8M (очень дешевая но мало свободных ножек).
Нижний ряд: Еще Xilinx XC6SLX16, Xilinx XC6SLX9, ANLOGIC (22k lut+SDRAM), ALTERA EP4CE15F23C8, еще W600 за $1, но мало ножек.
Справа от клавиатуры белый магнитофон для демонстрации загрузок компьютеров внукам. Нет ничего дороже $30… Особенно интересно для тех, кто хочет учить Zynq7010 — это FPGA 28 K LUT + 2 ARM cores ~600MHz + flash 128MB + ddr 256MB +ETH100. Видимо распродают контрольные платы от битмайнеров. Удивился и купил.
Эмулятор z80 прогонял на них на всех, кроме программера для альтеры и магнитофона. На некоторых и эмулятор 80286-го прогнал.
Для тех, кто хочет повторить.
Искать:
«STM32F407VET6 Development Board Cortex-M4 STM32 minimum system learning board ARM core board +3.2 inch LCD TFT With Touch Screen». Проверял только с 3.2 экраном, чип ILI9341.
> Source
Javian
По-моему такие только с микрофона и радиоприемника записывали. Линейного входа в них нет.
Sdima1357 Автор
Есть вход с внешнего микрофона. И выход на наушники. Специально такой смотрел. Да и паяльник у меня не отняли ещё.
Лишь бы хоть как нибудь писал, а то я засомневался. Головка стирания — похоже просто постоянный магнит.
tormozedison
А если нет, ничего страшного. Сигнал через конденсатор, микрофон нафиг, и готов линейный вход. Я с безымянной магнитолой в девяностых такое делал.