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

C++

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

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

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

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

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

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

Эмулятор SetTimer - C++
Ребята, подскажите, как написать функцию на подобие SetTimer. Дело в том, что используя std::thread, не дожидаясь завершение потока,...

Эмулятор CHIP-8 - C++
Мы с fasked написали простенький эмулятор для платформы CHIP-8. CHIP-8 Остались вопросы по графике и клавиатуре. Если кто знает как...

Эмулятор клавиатуры - C++
Привет. Нужно сделать програму которая при нажатии глобальных клавиш писала какойта текст. Как будто пользователь введёт его с клавиатуры....

Эмулятор мышки - C++
Здравствуйте все. Хотелось бы узнать, как можно на компьютере1 управлять курсором с помощью компьютера2 через USB-вход на компьютере1, так,...

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

Эмулятор Вебки под Seven - C++
Всем привет. Я проект пишу на С++, свой первый, более мене серьезный. Мне нужен эмулятор Веб камеры, но только что бы на Sevene работал......

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
07.02.2014, 18:52     Эмулятор: C + WinAPI #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  [ТС]     Эмулятор: C + WinAPI #3
Я не правильно выразился, в том плане что я как бы умею отлавливать клавиши. К примеру я описал команду для ассемблера keyst, она ловит и записывает в определенный регистр код нажатой клавиши. Но проблема в том что если такой код на ассемблере, запустить на эмуляторе (в том виде в каком он сейчас написан), то он просто 1 раз пройдет последовательно по коду и все. То есть если я сразу после пошагового выполнения команд, после keyst нажму клавишу она отловится. Но после прохода по всему коду. Написанная на моем ассемблере программа не будет как самостоятельный процесс работать. Имею виду чтобы сделать что-то вроде компилятора, который будет компилировать и выполнять код. (очень грубо написано и коряво, от незнания).
P.S. За ссылки спасибо! Прочитаю!
P.P.S. http://www.codenet.ru/progr/cpp/proc...reads-sync.php здесь прочитал еще днем про нити и потоки, может это то что мне нужно?....
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
07.02.2014, 19:57     Эмулятор: C + WinAPI #4
Ну, если у вас многопоточное приложение и ваш эмулятор поддерживает одновременное исполнение нескольких потоков, то цикл проверки ввода с клавиатуры вы можете вынести в отдельный поток и обрабатывать асинхронно (со всеми "прелестями" синхронизации). Не уверен, что вам это нужно, если только задачей не является именно изучение примитивов синхронизации.
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
07.02.2014, 20:35  [ТС]     Эмулятор: C + WinAPI #5
Цитата Сообщение от gazlan Посмотреть сообщение
Ну, если у вас многопоточное приложение и ваш эмулятор поддерживает одновременное исполнение нескольких потоков, то цикл проверки ввода с клавиатуры вы можете вынести в отдельный поток и обрабатывать асинхронно (со всеми "прелестями" синхронизации). Не уверен, что вам это нужно, если только задачей не является именно изучение примитивов синхронизации.
А как то проще это реализовать можно?
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
07.02.2014, 21:15     Эмулятор: C + WinAPI #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  [ТС]     Эмулятор: C + WinAPI #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
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
08.02.2014, 00:00     Эмулятор: C + WinAPI #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Теперь я мало что понял.

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

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

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

Эмулятор локальной сети - C++
Доброго времени суток! Требуется написать на C++ простой эмулятор локальной сети, максимум до 10 хостов. Подскажите куда копать. ...

Эмулятор трёхадресной машины. - C++
В общем, имеется задача "Эмулятор трёхадресной машины". Каждая инструкция имеет следующий формат: код инструкции (1 байт), операнд 1...

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

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

Нужен эмулятор браузера - C++ WinAPI
Нужен эмулятор браузера, есть где можно такое взять? тоесть нужно чтобы я мог указывать какую страницу открывать, где кликать, мог получить...


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

Или воспользуйтесь поиском по форуму:
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
08.02.2014, 00:28  [ТС]     Эмулятор: C + WinAPI #9
gazlan, Спасибо большое , более менее становится понятно буду пробовать!
Yandex
Объявления
08.02.2014, 00:28     Эмулятор: C + WinAPI
Ответ Создать тему
Опции темы

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