Zx spectrum128, CP/M 2.2 и терминал на STM32F407

  • Tutorial
Нарисовав черно-белый 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

Корневые директории(для этого кода именно так):

Z48 — сюда класть программы для spectrum48. Форматы: .TAP,.Z80,.SNA
Z128 — сюда класть программы для spectrum128. Форматы: .TAP,.Z80,.SNA
MP3 — попробуйте угадать? И форматы?

Видео тест Спектрума:


Бонус. Реализован слой согласования с CP/M 2.2 от Grant Searle's.

Мужик сделал отличную работу по реализации CP/M на Z80 (отдельно) и FPGA (другая система). Там и BIOS и образ диска с дофига программ, утилит и компиляторов:

Си, Лисп, Ада, Паскаль, Cobol, Алгол, Forth, APL, Fortran, PL/I, Basic всякий, muMath & muSimp (CAS math package), игры, редакторы… всего 240 мега. Это сегодня пару страниц текста, а тогда, во времена CP/M, столько не было ни у кого. Подробнее здесь.



Ну и видео тест CP/M:



Я немного добавил к эмулятору z80 на STM32 слой обращения к диску и терминал экрана: клавиатуры, микс ANSI и VT100. Надо будет допроверить и доделать. В основном работает, CATCHUM и Turbo Pascal исправны. Запускается CP/M когда видит диск отсюда, по первым двум байтам образа. Если диска вообще нет, то запускается в режиме Spectrum 128 в меню.



Что не сделано:

  1. Чтение и запись с физического магнитофона, магнитофон купил, жду пустые кассеты с Али.
  2. Вообще любая запись в спектруме не написана.(В CP/M — есть запись)
  3. ".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

Средняя зарплата в IT

110 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 8 763 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 45

    0
    белый магнитофон

    По-моему такие только с микрофона и радиоприемника записывали. Линейного входа в них нет.
      +1
      Есть вход с внешнего микрофона. И выход на наушники. Специально такой смотрел. Да и паяльник у меня не отняли ещё.
      Лишь бы хоть как нибудь писал, а то я засомневался. Головка стирания — похоже просто постоянный магнит.
        +1

        А если нет, ничего страшного. Сигнал через конденсатор, микрофон нафиг, и готов линейный вход. Я с безымянной магнитолой в девяностых такое делал.

      +2
      «Чип AY-3-8910 не то что бы сильно сложный, но документация на него скорее предназначена для пользователей и интеграторов, а не для эмуляции/симуляции. О многом приходилось скорее догадываться и смотреть по коду разных эмуляторов, чем просто сесть и написать по документации. Возможно, что где-то и не угадал… И фокус написать его нетребовательным к СPU ресурсам. Вроде получилось.»

      Снимаю кепку. Написать эмулятор без пятисотстраничного талмуда «туда не ходи, сюда ходи» — это безумно круто.

      ПЛИСы накапливаете про запас в связи со скупкой на корню производителей?

      «белый магнитофон для демонстрации загрузок компьютеров внукам. Нет ничего дороже $30»
      Ну а как, это же тёплый механический магнитофон, а не холодная стекляшка.

      «Эмулятор z80 прогонял на них на всех, кроме программера для альтеры и магнитофона. На некоторых и эмулятор 80286-го прогнал.»
      На очереди — терминал подключения к Матрице.

      Успешной реализации всех затей и да не оскудеет на них Ваша фантазия.
        0
        Плиски — это потому что на stm32 максимум — это эмуляция 8086 на 3-5 мегагерц. Даже Спектрум эмулируется со многими ограничениями. А хотелось бы замутить чего нибудь покруче. Ну и потренироваться в программировании плисок. Для меня это новенькое, остальное (Intel & Nvidia ) поднадоело на работе.
          0
          Если решили перейти на ПЛИС, попробуйте запустить на такой штуке:
          tomverbeure.github.io/2019/11/11/Cisco-HWIC-3G-CDMA.html
          есть все шансы уложиться в цену пачки сигарет :-)
          0

          8086 — медленный проц с многотактовыми инструкциями, думаю на STM32H7, который гонится почти до 700МHz, умеет выполнять по две инструкции за такт, имеет кеш и CCM для выполнения кода, а также метр RAM которая позволяет отказаться от медленной SDRAM, должно получиться явно больше чем 8086 на 3-5 мегагерц. Аналогично с Atari ST, должно тянуть без проблем, там обвязка простая, в отличии от амиги.

            0
            Платы STM32H7 — без ничего, стоят как паровоз ~$20(вверху слева на фотке). Даже обход 8 мегабайт выше-упомянутой PSRAM64-H (она на фотке припаяна вместо флешки) в режиме QSPI через эмуляцию кеша занимает около 4 секунд. Это слишком медленно. У меня есть заготовки и бенчи и на 68000 и на 8088. Могу поделиться. Если знаете как ускорить, welcome. И все рано проиграют FPGA раз в тридцать на эмуляции 8086-80286(важно) или MC68000(не так важно), при большей цене.
              0

              Отдельно H750 стоит 4-5$, в действительности это H753 с двумя метрами флеша, из которого проверено только 128КБ, учитывая что там еще и два банка рабочий метр можно получить практически гарантированно. В простейшем случае его можно хоть на переходник впаять и собрать все на макетке… Насчем скорости QSPI не скажу, память такая есть, но не тестил еще. Однако по докам даже если обращаться к одному байту, то нужно передать команду, адрес в quad режиме, для чтения еще добавляется 6 тактов ожидания и потом 2 такта на данные, итого 16-22 такта при частоте 144MHz, т.е. 2 метра в секунду — это мало даже в таком самом медленном случае(хотя можно 24 бит адреса побитно передавать). В любом случае 22 такта — это в десятки раз меньше, чем затратит на обращение к внешней памяти 8086.

                0
                Все можно, но зачем? Для каждой системы есть наиболее походящее железо. Для эмуляции 8086-80286 STM подходит не очень. Вы наверное забыли, насколько медленные были XT да и AT тоже. Делал эмуляцию на FPGA (вот на этом EP4CE15, снизу справа)- если меньше 20-30 мегагерц, то кроме «диггера» ничего не двигается. Турбо Си еле шевелится. Даже на raspi-4 (не в моде JIT) бежит медленно. А это совсем не stm32.
                  0

                  Официальная XT была с 8-ми битной шиной и работала на смешных 4.77 MHz, а официальная AT — это 6-8 MHz. Ориентировочно такой комп можно эмулировать без тормозов и программ рассчитанных под такое железо явно больше, чем для спектрума. Если для нормальной работы нужно 20-30 MHz, значит это уже софт предназначенный для 386 и выше, про него речь не идет. На FPGA конечно будет быстрее, но доступнее ли?

                    0
                    ZyNQ 7010/ Уже писал в статье — $12-$17 www.aliexpress.com/item/1005001529178155.html
                      0

                      У меня $19.23 с доставкой. И для большинства эту плату нужно купить конкретно под эмулятор, в то время как в случае STM32 на них собирают эмулятор потому что такая плата уже есть, или есть похожая и другой STM32 тоже может быть как-то использован в иных целях.

                        0
                        Ну а я купил несколько, так что теперь они у меня все равно валяются, как и STM-ки всякие разные. Вот и хочу потренироваться, пока недорого и спалить не жалко. Плата действительно крутая за свои деньги. Кстати — если бы я делал плату для себя с нуля(PCB) — то STM32F401 — как контроллер клавиатуры и SD CARD, а остальное SPARTAN6 XC6SLX9 и SDRAM 32MB
                +1
                в режиме QSPI
                Это же очень медленно. Параллельная память — наше всё!
                  0
                  Зато дешевая. И на плату садится вместо флешки.
            0

            Эмулятор 286 — это уже возможность портировать GW-BASIC первой версии, который под лицензией MIT. Он к ОЗУ нетребователен. Нужно только переделать так, чтобы запускался не из DOS, а с нулевого адреса, чтобы места меньше требовалось.


            Ещё можно попробовать К1801ВМ1 сэмулировать.

            0
            Не думали попробовать сэмулировать амигу? Вот другой проект, где это было сделано.
              0
              Не думали попробовать сэмулировать амигу?

              На чем именно? STM32F407 — не потянет однозначно. Хотя бы по памяти. Или нужен custom board. Сомневаюсь что и по скорости потянет. И будет ооочееенннь меедлеенно.
              Вот другой проект, где это было сделано

              Да, я видел, спасибо. А насчет Амиги — думаю.
              0

              "Эмулятор z80 прогонял на них на всех, кроме программера для альтеры и магнитофона" — а на программаторе-свистке в левом верхнем углу (под клавиатурой) — неужели тоже?

                0
                Там, в свистке стоит stm32f103c8t6
                habr.com/ru/post/412325
                То есть скорее да, чем нет. Есть еще кандидаты. Осциллограф на ней же.
                0
                  0
                  Я уже давно его писал. Сейчас только подключил к проекту. Ну не могу я за всем уследить…
                    0
                    Простите, ни как не хотел обидеть, просто уточнил что техноманьяки его отреверсили.
                    Очень надеюсь что кто нибудь выполнит реверс OPL2, все таки классический FM синтезатор YM3812 внутри хитро устроен.
                      0
                      Да я и не обиделся, я понял желание помочь.Забавно, что в проекте IBM PC на FPGA- next186, эмуляция OPL2 выполнена как раз на ассемблере Z80, тоже написанному на верилоге(z80 на верилоге, а не ассемблер, разумеется), в том же FPGA.
                        0
                        Надо посмотреть, таких извращений преодолений мне еще пока не попадалось;)
                        А эти варианты реализации эмуляции OPL2/OPL3 наверное уже видели?
                        OPL2 emulator
                        ADLMIDI: OPL3 MIDI player for Linux and Windows
                        Yamaha YMF262 (OPL3) emulator
                          0
                          Я честно говоря не фанат миди. После многочисленных попыток понять как добиться нормального звука, при проигрывании на разных миди девайсах, понял что каждый миди файл проигрывается нормально только на том девайсе, на котором его писали. И все. А на остальных получается или полное гав..., или не совсем полное, но все равно г, ну может быть за исключением одного пиано.
                          Собственно поэтому, этот формат практически мертв, и им никто не пользуется за исключением самих музыкантов. А я не музыкант :(. :)
                          То есть плохая стандартизация тут сыграла свою роль. Соответственно поэтому и есть сложности с эмуляцией миди карт
                            +3
                            Ну OPL(FM синтез) это не совсем миди. А в таком негативном отношении к миди, виноваты творческая натура профессиональных музыкантов. Когда приходило время написать саундтрек к игрушке, музыкант брал в руки любимый Корг, Ямаху, Роланд и забабахивал крутой трек. Демонстрирует его, все в отпаде от такого классного трека. И тут из задних рядов раздается вопрос «А как это будет звучать на Adlib, SB, SBPro?» Тут же следует ответ музыканта — «Да также! На синтезаторе General MIDI, у вас на звуковушках General MIDI! Какие проблемы?» Объяснение что это «не совсем так просто», и просьба подрихтовать полученную мелодию под целевой синтезатор оканчивается коронной фразой музыканта «Я творческая личность и мне влом не могу переделывать свою нетленку под вашу какашку звуковушку!» И хлопает дверью.
                            И на выходе мы получаем, то что получаем.
                            Но если музыканты действительно профессионалы то и результат был совершенно другой.

                            Приведу в качестве примера трек к игре DUNE от Cryo, в которой наверное наиболее ярко был показан потенциал FM синтеза

                            SB vs MT-32

                            Adlib (OPL2)

                            Adlib Gold (OPL3)

                            MT-32

                            И еще надо учесть тот факт, что реализация OPL2/OPL3 могла существенно отличаться у разных производителей звуковых карт

                            Cравнение FM синтезаторов (AWE64/ESS/Yamaha/OPTI)
                            1. Creative Labs SoundBlaster AWE64 digital capture

                            2. Ess1868

                            3. Ymf718


                            Full Dune Opl2 soundtrack:
                            OptiFM


                            После всех этих мучений, первым шагом к унификации звучания саундтрека, стала MOD музыка в которых звучали именно те инструменты что и хотел создатель, потом была эпоха CD-Audio треков на диске с игрой, ну а потом эпоха потоковой музыки, первопроходцем которого был C&C.
                            P.S. Не могу не поделиться великолепным смикшированным треком DUNE в котором одновременно звучат AdLib + MT-32 + AdLib Gold


                              +1
                              Да, дюну я помню, она шикарна.А насчёт хорош fm синтезатор или плох- мы знаем ответ. Не бывает совсем плохих инструментов, есть только плохие музыканты
                                +1
                                Ну трек Дюны настолько хорош, что когда я перечитываю Фрэнка Херберта то ставлю фоновой музыкой трек из игры или DUNE:Space Opera для полного погружения. Надеялся что Вильнев пригласит Stéphane Picq для создания трека к новому фильму, но не срослось. :(
                                А про музыкантов абсолютно согласен, хороший музыкант и плохие (слабые) инструменты заставит играть хорошо.
                                  +1
                                  Ещё есть Lost Eden.
                                    +1
                                    Херберт вообще чума. Я от него тащился и дети мои тоже.
                                      +1
                                      Херберт гений, его даже «малиновый» перевод не смог поломать. Хотя иногда читая книгу зависал с переходом персонажа из он->она и наоборот. Но глаза в кучу и вперед ;)
                    0
                    Экран 320х240 с параллельной 16bit шиной FSMC стоит дороже платы STM32F407, может использовать значительно более дешевый экран 2.8" на контроллере ILI9341 c SPI интерфейсом?
                      +1
                      Могу конечно. Это несложно. И код для него практически такой же.Но на некоторых играх или будет тормозить, или придется запускать дисплей далеко за пределами его спецификации по скорости SPI. Да и провода болтаться будут.
                      0
                      Бета128 ака трдос нехватает… С подключением образов дисков .trd
                      Впрочем, подозреваю, что не влезет и надо будет что-нибудь выкидывать.
                        0
                        Ну почему же, влезет конечно. Место ещё есть, можно basic из cp/m (там и basic и bios )выкинуть. Время только надо, разобрать работу контроллера диска, у меня не было такого.
                          0
                          Beta128 особо и не нужен. Лучше divmmc, там по харду мизер совсем, зато евойным софтом делается все остальное. Там и tr-dos есть с загрузкой .trd и моментальная загрузка .tap и еще куча всего.
                            0
                            Это практически тоже самое. Никто и не собирался собирать FDD, а только эмуляцию на .«TRD» образах. А ".TAP" он и так грузит у меня.
                              0
                              Если без аппаратного флопика, тогда еще и его эмулировать пришлось бы для совместимости с оригинальным tr-dos. В софте это все уже есть, а вот для fpga готовой реализации не видел. Начал уже было сам делать, выходило весьма не просто, но потом нашел divmmc…

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

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