问题标签 [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.
interrupt - IM0 中的 Z80 多字节命令
我只是为了好玩而设计一个带有很多外围设备的更复杂的 Z80 CP/M 系统。在阅读文档时,在接受 IM0 中的中断时,我偶然发现了 Z80 CPU 的(未记录的?)行为。
当中断发生时,Z80 激活 M1 和 IORQ 向外部设备发出信号:“嘿,给我一个操作码”。如果操作码是 rst 00 或类似的东西,一切都很好。现在文档告诉我们,任何命令的任何操作码都可以提供给 cpu,例如 CALL。
但现在出现了未记录的部分:“在中断确认周期期间读取多字节指令的第一个字节。随后的字节由正常的内存读取序列读取。”
“正常的内存读取序列”。我如何确定 CPU 是想从内存中获取一个字节,还是从设备中获取下一个字节?
编辑:我想,我找到了一个(好的?)解决方案:我可以通过分析 IORQ 和 M1 来检测中断确认周期的开始。我还可以通过分析 MREQ 和 M1 来检测下一个“正常”操作码获取。这样我就可以安装一个由这两个 AND 信号触发的触发器,即只要 CPU 从 io-device 读取数据,触发器就是 1。这个 1 我可以用来禁止总线驱动程序进出内存。
我的意图?我正在设计一个 CPLD 中具有 8 个优先输入的中断控制器。它的寄存器为每个中断引脚保存一个 16 位地址。只是为了好玩:-)
c - 带有系统寄存器和中断的 GameBoy 编译器
我花了很多时间学习 GameBoy 编程,因为我已经熟悉 Z80 Assembly,所以我不害怕投入使用它。我(当然)会发现用 C 或 C++ 编程效率更高,但是找不到适用于 GameBoy 的完整编译器,我可以找到的编译器自己管理所有内容,并且不向程序员提供对系统寄存器的访问权限,并且还有一些可怕的缺点,例如 100% CPU 利用率和不支持中断。
是否可以像 Arduino 的 AVR 编译器一样寻址系统寄存器?能够简单地使用其名称来寻址 CPU 或系统寄存器,例如DDRD = %10101011
我需要做什么才能将中断和系统寄存器添加到编译器中?除了一个系统寄存器之外,所有寄存器都只有一个字节的内存地址,中断向量当然是内存位置,唯一一个不是内存地址的系统寄存器只能用两条汇编指令修改EI
,DI
但这可能是内联函数,对吗?
z80 - Z80 软件延迟
我正在尝试创建软件延迟。这是我正在做的示例程序:
我的问题是如何计算加载到寄存器 B 所需的固定值,以便将值递减到 0 的过程需要 2 秒?
在我的手册中,运行指令的时间基于 4MHz CPU,但我使用的 Z80 CPU 的速度为 1.8MHz。知道如何计算吗?谢谢。PS这里是手册中的递减(DEC)和跳转(JP cc)说明:
assembly - GBDK 编译器中的二次幂乘法错误
我目前正在开发一个gameboy模拟器并测试我的模拟器的正确性,我正在使用GBDK为我的模拟器编译c程序。
我注意到编译器(如预期的那样)通过旋转来优化乘法与常量的乘法,这些常量是 2 的幂。但是,对于给定的功率,它似乎不会产生正确的旋转量。
例如以下非常简单的程序:
生成以下程序集:
对我来说这似乎是不正确的,因为 RR 指令实际上是通过进位标志旋转的,有效地使其成为 9 位旋转。这意味着应该有一个额外的旋转来产生正确的结果,而不是当前 (0x40) 的错误结果。
可视化:
谁能验证这确实是GBDK附带的SDCC编译器中的一个错误?我也对旋转后使用 and 指令感兴趣。
使用来自 sourceforge 的最新 (3-2.93) 版本的 GBDK for windows。
assembly - 需要帮助理解此代码(Z80 汇编程序)
我尝试浏览我拥有的文档,但这真的很混乱,我需要在考试中理解这一点,但我遇到了很多麻烦。
我了解大多数“功能”(ld、add、jp、inc)分别做什么,我不明白的是:
1) 在第一行将什么值加载到 IX 中?(变量?)向量上有 4 个值,我在 z80 模拟器中尝试了这个,它说 IX 得到值 0019,但我看不出这是从哪里来的......
2)我是否正确理解“vector:db 12,7,9,21”创建了一个值为12,7,9,21的数组?
3)“结束开始”行做什么?
4)“金额”持有的价值是多少?
z80 - Game Boy 上 CP 的进位标志的行为是什么?
在Game Boy CPU 手册的第 87 页上,声称该CP n
指令在没有借位时设置了进位标志,这意味着A < n
. 这似乎与自身冲突,因为进位标志是在A > n
.
一个例子:如果A=0
和B=1
,CP B
设置标志如SUB A, B
,即 0 - 1。这变为 0 + 255 = 255 并且未设置进位标志,即使A < B
.
我在其他 Z80 文档中也遇到了同样的问题,所以我不认为这是一个错字。
我是否误解了借贷和SUB
工作的方式,还是发生了其他事情?在标志方面不SUB
等于ADD
与二进制补码?
assembly - 8 位 Z80 处理器中 LD 指令中的值表示什么?
我很难理解这段代码中发生的事情:
ADD
以及在指令之后将哪些标志设置为 1 。
基本上,我不知道寄存器中存储了什么值B
。
我找不到任何信息130 inLD B, 130
是指“1000 0010”还是“0 1000 0010”(所以随后我们必须摆脱 MSB/LSB - 我不知道是哪一个)。
因此,我不确定存储在A
.
assembly - 将表示短的两个字节乘以 1.5
我正在查看一些汇编代码并遇到以下内容(为了便于阅读,我已对其进行了转换)。所有寄存器均为 8 位,指针为 16 位。所以(q)
加载8位。
(q+1) = (q+1) = rr(q+1)
在哪里(q)
取消引用q
并rr(q)
向右旋转
(q) = (q) + (q)/2 + bit((q+1), 0)
在哪里bit((q+1), 0)
获得第 0 位(q+1)
这真的让我很困惑,因为上面的代码所做的是将一个 16 位的值乘以 1.5,而不管它的字节序(即,无论您将 q 解释为小字节序还是大字节序,它的值在其各自的字节序中乘以 1.5)。
我对他们如何使用两个 8 位值将 16 位值乘以 1.5 感到困惑。这里发生了什么?具体来说,添加的第0位和向右(q+1) to (q)
旋转的目的是什么?(q+1)
这是汇编代码:
assembly - z80 的装配冒泡排序
我有一个大学作业。我需要为 z80 处理器编写一个汇编程序。该程序应执行以下操作。
从 0201H 开始的 20 个连续内存地址中存储了 20 个数字。程序应首先检查存储在 0200H 中的数字。如果值为 0,则程序应按升序对数字进行排序,否则按降序排序。最后在排序结束后,程序应该计算这 20 个数字的平均值。
我知道这个问题不是根据网站的规则形成的,但我真的需要帮助。
sd-card - z80 的 SPI 硬件接口
我正在尝试使用 z80 制作一台复古计算机,理想情况下希望它能够从 SD 卡启动。我 100% 准备使用 z80,不想使用带有内部 SPI 硬件接口的微控制器。我想了解计算机的硬件和软件方面,所以 arduinos 和微控制器不在桌面上,因为硬件方面在你购买之前就已经完成了。无论如何,我的主要问题是是否可以结合移位寄存器、一些解码逻辑和软件通过 SPI 模式从 SD 卡读取?我已经在互联网上搜索了几个小时并阅读了几篇文章,但似乎找不到教程。我了解 SPI 协议,但是缺乏有关硬件方面的信息,因为微控制器倾向于内置所有硬件。我打算将SD卡的SOMI连接到移位寄存器的串行输入引脚,SD卡的SIMO连接到移位寄存器的串行输出引脚,然后将一些数据引脚连接到一些触发器和一些解码之间的逻辑,因此如果我输出到特定端口,它将切换触发器。触发器将用作 SD 卡的时钟和芯片使能线。我还将 z80 的一个引脚连接到移位寄存器的锁存引脚(同样在其间使用解码逻辑),这样如果我输出到特定端口,它将锁存移位寄存器的数据。我不关心速度/效率,只要我能准确地从 SD 卡读取数据。另外,我是否将移位寄存器时钟输入连接到与连接 SD 卡的时钟相同的时钟?任何有关如何实现这一点的建议将不胜感激,