Все началось с очередной попытки бросить курить. Разбудив свою внутреннюю «жабу» в поисках поддержки, говорю ей: «Смотри, пачка моих сигарет стоит сегодня как карманный ретро-компьютер с экраном, то есть примерно $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, так что большую часть я уже потратил… Продолжение следует.

Комментарии (93)


  1. NewStahl
    21.05.2018 19:11
    +1

    >пачка моих сигарет стоит… примерно $10
    С такими ценами можно было бы легко бросить и без всяких Спектрумов :)


    1. Sdima1357 Автор
      21.05.2018 20:55
      +1

      моя жаба опять спит и полностью меня игнорирует :(


      1. tormozedison
        21.05.2018 21:31
        +2

        Будить мелодиями из спектрумовских демок срочно. AY не эмулирован, значит, биперовскими, они тоже здорово звучат.


        1. dredd_krd
          21.05.2018 23:15
          +2

          Достать спектрофон, сдуть пыль и вперёд в ностальгию!


          1. scg
            22.05.2018 09:46

            ZX Ревью же.


  1. DrAndyHunter
    21.05.2018 19:22
    +1

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


  1. TEEN_true
    21.05.2018 19:31
    +2

    Отличный повод начать знакомство с STM32. Спасибо!


  1. intell2000
    21.05.2018 21:00
    +1

    офигеть 8( )


  1. mkc
    21.05.2018 21:15
    +1

    Хорошая статья, показывает на что способно современное железо.


    1. iliasam
      21.05.2018 22:43
      +2

      Я на STM32F429 эмулятор 80186 запускал: hackaday.io/project/153287-fake86-emulator-for-stm32

      image


      1. tormozedison
        21.05.2018 23:08
        +1

        Ого!


  1. tormozedison
    21.05.2018 21:27
    +3

    ОЗУ на бордюре даже интереснее, я бы так оставил.
    В БК есть режим, когда часть видеопамяти используется в качестве доп. ОЗУ, полезная картинка занимает небольшую часть экрана, а под ней видно, что в этой области ОЗУ делается, напомнило.
    Клавиатура нужна обязательно, возможность программирования — главное преимущество Спектрума перед Денди.


    1. tormozedison
      21.05.2018 21:34
      +2

      Да, и соблазну сделать своп на карточке не поддаваться ни в коем случае.


    1. Javian
      22.05.2018 08:45

      Имхо мерцание полей быстро надоест.
      Если изготавливать корпус, то можно закрыть эту часть экрана или передней панелью или наклеить рамку.


      1. engine9
        22.05.2018 17:29

        Я бы заклеил какой-нибудь полупрозрачной пленкой, чтобы видно было 5% светового потока. Такой-то артефакт не хочется глушить.


      1. tormozedison
        22.05.2018 21:10
        +1

        Тут в комментах сказано, что поля не мерцают, они почти статичны.


    1. AlexSpirit
      22.05.2018 08:55

      Не было видно, что там было, эта область затенялась. Видимыми оставались несколько строк текста. Если не затенять, что бы всё было видно, то скорость работы с видео озу была меньше чем с основной памятью.


      1. kasperos
        24.05.2018 06:58

        В оригинальном ZX использовалось два «банка» памяти RAM 8*16Кибит + 8*32Кибит, наши поздние клоны как правило изготавливались уже с единой памятью 8*64Кибит, что уже не давало различия по скорости доступа к разным участкам памяти.
        Да и нет такого понятия «не показывать затененный участок» вам по прежнему показывают информацию которую регулярно «видеоадаптер» выбирает из памяти, это как полдня сидеть на ютубе на помегабайтном тарифе, а потом заявлять «я же ничего не качал!».


    1. easy_john
      23.05.2018 14:52

      На спектруме были такие копировщики (списать игру с одной кассеты, записать на другую), нижняя половина экрана начинала использоваться, если игра ровно 48к размером.


      1. balamutang
        24.05.2018 12:12

        там три блока по 2кб, соответственно экран состоял из трех частей (+ 3х256 байт цвета).
        мой любимый копировщик был NEW FORMAT COPY, в нем можно было править коды загруженной игры/программы и он тоже использовал память экрана :)


  1. dimanhursky
    21.05.2018 22:13
    +1

    вспомнились приколы программирования на Зет80 типа: Push — Return и XOR A.


  1. beeruser
    21.05.2018 22:32
    +2

    спесси

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


    1. Sdima1357 Автор
      21.05.2018 23:11

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

      Вы правы, однако спеки меня и на работе достали. Позвольте небольшую вольность.


  1. simik2
    21.05.2018 22:36
    +3

    Эх, жаль видосика нет, интересно посмотреть, как себя «видимопамять» ведет в динамике.


    1. Sdima1357 Автор
      21.05.2018 22:44
      +2

      Она весьма редко переключается и не на каждой игре, только несколько линий по 64 байта за цикл симуляции 20 миллисекунд. Алгоритм кеширования довольно эффективно работает.


  1. tormozedison
    21.05.2018 23:50

    А что за записную книжку вы делали 25 лет назад, КМОП-Z80 и ЖКИ однобитный?


    1. Sdima1357 Автор
      22.05.2018 00:06
      +1

      Toshiba, не помню номер, со встроенным контроллером матричного ЖКИ 160x64 вроде. Надо посмотреть в исходниках(сначала найти). Телефонная книжка с DTMF (подносишь к трубке-набирает), факс (если поключить модем и только посылыет), словарь Иврит, Русский, Арабский и Английский, калькулятор, часы-календарь, тетрис разумеется…


      1. tormozedison
        22.05.2018 00:09

        Самоделка или продакшен? Фото остались, код?


        1. Sdima1357 Автор
          22.05.2018 00:25
          +2

          Это продакшен. И продается до сих пор, недавно видел.
          Код — частично остался. Но он собственность израильской компании «кравитц». Код эмулятора (BCC+TASM+WIN32) и бинарники вроде есть все и на них никто не претендует.
          Эмулятор включает фотку. Там надо свистелку подправить, чтобы работала под современный Windows, она исключение вызывает, так как работала напрямую с динамиком) Если Вам нужно напишите мне на маил(в гитхабе есть), я вышлю


          1. tormozedison
            22.05.2018 00:30

            Тогда, думаю, по названию+модели можно найти фотки.


            1. tormozedison
              22.05.2018 00:36

              И примерные характеристики, сколько ОЗУ, ПЗУ, какой источник питания?


              1. Sdima1357 Автор
                22.05.2018 00:43
                +1


                1. Sdima1357 Автор
                  22.05.2018 01:20
                  +1

                  Сейчас под Wine запускал. Еще работает, но без звука:)



              1. Sdima1357 Автор
                22.05.2018 00:48

                128K static ram 256-512K rom в зависимости от языка, CR2032x2


                1. tormozedison
                  22.05.2018 06:12

                  ПЗУ, конечно, не масочное, чтобы чип не заказывать?


                  1. Sdima1357 Автор
                    22.05.2018 08:49

                    Убейте, не помню.


                    1. tormozedison
                      22.05.2018 21:01

                      А ведь там ресурсов хватит, чтобы CP/M запустить.


                      1. Sdima1357 Автор
                        22.05.2018 21:08

                        Возможно, однако нет смысла. Из-за маленького рынка, (Израиль+Иврит) он сильно «overpriced» долларов под сотню. Может сейчас цена и упала, но не думаю что сильно. Да и откровенное барахло по сегодняшним понятиям.


                        1. tormozedison
                          22.05.2018 21:21

                          Но можно попробовать на похожей схемотехнике (микропотребляющий нативный, а не эмулируемый Z80, однобитный ЖКИ, ОЗУ и ПЗУ столько же) сделать карманную машину с CP/M примерно с такой же потребляемой мощностью.


                          1. Sdima1357 Автор
                            22.05.2018 23:22

                            Главный жрун все равно дисплей. Процессор уходит в глубокий сон после отработки каждого события(нажатая клавиша, будильник и тд) и это единицы микроампер. Клавиши сканируются на низкой частоте ~32KHz, потом быстренько отрабатывается на полной частоте и опять спать до следующей клавиши.
                            Дисплей — даже пассивный, уже несколько миллиампер пока не погасишь. То есть батарейки хватит часов на 100-300 работы дисплея.


                            1. tormozedison
                              22.05.2018 23:42

                              Не знал, что матричному однобитному ЖКИ такого разрешения нужно несколько миллиампер.


                          1. Sdima1357 Автор
                            22.05.2018 23:42

                          1. balamutang
                            24.05.2018 12:27

                            а смысл? все равно что карманный кассетный плеер разрабатывать на современной базе, если только для собственного удовольствия (тем более для такой специализированной задачи можно написать код для STM32, а не брать за основу более примитивный Z80, который напрямую не может адресовать более 64кб и тд).
                            ну и смартфоны заменили почти всё, весь мир уже давно в кармане :)


                        1. tormozedison
                          22.05.2018 21:26

                          Плохо видно, что на кнопке с цифрой 6, неужели SPEECH?


                          1. Sdima1357 Автор
                            22.05.2018 23:23
                            +1

                            Ага. Была и такая фигня в планах.Но что-то не сложилось.


                            1. tormozedison
                              22.05.2018 23:38

                              И железку выпустили без этой надписи, чтобы пользователи не искали отсутствующую функцию?


                              1. Sdima1357 Автор
                                22.05.2018 23:44
                                +1

                                :)


  1. BSW
    22.05.2018 00:10

    Интересно — чем обусловлен выбор именно этой микросхемы? Просто была в наличии или 20К оперативки максимум для этой серии?


    1. Sdima1357 Автор
      22.05.2018 00:12
      +2

      Она у меня была. И она самая дешевая и распространенная из подходящих.


      1. Occamlab
        22.05.2018 00:56

        Кроме разгона до 112 MHz, в STM32F103C8T6 можно пробовать использовать вторые 64К flash, если очень нужно.


        1. clawham
          22.05.2018 09:48

          а где почитать? они получается отбраковка от 128 киловых и флеша там внутри таки есть?


          1. NihtRaven
            22.05.2018 14:24

            Делал по такому туториалу acassis.wordpress.com/2016/06/12/running-nuttx-on-a-less-than-u2-00-board
            На моей работало успешно.


  1. Bagobor
    22.05.2018 08:41
    +1

    github.com/retrogubbins/pase — эмуляция спектрума на ESP32


    1. dernuss
      22.05.2018 10:03

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


      1. Sdima1357 Автор
        22.05.2018 10:11

        Судя по потреблению энергии, это вайфай со спектрумом. :)


      1. Error1024
        22.05.2018 10:44

        Spectrum Next несет на борту вайфай :)


        1. VanDamM
          22.05.2018 11:53

          эх, не знаете когда он уже в свободной продаже появится?

          только из-за корпуса купил бы, а так и начинка неплохая


      1. Bagobor
        22.05.2018 11:24

        Wifi+BT :)
        2 Core + 1 Low power core…

        привел как пример тк по цене весьма близка к использованной в статье STM32 )


        1. Sdima1357 Автор
          22.05.2018 12:40

          Примерно втрое дороже, правда на нем можно и 128+ попробовать. Хватило-бы и ESP8266, который дешевле чем ESP32, но он плохо задокументирован.


          1. tormozedison
            22.05.2018 21:34

            На ESP8266 уже есть эмуляция РК.


  1. voicetranslator
    22.05.2018 08:42

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

    Сорри, картинки сейчас лень делать, но все работало, как Вы сами понимаете.


    1. Sdima1357 Автор
      22.05.2018 11:18

      Пруф можно на дисплей?


      1. voicetranslator
        22.05.2018 14:22

        Соврал, таки $5.95 (но это был какой-то крупный сейл, так они дороже, конечно). Вот он, только подключенный к Rpi2 B, вот скриншот покупки, а ссылку не дам, нет уже того продавца, похоже.
        P.S. Но в десятку почти уложился (если не считать «халявное» и то, что было уже дома).


        1. Sdima1357 Автор
          22.05.2018 14:37

          Я когда в GE Medical работал у меня были подарочные сервера Supermicro на 2-4 сокета с последними Xeon-ами от Интеля. Бесплатно.И лично мои. И каждый год новый. В GE они не числились, а Интель их обратно не просил. Так они в GE валяются, думаю что до сих пор. Вопрос стоял не во сколько мне обошлось, а сколько будет стоить если собирать сейчас и не мне.


          1. voicetranslator
            22.05.2018 14:47

            если собирать сейчас и не мне
            Я написал, сколько будет стоить собирать сейчас и мне :D
            Ваша разработка забавная, безусловно, но неужели вы думаете, что все сейчас прямо кинутся создавать такие эмуляторы Zx-ов?


            1. Sdima1357 Автор
              22.05.2018 14:55

              Поставьте себе retropie и не нервничайте. Это Geektimes, а не Хабр.


              1. voicetranslator
                22.05.2018 15:02
                -1

                А почему вы решили, что я нервничаю? Это вы нервничаете, похоже.
                Для очистки совести, вот прямо сейчас (ну, немного дороже $10) тыц и тыц.


                1. Sdima1357 Автор
                  22.05.2018 15:10

                  Ага, только распберри туда не входит.И с доставкой беда.


          1. JC_IIB
            22.05.2018 16:36

            Я когда в GE Medical работал у меня были подарочные сервера Supermicro на 2-4 сокета с последними Xeon-ами от Интеля. Бесплатно.И лично мои.


            Чтоб я так жил, мама мия :)


      1. voicetranslator
        22.05.2018 14:29
        -2

        А RPi Zero до сих пор на сейле.


        1. rstepanov
          22.05.2018 14:36

          IN-STORE ONLY


          1. voicetranslator
            22.05.2018 14:43

            Угу, в 3-х минутах езды от офиса.


  1. balamutang
    22.05.2018 11:10

    круто, недавно только вертел этот стм32, думал наверно спектрум сможет эмулировать, а тут бац — и готовый проект :)


  1. rstepanov
    22.05.2018 11:36

    Ожидал увидеть очередную статью «как я помигал диодом», а тут сюрприз!

    btw: для игровой приставки хорошо подойдет что-нибудь типа первой версии MKS-TFT32, там и экран, и sd-карта, и пищалка есть, и даже usb host, чтобы сразу в него геймпад воткнуть…


    1. Sdima1357 Автор
      22.05.2018 13:46

      Диодом по прежнему можно помигать, с бейсика, на спектрум, нужно только порт пробросить.
      Или лучше осциллограф на бейсике наваять пробросив ADC? Хорошая тема для статьи… :)


  1. Alexeyslav
    22.05.2018 11:38

    А я бы применил SPI-RAM микросхему, к тому же у STM-контроллеров очень часто встречается аппаратный расширитель памяти именно через SPI, это прибавит плюс к быстродействию.


    1. Sdima1357 Автор
      22.05.2018 12:35

      аппаратный расширитель памяти

      конкретно у этого — нет


  1. Andrey_13
    22.05.2018 12:33
    +1

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


  1. madf
    22.05.2018 15:41

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


    1. balamutang
      22.05.2018 16:25

      если прочитать статью то можно понять что искомые 12К в «бордере» экрана хранятся, видно на фотках


      1. 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


        1. madf
          22.05.2018 18:18

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


        1. YegorVin
          23.05.2018 01:24

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


          1. Sdima1357 Автор
            23.05.2018 12:40

            Как работает кеш?

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

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


          1. balamutang
            24.05.2018 12:02

            сложно представить себе такую программу, чтоб постоянно в разные области памяти обращалась. обычно переменные где-то в одном месте свалены, да и сама программа не ходит по каким-то слишком уж длинным алгоритмам. единственное случай в голову приходит — это игры с графикой, где надо постоянно спрайты из памяти на экран тащить, либо смещать изображение на экране


  1. CodeNameHawk
    22.05.2018 19:53

    Не плохо бы и схему посмотреть.


    1. Sdima1357 Автор
      22.05.2018 20:53

      Там все провода смапированны:
      github.com/sdima1357/specci48/blob/master/Inc/main.h


  1. nik_o
    23.05.2018 12:29
    +1

    Восхищаюсь умельцами! Супер!
    На чём только не собирали Spectrum: AVR, PLD (ПЛИС), SMT…
    Интересно, на чём ещё можно соорудить этот популярный комп?!


    1. AquiHostStrider
      24.05.2018 05:37

      На рассыпухе из SMD-элементов :) Или на той же рассыпухе, только в качестве транзисторов взять коробку с КТ315 и коробку с КТ361.


      1. Sdima1357 Автор
        24.05.2018 10:23

        И маленький грузовичок дла перевозки и питания.


      1. nik_o
        24.05.2018 10:38

        О, да Вы гурман батенька! :-)
        Но я думаю, одной коробкой 315-х и 361-х не обойтись.
        Нужно будет штук по 5.


  1. ksimute
    23.05.2018 23:37

    А что на пачке написано? Буквы странные :)
    Чем-то на тайские похожи, но в Тайланде еще и картинки страшные на пачках рисуют.
    Извините за офтоп.


    1. Sdima1357 Автор
      24.05.2018 00:17

      Конкретно на этой пачке на иврите написано красными буквами: «Предупреждение(опасность, внимание, осторожно)»
      потом что то мелко, а потом опять крупно черными:
      «курение приводит к импотенции»