Пишу эмулятор для проца, который работает на частоте < 2MHz.
Некоторые игры(*), запущенные в моем эмуляторе "летают" так что ничего не успеваешь сделать, а уже game over.
Обработка команд процессора выглядит примерно так:
while(true){
команда = следующая_команда();
if (команда == null || стоп)
break;
выполнить(команда);
while (пауза)
sleep(10);
}
Вопрос: Есть ли стандартные подходы для замедления выполнения программ в таких случаях?
(Процессор дремучий, большинство команд выполняются за 16 тактов, однако неизвестно какие именно, думаю можно принять что выполнение всех команды занимает одинаковое количество тактов)
* В процессоре есть т.н. "таймер задержки", если интерфейс игры основан на использовании этого таймера, то все ок, иначе ~ок (слишком быстро).
Re: Эмуляция процессора с низкой тактовой частотой
Здравствуйте, Muxa, Вы писали:
M>Пишу эмулятор для проца, который работает на частоте < 2MHz. M>Некоторые игры(*), запущенные в моем эмуляторе "летают" так что ничего не успеваешь сделать, а уже game over.
Посмотри исходники DosBox.
С уважением, Анатолий Попов.
ICQ: 995-908
Re: Эмуляция процессора с низкой тактовой частотой
Здравствуйте, Muxa, Вы писали:
M>Пишу эмулятор для проца, который работает на частоте < 2MHz. M>Некоторые игры(*), запущенные в моем эмуляторе "летают" так что ничего не успеваешь сделать, а уже game over.
Ну вот, а некоторые коворят, что DotNET медленный
"Нормальные герои всегда идут в обход!"
Re: Эмуляция процессора с низкой тактовой частотой
Здравствуйте, Muxa, Вы писали:
M>Вопрос: Есть ли стандартные подходы для замедления выполнения программ в таких случаях? M>(Процессор дремучий, большинство команд выполняются за 16 тактов, однако неизвестно какие именно, думаю можно принять что выполнение всех команды занимает одинаковое количество тактов)
Просто после обработки каждой команды вызывайте Sleep(16/Freq), где Freq — частота процессора в килогерцах.
"Нормальные герои всегда идут в обход!"
Re[2]: Эмуляция процессора с низкой тактовой частотой
JR>Просто после обработки каждой команды вызывайте Sleep(16/Freq), где Freq — частота процессора в килогерцах.
так не пойдет. надо еще учитывать реальное время выполнения команды в эмуляторе.
пока что делаю так:
после выполнения каждой команды, подсчитываю среднее значение количества команд, обработанных в секунду.
если получаю больше чем 'такт. частота'/16, то спать пока не выравняется частота (пока среднее значение команд в сек. не опустится ниже порогового значения).
Re[3]: Эмуляция процессора с низкой тактовой частотой
Здравствуйте, 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>* В процессоре есть т.н. "таймер задержки", если интерфейс игры основан на использовании этого таймера, то все ок, иначе ~ок (слишком быстро).
JR>Ну вот, а некоторые коворят, что DotNET медленный
в релизной конфигурации мой эмулятор обрабатывает около 50 млн. команд процессора в секунду.
в то время как оригинальный процессор только около 100 тыс.
Re: Эмуляция процессора с низкой тактовой частотой
H>Да тема на хабре проскакивала не так давно — факты сопоставил.
молодец.
эта статья меня как раз и вдохновила, на создание своего вело... кхм, эмулятора.
в планах хочу написать эмулятор Амиги, и писать на нем демки