私は、Javaでの趣味のプロジェクトとして、今後数か月にわたってSega Master Systemエミュレーターを作成することを計画しています(これには最適な言語ではないことはわかっていますが、作業が非常に快適で、 WindowsとLinuxの両方で、クロスプラットフォームアプリケーションが素晴らしいと思いました)。私の質問はサイクルカウントに関するものです。
別のZ80エミュレーター、および他のエミュレーターのソースコードを調べましたが、特に実行ループに興味をそそられます。呼び出されると、intが引数として渡されます(例として1000としましょう)。これで、各オペコードの実行にかかるサイクル数が異なり、これらが実行されると、サイクル数が全体の数値から減少することがわかります。残りのサイクル数が0未満になると、実行ループは終了します。
私の質問は、これらのエミュレーターの多くは、実行される最後の命令がサイクル数を負の値に押し上げる可能性があるという事実を考慮していないということです-つまり、実行ループ間で、たとえば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になります。これはほんのわずかな不正確さですが、人々の経験では全体的に重要ですか?これについて誰かの洞察をいただければ幸いです。これが適切だと思われるので、フレームごとにCPUに割り込む予定なので、1000サイクルは低いと思いますが、これは単なる例です。
どうもありがとう、フィル