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

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

21.10.2013, 20:38. Показов 253526. Ответов 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
Регистрация: 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
Цитата Сообщение от Koryim
Так это не для каких интересов, а просто для разминки мозга (хобби)!
ну, вам-то я ничего против и не говорю:)
Цитата Сообщение от Koryim
А на тот сайт я пробивался пробивался да и забросил это дело.
да и правильно, в целом. многие с этим сталкивались, но администрацию не пробить. вип-зона, фигли...
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
23.10.2013, 17:34
Цитата Сообщение от ShodS
Дык этож не правильно... нужно завести таймер который будет щелкать раз в 20мс и вызывать процедуру обновления всего экрана..... (думаю это будет эффективнее чем сейчас)
Цитата Сообщение от OtyxPM
А ещё эффективнее - поручить DMA перекидывать видеомассив в LCD. А процессор сможет в это время заниматься вычислениями.
Не все так просто, видеопамять в спектруме организована таким образом, что ее сразу на LCD не выведешь, нужно преобразовывать (тратить ресурсы ЦП)

Цитата Сообщение от moksir
Итак немного расчета для точной эмуляции
В этом направлении и буду идти. Только думаю выводить на LCD в прерывании нужно не целый байт а 1 пиксель. (а на вход и выход из прерывания тратится 24 такта?, Я просто с прерываниями на STM еще не работал)
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
23.10.2013, 20:17
Цитата Сообщение от Koryim
Не все так просто, видеопамять в спектруме организована таким образом, что ее сразу на LCD не выведешь, нужно преобразовывать (тратить ресурсы ЦП)
Это я в курсе... делал даже свои упаковщики экрана для спектрума...

Может такой вариант:
Создать массив размером с область экрана спектрума, НО, с удобной для вывода в 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
Цитата Сообщение от Ymk
преобразование адресов там тривиальное, и делать его надо 1 раз на строку.
Выдрал из своей старой софтины:

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
Цитата Сообщение от Koryim
В этом направлении и буду идти. Только думаю выводить на LCD в прерывании нужно не целый байт а 1 пиксель. (а на вход и выход из прерывания тратится 24 такта?, Я просто с прерываниями на STM еще не работал)
Вот попиксельно не хватит ресурсов, это же 7МГц! 12тактов сохранения регистров при входе и 12 восстановление при выходе, это кажись автоматом происходит.
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
Цитата Сообщение от dykytdroyd
там не просто так такая структура экрана была придумана.
Да, не просто так...
Но связано это только с тем, что размер экрана спектрума - 256 х 192 пикселя... По другому эффективнее такой экран не распределиш...
Вот если бы вертикальное разрешение экрана составляло 256 точек, то однозначно бы развертка шла вертикально (причем равномерно сверху вниз) а не горизонтально...
Так что ничего сверхъестественного в организации экрана спектрума нет.....

Цитата Сообщение от dykytdroyd
И память экономиться и работает быстро.
Ну это опять же актуально только для слабенького Z80...
В симуляторе уже нет таких жестких рамок по размерам ROM и по скорости, так что можно и фантазировать как угодно...

Цитата Сообщение от dykytdroyd
А вот уже буфер перекидать целым кадром программно или через dma.
Проблема в том, что в буфере экрана спектрума байт содержит 8 пикселей... а для управления LCD нужно формировать и передавать инфу для каждого отдельного пикселя, помоему, DMA тут не помощьник...

Вот если бы можно было бы кроме буфера экрана спектрума создать еще буфер соответствующий внутреннему ROM дисплея, и при записи в область экрана спектрума, одновременно модифицировать данные в буфере LCD дисплея, а потом с помощью DMA скидывать весь буфер в дисплей....
Но наверное буфер дисплея получится большим, и тут даже ARM окажется маленьким...
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
24.10.2013, 14:52
Цитата Сообщение от ShodS
Вот если бы можно было бы кроме буфера экрана спектрума создать еще буфер соответствующий внутреннему ROM дисплея, и при записи в область экрана спектрума, одновременно модифицировать данные в буфере LCD дисплея, а потом с помощью DMA скидывать весь буфер в дисплей....
Но наверное буфер дисплея получится большим, и тут даже ARM окажется маленьким...
Если перевести LCD контроллер в режим 8-мибитного цвета (легко), то размер фреймбуфера будет 256*192=48 Кбайт. То есть STM32 из категории high-density и выше подойдут по объёму SROM. Сабжевый F4xx - само собой подойдёт.
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
24.10.2013, 15:16
Цитата Сообщение от ShodS
Цитата Сообщение от dykytdroyd
там не просто так такая структура экрана была придумана.
Да, не просто так...
Но связано это только с тем, что размер экрана спектрума - 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
Цитата Сообщение от Koryim
А на тот сайт я пробивался пробивался да и забросил это дело.
В личку мне стукнитесь, сделаем аккаунт на zx.pk.ru.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
24.10.2013, 16:56
Цитата Сообщение от Ymk
пререндер одной строки растра (т.е. каждой следующей) не поможет с памятью? тогда и времянки и мультиколоры могут заработать искаропки. пока дма шлет отрисованную строку целиком, эмулится и рисуется следующая.
Кста..... это идея.....

Не обязательно за раз весь экран пихать... достаточно подготавливать какую то его часть и вот ее с помощью 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
Цитата Сообщение от ShodS
Не обязательно за раз весь экран пихать... достаточно подготавливать какую то его часть и вот ее с помощью DMA уже передавать LCD дисплею...
Я пока не въезжаю где выгода, этот буфер нужно тоже весь рассчитать сначала, может я что не так понял?

Цитата Сообщение от Ymk
если захочется точной эмуляции времянок (и бордюра) - математика будет уже другая. там 312 или 320 строк растра в зависимости от модели.
А есть где нибудь картинка с таймингами вывода на экран? сколько бордюр, сколько экран...

Настроил TIM6 на прерывания 50 Гц. Посылаю их в эмулятор. Выпилил клавиатуру, буду лудить и паять.

0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
24.10.2013, 23:37
Цитата Сообщение от Ymk
если захочется точной эмуляции времянок (и бордюра) - математика будет уже другая. там 312 или 320 строк растра в зависимости от модели.
Кстсти таким способом (ожидание прерывания, подготовка буфера, вывод через DMA) и бордюр не проблема съэмулировать..... но только слева и справа от рабочей области экрана... а вот сверху и снизу... надо покумекать.....
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
24.10.2013, 23:54
Цитата Сообщение от Koryim
Цитата Сообщение от ShodS
Не обязательно за раз весь экран пихать... достаточно подготавливать какую то его часть и вот ее с помощью DMA уже передавать LCD дисплею...
Я пока не въезжаю где выгода, этот буфер нужно тоже весь рассчитать сначала, может я что не так понял?Выгода очевидна...

Представь что у нас игра которая активно работает с областью экрана... В твоем случае ARM просто захлебнется в единичных вычисленияч каждого обращения к области экрана, потом загрузки указателя в дисплей и вывода в него нужных 8 байт данных.....

В моем случае - да, нужно тратится сначала на рассчет буфера... но это происходит так сказать - оптом.....
В принципе это та же работа которую контроллер проводит и в твоем случае, только выполненная более эффективно...
Тем более отпадает нужда каждый раз инициировать внутренний указатель ROM дисплея (это происходит всего 1 раз в начале вывода буфера), а так же отпадает нужда вручную грузить данные в дисплей, т .к. в моем случае (данные идут подряд) это можно возложить на DMA.....

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

Мой вариант будет грузить контроллер с одинаковой силой независимо от того что происходит в видеопамят спектрума...
Как результат можно точно просчитать скорость эмуляции, т.к. всегда известно какой процент ресурсов занимает отработка экрана.....

Ну как... есть выгода?.....

Ща попробую накидать процедурку обработки буфера дисплея в прерывании...
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
24.10.2013, 23:58
Цитата Сообщение от Koryim
А есть где нибудь картинка с таймингами вывода на экран? сколько бордюр, сколько экран...
http://sblive.narod.ru/ZX-Spectrum/Pent ... on128k.htm
http://www.worldofspistrum.org/rusfaq/
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
25.10.2013, 03:41
В общем как то так надо обрабатывать данные экрана.
Прерывание должно вызыватся с частотой 1200 Гц.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
ISR (tra-lya-lya)                        //не знаю как это наз-ся в ARM, ну в обчем это прерывание с частотой 1200 Гц
{
static uint8_t LCD_ssr_buf [2048];         //буфер для вывода порции байтовых данных в LCD
static uint16_t cicle_num;               //счетчик проходов. весь экран передается за 24 прохода
 
//указатель на область экрана спектрума
uint8_t* p_ssr_pixel_ROM = ssr_pixel_ROM + ((cicle_num & 0x07) * 32) + (((cicle_num & 0x18) >> 3) * 2048);
uint8_t* p_ssr_atr_ROM = ssr_atr_ROM + (cicle_num * 32);   //указатель на область атрибутов экрана спектрума
uint8_t* p_LCD_ssr_buf = LCD_ssr_buf;                  //указатель на буфер для вывода в LCD дисплей
 
for (uint8_t line =0; i<8; i++)                        //8шт. количество обрабатываемых линий по 32 байта каждая
{
for (uint8_t bytes =0; bytes<32; bytes++)            //32шт. количество байт в линии
{
uint8_t byte = *(p_ssr_pixel_ROM + bytes);         //извлекаем байт из области экрана
uint8_t attr = *(p_ssr_atr_ROM + bytes);         //его атрибуты
uint8_t attr_ink = attr & 0x07;                  //атрибуты чернила
uint8_t attr_paper = (attr & 0x38) >> 3;         //атрибуты буниги
 
for (uint8_t pixels =0; pixels<8; pixels++)         //8шт. количество пикселей LCD дисплея на один байт экрана спектрума
{
if (byte & 0x80)                         //если пиксель - единица -
*p_LCD_ssr_buf++ = attr_ink;            //пишем в буфер LCD данные INK
else                                  //если пиксель - ноль -
*p_LCD_ssr_buf++ = attr_paper;            //пишем в буфер LCD данные PAPER
byte <<= 1;                              //опрашиваем по очереди все 8 бит байта
}
}
p_ssr_pixel_ROM += 256;               //следующая линия экрана спектрума имеет адрес на 256 больший предыдущей
}
 
//тут нужно установить курсор дисплея в нужную 1\24-ю часть экрана (вычисляем на основе переменной cicle_num (ее значение 0-23))
 
//ну а тут нужно как то (без понятия, как) заставить ARM, передать в LCD, посредством DMA, 2048 байт буфера LCD_ssr_buf[].
 
if (++cicle_num == 24)                  //инкремент номера прохода
cicle_num = 0;
}
Вот в принципе и вся обработка экрана..... за 24 вызова этой функции - весь LCD обновится в соответствии с видеоданными спектрума. И памяти дополнительной - скушали мало, всего 2048 байт, для буфера LCD...

Вопрос только в том, может ли LCD обновлять область 256 х 192 пикселей, с частотой 50гц ?????
И успеет ли ARM за 0,8 мс, отработать и это прерывание, и еще проэмулировать ту работу, которую z80 выполняет за 0,8 мс ?????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2013, 03:41

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
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) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru