首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zilog Z80 OP-代码实现

Zilog Z80 OP-代码实现
EN

Stack Overflow用户
提问于 2012-03-12 19:30:29
回答 1查看 1.8K关注 0票数 15

我目前正在为好的旧GameBoy开发一个仿真器,我面临一些问题,不知道如何实现一些基本的操作代码。

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

您可以在以下链接下载z80的文档:um0080.pdf (第172页)

下面是一些例子来展示我的意思(用伪代码),以及我所做的工作:

和A,H(注意位移位)

代码语言:javascript
复制
(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(注意位掩蔽)

代码语言:javascript
复制
(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;

我知道所有的位操作,我知道它们是做什么的,但我似乎不知道为什么需要这样做。我有一些理论(如果我错了就纠正我:-):

我已经理解的是,寄存器H和L基本上是寄存器HL,它是一个16位寄存器。由于CPU/总线只能处理8位操作,所以需要拆分;或者更符合逻辑的建议是:由于它只有一个寄存器,因此H和L的值在寄存器中被屏蔽,它们只需要彼此分离(更高/更低的咬口?)。

如果有人能更清楚地告诉我这一点,我将非常感激,因为我只是想了解更多的背景知识(所有这些东西是如何内部工作的),所以我知道自己在做什么是非常重要的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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位整数通常并不特别有用。

那么,简短的总结:在理解操作码必须如何实现方面没有问题,仅仅是理解操作码是如何由特定作者实现的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9673551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档