Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
#1

Эмулятор: C + WinAPI - C++

07.02.2014, 15:14. Просмотров 1316. Ответов 8
Метки нет (Все метки)

Здравствуйте уважаемые читатели форума! У меня такой вопрос: (СРАЗУ ПРЕДУПРЕЖДАЮ Я НЕ ОЧЕНЬ ХОРОШО РАЗБИРАЮСЬ ПОКА В ЭТОМ ТАК ЧТО ОЧЕНЬ МНОГОЕ ИЗ МОИХ СЛОВ МОЖЕТ БЫТЬ ЖУТКИМ "БЫДЛЯКОМ"....)

В качестве зачетного задания преподаватель задал написать эмулятор процессора, (ну вначале придумать архитектуру, и написать эмулятор этого). Шаблон он дал, там был примитивный ассемблер, написанный на перле. И на С + WinApi сам эмулятор. С этим все понятно. Так же очень примитивная видео память реализованная битмапом. С написанием всяких функций описанием команд и прочим проблем нет. Препод в качестве последнего главного задания дал написать игру на и запустить на эмуляторе игру естественно писать на ассемблере который сам и должен написать. Допустим я умею в циклике рисовать что-нибудь, но непонятно как организовать работу с клавиатурой. Как бы на эмуляторе не делается исполняемый файл, команды выполняются либо разом либо по одной. (ОБЪЯСНЯЮ ПО КИТАЙСКИ..., ибо по другому не могу). Не знаю как объяснить только если на примере: к примеру читается файл, по порядку числа если 1 - то делается то то, 2- другое и т.д., на 5 к примеру, отлавливается нажатие клавиши если оно есть. и так далее. Программа просто по идее ведь пройдется по файлу выполнит все действия и все. А нужно сделать так чтобы образно говоря после прохождения по файлу, получилось что-то вроде отдельной программы которая работает на эмуляторе, и которая исполняет все те действия. Как-то так... Слышал что-то вроде написания асинхронного синхронизатора... но я плохо представляю как это сделать. Чтобы каждая команда представлялась отдельной программой, а потом их свзать... Как-то так слышал. Подскажите пожалуйста, как можно сделать. Либо скажите что можно почитать. Заранее спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2014, 15:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Эмулятор: C + WinAPI (C++):

handle,winapi - C++
Всем привет.Порекомендуйте литературу по Winapi,handle и т.п.

Создание окна без WinAPI - C++
Хотелось узнать, как создавать окна без использования WinAPI.

WinApi C++. Конкатенация рядов символов lstrcat - C++
Доброго времени суток. Возник вопрос в роботе с WinApi в С++. В програме есть момент где нужно получить полный путь к файлу, которий...

Какие еще есть способы создания визуальных приложений кроме WinApi? - C++
Здравствуйте, я так понимаю под Windows оконные приложения создаются на WinAPI. Хотел спросить есть ли другие инструменты для создания окон...

Могут ли мне ответить на support.microsoft.com по поводу WinAPI, если у меня visual studio express? - C++
Спрашивать в других местах - не предлагать. По моей проблеме с WinAPI даже в MSDN нет документации. Значит, по логике, надо спросить у...

Эмулятор на C++ Builder - C++ Builder
Нужно сделать эмулятор языка C++, который консольный, на C++ Builder. Может кто-то может дать хотя бы пример эмулятора на C++ Builder,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
07.02.2014, 18:52 #2
Цитата Сообщение от HarryPhomin Посмотреть сообщение
отлавливается нажатие клавиши
Обработка нажатия клавиши - это задача программы, а не эмулятора (если только это не специальная отладочная комбинация).

Несколько ссылок:

Эмуляция
Как написать эмулятор компьютера
Пишем эмулятор Gameboy, часть 1
эмулятор
Intel 8080 CPU Emulator
Software x86 CPU emulator library
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
07.02.2014, 19:19  [ТС] #3
Я не правильно выразился, в том плане что я как бы умею отлавливать клавиши. К примеру я описал команду для ассемблера keyst, она ловит и записывает в определенный регистр код нажатой клавиши. Но проблема в том что если такой код на ассемблере, запустить на эмуляторе (в том виде в каком он сейчас написан), то он просто 1 раз пройдет последовательно по коду и все. То есть если я сразу после пошагового выполнения команд, после keyst нажму клавишу она отловится. Но после прохода по всему коду. Написанная на моем ассемблере программа не будет как самостоятельный процесс работать. Имею виду чтобы сделать что-то вроде компилятора, который будет компилировать и выполнять код. (очень грубо написано и коряво, от незнания).
P.S. За ссылки спасибо! Прочитаю!
P.P.S. http://www.codenet.ru/progr/cpp/proc...reads-sync.php здесь прочитал еще днем про нити и потоки, может это то что мне нужно?....
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
07.02.2014, 19:57 #4
Ну, если у вас многопоточное приложение и ваш эмулятор поддерживает одновременное исполнение нескольких потоков, то цикл проверки ввода с клавиатуры вы можете вынести в отдельный поток и обрабатывать асинхронно (со всеми "прелестями" синхронизации). Не уверен, что вам это нужно, если только задачей не является именно изучение примитивов синхронизации.
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
07.02.2014, 20:35  [ТС] #5
Цитата Сообщение от gazlan Посмотреть сообщение
Ну, если у вас многопоточное приложение и ваш эмулятор поддерживает одновременное исполнение нескольких потоков, то цикл проверки ввода с клавиатуры вы можете вынести в отдельный поток и обрабатывать асинхронно (со всеми "прелестями" синхронизации). Не уверен, что вам это нужно, если только задачей не является именно изучение примитивов синхронизации.
А как то проще это реализовать можно?
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
07.02.2014, 21:15 #6
Цитата Сообщение от HarryPhomin Посмотреть сообщение
как-то проще
А в чем смысл?

