Эмуляция процессора с низкой тактовой частотой
От: Muxa  
Дата: 11.08.10 10:39
Оценка:
Пишу эмулятор для проца, который работает на частоте < 2MHz.
Некоторые игры(*), запущенные в моем эмуляторе "летают" так что ничего не успеваешь сделать, а уже game over.
Обработка команд процессора выглядит примерно так:
while(true){
  команда = следующая_команда();
  if (команда == null || стоп)
    break;
  выполнить(команда);
  while (пауза)
    sleep(10);
}

Вопрос: Есть ли стандартные подходы для замедления выполнения программ в таких случаях?
(Процессор дремучий, большинство команд выполняются за 16 тактов, однако неизвестно какие именно, думаю можно принять что выполнение всех команды занимает одинаковое количество тактов)

* В процессоре есть т.н. "таймер задержки", если интерфейс игры основан на использовании этого таймера, то все ок, иначе ~ок (слишком быстро).
Re: Эмуляция процессора с низкой тактовой частотой
От: Aen Sidhe Россия Просто блог
Дата: 11.08.10 10:43
Оценка: +1
Здравствуйте, Muxa, Вы писали:

M>Пишу эмулятор для проца, который работает на частоте < 2MHz.

M>Некоторые игры(*), запущенные в моем эмуляторе "летают" так что ничего не успеваешь сделать, а уже game over.

Посмотри исходники DosBox.
С уважением, Анатолий Попов.
ICQ: 995-908
Re: Эмуляция процессора с низкой тактовой частотой
От: Jolly Roger  
Дата: 11.08.10 14:04
Оценка: :)
Здравствуйте, Muxa, Вы писали:

M>Пишу эмулятор для проца, который работает на частоте < 2MHz.

M>Некоторые игры(*), запущенные в моем эмуляторе "летают" так что ничего не успеваешь сделать, а уже game over.

Ну вот, а некоторые коворят, что DotNET медленный
"Нормальные герои всегда идут в обход!"
Re: Эмуляция процессора с низкой тактовой частотой
От: Jolly Roger  
Дата: 11.08.10 14:07
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Вопрос: Есть ли стандартные подходы для замедления выполнения программ в таких случаях?

M>(Процессор дремучий, большинство команд выполняются за 16 тактов, однако неизвестно какие именно, думаю можно принять что выполнение всех команды занимает одинаковое количество тактов)

Просто после обработки каждой команды вызывайте Sleep(16/Freq), где Freq — частота процессора в килогерцах.
"Нормальные герои всегда идут в обход!"
Re[2]: Эмуляция процессора с низкой тактовой частотой
От: Muxa  
Дата: 11.08.10 15:20
Оценка:
JR>Просто после обработки каждой команды вызывайте Sleep(16/Freq), где Freq — частота процессора в килогерцах.
так не пойдет. надо еще учитывать реальное время выполнения команды в эмуляторе.
пока что делаю так:
после выполнения каждой команды, подсчитываю среднее значение количества команд, обработанных в секунду.
если получаю больше чем 'такт. частота'/16, то спать пока не выравняется частота (пока среднее значение команд в сек. не опустится ниже порогового значения).
Re[3]: Эмуляция процессора с низкой тактовой частотой
От: Jolly Roger  
Дата: 11.08.10 15:45
Оценка:
Здравствуйте, Muxa, Вы писали:

Конечно не пойдёт, у sleep гранулярность 10-15 миллисекунд, может быть и больше, зависит от железа. Это я не подумав ляпнул, звиняйте
"Нормальные герои всегда идут в обход!"
Re: Эмуляция процессора с низкой тактовой частотой
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 11.08.10 20:36
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Пишу эмулятор для проца, который работает на частоте < 2MHz.

M>Некоторые игры(*), запущенные в моем эмуляторе "летают" так что ничего не успеваешь сделать, а уже game over.
M>Обработка команд процессора выглядит примерно так:
M>while(true){
M>  команда = следующая_команда();
M>  if (команда == null || стоп)
M>    break;
M>  выполнить(команда);
M>  while (пауза)
M>    sleep(10);
M>}

M>Вопрос: Есть ли стандартные подходы для замедления выполнения программ в таких случаях?
M>(Процессор дремучий, большинство команд выполняются за 16 тактов, однако неизвестно какие именно, думаю можно принять что выполнение всех команды занимает одинаковое количество тактов)

M>* В процессоре есть т.н. "таймер задержки", если интерфейс игры основан на использовании этого таймера, то все ок, иначе ~ок (слишком быстро).


http://msdn.microsoft.com/ru-ru/library/system.threading.thread.spinwait.aspx — эта функция спасет вас.
Re[2]: Эмуляция процессора с низкой тактовой частотой
От: Muxa  
Дата: 12.08.10 07:56
Оценка: :)
JR>Ну вот, а некоторые коворят, что DotNET медленный
в релизной конфигурации мой эмулятор обрабатывает около 50 млн. команд процессора в секунду.
в то время как оригинальный процессор только около 100 тыс.
Re: Эмуляция процессора с низкой тактовой частотой
От: hardcase Пират http://nemerle.org
Дата: 12.08.10 14:47
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Пишу эмулятор для проца, который работает на частоте < 2MHz.


CHIP-8?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Эмуляция процессора с низкой тактовой частотой
От: Muxa  
Дата: 12.08.10 17:15
Оценка:
H>CHIP-8?
как узнал?
я специально не указывал частоту
Re[3]: Эмуляция процессора с низкой тактовой частотой
От: hardcase Пират http://nemerle.org
Дата: 13.08.10 08:37
Оценка:
Здравствуйте, Muxa, Вы писали:

H>>CHIP-8?

M>как узнал?
M>я специально не указывал частоту

Да тема на хабре проскакивала не так давно — факты сопоставил.

А вообще, будь у меня ПЛИС — я бы на ней сделал развел процессор.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Эмуляция процессора с низкой тактовой частотой
От: Muxa  
Дата: 13.08.10 08:43
Оценка:
H>Да тема на хабре проскакивала не так давно — факты сопоставил.
молодец.
эта статья меня как раз и вдохновила, на создание своего вело... кхм, эмулятора.
в планах хочу написать эмулятор Амиги, и писать на нем демки
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.