Итак, исходно-расходные материалы:
- «Blue pill»: STM32F103C8T6 — 20K ram 64K flash $2.06
- «Ардуино Display»: ILI9341 2.8" 320x240 с сенсорным экраном и слотом карточки $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?». Гугл мне выдал
Результат: работающий (попробовал около десятка игр, пока все работают) эмулятор ZX spectrum-48 с экраном размером с пачку сигарет (в карман уже влезает, но провода торчат наружу ), чтением дампов (иконка+образ памяти+регистры ~50K) игр с флеш карты формата FAT32 (еще несколько килобайт кода) и с суммарным потреблением ~50мА (то есть около 50 часов от типичной 18650 батареи на 2500мАч!), временем включения меньше секунды и общей стоимостью около деталей менее $10.
Недостатки:
- Все же немного медленнее оригинала.
- На экране видно код загруженной программы, в цвете.
- Надо джойстик, или кнопки помягче. И плату. И коробку. И прямые руки. И ...
В примерных планах: снижение потребления (оторвать светодиоды с платы), добавить модуляцию яркости экрана, режим часов с выключенным экраном, спаять нормальную клавиатуру с джойстиком, настроить задержки для корректного звука и чтения с магнитофона(а надо?), РС конвертер форматов файлов в дампы, ужать еще немного код для размещения интерфейса пользователя. Попробовать удешевить платформу используя экран 2.4 дюйма. Он правда, ну очень маленький, но за 5… Понятно, что тут интерес чисто спортивный, хотя если принять во внимание скорость разборки всякой электроники на непригодные запчасти внуками, цена все же имеет значение.
Собственно текущий работающий код на Гитхаб
И еще фотки для любителей, игра R-type, по краям вокруг основного экрана область подкачки:
Другая сторона:
игра Atic-Atac:
P.S.: В стоимость пачки сигарет я так и не уложился, поэтому моей «жабе» придется потерпеть мои вредные привычки, впрочем мне уже 55, так что большую часть я уже потратил… Продолжение следует.
Комментарии (93)
mkc
21.05.2018 21:15+1Хорошая статья, показывает на что способно современное железо.
iliasam
21.05.2018 22:43+2Я на STM32F429 эмулятор 80186 запускал: hackaday.io/project/153287-fake86-emulator-for-stm32
tormozedison
21.05.2018 21:27+3ОЗУ на бордюре даже интереснее, я бы так оставил.
В БК есть режим, когда часть видеопамяти используется в качестве доп. ОЗУ, полезная картинка занимает небольшую часть экрана, а под ней видно, что в этой области ОЗУ делается, напомнило.
Клавиатура нужна обязательно, возможность программирования — главное преимущество Спектрума перед Денди.tormozedison
21.05.2018 21:34+2Да, и соблазну сделать своп на карточке не поддаваться ни в коем случае.
Javian
22.05.2018 08:45Имхо мерцание полей быстро надоест.
Если изготавливать корпус, то можно закрыть эту часть экрана или передней панелью или наклеить рамку.engine9
22.05.2018 17:29Я бы заклеил какой-нибудь полупрозрачной пленкой, чтобы видно было 5% светового потока. Такой-то артефакт не хочется глушить.
AlexSpirit
22.05.2018 08:55Не было видно, что там было, эта область затенялась. Видимыми оставались несколько строк текста. Если не затенять, что бы всё было видно, то скорость работы с видео озу была меньше чем с основной памятью.
kasperos
24.05.2018 06:58В оригинальном ZX использовалось два «банка» памяти RAM 8*16Кибит + 8*32Кибит, наши поздние клоны как правило изготавливались уже с единой памятью 8*64Кибит, что уже не давало различия по скорости доступа к разным участкам памяти.
Да и нет такого понятия «не показывать затененный участок» вам по прежнему показывают информацию которую регулярно «видеоадаптер» выбирает из памяти, это как полдня сидеть на ютубе на помегабайтном тарифе, а потом заявлять «я же ничего не качал!».
easy_john
23.05.2018 14:52На спектруме были такие копировщики (списать игру с одной кассеты, записать на другую), нижняя половина экрана начинала использоваться, если игра ровно 48к размером.
balamutang
24.05.2018 12:12там три блока по 2кб, соответственно экран состоял из трех частей (+ 3х256 байт цвета).
мой любимый копировщик был NEW FORMAT COPY, в нем можно было править коды загруженной игры/программы и он тоже использовал память экрана :)
dimanhursky
21.05.2018 22:13+1вспомнились приколы программирования на Зет80 типа: Push — Return и XOR A.
simik2
21.05.2018 22:36+3Эх, жаль видосика нет, интересно посмотреть, как себя «видимопамять» ведет в динамике.
Sdima1357 Автор
21.05.2018 22:44+2Она весьма редко переключается и не на каждой игре, только несколько линий по 64 байта за цикл симуляции 20 миллисекунд. Алгоритм кеширования довольно эффективно работает.
tormozedison
21.05.2018 23:50А что за записную книжку вы делали 25 лет назад, КМОП-Z80 и ЖКИ однобитный?
Sdima1357 Автор
22.05.2018 00:06+1Toshiba, не помню номер, со встроенным контроллером матричного ЖКИ 160x64 вроде. Надо посмотреть в исходниках(сначала найти). Телефонная книжка с DTMF (подносишь к трубке-набирает), факс (если поключить модем и только посылыет), словарь Иврит, Русский, Арабский и Английский, калькулятор, часы-календарь, тетрис разумеется…
tormozedison
22.05.2018 00:09Самоделка или продакшен? Фото остались, код?
Sdima1357 Автор
22.05.2018 00:25+2Это продакшен. И продается до сих пор, недавно видел.
Код — частично остался. Но он собственность израильской компании «кравитц». Код эмулятора (BCC+TASM+WIN32) и бинарники вроде есть все и на них никто не претендует.
Эмулятор включает фотку. Там надо свистелку подправить, чтобы работала под современный Windows, она исключение вызывает, так как работала напрямую с динамиком) Если Вам нужно напишите мне на маил(в гитхабе есть), я вышлюtormozedison
22.05.2018 00:30Тогда, думаю, по названию+модели можно найти фотки.
tormozedison
22.05.2018 00:36И примерные характеристики, сколько ОЗУ, ПЗУ, какой источник питания?
Sdima1357 Автор
22.05.2018 00:48128K static ram 256-512K rom в зависимости от языка, CR2032x2
tormozedison
22.05.2018 06:12ПЗУ, конечно, не масочное, чтобы чип не заказывать?
Sdima1357 Автор
22.05.2018 08:49Убейте, не помню.
tormozedison
22.05.2018 21:01А ведь там ресурсов хватит, чтобы CP/M запустить.
Sdima1357 Автор
22.05.2018 21:08Возможно, однако нет смысла. Из-за маленького рынка, (Израиль+Иврит) он сильно «overpriced» долларов под сотню. Может сейчас цена и упала, но не думаю что сильно. Да и откровенное барахло по сегодняшним понятиям.
tormozedison
22.05.2018 21:21Но можно попробовать на похожей схемотехнике (микропотребляющий нативный, а не эмулируемый Z80, однобитный ЖКИ, ОЗУ и ПЗУ столько же) сделать карманную машину с CP/M примерно с такой же потребляемой мощностью.
Sdima1357 Автор
22.05.2018 23:22Главный жрун все равно дисплей. Процессор уходит в глубокий сон после отработки каждого события(нажатая клавиша, будильник и тд) и это единицы микроампер. Клавиши сканируются на низкой частоте ~32KHz, потом быстренько отрабатывается на полной частоте и опять спать до следующей клавиши.
Дисплей — даже пассивный, уже несколько миллиампер пока не погасишь. То есть батарейки хватит часов на 100-300 работы дисплея.tormozedison
22.05.2018 23:42Не знал, что матричному однобитному ЖКИ такого разрешения нужно несколько миллиампер.
Sdima1357 Автор
22.05.2018 23:42Однобитный 128х64 — 8-15 мА
pdf1.alldatasheet.com/datasheet-pdf/view/196334/ETC2/12864-12.html
balamutang
24.05.2018 12:27а смысл? все равно что карманный кассетный плеер разрабатывать на современной базе, если только для собственного удовольствия (тем более для такой специализированной задачи можно написать код для STM32, а не брать за основу более примитивный Z80, который напрямую не может адресовать более 64кб и тд).
ну и смартфоны заменили почти всё, весь мир уже давно в кармане :)
tormozedison
22.05.2018 21:26Плохо видно, что на кнопке с цифрой 6, неужели SPEECH?
Sdima1357 Автор
22.05.2018 23:23+1Ага. Была и такая фигня в планах.Но что-то не сложилось.
tormozedison
22.05.2018 23:38И железку выпустили без этой надписи, чтобы пользователи не искали отсутствующую функцию?
BSW
22.05.2018 00:10Интересно — чем обусловлен выбор именно этой микросхемы? Просто была в наличии или 20К оперативки максимум для этой серии?
Sdima1357 Автор
22.05.2018 00:12+2Она у меня была. И она самая дешевая и распространенная из подходящих.
Occamlab
22.05.2018 00:56Кроме разгона до 112 MHz, в STM32F103C8T6 можно пробовать использовать вторые 64К flash, если очень нужно.
clawham
22.05.2018 09:48а где почитать? они получается отбраковка от 128 киловых и флеша там внутри таки есть?
NihtRaven
22.05.2018 14:24Делал по такому туториалу acassis.wordpress.com/2016/06/12/running-nuttx-on-a-less-than-u2-00-board
На моей работало успешно.
Bagobor
22.05.2018 08:41+1github.com/retrogubbins/pase — эмуляция спектрума на ESP32
dernuss
22.05.2018 10:03Спектрум с вайфай;)
Bagobor
22.05.2018 11:24Wifi+BT :)
2 Core + 1 Low power core…
привел как пример тк по цене весьма близка к использованной в статье STM32 )Sdima1357 Автор
22.05.2018 12:40Примерно втрое дороже, правда на нем можно и 128+ попробовать. Хватило-бы и ESP8266, который дешевле чем ESP32, но он плохо задокументирован.
voicetranslator
22.05.2018 08:42RPi Zero ($4.95 на сейле) + 3.5'' LCD ($4.95 Aliexpress) + халявные BT+WiFi adapter (сэмплы с alibaba) + халявный блок питания (от старого, не помню какого телефона — их мириады были у меня) + 8GB sd-card (тоже, как ни странно, халявная — но нужна для Raspbian). То бишь я в $10-ку уложился (хотя сигареты покупаю в Nashua, New Hampshire, там они самые дешевые по Штатам, меньше $10).
Сорри, картинки сейчас лень делать, но все работало, как Вы сами понимаете.Sdima1357 Автор
22.05.2018 11:18Пруф можно на дисплей?
voicetranslator
22.05.2018 14:22Соврал, таки $5.95 (но это был какой-то крупный сейл, так они дороже, конечно). Вот он, только подключенный к Rpi2 B, вот скриншот покупки, а ссылку не дам, нет уже того продавца, похоже.
P.S. Но в десятку почти уложился (если не считать «халявное» и то, что было уже дома).Sdima1357 Автор
22.05.2018 14:37Я когда в GE Medical работал у меня были подарочные сервера Supermicro на 2-4 сокета с последними Xeon-ами от Интеля. Бесплатно.И лично мои. И каждый год новый. В GE они не числились, а Интель их обратно не просил. Так они в GE валяются, думаю что до сих пор. Вопрос стоял не во сколько мне обошлось, а сколько будет стоить если собирать сейчас и не мне.
voicetranslator
22.05.2018 14:47если собирать сейчас и не мне
Я написал, сколько будет стоить собирать сейчас и мне :D
Ваша разработка забавная, безусловно, но неужели вы думаете, что все сейчас прямо кинутся создавать такие эмуляторы Zx-ов?Sdima1357 Автор
22.05.2018 14:55Поставьте себе retropie и не нервничайте. Это Geektimes, а не Хабр.
voicetranslator
22.05.2018 15:02-1А почему вы решили, что я нервничаю? Это вы нервничаете, похоже.
Для очистки совести, вот прямо сейчас (ну, немного дороже $10) тыц и тыц.
JC_IIB
22.05.2018 16:36Я когда в GE Medical работал у меня были подарочные сервера Supermicro на 2-4 сокета с последними Xeon-ами от Интеля. Бесплатно.И лично мои.
Чтоб я так жил, мама мия :)
voicetranslator
22.05.2018 14:29-2А RPi Zero до сих пор на сейле.
balamutang
22.05.2018 11:10круто, недавно только вертел этот стм32, думал наверно спектрум сможет эмулировать, а тут бац — и готовый проект :)
rstepanov
22.05.2018 11:36Ожидал увидеть очередную статью «как я помигал диодом», а тут сюрприз!
btw: для игровой приставки хорошо подойдет что-нибудь типа первой версии MKS-TFT32, там и экран, и sd-карта, и пищалка есть, и даже usb host, чтобы сразу в него геймпад воткнуть…Sdima1357 Автор
22.05.2018 13:46Диодом по прежнему можно помигать, с бейсика, на спектрум, нужно только порт пробросить.
Или лучше осциллограф на бейсике наваять пробросив ADC? Хорошая тема для статьи… :)
Alexeyslav
22.05.2018 11:38А я бы применил SPI-RAM микросхему, к тому же у STM-контроллеров очень часто встречается аппаратный расширитель памяти именно через SPI, это прибавит плюс к быстродействию.
Andrey_13
22.05.2018 12:33+1Спектрум. Теплые воспоминания. А тут еще и любимое современное железо. Спасибо за интересную статью.
madf
22.05.2018 15:41Чот я не понял — это как в 20K ram МК можно впихнуть 48К спектрума? Ладно, минус 16К ПЗУ и того экран+рабочая область = 32К, куда девается 12К?
balamutang
22.05.2018 16:25если прочитать статью то можно понять что искомые 12К в «бордере» экрана хранятся, видно на фотках
Sdima1357 Автор
22.05.2018 16:56В «бордере» экрана
хранится все, что выше sinclair видео RAM: 0x10000-0x5b00 = 42240 bytes
ROM sinclair -16K в STM32 rom, остальное код эмулятора и интерфейса пользователя
В RAM stm32 — sinclair видео RAM, линии кеша(около 100 по 64 байта), таблицы адресов областей подкачки, битовая таблица изменений экрана sinclair для минимизации времени отрисовки на реальный экран, всякие переменные и стек эмулятора и куча для malloc FAT32
madf
22.05.2018 18:18Спасибо.
Теперь понятно и почему тормозит… всё же через SPI с кучей доп.организации.
YegorVin
23.05.2018 01:24То есть когда нужен доступ к области памяти которая загружена в неиспользуемую область дисплея происходит задержка чтобы подгрузить ее в основное озу микроконтроллера?
Как работает кеш? Что если программа будет каждые несколько тактов обращаться к случайным областям памяти из всего пространства 48к байт?Sdima1357 Автор
23.05.2018 12:40Как работает кеш?
LRU — Если происходит обращение к адресу не в кеше, то самый старый блок на 64 байта или выбрасывается, если в него не было записи, или записывается если запись была. Потом на освобожденное место подчитывается со swap area на ili9341 (рамки дисплея).
Что если программа будет каждые несколько тактов обращаться к случайным областям памяти из всего пространства 48к байт?
Случайное число трудно получить за несколько тактов. :)… Будет работать, но очень медленно и печально.
balamutang
24.05.2018 12:02сложно представить себе такую программу, чтоб постоянно в разные области памяти обращалась. обычно переменные где-то в одном месте свалены, да и сама программа не ходит по каким-то слишком уж длинным алгоритмам. единственное случай в голову приходит — это игры с графикой, где надо постоянно спрайты из памяти на экран тащить, либо смещать изображение на экране
CodeNameHawk
22.05.2018 19:53Не плохо бы и схему посмотреть.
Sdima1357 Автор
22.05.2018 20:53Там все провода смапированны:
github.com/sdima1357/specci48/blob/master/Inc/main.h
nik_o
23.05.2018 12:29+1Восхищаюсь умельцами! Супер!
На чём только не собирали Spectrum: AVR, PLD (ПЛИС), SMT…
Интересно, на чём ещё можно соорудить этот популярный комп?!AquiHostStrider
24.05.2018 05:37На рассыпухе из SMD-элементов :) Или на той же рассыпухе, только в качестве транзисторов взять коробку с КТ315 и коробку с КТ361.
nik_o
24.05.2018 10:38О, да Вы гурман батенька! :-)
Но я думаю, одной коробкой 315-х и 361-х не обойтись.
Нужно будет штук по 5.
ksimute
23.05.2018 23:37А что на пачке написано? Буквы странные :)
Чем-то на тайские похожи, но в Тайланде еще и картинки страшные на пачках рисуют.
Извините за офтоп.Sdima1357 Автор
24.05.2018 00:17Конкретно на этой пачке на иврите написано красными буквами: «Предупреждение(опасность, внимание, осторожно)»
потом что то мелко, а потом опять крупно черными:
«курение приводит к импотенции»
NewStahl
>пачка моих сигарет стоит… примерно $10
С такими ценами можно было бы легко бросить и без всяких Спектрумов :)
Sdima1357 Автор
моя жаба опять спит и полностью меня игнорирует :(
tormozedison
Будить мелодиями из спектрумовских демок срочно. AY не эмулирован, значит, биперовскими, они тоже здорово звучат.
dredd_krd
Достать спектрофон, сдуть пыль и вперёд в ностальгию!
scg
ZX Ревью же.