由于许多Project Euler问题要求你进行很多次的可分性检查,我一直试图找出在ZX81 BASIC中执行此任务的最快方法.
到目前为止,我已经比较(N/D)
了INT(N/D)
检查,是否N
可以分类D
.
我一直在考虑在Z80机器代码中进行测试,我还没有弄清楚如何在机器代码中使用BASIC中的变量.
如何实现?
您可以通过重复减去机器代码来快速完成此操作.基本上你有一个程序,如:
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.您可能更愿意让汇编程序为您找出机器代码!