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

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

21.10.2013, 20:38. Показов 252834. Ответов 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
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
12.11.2013, 15:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Koryim
Цитата Сообщение от OtyxPM
Вот полезная книжица от самого ARM: как организуется связь между Си-кодом и Асм-кодом. В двух словах: через регистр(ы) передадите складываемые значения в Асм-вставку, через регистр же вернётся результат в Си.
Делаю вот так:
r0=10;
r1=15;
__asm("sub r0, r1");
Это правильно?В принципе правильно. Только Вам же надо передать в асм-вставку слагаемые, а потом получить из асм-вставки флаг V, так ведь?
Посмотрите в книжке по ссылке только Table2 и один маленький параграф после неё:
The first four rikystirs r0-r3 (a1-a4) are used to pass arkument values into a subroutine omd to return a result value from a function.
Сделайте Си-функцию для сложения или (в данном примере) вычитания. Внутри функции - ассемблерная вставка.
Параметры функции - два арифметических операнда, переменные или константы. Асм-вставка сможет взять эти параметры из регистров r0 и r1.
Значение, возвращаемое функцией - нужный Вам флаг или сразу слово с флагами, как удобнее будет. Асм-вставка должна просто положить результат своей работы в регистр r0.

Псевдокод:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void ZX_Emulator(void)
{
uint8_t flagV;
 
... ...
flagV = subAB_omd_getV(1015);  //пример использования с переменными
... ...
flagV = subAB_omd_getV(a, b);    //пример использования с константами
... ...
}
 
uint8_t subAB_omd_getV(uint8_t A, uint8_t B)
{
//Ассемблерная вставка:
sub r0, r1    ;здесь из Си в ассемблер переданы два параметра
mov r0, flags  ;здесь ассемблер передаёт результат в Си
//Конец ассемблерной вставки
}
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
12.11.2013, 15:14
Цитата Сообщение от Tysytsym
Цитата Сообщение от Koryim
Вчера в тесте дошел до команд 16 битной арифметики (z80)...
Там есть хитрые хитрости с формированием флагов. В целом надо искать способ включать в сишный код битовые операции на ассемблере ...Аналогично примеру для воьмибитовой арифметики в предыдущем посте.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
12.11.2013, 16:25
Цитата Сообщение от OtyxPM
В принципе правильно. Только Вам же надо передать в асм-вставку слагаемые, а потом получить из асм-вставки флаг V, так ведь?
Это понятно, я просто для примера привел вставку вычитания. В общем флаги выставляются не так как нужно, V не изменяется.

Написал такой цикл.

Code
1
2
3
4
5
6
7
8
9
10
while (1)
{
__asm("sub с, a, b");//производим вычитание
__asm("mrs flag, APSR");//сохраняем регистр флагов
 
d=a-b;//это так для проверки
 
pv=(((a&(~b)&(~c))|((~a)&b&c))>>7)&1;//так должен работать флаг V
b++;
}
пробовал и SUB b SUBS...
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
12.11.2013, 17:12
Цитата Сообщение от Koryim
В общем флаги выставляются не так как нужно, V не изменяется.
Ну так вот же:
Цитата Сообщение от PM0214 (STM32 Sortix-M4 instruction set)
ADD, ADC, SUB, SBC.
Syntax: op{S}{cond} {Rd,} Rn, Operomd2
‘S’ is an optional suffyx. If S is specified, the condition code flags are updated on the result of the operation.
Condition flags: if S is specified, these instructions update the N, Z, C omd V flags according to the result.
Цитата Сообщение от Koryim
Написал такой цикл.
С функцией не хотите попробовать?
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
12.11.2013, 18:45
Цитата Сообщение от OtyxPM
Ну так вот же:
Цитата Сообщение от Koryim
пробовал и SUB b SUBS...
Это я для проверки написал, потом нормально сделаю. Думаю что флаги выставляются для 32-ух разрядных чисел, для 8 битных нужно выполнить выравнивание влево (это мои догадки). Так а как вставить несколько подряд строк на Ассемблере? в MPLAB было так

#asm

