我正在为优秀的旧GameBoy开发一个模拟器,我正面临一些问题,理解一些基本的操作代码必须如何实现。
现在我正在实施AND操作;前几个(0xA0 - > 0xA3; 0xA6和0xA7)非常简单,但寄存器H,L的AND运算有点不同。
您可以在此链接下载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;
AND A,L(注意位屏蔽)
(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
我知道所有的位操作,我知道他们做了什么,但似乎我无法弄清楚为什么需要这样做。我有一些理论(如果我错了,请纠正我: - )):
我已经理解的是,寄存器H和L基本上是寄存器HL,它是一个16位寄存器。由于CPU /总线只能处理8位操作,因此需要将其拆分; 或更多的逻辑建议:由于它只有一个寄存器,H和L的值在寄存器中被屏蔽,它们只需要彼此分开(高/低半字节?)。
如果有人能够让我更清楚,我会深表感激,因为我只想拥有更多的背景知识(这些内容如何在内部运作)所以对我来说非常重要,因为我知道自己在做什么。
答案 0 :(得分:11)
正如评论所指出的那样,你发现的实现将H和L寄存器一起存储为16位实体HL,然后通过向右移位将其分解为H并通过屏蔽关闭将其分解为L纯粹是一种实现具体
原始z80有一个4位ALU(参见Shima的评论从this transcript of a Computer History Museum panel的第9页开始),所以它实际上(i)和L的低4位和累加器;然后(ii)和L的高四位和累加器。然而,它将其寄存器公开为离散的8位实体,因此内部实现完全隐藏。
HL被称为寄存器对,因为它是两个寄存器,它们组合在一起形成一个16位的数量。忽略阴影和索引寄存器,原始的z80实际上有三个 - HL,BC和DE。 BC和DE在Gameboy的CPU中存在作为间接加载的替代对(例如操作码0x1a-LD A,(BC))和16位算术(例如,0x09 ADD HL,BC)并且在a上具有一些其他用途。 Z80。
SP和PC通常被视为不可分割的16位寄存器(当然,你可以通过将它们存储到存储器并单独读回字节来划分它们)并且AF存在用于推送和弹出但是F是如此特殊AF通常不是特别有用的16位整数。
简短摘要:您没有理解如何