|
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
|
|
Эмулятор ZX Spectrum на STM32f421.10.2013, 20:38. Показов 253526. Ответов 340
Метки нет (Все метки)
Написал эмулятор процессора Z80. Использовал отладочную плату STM32f4-discovery, к ней подключен LCD по FSMC. К PA[0-4](входы) и PC[0-7](выходы) подключается стандартная спектрумовская клавиатура (у меня ее правда нет, поэтому пока просто замыкаю пины проводком :)). Пока не реализован тайминг выполнения команд и нормальные прерывания от дисплея (возможно на нормальный вывод на LCD не хватит ресурсов). Но заветная надпись....
вот она!!! Т.к. это мой первый проект на ARM буду рад услышать критику или предложения, ну и вопросы. [34.63 Кб]
1
|
|
| 21.10.2013, 20:38 | |
|
Ответы с готовыми решениями:
340
Нужно настроить эмулятор мобильного телефона MEMU чтобы приложения не видели что это эмулятор Qt spectrum Audio Spectrum |
|
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 214
|
|
| 23.10.2013, 10:47 | |
|
Итак немного расчета для точной эмуляции:
В спектруме частота обновления пикселей 7МГц, частота Z80 3.5Мгц. Вывод точек идет по байтно, т.е. 7\8=0.875Мгц, исполнение команд идет 3-4 такта на байт команды. Получается, что частота синхронизации эмулятора 0.875Мгц. Делая прерывания на stm32 с такой частотой имеем 168\0.875 = 192такта. вычтем 24 такта на вх\вых прерывания, имеем 168 тактов на один квант эмулятора, за это время нужно рассчитать байт в экране для обновления, вывести его с учетом атрибута и сэмулировать часть команды Z80 приходящие на 4 такта Z80, а также еще некоторые параллельные процессы проходящие в компьютере (прерывание например). Если использовать везде где только можно таблицы (памяти в stm32f407vgt много) то этого вполне достаточно. Нужно учесть что время на вывод пикселей состоит где-то чуть более половины времени всего кадра. Важное дополнение сейчас - переделайте движек Z80, создайте массивы команд, где код команды это номер в массиве, а содержимое это адрес функции исполнения этой команды (массив указателей получается) и вызывайте ее, тогда избавитесь от бесконечных медленных case. Работа с LCD быстрая, если тупо постоянно последовательно обновлять его. на zx.pk.ru я создал тему со ссылкой сюда, интереса особого не вызвал, думаю из-за не законченности конструкции. Лисицин кажись год там разрабатывал свой эмулятор, преодолевая ограниченность мег.
0
|
|
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|||
| 23.10.2013, 15:24 | |||
0
|
|||
|
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
|
||||
| 23.10.2013, 17:34 | ||||
0
|
||||
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
||
| 23.10.2013, 20:17 | ||
Может такой вариант: Создать массив размером с область экрана спектрума, НО, с удобной для вывода в LCD структурой следования байтов, чтобы был эффективным вывод всего массива за раз..... При выполнении команд (запись, чтение) обращающихся в область экрана, обрабатывать их с преобразованием адреса... При таком решении, думаю, на преобразование адреса не должно ухождить много ресурсов, зато экран теперь будет летать (теперь уже можно будет с помощью DMA).....
0
|
||
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
| 23.10.2013, 20:45 | |
|
преобразование адресов там тривиальное, и делать его надо 1 раз на строку.
0
|
|
|
0 / 0 / 0
Регистрация: 05.09.2013
Сообщений: 122
|
||
| 23.10.2013, 21:13 | ||
Pyxit = ((y & $C0) | ((y << 3) & $38) | ((y >> 3) & $07)) << 5 Attr = 6144 + ((y & $F8) << 2) На Арме это видимо будет 4-5 команд. Возможно быстрее будет по табличке, 384 байта думаю найдется.
0
|
||
|
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 214
|
||
| 24.10.2013, 06:41 | ||
168\7=24такта, вот они и уйдут на прерывание. Там кстати в прерывании еще нужно флаг прерывания обязательно сбрасывать, это еще 3 такта. Так что не получится. Использовать массив памяти для вывода на экран не рационально, производительность требуется та же, а памяти нужно 75кб!
0
|
||
|
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
|
|
| 24.10.2013, 13:37 | |
|
Рисовать в буфер точно также как это делается на спектруме, там не просто так такая структура экрана была придумана. И память экономиться и работает быстро.
А вот уже буфер перекидать целым кадром программно или через dma.
0
|
|
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
||||
| 24.10.2013, 14:30 | ||||
Но связано это только с тем, что размер экрана спектрума - 256 х 192 пикселя... По другому эффективнее такой экран не распределиш... Вот если бы вертикальное разрешение экрана составляло 256 точек, то однозначно бы развертка шла вертикально (причем равномерно сверху вниз) а не горизонтально... Так что ничего сверхъестественного в организации экрана спектрума нет.....
В симуляторе уже нет таких жестких рамок по размерам ROM и по скорости, так что можно и фантазировать как угодно...
Вот если бы можно было бы кроме буфера экрана спектрума создать еще буфер соответствующий внутреннему ROM дисплея, и при записи в область экрана спектрума, одновременно модифицировать данные в буфере LCD дисплея, а потом с помощью DMA скидывать весь буфер в дисплей.... Но наверное буфер дисплея получится большим, и тут даже ARM окажется маленьким...
0
|
||||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
||
| 24.10.2013, 14:52 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
|
||
| 24.10.2013, 15:16 | ||
Но связано это только с тем, что размер экрана спектрума - 256 х 192 пикселя... По другому эффективнее такой экран не распределиш... Вот если бы вертикальное разрешение экрана составляло 256 точек, то однозначно бы развертка шла вертикально (причем равномерно сверху вниз) а не горизонтально... Так что ничего сверхъестественного в организации экрана спектрума нет..... Никто и не говорит про исключительность граф. режима спектрума, речь только об ограниченных ресурсах и как они были использованы. Я предлагаю проделать тоже самое с поправкой на то, что потребуется для вывода на LCD. Если LCD не позволяет сделать вывод всего кадра целиком, в топку его и взять другой со встроенным буфером :)
0
|
||
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
| 24.10.2013, 15:23 | |
|
пререндер одной строки растра (т.е. каждой следующей) не поможет с памятью? тогда и времянки и мультиколоры могут заработать искаропки. пока дма шлет отрисованную строку целиком, эмулится и рисуется следующая.
0
|
|
|
0 / 0 / 0
Регистрация: 03.02.2011
Сообщений: 45
|
||
| 24.10.2013, 16:08 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
||
| 24.10.2013, 16:56 | ||
Не обязательно за раз весь экран пихать... достаточно подготавливать какую то его часть и вот ее с помощью DMA уже передавать LCD дисплею... Например можно настроить прерывание на 50 * 24 = 1200Гц. В этом прерывании подготавливать из 1\24-й части экрана спектрума - буфер для 1\24-й части дисплея LCD... Это как раз 256 байт экрана спектрума, ну и наверное 2кб у LCD... Причем буфер LCD будет содержать данные идущие в ROM LCD последовательно... в спектруме это одни и теже 32 байта в младшем байте адреса, с инкрементируемым 8 раз старшим байтом адреса... т.е. рассчет 1\24-й части экрана спектрума - элементарный... тут для ARM-а вообще мизер работы... Ну и после подготовки буфера - запускаем DMA, и ждем следующего прерывания.... (а пока - прикидываемся процессором Z80 и пашем в поте лица.....) Помоему - идеальный вариант.....
0
|
||
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
| 24.10.2013, 20:44 | |
|
если захочется точной эмуляции времянок (и бордюра) - математика будет уже другая. там 312 или 320 строк растра в зависимости от модели.
0
|
|
|
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
|
|||
| 24.10.2013, 21:46 | |||
Настроил TIM6 на прерывания 50 Гц. Посылаю их в эмулятор. Выпилил клавиатуру, буду лудить и паять.
0
|
|||
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
||
| 24.10.2013, 23:37 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
||
| 24.10.2013, 23:54 | ||
Представь что у нас игра которая активно работает с областью экрана... В твоем случае ARM просто захлебнется в единичных вычисленияч каждого обращения к области экрана, потом загрузки указателя в дисплей и вывода в него нужных 8 байт данных..... В моем случае - да, нужно тратится сначала на рассчет буфера... но это происходит так сказать - оптом..... В принципе это та же работа которую контроллер проводит и в твоем случае, только выполненная более эффективно... Тем более отпадает нужда каждый раз инициировать внутренний указатель ROM дисплея (это происходит всего 1 раз в начале вывода буфера), а так же отпадает нужда вручную грузить данные в дисплей, т .к. в моем случае (данные идут подряд) это можно возложить на DMA..... Конечно твой вариант выиграет если обращения к области экрана - редкие... Но зато начнет жутко тормозить если запустить например игрушку..... Мой вариант будет грузить контроллер с одинаковой силой независимо от того что происходит в видеопамят спектрума... Как результат можно точно просчитать скорость эмуляции, т.к. всегда известно какой процент ресурсов занимает отработка экрана..... Ну как... есть выгода?..... Ща попробую накидать процедурку обработки буфера дисплея в прерывании...
0
|
||
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
||
| 24.10.2013, 23:58 | ||
http://www.worldofspistrum.org/rusfaq/
0
|
||
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
||||||
| 25.10.2013, 03:41 | ||||||
|
В общем как то так надо обрабатывать данные экрана.
Прерывание должно вызыватся с частотой 1200 Гц.
Вопрос только в том, может ли LCD обновлять область 256 х 192 пикселей, с частотой 50гц ????? И успеет ли ARM за 0,8 мс, отработать и это прерывание, и еще проэмулировать ту работу, которую z80 выполняет за 0,8 мс ?????
0
|
||||||
| 25.10.2013, 03:41 | |
|
Игры на ZX-Spectrum bass spectrum Кассеты / ZX Spectrum Spectrum bass.dll ZX Spectrum на AVR, V2_0 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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) активировать флаг. . .
|