Spectrum-48 против пачки сигарет, каша из топора или что может STM32F103C8T6+video(update)

Все началось с очередной попытки бросить курить. Разбудив свою внутреннюю «жабу» в поисках поддержки, говорю ей: «Смотри, пачка моих сигарет стоит сегодня как карманный ретро-компьютер с экраном, то есть примерно $10, а когда-то давным давно, на клон синклера-48К мы всю месячную зарплату и больше месяца на сборку и отладку потратили». Она: «Вы мужики- козлы и вруны, докажи!». Пришлось поработать.

Итак, исходно-расходные материалы:

  1. «Blue pill»: STM32F103C8T6 — 20K ram 64K flash $2.06
  2. «Ардуино Display»: ILI9341 2.8" 320x240 с сенсорным экраном и слотом карточки $7.72
  3. Пищалка $0.18
  4. Немного кнопок (7 штук) $0.2
  5. Немного проводов $0.1
  6. Флеш карта на 64 мега (с древнего фотоаппарата), в расчет не включена
  7. Программатор ST-LINK, не расходуется и в расчет не включен, однако тоже пару долларов стоит
  8. Пачка сигарет — расходуется слишком быстро и каждый день -$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.

Недостатки:

  1. Все же немного медленнее оригинала.
  2. На экране видно код загруженной программы, в цвете.
  3. Надо джойстик, или кнопки помягче. И плату. И коробку. И прямые руки. И ...


В примерных планах: снижение потребления (оторвать светодиоды с платы), добавить модуляцию яркости экрана, режим часов с выключенным экраном, спаять нормальную клавиатуру с джойстиком, настроить задержки для корректного звука и чтения с магнитофона(а надо?), РС конвертер форматов файлов в дампы, ужать еще немного код для размещения интерфейса пользователя. Попробовать удешевить платформу используя экран 2.4 дюйма. Он правда, ну очень маленький, но за 5… Понятно, что тут интерес чисто спортивный, хотя если принять во внимание скорость разборки всякой электроники на непригодные запчасти внуками, цена все же имеет значение.

Собственно текущий работающий код на Гитхаб

И еще фотки для любителей, игра R-type, по краям вокруг основного экрана область подкачки:



Другая сторона:



игра Atic-Atac:



