Сообщение от
Шынни
непонятно(
Всё просто - вместо того чтоб делать CP D или SUB D - юзается не прямой делитель, а с обратным знаком.
Классический алгоритм (без NEG):
Код:
DUP 8
RLA
SUB D
JP NC,1F
ADD A,D
1 RL H
EDUP
Даст правильный ответ, но в инверсном виде, т.е. после всего надо ещё делать LD A,H:CPL:LD H,A (почему так - лучше разобратся как происходит двоичное деление)
А если делитель инвертировать - то заменой SUB/ADD/JP - можно добится что флаг С сразу будет выставлятся "наоборот".
На понимание этого и эксперименты я потратил пару дней (в свободные минуты на работе)
Вообще изначально код из статьи был этот:
Код:
1.1 Пример_простейшей_процедуры_деления:
НА ВХОДЕ : C = Делимое, В = Делитель
НА ВЫХОДЕ: L = результат, A = остаток
;L=C/B:
DIVIS XOR A ;обнуление текущего остатка
DIVIS2 LD L,#01 ;счетчик (сдвиг 8 раз)
D1 RL C ;чтение текущего разряда
RLA ;накопитель разрядов
CP B ;какой результат текущего разряда
JR C,ZER ;переход,если текущий разряд=0
SUB B ;тек.разряд=1,снятие с накопителя
SLI L ;занесение разряда=1
JR NC,D1 ;переход,если счетчик не переполнился
RET ;выход
ZER SLA L ;занесение разряда=0
JR NC,D1 ;переход,если счетчик не переполнился
RET ;выход