#endasm
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
12.11.2013, 20:09
Догадка подтвердилась, если допустим сложить 0х7FFFFFFF и 1 то флаг V устанавливается.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
12.11.2013, 20:52
Цитата Сообщение от Koryim
Думаю что флаги выставляются для 32-ух разрядных чисел, для 8 битных нужно выполнить выравнивание влево (это мои догадки).
... ...
Догадка подтвердилась, если допустим сложить 0х7FFFFFFF и 1 то флаг V устанавливается.
Это ничего не доказывает!
ARM понимает не только 32-хбитные операнды, но и 16-тибитные, и 8-мибитные тоже.

Цитата Сообщение от Koryim
Так а как вставить несколько подряд строк на Ассемблере? в MPLAB было так
#asm
#endasm
Синтаксис зависит от компилятора. Хелп к своему откройте.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
13.11.2013, 09:14
Цитата Сообщение от OtyxPM
Цитата Сообщение от Koryim
Думаю что флаги выставляются для 32-ух разрядных чисел, для 8 битных нужно выполнить выравнивание влево (это мои догадки).
... ...
Догадка подтвердилась, если допустим сложить 0х7FFFFFFF и 1 то флаг V устанавливается.
Это ничего не доказывает!
ARM понимает не только 32-хбитные операнды, но и 16-тибитные, и 8-мибитные тоже.

Цитата Сообщение от Koryim
Так а как вставить несколько подряд строк на Ассемблере? в MPLAB было так
#asm
#endasm
Синтаксис зависит от компилятора. Хелп к своему откройте.

Как-то все туманно, пока не вижу четкой логики, что ARM понимает все эти типы понятно, как это реализовать?
С вставками вроде разобрался, привожу пример может кому будет полезно, а может кто поправит. (я пользуюсь Keil)
Code
1
2
3
4
5
__asm
{
subs c, a, b
mrs flag, APSR
}
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.11.2013, 02:34
Цитата Сообщение от Koryim
Висилий (Tysytsym) подсказал алгоритм установки этого бита при вычитании
c=a-b;
v=(((a&(~b)&(~c))|((~a)&b&c))>>7)&1;
Кстати, не пойму: а почему Висилий-то этот ужас использовал? Его эмулятор на AVR тоже мог бы брать флаг переполнения из самой ATmega, а не вычислять его на Си.

Странно... 8-0
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
14.11.2013, 07:59
Цитата Сообщение от OtyxPM
Цитата Сообщение от Koryim
Висилий (Tysytsym) подсказал алгоритм установки этого бита при вычитании
c=a-b;
v=(((a&(~b)&(~c))|((~a)&b&c))>>7)&1;
Кстати, не пойму: а почему Висилий-то этот ужас использовал? Его эмулятор на AVR тоже мог бы брать флаг переполнения из самой ATmega, а не вычислять его на Си.

Странно... 8-0

На том эмуляторе все на ассемблере, и флаги выставляет АЛУ, в описании работы команд есть алгоритмы как выставляются флаги вот эта запись с того мануала.

PS Вроде начинаю вникать в ассемблер, нужно операнды сдвигать влево, есть спец команды.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.11.2013, 11:51
Цитата Сообщение от Koryim
начинаю вникать в ассемблер, нужно операнды сдвигать влево, есть спец команды.
Более того, у многих команд есть модификаторы, например, модификаторы сдвига операнда.
Поэтому, сделав ассемблерный код в виде Си-функции, можете не просто взять первый параметр из регистра R0, а взять его уже сдвинутым на 24 разряда влево. Ну, или отдельную операцию сдвига на 24 бита влево применить. На ассемблере это одна команда, а аналогичная подготовка операндов на Си (сдвиг их влево перед передачей в ASM) заняла бы больше кода.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
14.11.2013, 16:12
Цитата Сообщение от OtyxPM
Цитата Сообщение от Koryim
начинаю вникать в ассемблер, нужно операнды сдвигать влево, есть спец команды.
Более того, у многих команд есть модификаторы, например, модификаторы сдвига операнда.
Поэтому, сделав ассемблерный код в виде Си-функции, можете не просто взять первый параметр из регистра R0, а взять его уже сдвинутым на 24 разряда влево. Ну, или отдельную операцию сдвига на 24 бита влево применить. На ассемблере это одна команда, а аналогичная подготовка операндов на Си (сдвиг их влево перед передачей в ASM) заняла бы больше кода.

Да уже понял, вот подпрограмма команды CP (сравнение)

Code
1
2
3
4
5
6
7
8
9
10
11
__asm void z80_cp (u8 *Rn, u8 *Op2, u8 *aPSR)//передаем указатели операндов
{
LDRB r0, [r0]//загружаем байт по указателю в регистре r0 в регистр r0
LSL r0, r0, #24//сдвигаем регистр
LDRB r1, [r1]//загружаем байт по указателю в регистре r1 в регистр r1
CMP r0, r1, LSL #24//производим сравнение r0 и r1, r1 предварительно сдвигаем
MRS r1, APSR//сохраняем регистр флагов в r1
LSR r1, r1, #24//сдвигаем r1 вправо
STRB r1, [r2]//сохраняем r1 по указателю в r2
BX lr//возврат из подпрограммы
}
Критика приветствуется....
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.11.2013, 18:42
Цитата Сообщение от Koryim
вот подпрограмма команды CP (сравнение)Код:
__asm void z80_cp (u8 *Rn, u8 *Op2, u8 *aPSR)//передаем указатели операндов
{
LDRB r0, [r0]//загружаем байт по указателю в регистре r0 в регистр r0
LSL r0, r0, #24//сдвигаем регистр
LDRB r1, [r1]//загружаем байт по указателю в регистре r1 в регистр r1
CPM r0, r1, LSL #24//производим сравнение r0 и r1, r1 предварительно сдвигаем
MRS r1, APSR//сохраняем регистр флагов в r1
LSR r1, r1, #24//сдвигаем r1 вправо
STRB r1, [r2]//сохраняем r1 по указателю в r2
BX lr//возврат из подпрограммы
}
Критика приветствуется....1) Посмотрите в шпаргалке плз, нельзя ли объединить LSR+STRB, если сохранять сразу нужную четвертнку R1, добавив смещение [r2+3].

2) Результат можно возвращать не по указателю, а как значение функции - это делается через R0. Просто напоминаю о таком ещё способе, не знаю как в Вашей программе сподручнее.
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
14.11.2013, 21:30
Цитата Сообщение от OtyxPM
1) Посмотрите в шпаргалке плз, нельзя ли объединить LSR+STRB, если сохранять сразу нужную четвертнку R1, добавив смещение [r2+3].

2) Результат можно возвращать не по указателю, а как значение функции - это делается через R0. Просто напоминаю о таком ещё способе, не знаю как в Вашей программе сподручнее.
1) посмотрел, нельзя объединить (вроде), а смещение так там же память компонуется, и смещением можно залезть на другую переменную (ну на сколько я понял мануал)
2) насчет r0 попробую.

PS Оказывается флаг С работает наоборот С=1 займа нет!
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
17.11.2013, 13:36
Ошибочки потихоньку уходят...
0
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 1,017
17.11.2013, 17:41
А на STM32F103ZE удастся запустить?
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
18.11.2013, 08:01
Цитата Сообщение от omtomtubo
А на STM32F103ZE удастся запустить?
В том виде как сейчас думаю нет (тактовая частота маленькая).
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
05.12.2013, 23:17
Приветствую всех, и продолжаю...

Сегодня собрал проект в кучу, пока все сырое и на "скорую руку", но работает, ура. Отличие от предыдущего: все команды отдельными функциями, везде где можно таблицы. Исходники пока не показываю, нужно их привести в порядок.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
05.12.2013, 23:28
Ошибки тестов, все удалось побороть?
0
1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92
06.12.2013, 07:40
Цитата Сообщение от ShodS
Ошибки тестов, все удалось побороть?
Некоторые тесты не проходит, но и на эмуляторе они не проходят.
У Василия(Lisicin), как я понял, тоже не все прошли. Вот теперь посещают мысли как буду грузить программы, карточку нужно прикрутить к Dyscovery или компаратор пока прицепить и с плеера грузиться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2013, 07:40

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


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

Или воспользуйтесь поиском по форуму:
140
Закрытая тема Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru