Snes仿真器如何从完全完美中获得几个像素

2021-06-29 23:53:00

据报道,6月28日,ars令人遗憾的是,他难以理解,他也令人遗憾地了解这篇文章的作品,他在线互动附近的手柄,据报道,周末在线互动。我们今天重新传中这篇文章,以记住他们对经典游戏仿真界和ARS的巨大贡献。您还可以阅读2011件关于BSNES开发准确性的追求。

如果您或您所知的人正在努力与自杀思想斗争,请在800-273-8255联系国家自杀预防寿命,或达到类似的国际热线。我们' D还鼓励读者捐赠给美国联邦的自杀预防,如果他们&#39所搬家。

作为BSNES的首席编码器,我一直在尝试在过去的15年里完善超级任天堂仿真。我们现在处于这个目标的观点,但我们面临着最后一个挑战:SNES视频处理器的准确周期定时。获得最终的仿真精度将需要社区努力,我希望有些人可以帮助。但首先,让我回顾我们和#39的距离。今天,Snes仿真在一个非常好的地方。禁止对仿真的不寻常外围设备(例如基于光传感器的高尔夫俱乐部,运动自行车或用于在日本的活赛马比赛上放置真实赌注的拨号调制解调器),每个官方许可的SNES标题都是完全播放,没有众所周知的游戏有任何辉煌的问题。

SNES仿真使我精确的是i'甚至被认为将我的仿真器分成两个版本:Higan,它侧重于绝对准确性和硬件文档;和BSNES,专注于性能,功能和易用性。

所以它,吧?在一份工作中做得很好的荣誉,谢谢你所有的鱼?好吧......不太。

今天,我们为几乎每个狭小带的组件享受循环级别准确性。唯一的例外是PPU(图片处理单元),用于生成发送到屏幕的视频帧。我们大多了解PPU的工作方式,但我们必须猜测一些导致少于完全完美的功能。

剩下的问题是相对较小的问题,在盛大的事情方案中。如果你'重复追求追求百分之百的忠实仿真完善的奉献,我并不能让你进一步改善SNES PPU仿真的必要性。与生活中的任何目标一样,我们越来越靠完美,回报越小。

我可以告诉你为什么这对我来说很重要:它的生活和#39;工作,我不想说我这靠近完成而没有得到最后一块。我变老了,我赢了,我赢了。我希望这个最后的事情解决了,所以我可以对我的退休感到充满信心,因为SNES一直忠实地通过仿真完全保存。没有石头被遗忘,没有区域未完成。我想说它&#39所做的。

如果您'仍然有兴趣,请阅读深入潜入问题的背景和我提出的解决方案。

箭头表示SNE中的各种处理器可以彼此通信的方向,并且虚线表示存储器芯片连接。

现在要带走的关键是要注意的,视频和音频输出专门从PPU和DSP发送。这意味着它们像“黑匣子”一样,我们在内部没有任何可见性。后来这将是重要的。

想象一下,你正在模仿CPU' s"乘法"需要两个寄存器(变量)的指令将它们乘以,并生成结果和一些表示结果状态(例如溢出)的标志。

我们可以设计一个软件程序,该软件程序将每个可能的值从0到255乘以乘法器和多样性。然后我们可以输出乘法的数字和标志结果。这将产生两个65,536个条目表。

通过分析这些表,我们可以准确地确定CPU结果设置某种方式。然后我们可以修改我们的仿真器,所以在运行相同的测试时,我们在同一时间产生完全相同的表。

现在让' S说CPU有16位x 16位乘法。测试每个可能的值都会产生40亿个结果,这开始推动在合理的时间内测试的实际测试。如果CPU具有32位x 32位乘法,则测试宇宙热死前的所有输入组合是不可行的(至少有当前技术,至少)。

在这样的情况下,我们必须使用测试来获得更多选择性,并尝试何时何时可以更改标记可能会更改时,结果可能会溢出。否则我们' D有一个永远不会完成的测试。

乘法是一个相当琐碎的操作,但这是逆向工程背后的一般过程,它延伸到更复杂的操作,例如snes'水平消隐DMA(直接内存访问)转移工作。我们创建了试图检测到边缘案例发生的情况的测试,然后确认我们的仿真表现与真正的SNES相同。

SNES包含两个振荡器:在〜21MHz上运行的晶时钟,控制CPU和PPU;和一个在〜24MHz上运行的陶瓷谐振器,用于控制SMP和DSP。盒式切割器有时会使用〜21MHz CPU振荡器,有时包括在不同频率下运行的自己的振荡器。

时钟是任何系统的核心定时元素,并且SNES旨在以某些频率和时间执行各种任务。

如果您想象一个100Hz时钟,它是一种带有数字引脚的设备,该设备转换为逻辑高(例如+5伏),然后返回到每秒100次逻辑低(0伏或地)。因此,每一秒,销电压都会波动200次:100个上升时钟边缘和100个下降时钟边缘。

时钟周期通常被视为一个完整的转换,因此100Hz时钟将产生每秒100个时钟周期。有一些系统需要区分上升和下降边缘,并且对于那些,我们将其进一步分解成半循环以表示时钟信号的每个相(高或低)。

真实仿真器的关键目标是以完全相同的方式执行任务,并且与真实硬件完全相同。它不得不具体地执行任务的问题。重要的是,在给出相同的输入时,模拟器会生成与真实硬件相同的时机相同的输出。

