私はNESエミュレーターを書く予定です。しかしまず、エミュレーションのしくみを理解するために、Chip-8 エミュレーターを作成します。
エミュレーターはほぼ完成しています。ゲームにいくつかのバグがありますが、これはすぐに修正されます。私の問題番号 1 は、エミュレーターを Chip-8 のクロック速度と同期させることです。私がよく読んだインターネットでは、一般的なクロック速度は〜540Hzである必要があります。チップのタイマーは、60Hz の周波数で刻む必要があります。
エミュレータを Chip-8 と同期させるために、次のロジックを記述しました。
private void GameTick()
{
Stopwatch watch = new Stopwatch();
var instructionCount = 0;
_gameIsRunning = true;
while (_gameIsRunning)
{
watch.Restart();
EmulateCycle();
//Updates the internal timer at a 60hz frequenz
//540hz (game tick) divided by 9 equals 60hz (timer tick)
instructionCount++;
if(instructionCount == 9)
{
UpdateSoundAndDelay();
instructionCount = 0;
}
if (_readyToDraw)
{
DrawGraphics();
_readyToDraw = false;
}
SetKeys();
//Pause the game to get a virtual clock speed of ca. 540mhz
var elapsedMicroseconds = watch.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
while(elapsedMicroseconds < 1852)
{
elapsedMicroseconds = watch.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
}
}
}
詳細については、私のリポジトリをご覧ください: https://github.com/Marcel-Hoffmann/Chip-8-Emulator
ご覧のとおり、CPU サイクルごとに 1852 マイクロ秒待機します。結果は、540Hz に等しい 1 秒間に ~ 540 サイクルになります。しかし、私はこの論理にあまり満足していません。
クロック速度を同期する方法について、誰かがより良いアイデアを持っていますか?