苦情催泪电视剧有哪些:街机模拟器工作原理

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 02:18:58
我们常说的芯片,通常都是接受一定的输入,完成特定的计算,并产生结果。输入通常来自相连的外设,输出也传递到外设。例如,最简单的计算器,内部也有一 个芯片,我们在计算器的键盘上输入3+5=,就转化成了计算器芯片的输入参数,并启动内部的计算逻辑,算出结果8,在屏幕上显示出这个结果。作为cpu的 计算器芯片,在这个过程中已经与两个外部设备进行了交互:键盘和显示屏。  

cpu与外围设备交互,通常有特定的方法。像x86系列cpu,提供了io端口,中断,内存映射这几种方式。例如cpu与显卡的交互,通常会使用到以上 所有的方式:显卡的帧缓存通过内存映射,使cpu可以寻址到;显卡芯片的寄存器(显卡芯片也是一个cpu,也有寄存器)通过io端口进行读写,通过读写寄 存器这种低级的编程方式,显卡开始各种工作(例如bitblt),cpu也并行的进行其他计算工作,当显卡完成某个功能调用后,通过x86中断通知cpu 所需的请求已经完成,进而cpu可以再请求显卡做下一步工作。通过中断,cpu和显卡处于异步的方式,cpu不必等待显卡完成绘图。  

几乎所有的芯片都是可编程的,也就是说,可以定制它们的工作方式。只是一些芯片提供了良好的编程接口。像x86系列,MC68000等这样的芯片,可以 运行一段事先写好的程序,来完成某一特定的功能。而像早期的显卡芯片,只能通过读写寄存器来调用显卡的功能。  

街机模拟器,最核心的功能就是模拟那些街机用到的芯片。比如《街霸2》这个游戏,用到了MC68000做cpu,Z80做音频处理,还用到了一个 yamaha的音频芯片,视频方面应该用到了一个芯片做输出。  

游戏的rom,包含音频、视频数据,和游戏代码。代码就是在MC68000上跑的,因此先说一下MC68000的模拟。  

MC68000(m68k)的模拟器是用汇编写的,来自于MAME。从代码中可以看出,m68k有一组寄存器、接受中断输入、通过内存映射与外设交互。 m68k模拟器的内存接口由客户端(使用该模拟器的代码,在这里就是街机模拟程序)提供,这样一来,客户端就可以接管m68k与外设的交互了。例如,用于 音频处理的z80,寄存器组被映射到m68k的某一地址段上。m68k在运行过程中读写z80的寄存器,实际上回调街机模拟程序的相应代码,转发给了 z80模拟器。通过这种方式,就可以模拟m68k与其他外设的交互了。  

m68k模拟器用本机代码模拟m68k的指令集。每一条m68k指令用一段本机代码来模拟。对于一段m68k代码,结合ip(指令指针)找到对应的 m68k指令,通过一个跳转表,跳到对应的那一段模拟代码执行。每一条m68k指令模拟出来的执行周期是原指令周期的数倍到数十倍。因为本机cpu的速度 通常是m68k速度的数百倍,所以这样的模拟不会有问题。  

那么本机cpu(host)与被模拟的cpu(m68k)是如何联系的呢?首先必须让模拟的m68k在正常的主频下运行。host用指定的频率(例如 60Hz)来调用m68k模拟器,指定让m68k运行多少个时钟周期(cycle)。比如想让m68k跑在8MHz,那么每次要让m68k跑 8000000/60=133333个cycle。在m68k运行的过程中,自然会通过内存接口与外设交互,这样就让其他外设的模拟器开始相应的模拟工 作。  

视频部分没有用到模拟器,我推测是使用的帧缓存(framebuffer)。因为2D游戏的画面都是通过贴图(tile)完成的,不需要绘制。为了达到 60Hz的刷新率,模拟程序每次在m68k跑完时钟周期后,读取这个帧缓存,转化成符合当前屏幕格式的位图,blt到显卡。这个过程还需要进一步的学习