有时,操作随着时间的推移而发生。例如,拍摄CPU乘法。 SNE CPU在八个CPU OPOD循环中,SNE CPU在后台计算乘法结果,而不是暂停等待乘法来完成乘法。这允许您的代码在等待乘法时才能完成其他事情。

任何商业发布的软件都可能等待这一点八个周期,因为如果您在它之前尝试阅读结果'准​​备好,您将获得部分计算的结果。然而,早期的Snes仿真器立即给出了正确的结果,而不等待这些额外的周期。

当Hobbyists开始通过仿真器创建和测试Homebrew软件时,这种差异开始导致一些问题。这些软件中的一些,例如许多早期的超级马里奥世界ROM黑客,这些软件只在这些早期的仿真器上正确工作,而不是真正的SNES硬件。那个'因为它们是用仿真器设计的直接(和不真实的 - 与实际硬件)乘法的设计。

随着仿真器的改进,这款旧软件已破坏,我们必须随后在我们的较新的模拟器中提供兼容性选项,以便不会失去此软件。是的,就像要说的那样,我们的仿真者必须模仿其他仿真器!梅塔!

关于CPU乘法延迟的好处是它非常可预测:八个计算周期在请求乘法后立即启动。通过编写代码来读取每个周期后的结果,我们能够确认SNES CPU正在使用展位算法进行乘法。

其他操作对模型并不那么简单,因为它们在后台异步发生。 SNES CPU' S DRAM刷新是一个这样的案例。

在每个扫描线的渲染过程中,在某个点处,整个SNE CPU冻结短时间,随着RAM芯片的内容刷新。需要这是因为作为成本切割度量,SNES为其主CPU存储器使用动态RAM(而不是静态RAM)。必须定期刷新动态RAM,以随着时间的推移保持其内容。

弄清楚这些操作的精确时间的关键洞察是利用SNES PPU的水平和垂直计数器。这些计数器前进并在每个水平和垂直消隐时段后复位。然而,他们的精确度只是Snes&#39的四分之一; CPU振荡器频率;也就是说,水平计数器仅增量一次每四个时钟周期一次。

通过多次读取计数器,我能够确定计数器对准的时钟周期的哪个四分之一。通过将此洞察力与专门制作的功能相结合,可以通过精确,用户指定的时钟周期循环,可以完全将SNES CPU完全对准到我想要的任何精确的时钟周期位置。

通过迭代循环中的一系列时钟周期,我可以完全确定发生某些操作(例如DRAM刷新,HDMA传输,中断轮询等),并且我能够精确地在仿真下再现。

SNES SMP芯片也有自己的定时器,并且同样的逆向工程也成功地反对该处理器。我可以单独花一整篇文章谈论SMP测试寄存器,这允许编码器控制SMP的时钟分频器及其定时器,以及其他可怕的东西。就这样说,虽然这不是一种简单或快速的过程,但我们最终胜利。

在需要被驯服的各种游戏盒内,有一系列SNES协处理器。从专用通用CPU如Superfx和SA-1,与DSP-1和CX4等数字信号处理器,与S-DD1和SPC7110这样的解压缩加速器,到来自Sharp和Epson的实时时钟,以及更多。 ..

这意味着SNES仿真器需要能够处理Superfx的指令和像素缓存; SA-1的内存总线冲突仲裁器(允许SNES CPU和SA-1同时共用相同的ROM和RAM芯片); DSP-1和CX4的嵌入式固件; S-DD1和SPC7110的基于预测的算术编码器;和奇数BCD(二进制编码的小数)的实时时钟边缘情况。慢慢但肯定地,通过应用上述技术来确定正确和时间,我们能够接近完美地模拟所有这些芯片。

它实际上采取了巨大的努力,数千美元来从各种游戏中使用的数字信号处理器中取出并提取编程固件。在一个例子中,NEC UPD772X的仿真导致了来自Higan的代码,用于挽救斯蒂芬霍金的后期教授'声音!

在另一个情况下,我们必须反向工程师的日立HG51B架构的整个指令集,因为这种架构从未被公开记录过。在另一个游戏(Hayazashi Nidan Morita Shougi 2)最终包含一个完整的32位,21MHz ARM6 CPU,以加速其日本国际象棋引擎!

仅保留所有SNES协处理器是一个充满挑战和惊喜的多年旅程。

不要与DSP-1盒式切割机混淆,索尼S-DSP(数字信号处理器)芯片是从SNES产生独特的声音。该芯片组合了八个语音通道,具有4位ADPCM编码以产生16位立体声信号。

在表面上,并且根据前面的系统图,DSP最初看起来像一个黑色盒子:您可以配置语音通道和混音器设置,并坐下,因为它会将声音发送到扬声器时。

但是一个关键的功能允许开发人员通过BlarGG的名称来完全反向工程师这个芯片:Echo缓冲区。 SNES DSP具有一个功能,将从先前样本的输出混合在一起以产生回声效果。这发生在音频生成过程的最终(除了可以应用于静默所有音频输出的最后一个最终静音标志。)

通过仔细循环定时代码并监视这些回声结果,可以发现SNES DSP将采用SNES DSP的确切操作顺序,以生成每个样本,并产生周期准确的位完美音频。