Z80 Explorer-Zilog Z80网表级模拟器

2020-07-20 20:30:23

Z80 Explorer是一个Zilog Z80网表级别的模拟器,能够运行Z80机器代码,也是一个教育工具,具有帮助反向工程和更好地理解该芯片的功能。

Z80 Explorer是一个工具,几年前当我第一次开始看Z80芯片芯片的照片并学习对其功能进行逆向工程时,我希望自己有这个工具。这个过程缓慢而痛苦,因为它涉及到将模糊的图像痕迹解密成逻辑门和功能。

有时,我发现Visual6502团队完成了一项出色的工作,将CPU的轨迹映射为表示各个层的位图。他们的在线观看工具令人印象深刻,人们可以从使用它中学到很多东西,但与大多数在线工具一样,它也有局限性,当我试图更深入地了解芯片行为时,很快就遇到了这些限制。

随着我不断地玩这个在线工具,我对附加功能的愿望清单稳步增长。我本来希望它不仅是一个功能齐全、速度快的模拟器,而且还能提供更详细的方法,以便更深入地了解芯片的内部行为,同时还具有教育性、易用性和直观性。

快进到今天,在新冠肺炎一次次居家订单的帮助下,我把这个工具写成了我最初想象的样子。

在这篇博客中,我将概述Z80 Explorer的功能,并展示一些有用的功能,即使在阅读完文档后也很容易错过这些功能。这个博客可能会随着工具本身的变化而定期变化,因为我目前正在积极开发它(2020年夏天)。

该工具的用户指南是一个单独的在线文档,位于https://baltazarstudios.com/Z80ExplorerGuide这里,它非常简洁;如果有什么不清楚的地方,请给我发电子邮件,我会详细说明。

该工具用于加载和使用Z80数据集(图层图像和网表)。它应该能够以最小的改动容纳其他NMOS芯片。然而,在这个时候我还没有做过任何其他的端口,因为我只专注于Z80。芯片的数据(资源)与应用程序分开保存,可以从共享的GitHub回收站独立下载和更新。具体地说,随着各种网络的功能被理解,网络和总线被命名,网络名称、提示和注释的列表可以增长并被共享。

Z80 Explorer能够在网表级别运行原生Z80代码。这意味着,当指令操作码被馈送到其引脚时,二进制1和0通过其晶体管门的内部网络传播,并执行与硅门在真实芯片上所做的相同的功能。

运行它的引擎相当快:在我的4 GHz i7-4790K CPU上,我能够以大约2.3 kHz的频率运行Z80代码,这是唯一的!与在真正的硅上运行的速度相比,它的速度大约慢了2000倍。在这样的“速度”下,运行一些标准的CPU诊断程序并不是不可能的-所以我就这样做了:我运行了一个众所周知的ZEXALL诊断程序。

在模拟器中运行了几天后,通过测试的名单不断增加。在大约一周后,模拟器的内部周期计数器一度溢出其32位变量,模拟停止。我只需要恢复它,不需要重新设置,也不会损失累积的进度。

我已经将该版本的ZEXALL添加到应用程序资源中。它对原始版本进行了修改,因为我根据测试运行的时间对测试进行了排序:先运行速度最快的测试,不需要太长时间,您就会开始看到一些结果,从而向您保证它确实运行得很好。

Z80 Explorer有图像视图,可显示各种版本的芯片图像。它们中的一些是显示为层(扩散层、金属层等)的未经修改的资源文件,而另一些是以这些层的组合创建的:vss.vcc.nets.ol是具有着色的网络的层,使得地面显示为绿色、Vcc为红色,其余的网络根据用户过滤器着色。

如果在按住Ctrl键的同时单击层按钮,或在按住Ctrl键的同时按住指定给每个层的键,则可以查看不同的层并创建它们的组合。

还可以对芯片/层视图进行注释。应用程序在启动时加载一个默认批注文件(包含这些批注),但是您可以通过将该文件拖放到应用程序图像视图中来加载任何其他批注文件。例如,“ANNOT_INTERMANDS.json”(位于资源文件夹中)包含一组不同的注释,更侧重于内部特性。注释是自适应的,因此它们将在您放大和缩小时显示和隐藏。它们还可以包含宏,这些宏是扩展为命名的Net和Bus值的令牌,这些值在模拟运行时会实时更新。

在我以前的文章中,我查看了指令寄存器。使能加载它的信号是一对互补的WE(写使能)控制迹线。

我们能否准确地找到现在称为";load_ir";的写启用被断言的时间?控制此控制信号的内部逻辑方程是什么?

使用Z80 Explorer(Z80资源管理器)的Find(查找)选项搜索";load_ir&34;信号名称,然后询问该网络的原理图,将显示以下视图:

因此,该信号由具有锁存器的或网255产生。让我们跟随网络255,该网络255是具有网络1329的时钟的与非门(因此,时钟选通)。选择(双击)1329并索要示意图将使我们更接近预期:

因此,NET 1329是时钟选通的NAND组合信号,在M3、T3和PLA22有效时有效。PLA22表示指令扩展解码。(PLA22的描述保存在申请文件中,就像对所有其他PLA条目和一些其他重要网络的描述一样)。

