如何写一个NES模拟器(四)——6502CPU的模拟

如何模拟6502的CPU呢?

       6502的CPU主频大约是1.78MHz,什么意思呢?就是1秒钟能运行1.78M个CPU循环(cycles)。NES每秒生成60个帧,每个帧有262条扫描线。那么每条扫描线的CPU循环数就是:1.78 M / 60 / 262 = 113.23 cycles。由于现代的CPU主频过高,我们在运行113个循环后可以睡眠一会。或者更简单的一个方法是,每一帧后,我们让CPU休息一会,每一帧的循环数是 262 * 113;

       在程序中,我使用了这个简单方法,当然模拟没有那么准确了。

伪代码如下:

       OldTicks = GetTicks();

       Cpu_exec(262 * 113);

       Ticks = GetTicks();

       If( Ticks -OldTicks < 1000ms / 60hz )

              Sleep(1);

else

              goto 执行;

 

关于CPU_exec(cycles),我在网上下载了别人的指令集和实现,修改一下即可。如果你想自己实现,也可以参考。CPU模拟的关键地方有,中断的发生时机,标志位的置位时机,以及对端口2000-2007(和PPU通讯)的读写。代码一看也了然。

最后总结,模拟NES的步骤:

  1. 读取NES-ROM文件,将图案文件初始化放入PPU的图案表中
  2. 把程序指针指向reset中断,开始执行程序代码
  3. CPU把要显示的图案在某个时刻写入到PPU的4个命名表中
  4. PPU显示图形(显示图形的技巧也需要看资料模拟)
  5. 在blank期间处理手柄和声音

这就是我所理解的所有,当然有许多地方不正确或不准确,大家可以指正。

最后我会上传现在的版本,bug很多,但是正好给刚学的一些修改和了解的机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值