Нарисовав черно-белый Spectrum48 за $3 на телевизоре и получив вопросы как: «а почему не цветной», «а почему без музыки», «а где НЕИГРУШКИ» — решил поправить и опубликовать менее бюджетную версию, Spectrum128+СP/M, примерно на $25 железа.



Мне могут возразить — это уже дорого, можно купить Raspberry или другой Linux board на эти деньги, однако реализация на STM32 имеет несколько выигрышных черт, таких как:

  1. Время готовности при включении меньше пары секунд.
  2. Лаг на клавиатуру меньше одного фрейма (20 миллисекунд, примерно как на настоящем, железном спектруме).
  3. Эмулятор на STM мне нравится больше, так как у эмуляторов на Linux, а также и других эмуляторов есть фатальный недостаток — их писал не я.
  4. Можно питаться от батареек.

Подробнее о реализации.

Подсистема звука

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 в меню.



Что не сделано:

  1. Чтение и запись с физического магнитофона, магнитофон купил, жду пустые кассеты с Али.
  2. Вообще любая запись в спектруме не написана.(В CP/M — есть запись)
  3. ".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