如何做到CPU与PPU同步呢?(看资料可以知道,CPU与PPU使用同一个振荡器,其运行是同时的)这里将自己的猜测记录下来,具体做到,还需要实践的检验。
用PC模拟FC是可行的,因为PC的速度远远超过FC,如果用PC全速运行FC的话,FC游戏将快到没法玩。所以我们要给程序加上"限速器",限速器的目的是什么?让FC按照应有的速度运行。
这里,我用PAL制式的FC(50帧每秒,32*30块,312条扫描线,扫描线总周期1362)作为讨论对象
首先,我们要让模拟器每秒限制产生50帧图像,那么必须在"每产生50帧图像后",将1秒剩下的时间还给系统。如果50帧图像需要a秒,那么要将(1-a)秒还给系统(要知道a是很小的).
这样还不够,因为每帧图像会产生重要的"VBlank中断",所以,我们最好让每帧图像间隔时间一样长,那就是将每帧图像平均分到"每1/50秒".如果每帧图像需要b秒,那么要将(1/50-b)秒还给系统。
现在,至少能够产生稳定的VBlank中断了,可还不够,因为有些代码是要处理"水平消隐"的,所以要给扫描线平均分配时间。查资料,PAL制式下,扫描 线有312条,所以,要将扫描线,平均分到"1/15600秒",并将剩余的时间还给系统(还给系统的目的是"间隔开").
还不够,因为,要做到精确的"精灵碰撞",需要将"像素"平均分到"1/(15600*1362)秒".
结论就是,将时间"1/(15600*1362)秒"转换成CPU的指令周期数,PPU每画"一个像素",CPU就执行一些指令。计算结果为1/21247200,恰好接近PAL制式的基频"21281362.0Hz",这就是每个像素需要的时间。
而CPU是这个频率的1/12,为1773447Hz,即每秒有1773447个周期,提供给CPU使用。我们也把这个周期按照刚才的算法算一 遍,1773447/50=35468.94(正好与"帧IRQ周期35469"一样).1773447/50/312=113.6825,即每条扫描线 等价于113.6825个CPU周期。
为方便起见,可以以扫描线为单位,这样比较好处理,CPU每运作113.6825个周期,PPU就渲染一条扫描线。
本文来自:http://zjdddd.blog.163.com/blog/static/18028530820111202479457/
女孩不哭(QQ:191035066)@2011-12-24 02:38:27