Нарисовавши черно-белый 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
Корневые директории(для этого кода именно так):
ZX48
сюда класть программы для spectrum48.Форматы: .TAP,.Z80,.SNA
ZX128
сюда класть программы для spectrum128.Форматы: .TAP,.Z80,.SNA
MP3
попробуйте угадать? И форматы?
Видео тест Спектрума:
www.youtube.com/watch?v=WKQc5I55Ji8
Бонус. Реализован слой согласования с CP/M 2.2 от Grant
Searle's.
www.searle.wales
Мужик сделал отличную работу по реализации CP/M на Z80 (отдельно) и
FPGA (другая система)
Там и BIOS и образ диска с дофига программ, утилит и
компиляторов:
Си, Лисп, Ада, Паскаль,Cobol, Алгол,Forth,APL,Fortran,PL/I,Basic
всякий, muMath & muSimp (CAS math package), игры, редакторы всего
240 мега. Это сегодня пару страниц текста, а тогда, во времена CP/M
столько не было ни у кого.
Подробнее здесь:
obsolescence.wixsite.com/obsolescence/multicomp-fpga-cpm-demo-disk
Ну и видео тест CP/M:
www.youtube.com/watch?v=-h3XCy79aJw
Я немного добавил к эмулятору z80 на STM32 слой обращения к диску и
терминал экрана: клавиатуры, микс ANSI и VT100. Надо будет
допроверить и доделать. В основном работает, CATCHUM и Turbo Pascal
исправны. Запускается CP/M когда видит диск отсюда, по первым двум
байтам образа:
obsolescence.wixsite.com/obsolescence/multicomp-fpga-cpm-demo-disk
Если диска вообще нет, то запускается в режиме Spectrum 128 в
меню.
Что не сделано:
1. Чтение и запись с физического магнитофона, магнитофон купил, жду
пустые кассеты с Али.
2. Вообще любая запись в спектруме не написана.(В CP/M есть
запись)
2.".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:
github.com/sdima1357/spectrum128_cpm