当前位置:  开发笔记 > 编程语言 > 正文

ZX81 BASIC中的快速可分性检查

如何解决《ZX81BASIC中的快速可分性检查》经验,为你挑选了1个好方法。

由于许多Project Euler问题要求你进行很多次的可分性检查,我一直试图找出在ZX81 BASIC中执行此任务的最快方法.

到目前为止,我已经比较(N/D)INT(N/D)检查,是否N可以分类D.
我一直在考虑在Z80机器代码中进行测试,我还没有弄清楚如何在机器代码中使用BASIC中的变量.

如何实现?



1> cyborg..:

您可以通过重复减去机器代码来快速完成此操作.基本上你有一个程序,如:

set accumulator to N
subtract D
if carry flag is set then it is not divisible
if zero flag is set then it is divisible
otherwise repeat subtraction until one of the above occurs

8位版本将是这样的:

DIVISIBLE_TEST:
LD B,10
LD A,100

DIVISIBLE_TEST_LOOP:
SUB B
JR C, $END_DIVISIBLE_TEST
JR Z, $END_DIVISIBLE_TEST
JR $DIVISIBLE_TEST_LOOP

END_DIVISIBLE_TEST:
LD B,A
LD C,0
RET

现在,您可以使用USR从基本呼叫.USR返回的是BC寄存器对中的任何内容,因此您可能希望执行以下操作:

REM poke the memory addresses with the operands to load the registers
POKE X+1, D
POKE X+3, N
LET r = USR X
IF r = 0 THEN GOTO isdivisible
IF r <> 0 THEN GOTO isnotdivisible

这是我写给Z80的介绍,应该可以帮助你解决这个问题.如果您不熟悉它们,这将解释标志.虽然它是Spectrum而不是ZX81,但是有更多链接可以从主站点获得良好的Z80内容.

16位版本将非常相似,但使用寄存器对操作.如果你需要超过16位,它会有点复杂.

如何加载它取决于你 - 但传统的方法是使用DATA语句和POKE.您可能更愿意让汇编程序为您找出机器代码!

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有