gpt4 book ai didi

low-level - CPU 仿真和锁定到特定时钟速度

转载 作者:行者123 更新时间:2023-12-03 10:15:17 29 4
gpt4 key购买 nike

如果你看过我的另一篇 question ,你会知道我已经花了这个周末组装一个 6502 CPU 仿真器作为一个编程练习。

CPU 模拟器大部分是完整的,从我有限的测试来看似乎相当准确,但是它运行得非常快,我想将其降低到机器的实际时钟速度。

我当前的测试循环是这样的:

    // Just loop infinitely.
while (1 == 1)
{
CPU.ClockCyclesBeforeNext--;

if (CPU.ClockCyclesBeforeNext <= 0)
{
// Find out how many clock cycles this instruction will take
CPU.ClockCyclesBeforeNext = CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].CpuCycles;

// Run the instruction
CPU.ExecuteInstruction(CPU.Memory[CPU.PC]);

// Debugging Info
CPU.DumpDebug();
Console.WriteLine(CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].ArgumentLength);

// Move to next instruction
CPU.PC += 1 + CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].ArgumentLength;
}
}

如您所知,每个操作码都需要特定的时间来完成,因此在我对 CPU 周期时钟进行倒计时之前,我不会运行下一条指令。这在操作码之间提供了适当的时间,只是整个事情运行得很快。

objective-c PU 速度为 1.79mhz,但是我希望时钟问题的任何解决方案都能将速度保持在 1.79mhz,即使我增加了复杂性,因此我不必对其进行调整。

有任何想法吗?

最佳答案

多年前我写了一个 Z80 仿真器,为了精确执行周期,我将时钟频率划分为许多小块,让内核执行那么多时钟周期。就我而言,我将其与我正在模拟的游戏系统的帧速率相关联。每个操作码都知道执行需要多少个周期,并且内核将继续运行操作码,直到执行了指定数量的周期。我有一个外部运行循环,它将运行 cpu 核心,并运行模拟系统的其他部分,然后休眠直到下一次迭代的开始时间。

编辑:添加运行循环示例。

int execute_run_loop( int cycles )
{
int n = 0;
while( n < cycles )
{
/* Returns number of cycles executed */
n += execute_next_opcode();
}

return n;
}

希望这可以帮助。

关于low-level - CPU 仿真和锁定到特定时钟速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/112439/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com