1 / 1 / 0
Регистрация: 18.10.2013
Сообщений: 92

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

21.10.2013, 20:38. Показов 253366. Ответов 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
Закрытая тема Создать тему
Опции темы

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