我目前正在为好的旧GameBoy开发一个仿真器,我面临一些问题,不知道如何实现一些基本的操作代码。
现在我正在实现AND操作;前几个(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的值在寄存器中被屏蔽,它们只需要彼此分离(更高/更低的咬口?)。
如果有人能更清楚地告诉我这一点,我将非常感激,因为我只是想了解更多的背景知识(所有这些东西是如何内部工作的),所以我知道自己在做什么是非常重要的。
发布于 2012-03-13 01:19:33
正如注释所指出的那样,您发现的实现将H和L注册为16位实体HL,然后通过右移将其分解为H,然后通过掩蔽将其分解为L,这纯粹是一个实现特定的事实。
最初的z80有一个4位的ALU (参见这是电脑历史博物馆小组的成绩单第9页底部开始的Shima注释),因此它实际上会(i)和低四位L和累加器;然后(ii)和高四位L和累加器。但是,它将寄存器公开为离散的8位实体,因此内部实现是完全隐藏的。
HL被称为寄存器对,因为它是两个寄存器加在一起形成一个16位的数量。忽略阴影和索引寄存器,原始z80实际上有三个- HL,BC和DE。BC和DE在Gameboy的CPU中作为间接加载(如操作码0x1a - LD A,( BC) )和16位算术(例如0x09添加HL,BC)的替代对而存活,并在z80上有一些其他用途。
SP和PC通常被认为是不可分割的16位寄存器(当然,您可以通过将它们存储到内存中并单独读取字节来将它们分开),并且AF存在于推送和弹出中,但是F是如此特殊,因此AF作为16位整数通常并不特别有用。
那么,简短的总结:在理解操作码必须如何实现方面没有问题,仅仅是理解操作码是如何由特定作者实现的。
https://stackoverflow.com/questions/9673551
复制相似问题