有没有办法将代码添加到无限 z80 汇编循环中?
Is there a way to add code to an infinite z80 assembly loop?
前一段时间,我问过 TI-84 上最快的无限循环是什么。我参与使用带有此代码的程序集无限循环的答案之一:
AsmPrgm
18FE
但是,这有点不切实际,因为它只能通过重置按钮退出,并且运行里面没有任何东西。
有没有办法将 TI-Basic 代码放入此循环中and/or 使其有条件地退出?
这里是 link 原问答:
$18FE 是 jr -2,它本身向后循环两个字节。您会希望在循环开始后出现额外的逻辑,让您逃脱(即检查按钮按下),然后让它循环回到该标签。为此,您需要调整 $FE 值,因为那是跳跃的距离。它是一个带符号的 8 位值,因此请确保您获得所有条件代码,然后根据您使用的字节数返回分支。
关于您的原始(链接)问题,jr $ 并不是 Z80 上可能最快的循环,因为最快的循环是 jp $(实际上是 jp (hl)),其中 $ 表示当前指令的地址。
最快的可退出循环可以通过三种方式完成,具体取决于您对 'loop' 的定义是什么以及应该如何退出循环:
- 使用中断退出上述循环:在这种情况下,您应该在中断中展开堆栈(删除return地址)并跳转到其他地方。
- 像这样使用循环:
IN reg,(C)
JP cc,$-2
其中 IN reg,(C) 命令还根据从端口读取的值设置 S(符号)、Z(零)和 P/V(奇偶校验)标志,JP cc 使用这些标志之一来继续循环或离开它。
- 使用
HALT
,中断自然退出
已知Z80执行HALT
的方式是不断从内存中获取HALT
指令后的相同字节,然后忽略它,直到捕捉到中断。这种行为可以描述为循环,直到捕获到中断。这种行为的根本原因是 Z80 自然会在每次获取操作码时刷新 DRAM,并且在 HALT
执行期间保持刷新。
你绝对可以让汇编程序有条件地退出。命令 C9
是 return,因此如果您的程序仅由 AsmPrgmC9
、运行 组成,它作为汇编程序将立即完成(看起来一样作为 运行 一个什么都没有的程序)。如果您想在满足某些条件时结束循环,那么您需要开始学习汇编,因为答案会根据条件和您使用的 OS version/calculator 的不同而有很大差异。
前一段时间,我问过 TI-84 上最快的无限循环是什么。我参与使用带有此代码的程序集无限循环的答案之一:
AsmPrgm
18FE
但是,这有点不切实际,因为它只能通过重置按钮退出,并且运行里面没有任何东西。
有没有办法将 TI-Basic 代码放入此循环中and/or 使其有条件地退出?
这里是 link 原问答:
$18FE 是 jr -2,它本身向后循环两个字节。您会希望在循环开始后出现额外的逻辑,让您逃脱(即检查按钮按下),然后让它循环回到该标签。为此,您需要调整 $FE 值,因为那是跳跃的距离。它是一个带符号的 8 位值,因此请确保您获得所有条件代码,然后根据您使用的字节数返回分支。
关于您的原始(链接)问题,jr $ 并不是 Z80 上可能最快的循环,因为最快的循环是 jp $(实际上是 jp (hl)),其中 $ 表示当前指令的地址。 最快的可退出循环可以通过三种方式完成,具体取决于您对 'loop' 的定义是什么以及应该如何退出循环:
- 使用中断退出上述循环:在这种情况下,您应该在中断中展开堆栈(删除return地址)并跳转到其他地方。
- 像这样使用循环:
IN reg,(C)
JP cc,$-2
其中 IN reg,(C) 命令还根据从端口读取的值设置 S(符号)、Z(零)和 P/V(奇偶校验)标志,JP cc 使用这些标志之一来继续循环或离开它。
- 使用
HALT
,中断自然退出
已知Z80执行HALT
的方式是不断从内存中获取HALT
指令后的相同字节,然后忽略它,直到捕捉到中断。这种行为可以描述为循环,直到捕获到中断。这种行为的根本原因是 Z80 自然会在每次获取操作码时刷新 DRAM,并且在 HALT
执行期间保持刷新。
你绝对可以让汇编程序有条件地退出。命令 C9
是 return,因此如果您的程序仅由 AsmPrgmC9
、运行 组成,它作为汇编程序将立即完成(看起来一样作为 运行 一个什么都没有的程序)。如果您想在满足某些条件时结束循环,那么您需要开始学习汇编,因为答案会根据条件和您使用的 OS version/calculator 的不同而有很大差异。