回到锁存器244-这部分可能不会太明显,除非你有一些查看芯片迹线的经验-网络244在底部,锁存器置位和复位信号在顶部,两者都是时钟选通的:

询问网络1306(从左上角连接的网络)的原理图,该网络也用作锁存器复位:

我们看到锁存器将在内部复位或T3周期中复位。锁存器将设置在M1和T2周期边沿(因此它将显示在M1/T3):

我们可以通过运行手工编写的测试代码来验证我们发现的内容。我使用一个模板测试程序";test_blank.asm";编写了几条指令,其中一条使用了IX寄存器,然后运行了几个周期。在波形视图窗口中,结果显示当指令使用IX/IY前缀(PLA22有效)时,LOAD_IR信号如何在每个M1/T3以及M3/T3被断言。

接下来,通过将文件放到应用程序的图像视图(主窗格)上来加载";annot_inders.json";文件。

通过将此命令粘贴到命令窗口中,可以放大到所有M和T闩锁所在的区域:

在启动时,该应用程序将尝试检测锁闩,并将自动检测大多数锁闩。对于未检测到的,您可以在找到它们时添加它们。查找闩锁的最简单方法是使用“Driven By”选项。在点击一个网络并跟随其信号链之后,如果您看到两个网络在相互依赖的环路中相互驱动,您就会发现一个由这两个网络组成的锁存器(它们也充当反相器)。应用程序的初始化文件之一latches.ini&34;包含其他闩锁的定义。当您发现应用程序没有检测到的闩锁时,您可以添加到该文件中。

原理图视图使用这种“Driven by”算法的扩展版本来构建对所选网络有贡献的门的树。

反过来,“Driving Nets”选项帮助您在输入网络分支到网络时跟踪它。例如,点击/Reset输入焊盘,按照突出显示的行迭代“Driving Nets”。很快,你应该会走到“死胡同”,在这里,显然没有什么东西在推动着你的网:

关于这些命令:为了自己创建这些缩放和定位命令,请设置所需的视图,然后在命令窗口中键入“img.state()”。所需的行将在应用程序日志窗口中打印。

要获取img.show()命令中使用的坐标,请右键单击并选择要突出显示的区域,然后只需从Log窗口读取坐标并将其作为参数粘贴到img.show()中即可。

上述特定网络包含复位输入触发器和锁存器。从它出来的控制信号之一是“INT_RESET”,即内部复位:

每个芯片通常都有几个信号,这些信号通过芯片传播到几乎每个角落。其中一些网络是电源、接地、复位和时钟网络。(较新的芯片对设计的各个部分实施各种“门控”,以限制功耗,但Z80不会这样做。)。

我已经提到了波形视图。任何使用过ModelSim等模拟工具的人都应该熟悉这个视图;但即使对于其余的人,它的使用也应该非常简单和直观。

需要记住的重要一点是,在将其添加到波形视图之前,如果您想要观察的网络尚未命名,请对其进行“命名”。双击网络并选择“Edit Net Name...”。你可以输入任何名字;一个简单的名字(123是它的净数)就足够了,特别是如果那只是一个临时的网,而你不想保留它的话。如果您找到了更合适的名称,您可以随时重新命名网络,也可以删除该名称。

Resources';";test";文件夹包含几个Z80代码片段。其中一些可以按原样运行(";zexall.asm";),另一些包含用于测试特定功能的代码(";test_busrq.asm";),或者用作您自己实验的模板(";test_blank.asm";)。它们仍然需要编译,因此提供了Z80汇编程序(zmac.exe)。

当您运行不同的Z80代码片段时,您可以看到所选网络在各种情况下的行为。一旦你分析了信号的波形,你就可以推断出它的作用。

这款应用程序的一些高级功能可以让你设置一些特定的观察条件。例如,您可以设置NMI,然后查看在某个时钟断言NMI时会发生什么情况。您可以通过写入“trickbox”(一个模拟的内存映射区)来修改测试程序并设置您自己的条件。这些位置被Z80 Explorer模拟引擎视为特殊位置,写入这些位置会导致各种事件发生:在特定时钟注入中断、按住复位引脚然后释放引脚等。

通过精心设计测试,您可以设置一个快速、可重复且方便的模拟周期,并观察信号的作用以及芯片的行为。除了网络跟踪之外,示意图和注释应该提供足够的框架来理解Z80内部是如何工作的。

一个博客不可能涵盖该工具提供的所有功能。我还没有描述Tips功能(它允许您用附加信息标记网络,如描述每条PLA线路的信息);网组的自定义颜色;嵌入式JavaScript引擎和脚本命令,以及模拟监视器用来控制测试程序的“trickbox”存储区,以及测试程序如何控制它们自己的模拟。但是,文档简要描述了所有这些功能,并提供了足够的详细信息来提供必要的指导。

用一些稍微不同的东西来结束:在这个模拟中引导ZX Spectrum怎么样?

为此,我执行了这个外部JS脚本文件。我还提供了48.rom的文件。

Zilog Z-80CPU没有像其他一些较老的芯片(比如6502,其中每个网络的功能已经被理解)那样被广泛地进行反向工程。我希望这个工具能让好奇的人最终完全了解Z80';的内部运作。

请发布您的调查结果、功能请求、改进请求或需要修复的错误。此外,当您深入研究和发现功能时,请共享网络名称、注释和提示。