1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
|
|
1 | |
Эмулятор: C + WinAPI07.02.2014, 15:14. Показов 2937. Ответов 8
Метки нет (Все метки)
Здравствуйте уважаемые читатели форума! У меня такой вопрос: (СРАЗУ ПРЕДУПРЕЖДАЮ Я НЕ ОЧЕНЬ ХОРОШО РАЗБИРАЮСЬ ПОКА В ЭТОМ ТАК ЧТО ОЧЕНЬ МНОГОЕ ИЗ МОИХ СЛОВ МОЖЕТ БЫТЬ ЖУТКИМ "БЫДЛЯКОМ"....)
В качестве зачетного задания преподаватель задал написать эмулятор процессора, (ну вначале придумать архитектуру, и написать эмулятор этого). Шаблон он дал, там был примитивный ассемблер, написанный на перле. И на С + WinApi сам эмулятор. С этим все понятно. Так же очень примитивная видео память реализованная битмапом. С написанием всяких функций описанием команд и прочим проблем нет. Препод в качестве последнего главного задания дал написать игру на и запустить на эмуляторе игру естественно писать на ассемблере который сам и должен написать. Допустим я умею в циклике рисовать что-нибудь, но непонятно как организовать работу с клавиатурой. Как бы на эмуляторе не делается исполняемый файл, команды выполняются либо разом либо по одной. (ОБЪЯСНЯЮ ПО КИТАЙСКИ..., ибо по другому не могу). Не знаю как объяснить только если на примере: к примеру читается файл, по порядку числа если 1 - то делается то то, 2- другое и т.д., на 5 к примеру, отлавливается нажатие клавиши если оно есть. и так далее. Программа просто по идее ведь пройдется по файлу выполнит все действия и все. А нужно сделать так чтобы образно говоря после прохождения по файлу, получилось что-то вроде отдельной программы которая работает на эмуляторе, и которая исполняет все те действия. Как-то так... Слышал что-то вроде написания асинхронного синхронизатора... но я плохо представляю как это сделать. Чтобы каждая команда представлялась отдельной программой, а потом их свзать... Как-то так слышал. Подскажите пожалуйста, как можно сделать. Либо скажите что можно почитать. Заранее спасибо.
0
|
07.02.2014, 15:14 | |
Ответы с готовыми решениями:
8
Эмулятор на C++ Builder Эмулятор работы C++ Builder Эмулятор шахматных часов Свой эмулятор для Windows |
07.02.2014, 18:52 | 2 |
Обработка нажатия клавиши - это задача программы, а не эмулятора (если только это не специальная отладочная комбинация).
Несколько ссылок: Эмуляция Как написать эмулятор компьютера Пишем эмулятор 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
|
07.02.2014, 19:57 | 4 |
Ну, если у вас многопоточное приложение и ваш эмулятор поддерживает одновременное исполнение нескольких потоков, то цикл проверки ввода с клавиатуры вы можете вынести в отдельный поток и обрабатывать асинхронно (со всеми "прелестями" синхронизации). Не уверен, что вам это нужно, если только задачей не является именно изучение примитивов синхронизации.
0
|
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
|
|
07.02.2014, 20:35 [ТС] | 5 |
0
|
07.02.2014, 21:15 | 6 | |||||
А в чем смысл?
Если поручить перехват интерпретатору, то этот код либо не дойдет до аппликации (будет обработан самим интерпретатором), либо будет передан аппликации как обычно (зачем перехватывали?), либо транслирован в какой-то иной код (но такая задача не ставилась). Предположим, вся аппликация состоит из двух блоков: A - DoSmth & B - CheckKeyPress. Интерпретатор выполняет их в бесконечном цикле:
Интерпретатор может получить код клавиши и сохранить его, например, в глобальной переменной и выставить флажок KeyPressed, но, тогда, вы либо проверяете его в A и B теряет смысл, либо проверяете его в B, где он был бы проверен и без этих ухищрений.
1
|
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
|
||||||
07.02.2014, 22:42 [ТС] | 7 | |||||
Я честно не все понял.. (надо будет больше читать). Как примерно написан эмулятор. На перле написан ассемблер, из asm файла он кодирует команды и операнды опкодами. И записывает в bin файл. В программе на Си для каждой команды есть функция обработчик. Дальше программа запускает bin файл, и по команде выполняет.
0
|
08.02.2014, 00:00 | 8 |
Сообщение было отмечено HarryPhomin как решение
Решение
Теперь я мало что понял.
Вложите весь этот ваш код в бесконечный цикл и нажимайте сколько угодно. Все, что требуется, это вместо jne сделать полноценный switch с переходами на нужные метки в зависимости от значения в регистре r28. То есть, какая клавиша была нажата (код клавиши --> в r28, а не 0/1), на такую метку и переходим. Если неизвестный код - ошибка. Напишите на C любой switch, посмотрите ассемблерный листинг и увидите, как компилятор строит таблицу переходов. У вас будет также, только проще. В эташе реальный пример.
1
|
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
|
|
08.02.2014, 00:28 [ТС] | 9 |
gazlan, Спасибо большое , более менее становится понятно буду пробовать!
0
|
08.02.2014, 00:28 | |
08.02.2014, 00:28 | |
Помогаю со студенческими работами здесь
9
Как создать эмулятор ps1 Эмулятор светофора Нужен эмулятор браузера Эмулятор. На С, С++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |