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

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

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

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

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

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

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

Эмулятор шахматных часов
задача стоит такая, если кто знает как делать, помогите,у меня что то совсем ничего не получается....

Свой эмулятор для Windows
Очень интересует вопрос: Можно ли сделать в билдере свой эмулятор со своим аниммированным...

8
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
07.02.2014, 18:52 2
Цитата Сообщение от HarryPhomin Посмотреть сообщение
отлавливается нажатие клавиши
Обработка нажатия клавиши - это задача программы, а не эмулятора (если только это не специальная отладочная комбинация).

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

Эмуляция
Как написать эмулятор компьютера
Пишем эмулятор Gameboy, часть 1
эмулятор
Intel 8080 CPU Emulator
Software x86 CPU emulator library
1
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/cp... s-sync.php здесь прочитал еще днем про нити и потоки, может это то что мне нужно?....
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
07.02.2014, 19:57 4
Ну, если у вас многопоточное приложение и ваш эмулятор поддерживает одновременное исполнение нескольких потоков, то цикл проверки ввода с клавиатуры вы можете вынести в отдельный поток и обрабатывать асинхронно (со всеми "прелестями" синхронизации). Не уверен, что вам это нужно, если только задачей не является именно изучение примитивов синхронизации.
0
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
07.02.2014, 20:35  [ТС] 5
Цитата Сообщение от gazlan Посмотреть сообщение
Ну, если у вас многопоточное приложение и ваш эмулятор поддерживает одновременное исполнение нескольких потоков, то цикл проверки ввода с клавиатуры вы можете вынести в отдельный поток и обрабатывать асинхронно (со всеми "прелестями" синхронизации). Не уверен, что вам это нужно, если только задачей не является именно изучение примитивов синхронизации.
А как то проще это реализовать можно?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 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, где он был бы проверен и без этих ухищрений.
1
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 тоесть загрузка всего кода и выполнение сразу и в последующем он существовал и выполнялся на эмуляторе как программа. Т.е. уже в зависимости от описанных в программе на ассемблере действий (и в ней же бесконечный цикл проверки) выполнялось действие на нажатие клавиши или на не нажатие и т.д..
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
08.02.2014, 00:00 8
Лучший ответ Сообщение было отмечено HarryPhomin как решение

Решение

Теперь я мало что понял.

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

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

Напишите на C любой switch, посмотрите ассемблерный листинг и увидите, как компилятор строит таблицу переходов. У вас будет также, только проще. В эташе реальный пример.
Вложения
Тип файла: 7z switch.lst.7z (1.2 Кб, 8 просмотров)
1
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
08.02.2014, 00:28  [ТС] 9
gazlan, Спасибо большое , более менее становится понятно буду пробовать!
0
08.02.2014, 00:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2014, 00:28
Помогаю со студенческими работами здесь

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

Эмулятор светофора
Всех приветствую! Только начал изучать MFC, по этому прошу помощи. Нужно сделать програмку эмулятор...

Нужен эмулятор браузера
Нужен эмулятор браузера, есть где можно такое взять? тоесть нужно чтобы я мог указывать какую...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru