Я планирую создать эмулятор Sega Master System в течение следующих нескольких месяцев в качестве хобби-проекта на Java (я знаю, что это не лучший язык для этого, но я нахожу его очень удобным для работы, и какчастый пользователь Windows и Linux, я думал, что кроссплатформенное приложение будет отличным).Мой вопрос касается подсчета циклов:
Я просмотрел исходный код для другого эмулятора Z80, а также для других эмуляторов, и, в частности, цикл выполнения заинтриговал меня - когда он вызывается, передается intв качестве аргумента (скажем, 1000 в качестве примера).Теперь я понимаю, что для каждого кода операции требуется разное количество циклов, и что по мере их выполнения число циклов уменьшается от общего значения.Как только число оставшихся циклов <= 0, цикл выполнения заканчивается. </p>
Мой вопрос заключается в том, что многие из этих эмуляторов не учитывают тот факт, что последняя выполняемая инструкция может увеличить числоциклы к отрицательному значению - это означает, что между циклами выполнения можно в итоге сказать, что выполняется 1002 цикла вместо 1000. Это важно?Некоторые эмуляторы учитывают это, компенсируя следующий цикл выполнения, а некоторые нет - какой подход лучше?Позвольте мне проиллюстрировать мой вопрос, так как я не очень хорошо разбираюсь:
public void execute(int numOfCycles)
{ //this is an execution loop method, called with 1000.
while (numOfCycles > 0)
{
instruction = readInstruction();
switch (instruction)
{
case 0x40: dowhatever, then decrement numOfCycles by 5;
break;
//lets say for arguments sake this case is executed when numOfCycles is 3.
}
}
После окончания этого конкретного примера зацикливания numOfCycles будет равен -2.Это будет только небольшая неточность, но имеет ли это значение в целом для опыта людей?Я был бы признателен за чье-либо понимание этого вопроса.Я планирую прерывать процессор после каждого кадра, так как это кажется уместным, поэтому 1000 циклов - это мало, я знаю, это всего лишь пример.
Большое спасибо, Фил