问题标签 [z80]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
math - Z80 上的溢出和进位标志
我已经开始在我的 Z80 内核上实现 ADD A,r 组操作码。我对我认为我已经确定的进位和溢出标志有点困惑,但我想把它交给社区来检查我是否正确。
基本上,据我所知,Z80 中的 ALU 并不关心有符号/无符号操作,它只是添加位。这意味着如果将两个 8 位值相加并作为相加的结果产生一个 9 位值,则将设置进位标志。这包括添加两个负的二进制补码,例如 -20 (11101100) 和 -40 (11011000),虽然结果是 -60 (11000100),但结果实际上是一个 9 位值 1 1100 0100。这肯定意味着如果添加两个负的二进制补码值,则将始终设置进位标志,即使没有溢出条件 - 我是对的吗?
其次,我决定要检测这条指令中的溢出,我将对两个操作数的第 7 位进行异或运算,如果结果是 10000000,那么肯定没有溢出 - 如果结果是 00000000,那么可能会有溢出为符号相同,因此我会将加法结果的第 7 位与任一操作数的第 7 位进行异或运算,如果结果为 10000000,则发生溢出并设置 P/V 溢出标志。我也在这里吗?
抱歉,这个令人费解的问题,我很确定我是对的,但在我继续基于这个逻辑的无数指令之前,我需要知道。非常感谢。
math - Z80 DAA指令
为这个看似次要的问题道歉,但我似乎无法在任何地方找到答案 - 我只是想在我的 Z80 模拟器中实现 DAA 指令,我在 Zilog 手册中注意到它是为了调整二进制编码十进制算术的累加器。它说该指令旨在在加法或减法指令之后立即运行。
我的问题是:
- 如果它在另一条指令之后运行会发生什么?
- 它怎么知道它之前的指令?
- 我意识到有 N 标志 - 但这肯定不会明确表明前一条指令是加法或减法指令?
- 不管前面的指令如何,它是否只是根据 DAA 表中规定的条件修改累加器?
interrupt - Zilog Z80 - 如何使用中断模式1(IM 1指令)
我想在 Z80 上使用 IM 1 中断模式。
在中断模式 1 中,处理器跳转到内存中的 38h 地址(对吗?),然后继续中断。如何在我的代码中指定它?我读过:
defs [,] ds [,] 这个伪指令在代码段中插入一个字节块
我需要一些示例源代码。
亲切的问候
拉法尔·R。
math - DAA 指令中的半进位/半借位标志
抱歉,这是我的第二个 Z80 DAA 问题——我现在已经几乎实现了这条指令,但有一点我不确定——这条指令是否设置了 H 标志?Z80 手册说“看指令”,但它只提到了 DAA 之前的标志,而不是在它执行之后。
我将标志设置如下:
如果结果为负(0x80 和结果等于 0x80)则设置 S 如果结果为零则设置 Z H(不确定因此这个问题) P/V 设置为结果的奇偶校验(如果是偶数则为 1,如果为奇数则为 0)N如果修改了原始累加器值的较高半字节,则设置 C
除此之外,该指令似乎按照我的预期执行:-) 我希望有人可以为我解决这个问题,非常感谢。
io - Z80 上未记录的 16 位 I/O 寻址
我从 Z80 上的 Zilog 数据表中注意到,对于 I/O(IN 和 OUT)组指令,各种寄存器的内容通常放在地址总线的前 8 位(取决于指令),其中低 8 位选择最多 256 个理论上连接的设备之一。
我的问题是用这些高 8 位这样做有什么意义?我知道有些机器以某种方式使用它来降低解码复杂性,但它们真的用于任何事情吗?我想完全按照 Z80 的建议执行指令,但我看不出执行此行为的意义,因为它是非标准的。这种行为被描述为无证,例如,在“世嘉主系统”上,我能侥幸逃脱吗?非常感谢。
问候,菲尔·波特
fetch - Z80内存刷新寄存器
我再次提出另一个无害的 Z80 问题 :-) 我的仿真器内核当前的结构方式,每次从内存中获取操作码字节时,我都会递增内存刷新寄存器的低 7 位 - 这意味着多字节指令,例如作为开始 DD 或 FD 的那些,我将寄存器增加两次 - 或者在 RLC (IX+d) 等指令的实例中增加三次(因为它的布局是 opcode1-opcode2-d-opcode3)。
它是否正确?我不确定 - Z80 手册对此有点不清楚,因为它说 CPDR(一个两字节指令)将其递增两次,但是“内存刷新寄存器”部分仅表示它在每次指令获取后递增。我注意到 J80(我检查过的一个模拟器,因为我不确定)只在指令的第一个操作码字节之后递增。
哪个是对的?我想这在任何情况下都不是很重要,但很高兴知道:-) 非常感谢。
问候,菲尔·波特
emulation - Game Boy:什么是“半进位”?
Game Boy Z80 CPU 有一个半进位标志,我似乎找不到太多关于何时设置/清除它的信息。
到目前为止,我所理解的是,任何 8 位加法、减法、移位或旋转操作(可能还有其他操作?)将其设置为结果的第 4 位(?),并且 DAA 指令以某种方式设置/使用它。我不确定16位指令如何影响它以及它是否受到使用某些寄存器的影响。
assembly - Z80 Asm - Hex 如何创建字符串
我更喜欢在我的计算器上用十六进制编码。我知道我的操作码和什么不知道,但我不确定如何在寄存器 HL 中创建字符串“hello”。你能帮忙吗?我已经用谷歌搜索了它,但很难找到答案,因为大多数人使用为他们处理这个问题的编译器。不过,我想以艰难而富有挑战性的方式做到这一点。但我想要最有效的十六进制方式。
我试过了....
[此处的代码] C9 - 返回 [此处的字符串]
...但似乎 LD 没有办法获取相关数据。所以我什至无法获得C9之后的地址位置。有小费吗?
c - Zilog Z80 OP-Code 实现
我目前正在为老式的 GameBoy 开发一个模拟器,但我在理解一些基本操作代码必须如何实现时遇到了一些问题。
现在我正在实施 AND 操作;前几个(0xA0 -> 0xA3;0xA6 和 0xA7)非常简单,但寄存器 H、L 的 AND 操作有点不同。
您可以在此链接下下载 z80 的文档: um0080.pdf(第 172 页)
这里有一些例子来说明我的意思(使用伪代码)以及我所做的基本上是什么:
AND A,H(注意位移)
AND A,L(注意位掩码)
我知道所有的位操作,也知道它们的作用,但似乎我无法弄清楚为什么需要这样做。我有一些理论(如果我错了,请纠正我:-)):
我已经了解的是,寄存器 H 和 L 基本上是寄存器 HL,它是一个 16 位寄存器。由于 CPU/Bus 只能处理 8-Bit 操作,所以需要拆分;或更逻辑的建议:由于它只有一个寄存器,因此 H 和 L 的值在寄存器中被屏蔽,它们只需要彼此分开(高/低半字节?)。
如果有人能让我更清楚这一点,我将不胜感激,因为我只想拥有更多的背景知识(所有这些东西在内部是如何工作的),所以我知道自己在做什么对我来说非常重要。