由于许多项目欧拉问题都需要相当的次数做一个整除检查,我一直在试图找出最快的方式在的 ZX81 BASIC。

到目前为止,我比较(N/D)INT(N/D)检查,N是否是D可分与否。结果 我一直在想这样做的测试中 Z80的机器代码,我还没有想出如何使用在BASIC中的变量的机器代码。

怎样才可以实现?

有帮助吗?

解决方案

不知道RANDOMIZE USR是ZX81可用,但我认为它可以用于调用程序汇编。为了传递参数,你可能需要使用POKE执行RANDOMIZE USR之前设置一些固定的内存位置。

我记得找在ROM中实施,以支持ZX基本程序的列表。我敢肯定,有几个执行浮点运算。

到浮点一种替代方法是使用定点算术。这是在这些类型的情况下有没有数学协处理器快了很多。

您也可能会发现在辛克莱用户问题的详细信息。他们发表在ZX频谱相关的编程的一些文章

其他提示

您可以非常快的机器代码通过反复减去做到这一点。基本上你有一个像过程:

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的回报是在公元前寄存器对什么的,所以你可能会想要做的事,如:

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应该帮助你摸不着头脑。这将解释标志,如果你不熟悉他们。 有一个负载从主站点链接到好东西Z80虽然它是频谱,而不是ZX81重点。

一个16位版本将是相当类似,但使用寄存器对的操作。如果你需要超越16位,将获得多一点令人费解。

您如何加载,这是由你 - 而传统的方法是使用数据报表和扑克。您可能希望有一个汇编弄不清机器代码,你尽管!

您现有解决方案可能是足够好的。用的东西,如果你发现它是在剖析瓶颈,只有更换速度更快。

(所述着脸当然。)

和反正在ZX81你可以切换到快速模式。

您应该将在一些预定公知的存储器位置中的值,第一个。然后使用相同的位置从Z80的汇编内。没有参数两者之间传递。

这是基于什么我(仍然)记得的ZX频谱48.祝你好运,但你可能会考虑升级硬件。 ; /

与Z80的机器代码的问题是,它没有浮点OPS(没有整数除法或乘法,对于这个问题)。在实施Z80汇编自己FP库是不平凡的。当然,你可以使用内置的基本套路,但你可能也只是坚持用BASIC。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top