我目前正在为好老Gameboy开发一个仿真器,我面临着一些问题,了解必须如何实现一些基本的操作代码。

现在我正在实施和操作;前几(0xA0 - > 0xA3; 0xA6&0xA7)非常直向,但寄存器H,L的操作有点不同。

您可以在此链接下下载z80的文件: UM0080.pdf (第172页)

这里有一些例子来展示我的意思(伪码),基本上我做了什么:

和a,h(注意位移)

(read HL register; >> 8) save in cache C
R->C = R->HL >> 8;

perform AND operation with cache
AND_H(R->C);
R->A &= R->C;
.

和a,l(注意位屏蔽)

(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
.

我知道所有的位操作,我知道他们做了什么,但似乎我无法弄清楚为什么它需要这样做。我有一些理论(如果我错了,请纠正我: - )):

已经理解的是,寄存器H和L基本上是寄存器HL,这是一个16位寄存器。由于CPU /总线只能处理8位操作,因此需要拆分; 或者逻辑建议越多:由于其仅一个寄存器,因此H和L的值在寄存器中屏蔽,它们只是需要彼此分开(更高/较低的蚕食?)。

如果有人能够对我做出更清楚的话,我会非常感激,因为我只想拥有更多的背景知识(所有这些东西在内部工作),这对我来说非常重要,我知道我正在做什么。

有帮助吗?

解决方案

作为评论指出,您发现的实现将H和L存储器一起存储为16位实体HL,然后通过屏蔽关闭将其分解为H,屏蔽纯粹是一种实现具体。

原始z80有一个4位的alu(请参阅在计算机历史博物馆面板的此成绩单)因此它实际上(i)和L和累加器的低四位;然后(ii)和L和蓄能器的高四位。然而,它将其寄存器暴露为离散的8位实体,因此内部实现完全隐藏。

HL称为寄存器对,因为它是两个寄存器一起携带,以制作16位数量。忽略阴影和索引寄存器,原始Z80实际上有三个 - HL,BC和DE。 BC和de在GameBoy的CPU中生存为间接加载的替代对(如操作码0x1A - LD A,(BC))和16位算术(例如,0x09添加HL,BC),并且在a上有一些其他用途Z80。

sp和pc通常被认为是不可分割的16位寄存器(当然,当然,您可以通过将它们存储到内存并单独读回字节来划分它们),而af存在用于推动和弹出,但f是如此特殊AF通常通常特别有用作为16位整数。

简短摘要然后:您没有了解如何实现OPCodes 所实施的问题,仅仅是由特定作者实现的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top