Z80:从栈顶复制到 HL
Z80: Copying from Top of Stack to HL
这可以通过以下方式完成:
11 pop hl
10 push hl
在 21 个周期内。我发现的唯一替代方案是 ex (sp),hl
,它需要 19 个周期。缺点是内容必须在我处理完后才能恢复到原来的值,所以在实践中,这种方法比第一种方法更昂贵。
还有其他选择吗?
如果您想将堆栈顶部的值放入 HL,那么您已经列出了几乎所有可用选项:
pop hl : push hl ; 10+11 = 21t
或
pop hl : dec sp : dec sp ; 10+6+6 = 22t
你也可以做self-modified代码,这不会有太大好处:
ld (addr1+1),sp
addr1: ld hl,(0) ; 20 + 16 = 36t
更别扭的是,可以先把SP弄成HL:
ld hl,0 : add hl,sp
ld a,(hl) : inc hl : ld h,(hl) : ld l,a ; 10+11 + 7+6+7+4 = 21+24 = 45t
(我提到了最后两个选项,以防万一在您的情况下您可以以某种方式从其中一个中受益。)
命令
ex (sp),hl ; 19t
用HL的当前值交换栈顶的值,所以已经不是你要的了(虽然很快)。因此,进一步加快速度的唯一方法就是以各种方式作弊。有一些看似最明显的作弊方法:
如果你真的知道 SP 指的是哪里,简单地阅读它会更快:
ld hl,(wherethestackis) ; 16t
如果你能控制堆栈的确切位置,或者堆栈实际包含什么,你可以将它指向将值加载到 HL 的命令,这样你就可以简单地做
ld hl,thevalueonthestack ; 10t
我知道这两个选项看起来都很极端,但我知道很多高度优化的 Z80 代码都受益于类似的技巧。所以,请不要直接解雇他们。
这可以通过以下方式完成:
11 pop hl
10 push hl
在 21 个周期内。我发现的唯一替代方案是 ex (sp),hl
,它需要 19 个周期。缺点是内容必须在我处理完后才能恢复到原来的值,所以在实践中,这种方法比第一种方法更昂贵。
还有其他选择吗?
如果您想将堆栈顶部的值放入 HL,那么您已经列出了几乎所有可用选项:
pop hl : push hl ; 10+11 = 21t
或
pop hl : dec sp : dec sp ; 10+6+6 = 22t
你也可以做self-modified代码,这不会有太大好处:
ld (addr1+1),sp
addr1: ld hl,(0) ; 20 + 16 = 36t
更别扭的是,可以先把SP弄成HL:
ld hl,0 : add hl,sp
ld a,(hl) : inc hl : ld h,(hl) : ld l,a ; 10+11 + 7+6+7+4 = 21+24 = 45t
(我提到了最后两个选项,以防万一在您的情况下您可以以某种方式从其中一个中受益。)
命令
ex (sp),hl ; 19t
用HL的当前值交换栈顶的值,所以已经不是你要的了(虽然很快)。因此,进一步加快速度的唯一方法就是以各种方式作弊。有一些看似最明显的作弊方法:
如果你真的知道 SP 指的是哪里,简单地阅读它会更快:
ld hl,(wherethestackis) ; 16t
如果你能控制堆栈的确切位置,或者堆栈实际包含什么,你可以将它指向将值加载到 HL 的命令,这样你就可以简单地做
ld hl,thevalueonthestack ; 10t
我知道这两个选项看起来都很极端,但我知道很多高度优化的 Z80 代码都受益于类似的技巧。所以,请不要直接解雇他们。