P.S.: В стоимость пачки сигарет я так и не уложился, поэтому моей «жабе» придется потерпеть мои вредные привычки, впрочем мне уже 55, так что большую часть я уже потратил… Продолжение следует.
Video,no sound ,sorry:
Поделиться публикацией
Комментарии 96
    +3
    >пачка моих сигарет стоит… примерно $10
    С такими ценами можно было бы легко бросить и без всяких Спектрумов :)
      +1
      моя жаба опять спит и полностью меня игнорирует :(
        +2
        Будить мелодиями из спектрумовских демок срочно. AY не эмулирован, значит, биперовскими, они тоже здорово звучат.
          +3
          Достать спектрофон, сдуть пыль и вперёд в ностальгию!
            +1
            ZX Ревью же.
      +1

      Это просто прекрасный туториал. Вы сделали мои ближайшие выходные!

        +3
        Отличный повод начать знакомство с STM32. Спасибо!
          +2
          офигеть 8( )
            +1
            Хорошая статья, показывает на что способно современное железо.
            +5
            ОЗУ на бордюре даже интереснее, я бы так оставил.
            В БК есть режим, когда часть видеопамяти используется в качестве доп. ОЗУ, полезная картинка занимает небольшую часть экрана, а под ней видно, что в этой области ОЗУ делается, напомнило.
            Клавиатура нужна обязательно, возможность программирования — главное преимущество Спектрума перед Денди.
              +2
              Да, и соблазну сделать своп на карточке не поддаваться ни в коем случае.
                0
                Имхо мерцание полей быстро надоест.
                Если изготавливать корпус, то можно закрыть эту часть экрана или передней панелью или наклеить рамку.
                  0
                  Я бы заклеил какой-нибудь полупрозрачной пленкой, чтобы видно было 5% светового потока. Такой-то артефакт не хочется глушить.
                    +1
                    Тут в комментах сказано, что поля не мерцают, они почти статичны.
                    0
                    Не было видно, что там было, эта область затенялась. Видимыми оставались несколько строк текста. Если не затенять, что бы всё было видно, то скорость работы с видео озу была меньше чем с основной памятью.
                      0
                      В оригинальном ZX использовалось два «банка» памяти RAM 8*16Кибит + 8*32Кибит, наши поздние клоны как правило изготавливались уже с единой памятью 8*64Кибит, что уже не давало различия по скорости доступа к разным участкам памяти.
                      Да и нет такого понятия «не показывать затененный участок» вам по прежнему показывают информацию которую регулярно «видеоадаптер» выбирает из памяти, это как полдня сидеть на ютубе на помегабайтном тарифе, а потом заявлять «я же ничего не качал!».
                        0
                        Этот пост про БК, а не ZX.
                      +1
                      На спектруме были такие копировщики (списать игру с одной кассеты, записать на другую), нижняя половина экрана начинала использоваться, если игра ровно 48к размером.
                        +1
                        там три блока по 2кб, соответственно экран состоял из трех частей (+ 3х256 байт цвета).
                        мой любимый копировщик был NEW FORMAT COPY, в нем можно было править коды загруженной игры/программы и он тоже использовал память экрана :)
                          +1
                          Бывали игры, блоки данных которых занимали почти всю оставшуюся память после экрана. Чтобы такие блоки копировать (и при этом иметь свой код в памяти) копировщикам на 48 Кб приходилось держать что-то на экране. Но обычно они атрибутами это дело гасили.
                      +1
                      вспомнились приколы программирования на Зет80 типа: Push — Return и XOR A.
                        +4
                        спесси

                        спекки тогда уж
                          0
                          спекки тогда уж

                          Вы правы, однако спеки меня и на работе достали. Позвольте небольшую вольность.
                          +4
                          Эх, жаль видосика нет, интересно посмотреть, как себя «видимопамять» ведет в динамике.
                            +2
                            Она весьма редко переключается и не на каждой игре, только несколько линий по 64 байта за цикл симуляции 20 миллисекунд. Алгоритм кеширования довольно эффективно работает.
                            +1
                            А что за записную книжку вы делали 25 лет назад, КМОП-Z80 и ЖКИ однобитный?
                              +1
                              Toshiba, не помню номер, со встроенным контроллером матричного ЖКИ 160x64 вроде. Надо посмотреть в исходниках(сначала найти). Телефонная книжка с DTMF (подносишь к трубке-набирает), факс (если поключить модем и только посылыет), словарь Иврит, Русский, Арабский и Английский, калькулятор, часы-календарь, тетрис разумеется…
                                +1
                                Самоделка или продакшен? Фото остались, код?
                                  +2
                                  Это продакшен. И продается до сих пор, недавно видел.
                                  Код — частично остался. Но он собственность израильской компании «кравитц». Код эмулятора (BCC+TASM+WIN32) и бинарники вроде есть все и на них никто не претендует.
                                  Эмулятор включает фотку. Там надо свистелку подправить, чтобы работала под современный Windows, она исключение вызывает, так как работала напрямую с динамиком) Если Вам нужно напишите мне на маил(в гитхабе есть), я вышлю
                                    0
                                    Тогда, думаю, по названию+модели можно найти фотки.
                                      0
                                      И примерные характеристики, сколько ОЗУ, ПЗУ, какой источник питания?
                                        +3
                                          +2
                                          Сейчас под Wine запускал. Еще работает, но без звука:)


                                          +1
                                          128K static ram 256-512K rom в зависимости от языка, CR2032x2
                                            0
                                            ПЗУ, конечно, не масочное, чтобы чип не заказывать?
                                              0
                                              Убейте, не помню.
                                                0
                                                А ведь там ресурсов хватит, чтобы CP/M запустить.
                                                  0
                                                  Возможно, однако нет смысла. Из-за маленького рынка, (Израиль+Иврит) он сильно «overpriced» долларов под сотню. Может сейчас цена и упала, но не думаю что сильно. Да и откровенное барахло по сегодняшним понятиям.
                                                    0
                                                    Но можно попробовать на похожей схемотехнике (микропотребляющий нативный, а не эмулируемый Z80, однобитный ЖКИ, ОЗУ и ПЗУ столько же) сделать карманную машину с CP/M примерно с такой же потребляемой мощностью.
                                                      0
                                                      Главный жрун все равно дисплей. Процессор уходит в глубокий сон после отработки каждого события(нажатая клавиша, будильник и тд) и это единицы микроампер. Клавиши сканируются на низкой частоте ~32KHz, потом быстренько отрабатывается на полной частоте и опять спать до следующей клавиши.
                                                      Дисплей — даже пассивный, уже несколько миллиампер пока не погасишь. То есть батарейки хватит часов на 100-300 работы дисплея.
                                                        0
                                                        Не знал, что матричному однобитному ЖКИ такого разрешения нужно несколько миллиампер.
                                                        0
                                                          +1
                                                          а смысл? все равно что карманный кассетный плеер разрабатывать на современной базе, если только для собственного удовольствия (тем более для такой специализированной задачи можно написать код для STM32, а не брать за основу более примитивный Z80, который напрямую не может адресовать более 64кб и тд).
                                                          ну и смартфоны заменили почти всё, весь мир уже давно в кармане :)
                                                          0
                                                          Плохо видно, что на кнопке с цифрой 6, неужели SPEECH?
                                                            +1
                                                            Ага. Была и такая фигня в планах.Но что-то не сложилось.
                                                              0
                                                              И железку выпустили без этой надписи, чтобы пользователи не искали отсутствующую функцию?
                                    0
                                    Интересно — чем обусловлен выбор именно этой микросхемы? Просто была в наличии или 20К оперативки максимум для этой серии?
                                      +2
                                      Она у меня была. И она самая дешевая и распространенная из подходящих.
                                        +2
                                        Кроме разгона до 112 MHz, в STM32F103C8T6 можно пробовать использовать вторые 64К flash, если очень нужно.
                                          0
                                          а где почитать? они получается отбраковка от 128 киловых и флеша там внутри таки есть?
                                          0
                                          Это не на всех. Есть и 64 и 128. Разные чипы с почти одинаковой маркировкой.Те которые 64 они не разгоняются, сегодня такие получил, впрочем у меня нет статистики 2 на 128 и две на 64 (:
                                      +1
                                      github.com/retrogubbins/pase — эмуляция спектрума на ESP32
                                        +1

                                        Спектрум с вайфай;)

                                          0
                                          Судя по потреблению энергии, это вайфай со спектрумом. :)
                                            0
                                            Spectrum Next несет на борту вайфай :)
                                              0
                                              эх, не знаете когда он уже в свободной продаже появится?

                                              только из-за корпуса купил бы, а так и начинка неплохая
                                              0
                                              Wifi+BT :)
                                              2 Core + 1 Low power core…

                                              привел как пример тк по цене весьма близка к использованной в статье STM32 )
                                                0
                                                Примерно втрое дороже, правда на нем можно и 128+ попробовать. Хватило-бы и ESP8266, который дешевле чем ESP32, но он плохо задокументирован.
                                                  0
                                                  На ESP8266 уже есть эмуляция РК.
                                            0
                                            RPi Zero ($4.95 на сейле) + 3.5'' LCD ($4.95 Aliexpress) + халявные BT+WiFi adapter (сэмплы с alibaba) + халявный блок питания (от старого, не помню какого телефона — их мириады были у меня) + 8GB sd-card (тоже, как ни странно, халявная — но нужна для Raspbian). То бишь я в $10-ку уложился (хотя сигареты покупаю в Nashua, New Hampshire, там они самые дешевые по Штатам, меньше $10).

                                            Сорри, картинки сейчас лень делать, но все работало, как Вы сами понимаете.
                                              0
                                              Пруф можно на дисплей?
                                                0
                                                Соврал, таки $5.95 (но это был какой-то крупный сейл, так они дороже, конечно). Вот он, только подключенный к Rpi2 B, вот скриншот покупки, а ссылку не дам, нет уже того продавца, похоже.
                                                P.S. Но в десятку почти уложился (если не считать «халявное» и то, что было уже дома).
                                                  0
                                                  Я когда в GE Medical работал у меня были подарочные сервера Supermicro на 2-4 сокета с последними Xeon-ами от Интеля. Бесплатно.И лично мои. И каждый год новый. В GE они не числились, а Интель их обратно не просил. Так они в GE валяются, думаю что до сих пор. Вопрос стоял не во сколько мне обошлось, а сколько будет стоить если собирать сейчас и не мне.
                                                    0
                                                    если собирать сейчас и не мне
                                                    Я написал, сколько будет стоить собирать сейчас и мне :D
                                                    Ваша разработка забавная, безусловно, но неужели вы думаете, что все сейчас прямо кинутся создавать такие эмуляторы Zx-ов?
                                                      +1
                                                      Поставьте себе retropie и не нервничайте. Это Geektimes, а не Хабр.
                                                        –2
                                                        А почему вы решили, что я нервничаю? Это вы нервничаете, похоже.
                                                        Для очистки совести, вот прямо сейчас (ну, немного дороже $10) тыц и тыц.
                                                          0
                                                          Ага, только распберри туда не входит.И с доставкой беда.
                                                      0
                                                      Я когда в GE Medical работал у меня были подарочные сервера Supermicro на 2-4 сокета с последними Xeon-ами от Интеля. Бесплатно.И лично мои.


                                                      Чтоб я так жил, мама мия :)
                                                    –2
                                                    А RPi Zero до сих пор на сейле.
                                                      0
                                                      IN-STORE ONLY
                                                        0
                                                        Угу, в 3-х минутах езды от офиса.
                                                  +1
                                                  круто, недавно только вертел этот стм32, думал наверно спектрум сможет эмулировать, а тут бац — и готовый проект :)
                                                    +1
                                                    Ожидал увидеть очередную статью «как я помигал диодом», а тут сюрприз!

                                                    btw: для игровой приставки хорошо подойдет что-нибудь типа первой версии MKS-TFT32, там и экран, и sd-карта, и пищалка есть, и даже usb host, чтобы сразу в него геймпад воткнуть…
                                                      0
                                                      Диодом по прежнему можно помигать, с бейсика, на спектрум, нужно только порт пробросить.
                                                      Или лучше осциллограф на бейсике наваять пробросив ADC? Хорошая тема для статьи… :)
                                                      +1
                                                      А я бы применил SPI-RAM микросхему, к тому же у STM-контроллеров очень часто встречается аппаратный расширитель памяти именно через SPI, это прибавит плюс к быстродействию.
                                                        0
                                                        аппаратный расширитель памяти

                                                        конкретно у этого — нет
                                                        +1
                                                        Спектрум. Теплые воспоминания. А тут еще и любимое современное железо. Спасибо за интересную статью.
                                                          0

                                                          Чот я не понял — это как в 20K ram МК можно впихнуть 48К спектрума? Ладно, минус 16К ПЗУ и того экран+рабочая область = 32К, куда девается 12К?

                                                            +1
                                                            если прочитать статью то можно понять что искомые 12К в «бордере» экрана хранятся, видно на фотках
                                                              0
                                                              В «бордере» экрана
                                                              хранится все, что выше sinclair видео RAM: 0x10000-0x5b00 = 42240 bytes
                                                              ROM sinclair -16K в STM32 rom, остальное код эмулятора и интерфейса пользователя
                                                              В RAM stm32 — sinclair видео RAM, линии кеша(около 100 по 64 байта), таблицы адресов областей подкачки, битовая таблица изменений экрана sinclair для минимизации времени отрисовки на реальный экран, всякие переменные и стек эмулятора и куча для malloc FAT32

                                                                0

                                                                Спасибо.
                                                                Теперь понятно и почему тормозит… всё же через SPI с кучей доп.организации.

                                                                  +1
                                                                  То есть когда нужен доступ к области памяти которая загружена в неиспользуемую область дисплея происходит задержка чтобы подгрузить ее в основное озу микроконтроллера?
                                                                  Как работает кеш? Что если программа будет каждые несколько тактов обращаться к случайным областям памяти из всего пространства 48к байт?
                                                                    0
                                                                    Как работает кеш?

                                                                    LRU — Если происходит обращение к адресу не в кеше, то самый старый блок на 64 байта или выбрасывается, если в него не было записи, или записывается если запись была. Потом на освобожденное место подчитывается со swap area на ili9341 (рамки дисплея).
                                                                    Что если программа будет каждые несколько тактов обращаться к случайным областям памяти из всего пространства 48к байт?

                                                                    Случайное число трудно получить за несколько тактов. :)… Будет работать, но очень медленно и печально.

                                                                      +1
                                                                      сложно представить себе такую программу, чтоб постоянно в разные области памяти обращалась. обычно переменные где-то в одном месте свалены, да и сама программа не ходит по каким-то слишком уж длинным алгоритмам. единственное случай в голову приходит — это игры с графикой, где надо постоянно спрайты из памяти на экран тащить, либо смещать изображение на экране
                                                                0
                                                                Не плохо бы и схему посмотреть.
                                                                +1
                                                                Восхищаюсь умельцами! Супер!
                                                                На чём только не собирали Spectrum: AVR, PLD (ПЛИС), SMT…
                                                                Интересно, на чём ещё можно соорудить этот популярный комп?!
                                                                  0
                                                                  На рассыпухе из SMD-элементов :) Или на той же рассыпухе, только в качестве транзисторов взять коробку с КТ315 и коробку с КТ361.
                                                                    0
                                                                    И маленький грузовичок дла перевозки и питания.
                                                                      0
                                                                      О, да Вы гурман батенька! :-)
                                                                      Но я думаю, одной коробкой 315-х и 361-х не обойтись.
                                                                      Нужно будет штук по 5.
                                                                    0
                                                                    А что на пачке написано? Буквы странные :)
                                                                    Чем-то на тайские похожи, но в Тайланде еще и картинки страшные на пачках рисуют.
                                                                    Извините за офтоп.
                                                                      0
                                                                      Конкретно на этой пачке на иврите написано красными буквами: «Предупреждение(опасность, внимание, осторожно)»
                                                                      потом что то мелко, а потом опять крупно черными:
                                                                      «курение приводит к импотенции»

                                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                    Самое читаемое