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

C++

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

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

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

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

В качестве зачетного задания преподаватель задал написать эмулятор процессора, (ну вначале придумать архитектуру, и написать эмулятор этого). Шаблон он дал, там был примитивный ассемблер, написанный на перле. И на С + WinApi сам эмулятор. С этим все понятно. Так же очень примитивная видео память реализованная битмапом. С написанием всяких функций описанием команд и прочим проблем нет. Препод в качестве последнего главного задания дал написать игру на и запустить на эмуляторе игру естественно писать на ассемблере который сам и должен написать. Допустим я умею в циклике рисовать что-нибудь, но непонятно как организовать работу с клавиатурой. Как бы на эмуляторе не делается исполняемый файл, команды выполняются либо разом либо по одной. (ОБЪЯСНЯЮ ПО КИТАЙСКИ..., ибо по другому не могу). Не знаю как объяснить только если на примере: к примеру читается файл, по порядку числа если 1 - то делается то то, 2- другое и т.д., на 5 к примеру, отлавливается нажатие клавиши если оно есть. и так далее. Программа просто по идее ведь пройдется по файлу выполнит все действия и все. А нужно сделать так чтобы образно говоря после прохождения по файлу, получилось что-то вроде отдельной программы которая работает на эмуляторе, и которая исполняет все те действия. Как-то так... Слышал что-то вроде написания асинхронного синхронизатора... но я плохо представляю как это сделать. Чтобы каждая команда представлялась отдельной программой, а потом их свзать... Как-то так слышал. Подскажите пожалуйста, как можно сделать. Либо скажите что можно почитать. Заранее спасибо.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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++ Эмулятор SetTimer
Нужен эмулятор браузера C++ WinAPI
C++ Builder Эмулятор на C++ Builder
C++ Builder Эмулятор шахматных часов

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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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