Если поручить перехват интерпретатору, то этот код либо не дойдет до аппликации (будет обработан самим интерпретатором), либо будет передан аппликации как обычно (зачем перехватывали?), либо транслирован в какой-то иной код (но такая задача не ставилась).

Предположим, вся аппликация состоит из двух блоков: A - DoSmth & B - CheckKeyPress. Интерпретатор выполняет их в бесконечном цикле:

C++
1
2
3
4
5
while (!bExit)
{
   Execute(A);
   Execute(B);
}
Пока вы находитесь в A, для аппликации нет никакого способа получить и обработать нажатие клавиши, это задача B.

Интерпретатор может получить код клавиши и сохранить его, например, в глобальной переменной и выставить флажок KeyPressed, но, тогда, вы либо проверяете его в A и B теряет смысл, либо проверяете его в B, где он был бы проверен и без этих ухищрений.
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
07.02.2014, 22:42  [ТС] #7
Я честно не все понял.. (надо будет больше читать). Как примерно написан эмулятор. На перле написан ассемблер, из asm файла он кодирует команды и операнды опкодами. И записывает в bin файл. В программе на Си для каждой команды есть функция обработчик. Дальше программа запускает bin файл, и по команде выполняет.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pen:
print 555, 1
print 777, 1
print 999, 1
 
srand 100
srand 200
mov r2, 40
srand r2
print r0, 2
print r0, 1
print r0, 3
keyst
mov r10, 10
mov r11, 20
sub r10,r11
cmp r28, 0
jne pen
Вот к примеру, код на моем асме. keyst, выставляет флаг в глобальной переменной, и в случае нажатия клавиши, в регистре r28 возвращается код этой клавиши. Регистр этот проверяется с нулем. (для примера взял 0 что не нажата никакая клавиша и идет просто выход из цикла и другие действия). Дак вот если по командно выполнять, то если я после keyst нажму клавишу все отлично ловится и работает. А нужно чтобы выполнилось run тоесть загрузка всего кода и выполнение сразу и в последующем он существовал и выполнялся на эмуляторе как программа. Т.е. уже в зависимости от описанных в программе на ассемблере действий (и в ней же бесконечный цикл проверки) выполнялось действие на нажатие клавиши или на не нажатие и т.д..
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
08.02.2014, 00:00 #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Теперь я мало что понял.

Вложите весь этот ваш код в бесконечный цикл и нажимайте сколько угодно.

Все, что требуется, это вместо jne сделать полноценный switch с переходами на нужные метки в зависимости от значения в регистре r28. То есть, какая клавиша была нажата (код клавиши --> в r28, а не 0/1), на такую метку и переходим. Если неизвестный код - ошибка.

Напишите на C любой switch, посмотрите ассемблерный листинг и увидите, как компилятор строит таблицу переходов. У вас будет также, только проще. В эташе реальный пример.
Вложения
Тип файла: 7z switch.lst.7z (1.2 Кб, 6 просмотров)
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
08.02.2014, 00:28  [ТС] #9
gazlan, Спасибо большое , более менее становится понятно буду пробовать!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2014, 00:28
Привет! Вот еще темы с ответами:

Эмулятор шахматных часов - C++ Builder
задача стоит такая, если кто знает как делать, помогите,у меня что то совсем ничего не получается. Разработать приложение, которое...

Эмулятор работы C++ Builder - C++ Builder
Подскажите пожалуйста идею как можно сделать эмулятор работы С++ Builder. Не обязательно чтоб работал компилировал и т д. просто эмулятор...

Свой эмулятор для Windows - C++ Builder
Очень интересует вопрос: Можно ли сделать в билдере свой эмулятор со своим аниммированным интерфейсом? предполагается, чтобы в программе...

Как создать эмулятор ps1 - C++ Builder
Как создать эмулятор ps1!Мой младший брат хочет чтобы я создал эмулятор игровой консоли PSone! Мы с ним поспорили! Он утверждает что я не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.02.2014, 00:28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru