Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/1311: Рейтинг темы: голосов - 1311, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92

Эмулятор ZX Spectrum на STM32f4

21.10.2013, 20:38. Показов 253414. Ответов 340
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал эмулятор процессора Z80. Использовал отладочную плату STM32f4-discovery, к ней подключен LCD по FSMC. К PA[0-4](входы) и PC[0-7](выходы) подключается стандартная спектрумовская клавиатура (у меня ее правда нет, поэтому пока просто замыкаю пины проводком :)). Пока не реализован тайминг выполнения команд и нормальные прерывания от дисплея (возможно на нормальный вывод на LCD не хватит ресурсов). Но заветная надпись....


вот она!!!
Т.к. это мой первый проект на ARM буду рад услышать критику или предложения, ну и вопросы.


[34.63 Кб]
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.10.2013, 20:38
Ответы с готовыми решениями:

Нужно настроить эмулятор мобильного телефона MEMU чтобы приложения не видели что это эмулятор
Нужно чтобы сторонние приложения воспринимали эмулятор как реальное устройство без root прав

Qt spectrum
Доброго времени суток. Возникли сложности с пониманием готового кода в Qt примерах. Буду очень благодарен кто сможет объяснить реализацию...

Audio Spectrum
Всем привет, пишу аудио плеер (WinForm). Встал вопрос как сделать Spectrum, кто знает скажите пожалуйста. Нашёл подходящий пример, но...

340
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
05.11.2013, 15:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Koryim
UnrealSpeccy тест якобы не прошёл, есть ошибки.
даже самый последний? 0.38.1?
Цитата Сообщение от OtyxPM
Что-нибудь типа QBosys, которому даже Wymdows не нужен, - хороший путь для быстрого конвертора на коленке: надо всего-то открыть два файла (исходный код и сконвертированный), в цикле прочитать-пересчитать-записать байты, закрыть два файла.
нынче питон универсален, популярен и мультиплатформен. думаю, там оно может решиться в одну строку:) перл хорош только для тех, кто к нему привык, питон в сравнении с ним гораздо человечнее (менее упорот).
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
05.11.2013, 18:39
Цитата Сообщение от Ymk
даже самый последний? 0.38.1?
Посмотрел версию 0.38.0, в некоторых тестах ошибки, читал сегодня как Лисицин отлаживал свой проект, жесть.

В общем по таймингам засада, два пикселя выводятся за один тик процессора Z80 (на железном), я вывожу по 8 пикселей - это 4 такта. Одна команда процессора Z80 выполняется 4 и более такта. Отлично, но есть команды которые выполняются за не кратное 4 количество тактов. И как выдержать тайминг в этом случае это вопрос. Кто что посоветует?
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
05.11.2013, 18:57
Цитата Сообщение от Koryim
есть команды которые выполняются за не кратное 4 количество тактов. И как выдержать тайминг в этом случае это вопрос. Кто что посоветует?
Сделать массив указателей на функции обработки команд. Каждая функция обрабатывает определенный диапазон однотипных команд, выполняющихся одинаковое время. И каждую функцию отдельно доводить по таймингам...

Так быстродействия ARM-а хватает сейчас чтобы не отставать от реалтайма?
Я тут увидел как можно пооптимизировать прерывание для вывода в LCD... Есть смысл это делать?
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
05.11.2013, 19:23
Еще вариант пришел на ум.....
Завести железный таймер\счетчик X тикающий с частотой 3,5мГц... Так же завести программный счетчик Y, который после окончания эмуляции текущей команды будет увеличиватся на количество тактов необходимое для выполнения команды которую только что выполнили.....
Теперь будет возможность жестко синхронизировать эмуляцию команд... Просто перед отработкой очередной команды, нужно будет посмотреть на счетчики:
если Y больше чем X, то значит мы усе успеваем... и можно пофилонить, пока счетчики не сравняются.....
если X больше чем Y, то значит надо сникерснуть....

Как тебе такой вариант?
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
05.11.2013, 20:11
Цитата Сообщение от ShodS
Еще вариант пришел на ум.....
Завести железный таймер\счетчик X тикающий с частотой 3,5мГц... Так же завести программный счетчик Y, который после окончания эмуляции текущей команды будет увеличиватся на количество тактов необходимое для выполнения команды которую только что выполнили.....
Теперь будет возможность жестко синхронизировать эмуляцию команд... Просто перед отработкой очередной команды, нужно будет посмотреть на счетчики:
если Y больше чем X, то значит мы усе успеваем... и можно пофилонить, пока счетчики не сравняются.....
если X больше чем Y, то значит надо сникерснуть....

Как тебе такой вариант?
Вариант отличный, т.е. как таковых прерываний (железных) не будет, а будет типа мягких, софтовых. Пытаюсь оптимизировать код вывода на экран, сейчас 8 байт выводятся за 0.00000044с (самая долгая ветка) на экран я пока вывожу 9600 байт 0.00000044с*9600=0,004224с. один кадр 1/50=0,02с. Получается что за один кадр есть 0.015с свободного времени или 0.7 в секунду (вроде нормально).
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
05.11.2013, 20:12
Цитата Сообщение от ShodS
Я тут увидел как можно пооптимизировать прерывание для вывода в LCD... Есть смысл это делать?
Конечно, жду предложений.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
05.11.2013, 21:45
Цитата Сообщение от Koryim
т.е. как таковых прерываний (железных) не будет
Именно... Для реализации этой идеи - дополнительные прерывания ВООБЩЕ не нужны...
Просто при старте запускаем железный таймер\счетчик на тупой счет с частотой 3,5мГц... (т.е. он сам по себе тикает и все... а мы ка бы на него будем ориентироватся...)
Ну и запускаем еще один, чисто софтовый счетчик, его мы будем увеличивать после отработки команды, на длину тактов этой команды.
Останется в начале отработки каждой следующей команды посмотреть, насколько мы обгоняем или отстаем...

По моему это идеальный вариант будет... в функциях эмуляции команд вообще не надо будет ничего подгонять по таймингам.....

сумасшедший примерчик :).....

выполнили команду DI (за это время железный счетчик X увеличился на 1 и стал равен 1)
прибавили 4 к счетчику Y (DI = 4 такта, Y+4=4)
сравнили содержимое счетчиков (X=1, Y=4)
опережаем. ждем пока счетчики сравняются (ждем состояния X=4, Y=4)

выполнили команду LD A,0 (за это время железный счетчик X увеличился на 2 и стал равен 6)
прибавили 7 к счетчику Y (LD A,0 = 7 тактов, Y+7=11)
сравнили содержимое счетчиков (X=6, Y=11)
опережаем. ждем пока счетчики сравняются (ждем состояния X=11, Y=11)

тут вклинилось прерывание обработки экрана... (за это время счетчик X натикал до состояния 30)

выполнили команду JR M1 (за это время железный счетчик X увеличился на 1 и стал равен 31)
прибавили 12 к счетчику Y (JR M1 = 12 тактов, Y+12=23)
сравнили содержимое счетчиков (X=31, Y=23)
сразу переходим к выполнению следующей команды, т.к. отстаем от графика...

выполнили команду LD I,A (за это время железный счетчик X увеличился на 2 и стал равен 33)
прибавили 9 к счетчику Y (LD I,A = 9 тактов, Y+9=32)
сравнили содержимое счетчиков (X=33, Y=32)
сразу переходим к выполнению следующей команды, т.к. отстаем от графика...

выполнили команду LD DE,0 (за это время железный счетчик X увеличился на 2 и стал равен 35)
прибавили 10 к счетчику Y (LD DE,0 = 10 тактов, Y+10=42)
сравнили содержимое счетчиков (X=35, Y=42)
опережаем. ждем пока счетчики сравняются (ждем состояния X=42, Y=42)
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
06.11.2013, 20:07
Цитата Сообщение от ShodS
Именно... Для реализации этой идеи - дополнительные прерывания ВООБЩЕ не нужны...
Завел тайминги, сейчас борюсь со случаями когда таймеры переполняются.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
06.11.2013, 20:13
Цитата Сообщение от Koryim
Цитата Сообщение от ShodS
Именно... Для реализации этой идеи - дополнительные прерывания ВООБЩЕ не нужны...
Завел тайминги, сейчас борюсь со случаями когда таймеры переполняются.
Имееш ввиду когда железный таймер\счетчик доходит до конца счета и обнуляется или что?
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
07.11.2013, 07:59
Цитата Сообщение от ShodS
Цитата Сообщение от Koryim
Цитата Сообщение от ShodS
Именно... Для реализации этой идеи - дополнительные прерывания ВООБЩЕ не нужны...
Завел тайминги, сейчас борюсь со случаями когда таймеры переполняются.
Имееш ввиду когда железный таймер\счетчик доходит до конца счета и обнуляется или что?

Ага, два момента, когда железный доходит до переполнения, и когда софтовый. Пока загружаю значения таймингов в регистр перезагрузки в таймер 7, и смотрю когда флаг что прошла перезагрузка установится. Пробую сохранять файл на ленту, чегото он много сохраняет... Вечером попробую видео записать.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
07.11.2013, 10:53
Цитата Сообщение от Koryim
два момента, когда железный доходит до переполнения, и когда софтовый.
Попробуй сделай так:
Ведь нам не обязательно чтобы эти счетчики крутились по кругу... ну и давай их будем обнулять каждый раз когда у нас была ситуация во время сравнения что Y был больше, и мы ждали счетчика X... Как только значения сравнялись - обнуляем оба счетчика..... Тогда по идее переполнения никогда не будет...

