Вы можете сделать это очень быстро в машинном коде, вычитая несколько раз. Обычно у вас есть такая процедура:
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, должно помочь вам понять это. Это объяснит флаги, если вы с ними не знакомы.
На основном сайте есть много ссылок на хорошие материалы по Z80, хотя речь идет о спектруме, а не о ZX81.
16-битная версия была бы очень похожа, но с использованием операций пары регистров. Если вам нужно выйти за пределы 16 бит, это будет немного более запутанным.
Как вы загружаете это, зависит от вас - но традиционный метод использует операторы DATA и POKE. Вы можете предпочесть, чтобы ассемблер выяснил машинный код для вас!