Итак, исходно-расходные материалы:
- «Blue pill»: STM32F103C8T6 — 20K ram 64K flash $2.06
- «Ардуино Display»: ILI9341 2.8″ 320×240 с сенсорным экраном и слотом карточки $7.72
- Пищалка $0.18
- Немного кнопок (7 штук) $0.2
- Немного проводов $0.1
- Флеш карта на 64 мега (с древнего фотоаппарата), в расчет не включена
- Программатор для ST-LINK, не расходуется и в расчет не включен, однако тоже пару долларов стоит
- Пачка сигарет — расходуется слишком быстро и каждый день -$8.37
Замечательная «голубая таблетка» китайского производства хороша всем, кроме объема оперативной памяти, всего 20К (впрочем постоянной тоже немного, всего 64К). Spectrum-48К нужно 48К (совпадение?-не думаю) оперативной памяти и 16К постоянной. Оперативную память займем у экрана, ведь разрешение спесси — 256х192 + бордюр, а у ILI9341 — 320х240 по 18 бит на точку. То есть можно середину экрана использовать для отрисовки, а все остальное — для собственно «swap area» (область подкачки?). При этом наиболее часто (LRU алгоритм) используемая эмулятором процессора Z80 память- кешируется в оперативной памяти STM32, остальное хранится в экранной памяти ILI9341, с медленным (SPI) доступом.
Лет 25 назад, я писал эмулятор Z80 на платформе 80286, они с Z80 не очень дальние родственники, оба произошли от 8080, что позволило получить весьма быстрый код при помощи чудесного Борланд ТАСМ и С++, однако тогда не было необходимости настолько детальной эмуляции (код писался для обеих сторон: записная книжка со словарем и ее эмулятор под windows 3.1 для отладки).
Писать с нуля под арм было лень, поэтому я спросил у Гугла: «А скажи-ка мне Гугл, как сегодня дела с аккуратной эмуляцией Z80?». Гугл мне выдал пару тысяч два подходящих проекта: На базе STM32F4, автор Gorien и наиболее продвинутый и отлаженный Fuse-emulator. При первой сборке кода от Gorien, получилось около 100К исполняемого кода, что явно больше доступной на сабже. Пришлось немного повозиться с упихиванием слона в холодильник. К примеру, обращения к локальным переменным компилируются в более компактный код, чем глобальные, все расширенные команды регистров IX и IY одинаковые, с точностью до замены переменных, таблицу знакогенератора можно заменить ссылкой на знакогенератор Спектрума и т.д. Также потребовалось разогнать процессор до 112 MHz (спасибо xedas за идею)
Результат: работающий (попробовал около десятка игр, пока все работают) эмулятор ZX spectrum-48 с экраном размером с пачку сигарет (в карман уже влезает, но провода торчат наружу ), чтением дампов (иконка+образ памяти+регистры ~50K) игр с флеш карты формата FAT32 (еще несколько килобайт кода) и с суммарным потреблением ~50мА (то есть около 50 часов от типичной 18650 батареи на 2500мАч!), временем включения меньше секунды и общей стоимостью около деталей менее $10.
Недостатки:
- Все же немного медленнее оригинала.
- На экране видно код загруженной программы, в цвете.
- Надо джойстик, или кнопки помягче. И плату. И коробку. И прямые руки. И …
В примерных планах: снижение потребления (оторвать светодиоды с платы), добавить модуляцию яркости экрана, режим часов с выключенным экраном, спаять нормальную клавиатуру с джойстиком, настроить задержки для корректного звука и чтения с магнитофона(а надо?), РС конвертер форматов файлов в дампы, ужать еще немного код для размещения интерфейса пользователя. Попробовать удешевить платформу используя экран 2.4 дюйма. Он правда, ну очень маленький, но за 5… Понятно, что тут интерес чисто спортивный, хотя если принять во внимание скорость разборки всякой электроники на непригодные запчасти внуками, цена все же имеет значение.
Собственно текущий работающий код на Гитхаб
И еще фотки для любителей, игра R-type, по краям вокруг основного экрана область подкачки:
Другая сторона:
игра Atic-Atac:
ПС. В стоимость пачки сигарет я так и не уложился, поэтому моей «жабе» придется потерпеть мои вредные привычки, впрочем мне уже 55, так что большую часть я уже потратил… Продолжение следует.
Источник