Получается что если мы отстали от графика, то счетчики не сбрасываем, и они какое то время считают нормально... Но как только мы догнали (Y оказался больше X), после ожидания момента (Y==X) сбрасываем оба счетчика.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
07.11.2013, 14:48
вы прям тайминги команд в реалтайме эмулируете? а зачем такие сложности?
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
07.11.2013, 15:02
Цитата Сообщение от Ymk
вы прям тайминги команд в реалтайме эмулируете? а зачем такие сложности?
Помимо обработки эмуляции есть еще вывод на экран, да и если бы его не было у меня бы рука не поднялась лишний NOP в обработчике набрать, как только я выявлю все ошибки сразу же избавлюсь от декодера команд, а это еще немного свободного времени, которое можно с пользой потратить :)
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
07.11.2013, 15:10
я как понял, щас так: команду сэмулили - кусочек экрана нарисовали, прям сразу. если так, то не понятно - зачем. можно же быстро наэмулить на строку (224 такта), потом ее отрисовать и потом еще куча времени останется. и никаких подгонок и прочей лишней реалтайм-работы. я просто идею понять хочу.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
07.11.2013, 19:17
Цитата Сообщение от Ymk
я как понял, щас так: команду сэмулили - кусочек экрана нарисовали, прям сразу. если так, то не понятно - зачем. можно же быстро наэмулить на строку (224 такта), потом ее отрисовать и потом еще куча времени останется. и никаких подгонок и прочей лишней реалтайм-работы. я просто идею понять хочу.
Нет не так, экран отрисовываем с частотой 0,875 МГц на байт (бордюр и экран), а команды идут с частотой кратной 3,5 МГц. 1 байт экрана это 4 такта генератора 3,5 МГц (самая маленькая команда в спектруме 4 такта) жаль что есть команды в 6, 7 и более тактов, а так бы можно было сделать как вы говорили.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
07.11.2013, 20:48
есть и в 5 тактов команда:)

а так, как я говорил, мне кажется, было бы просто и точно. и пофиг сколько тактов какие команды.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
07.11.2013, 21:54
А вот и обещанное видео :)

https://www.youtube.com/watch?v=88bgF9vJwOk

Цитата Сообщение от ShodS
Попробуй сделай так:
Ведь нам не обязательно чтобы эти счетчики крутились по кругу... ну и давай их будем обнулять каждый раз когда у нас была ситуация во время сравнения что Y был больше, и мы ждали счетчика X... Как только значения сравнялись - обнуляем оба счетчика..... Тогда по идее переполнения никогда не будет...

Получается что если мы отстали от графика, то счетчики не сбрасываем, и они какое то время считают нормально... Но как только мы догнали (Y оказался больше X), после ожидания момента (Y==X) сбрасываем оба счетчика.
Так и сделал, на видео такой вариант. На некоторых командах в 4 такта немного отстает. Буду запускать тесты, ловить ошибки, а потом избавлюсь от "дешифратора".
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
07.11.2013, 22:49
Цитата Сообщение от Koryim
А вот и обещанное видео :)
Не верю своим глазам... (и ушам...)
Это что, мы на верный след напали!?.....
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
07.11.2013, 23:11
Цитата Сообщение от ShodS
Цитата Сообщение от Koryim
А вот и обещанное видео :)
Не верю своим глазам... (и ушам...)
Это что, мы на верный след напали!?.....

вроде:)

Прогнал тест (Z80 Test Suite), есть ошибки, много ошибок....
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
08.11.2013, 09:49
Цитата Сообщение от Koryim
На некоторых командах в 4 такта немного отстает.
А как определяеш, отстает или нет?.....

Цитата Сообщение от Koryim
Прогнал тест (Z80 Test Suite), есть ошибки, много ошибок....
Ну ошибки - это дело поправимое..
Главное что звук более менее реальный, а значит с таймингами все таки удачное решение... Это намного упростило задачу... т.к. возня с настройкой таймингов всех процедур обработки команд - тот еще геморрой.....

Кстати а видно (слышно) отличие от предыдущих вариантов? Или особо и не заметно, что контроллер привязали к 3,5мгц ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2013, 09:49

Игры на ZX-Spectrum
У кого было это чудо? :) И любимые игры на нем?

bass spectrum
Зашкаливает спектрум, смена высоты не помогает, какая команда отвечает за "чувствительность" спектрума?

Кассеты / ZX Spectrum
Доброго времени суток! Простите за дебильный вопрос, но всё же: можно ли подружить вот такой КПК HP 95LX ...

Spectrum bass.dll
Доброе утро всем. Подскажите кто знает. "использую фоновую картинку на форме" вот и хотелось бы его сделать прозрачным. Как сделать...

ZX Spectrum на AVR, V2_0
Здравствуйте! Представляю свою новую разраюотку - AVR ZX Spectrum V2_0 Видео: http://www.youtube.com/watch?v=y4JQdIvJunI Схема,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Закрытая тема Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru