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

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

21.10.2013, 20:38. Показов 253403. Ответов 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
25.10.2013, 04:44
Студворк — интернет-сервис помощи студентам
но мультиколоры в пролете...
0
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 214
25.10.2013, 07:49
Вот весьма интересный исходник, для pocketpc, с учетом ограниченных ресурсов хоста
http://pocketspeccy.narod.ru/
Так же простой кроссплатформенный http://fuse-emulator.sourceforge.net/
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
25.10.2013, 08:14
Доброго времени суток всем!
Парни, помогите новичку!
Пытаюсь скомпилировать FriiRTOS под кокосов, выдает следующее

Code
1
2
3
4
5
6
7
  [cc] G:\TMP\cciDWXmt.s: Assembler messages:
[cc] G:\TMP\cciDWXmt.s:409: Error: selected processor does not support Thumb mode `vstmdbeq r0!,{s16-s31}
[cc] G:\TMP\cciDWXmt.s:411: Error: instruction not allowed in IT btock -- `stmdb r0!,{r4-r11,r14}
[cc] G:\TMP\cciDWXmt.s:430: Error: selected processor does not support Thumb mode `vldmyoeq r0!,{s16-s31}
[cc] G:\TMP\cciDWXmt.s:432: Error: instruction not allowed in IT btock -- `msr psp,r0
 
BUILD FAILED
Пример скачал с этого ресурса.
http://forum.iosyitistromyss.r... 35&t=11105
Уже пробовал и свежий компилятор 4.7 - не помогло.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
25.10.2013, 12:39
Цитата Сообщение от Ymk
но мультиколоры в пролете...
Почему?.....
Что имеете ввиду под мультиколорами?

Цвет чернил и цвет буниги обрабатывается... не задействовал только биты атрибутов BRIGHT и FLASH... но и это элементарно включить...
Бордюр тоже пока не обрабатывается, для его реализации нужно увеличить LCD буфер с 2048 байт до 2560 байт. Если ARM обработает то что есть сейчас, то тады можно подумать и о бордюре...

Просто пока интересно насчет концепции, реалистичная она... или нет...
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
25.10.2013, 12:54
Цитата Сообщение от ShodS
В общем как то так надо обрабатывать данные экрана.
Прерывание должно вызываться с частотой 1200 Гц.....
Вопрос только в том, может ли LCD обновлять область 256 х 192 пикселей, с частотой 50гц ?????
И успеет ли ARM за 0,8 мс, отработать и это прерывание, и еще проэмулировать ту работу, которую z80 выполняет за 0,8 мс ?????
Есть такая бредовая идея: создаем массив - u16 [256][128][8], в него поместим 8 значений цвета точек в зависимости от атрибута и байта пикселей, эти 8 точек будем передавать с помощью DMA. Плюс-ничего не нужно считать, просто выводить. Минус - 500 Кб минус.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
25.10.2013, 13:21
Цитата Сообщение от ShodS
Цитата Сообщение от Ymk
но мультиколоры в пролете...
Почему?.....
Что имеете ввиду под мультиколорами?

Я так понимаю мультиколор это замена атрибута цвета пока луч идет по экрану (получиться что соседние пиксели в строках будут иметь разные атрибуты), какова реальная скорость обновления всего экрана в спектруме? думаю самое быстрое 1 МГц на байт.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
25.10.2013, 13:47
Цитата Сообщение от Koryim
Я так понимаю мультиколор это замена атрибута цвета пока луч идет по экрану (получиться что соседние пиксели в строках будут иметь разные атрибуты)
Не ну... для 100% попадания... надо собирать железный спектрум.....
Тут и бордюр.. неотразимый, и мафончик надо поискать под это дело... и кассеты раздобыть.. МК60... (для полного погружения в 1980-е) и буде вам 100%-ное щастье...
А со всякими эмуляторами, такие мелочи не светят... тут хотябы грубо попасть в колею.....
0
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 214
25.10.2013, 13:51
Я же пишу, частота обновлений пикселов 7Мгц, когда идет время брдюров, то цвет из 7 возможных берется с порта при выводе каждого пикселя. Сделать это не реально, по этому обычно идут на упрощение, например вывод идет по 8 точек как и предлагал.
Вывод через буфер построчно через DMA тоже вариант, но мультиколоры и бордюрные эффекты исказятся.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
25.10.2013, 16:38
Цитата Сообщение от Koryim
Я так понимаю мультиколор это замена атрибута цвета пока луч идет по экрану
именно.
Цитата Сообщение от Koryim
какова реальная скорость обновления всего экрана в спектруме? думаю самое быстрое 1 МГц на байт.
а это даже не важно, мне кажется. но самая быстрая запись в память - через стек: push hl, а это 11 или 12 тактов на 2 байта.
Цитата Сообщение от ShodS
А со всякими эмуляторами, такие мелочи не светят... тут хотябы грубо попасть в колею.....
на пк, да и не только, эмуляторы давным давно эмулят всё что угодно.

можно попробовать эмулить в цикле по одной строке (а это обычно 224 такта), при этом сделать буфер событий, куда будут попадать евенты смены цвета бордюра (с номером такта относительно начала строки), смены графики... когда 224 такта отшагали, рендерим строку. т.о., графика будет именно такая, какая она была бы на мониторе. но ясное дело, тут нужны будут подстройки, но софта для этого - вагоны.
Цитата Сообщение от moksir
Я же пишу, частота обновлений пикселов 7Мгц, когда идет время брдюров, то цвет из 7 возможных берется с порта при выводе каждого пикселя.
8 цветов:) причем, для каждого пикселя оно только на определенных моделях, есть где по "знакоместам". а экран - только по знакоместам.
Цитата Сообщение от moksir
Сделать это не реально
зависит от подхода.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 2,309
25.10.2013, 17:12
Прикольно :-) Но на ПЛИС уже все давно сделано... правда вывод на VGA монитор или бытовой телек, а не на LCD.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
25.10.2013, 17:59
Цитата Сообщение от VyvotzorD
Прикольно :-) Но на ПЛИС уже все давно сделано... правда вывод на VGA монитор или бытовой телек, а не на LCD.
Если TFT-контроллер включить в режиме raw RGB, то большой разницы с VGA или TV не будет. Только буфер нужен будет внешний (не в дисплейном чипе).
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
26.10.2013, 19:02
Цитата Сообщение от moksir
Я же пишу, частота обновлений пикселов 7Мгц, когда идет время брдюров, то цвет из 7 возможных берется с порта при выводе каждого пикселя. Сделать это не реально, по этому обычно идут на упрощение, например вывод идет по 8 точек как и предлагал.
Вывод через буфер построчно через DMA тоже вариант, но мультиколоры и бордюрные эффекты исказятся.
В общем, создал трехмерный массив. Пробую обновлять только экран без бордюра. При таком раскладе частота обновления 153 гц!!! Буду разбираться с DMA чтобы высвободить больше свободного времени. Процедура обновления экрана выглядит вот так:
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
//Вывод всех пикселей
void LCD_Out_Ott_Picsel(void)
{   u8 picsel;
u8 atribut;
u8 bitcount;
u16 boytROM;
 
LCD_SetCursor(0x20, 0x18);
LCD_WriteROM_Prepare();
 
for (boytROM=0x0; boytROM<0x1800; boytROM++)
{
 
picsel=ssr_picsel_ROM[(boytROM&0x1800)|((boytROM&0xE0)<<3)|((boytROM&0x700)>>3)|(boytROM&0x1F)];//удаляем особенности вывода строк
atribut=ssr_atr_ROM[((boytROM&0x1F00)>>3)|(boytROM&0x1F)];//перевод адреса пикселей в адрес атрибутов
 
bitcount=0;
do
{
LCD_WriteROM(COLOR[picsel][atribut][bitcount]);
bitcount++;
}while (bitcount!=8);
}
}
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
26.10.2013, 20:49
Цитата Сообщение от Koryim
picsel, atribut, boytROM
Не по коду:
тут уже говорили, что орфографию стоило бы поправить.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
26.10.2013, 21:42
Цитата Сообщение от OtyxPM
Цитата Сообщение от Koryim
picsel, atribut, boytROM
Не по коду:
тут уже говорили, что орфографию стоило бы поправить.

picse = byte_ssreen_memory
atribut = byte_colour_memory
boytROM = byte_ROM

так понятней будет?
PS добавил Ftosh.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
26.10.2013, 22:19
Цитата Сообщение от Koryim
picse = byte_ssreen_memory
atribut = byte_colour_memory
boytROM = byte_ROM

так понятней будет?
Имелась в виду только орфография, слова-то можно оставить как есть :-)
pixel, attribute, byteROM
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
26.10.2013, 23:37
Цитата Сообщение от OtyxPM
Цитата Сообщение от Koryim
picse = byte_ssreen_memory
atribut = byte_colour_memory
boytROM = byte_ROM

так понятней будет?
Имелась в виду только орфография, слова-то можно оставить как есть :-)
pixel, attribute, byteROM

Ну там все не получится оставить, т.к. часть это зарезервированные слова в С.
Но поправить надо.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
27.10.2013, 21:15
Есть вопрос по DMA. Чтобы слать серию из 8 16-ти битных слов на LCD нужно организовать передачу память-память? (к LCD мы то обращаемся как к памяти).
Может у кого есть подробное описание настройки DMA?, только без SPL.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
30.10.2013, 19:10
Глупый вопрос, как объявить переменную, чтоб можно было иметь к ней доступ из всех *.с файлов проекта?

Разобрался с DMA.

Code
1
2
3
4
5
6
7
8
9
10
RCC->AHB1ENR|=RCC_AHB1ENR_DMA2EN;//разрешаем тактирование, только DMA2 может пересылать данные память-память
DMA2_Stream0->CR=0x00000000;//после сброса процессора в регистре конфигурации пусто, для надежности еще раз сбросим
DMA2_Stream0->CR|=DMA_SxCR_MSIZE_0;//размерность куда будем слать 16 бит
DMA2_Stream0->CR|=DMA_SxCR_PSIZE_0;//размерность откуда будем слать 16 бит
DMA2_Stream0->CR|=DMA_SxCR_PINC;//увеличиваем указатель "откуда"
DMA2_Stream0->CR|=DMA_SxCR_DIR_1;//пересылаем memory-to-memory
DMA2_Stream0->NDTR=0x0008;//сколько раз пересылаем
DMA2_Stream0->POR=(u32)&source[0];//указатель на начало буфера "откуда"
DMA2_Stream0->M0AR=(u32)&destination;//указатель на буфер "куда" (в нашем случае на адресное пространство FSMC к которому подключен LCD)
DMA2_Stream0->CR|=DMA_SxCR_EN;//пересылаем
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
30.10.2013, 19:30
Цитата Сообщение от Koryim
Глупый вопрос, как объявить переменную, чтоб можно было иметь к ней доступ из всех *.с файлов проекта?
поместите объявление этой переменной со словом extern в любом глобальном хедере - таком, чтобы инклюдился всеми *.c-файлами, которым надо обращаться к этой переменной.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
31.10.2013, 10:46
создал test.h, в нем объявил переменную:- extern int i;, в *.с написал: #include "test.h". Затем пытаюсь изменить i++;, компилирую выдает .\empty_project.axf: Error: L6218E: Undefined symbol i. Пробую в одном из *.с файлов добавить int i; ошибка исчезает. Что я делаю не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2013, 10:46

Игры на 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 Схема,...


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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