Разрядное деление
Вход: HL – делимое; A – делитель.
Выход: C – частное; H – остаток.
В процессе работы используются все регистры общего назначения.
DIV: LD BC,0800h ; Счётчик разрядов в регистре B
LD H,C
LD E,H
LD D,A ; Копия делителя
LOOP: ADD HL,HL ; Сдвиг делимого влево
LD A,H ; Определение очередной цифры результата
CP D
JR C,NEXT
SBC HL,DE ; Вычитание делителя из текущего остатка
NEXT: CCF ; Формирование очередной цифры результата
RL C
DJNZ LOOP ; Цикл, пока не обработаны все разряды
RET
[1] В этой и последующих командах данной группы, кроме LDIR и LDDR, флаг P/V сбрасывается, если после уменьшения BC становится равным нулю, и устанавливается в противном случае.
[2] Каждый проход инструкций с автоматическим повторением выполняются за 21 такт, если условие повторения выполнено, и за 16 тактов в противном случае.
[3] Сравнение выполняется путём вычитания содержимого ячейки памяти (HL) из аккумулятора. Результат вычитания теряется, но на его основе формируются значения флажков.
[4] В этой и последующих инструкциях условного относительного перехода выполнение команды занимает 7 тактов, если условие перехода не соблюдается, и 12 тактов, если соблюдается.
[5] Инструкция DJNZ выполняется 8 тактов, если после декремента B=0 (переход не выполняется), и 13, тактов, если B?0 (переход выполняется).
[6] В командах условного вызова подпрограммы (CALL cc,nn) и условного возврата из подпрограммы (RET cc) меньшее количество тактов соответствует ситуации, когда условие не выполнено (переход не происходит), а большее количество тактов – ситуации, когда условие выполнено (переход происходит).
[7] В инструкциях IN A,(p) и OUT (p),A младший байт адреса порта содержится в коде команды (p), а старший – в аккумуляторе. В остальных инструкциях этой группы 16-разрядный адрес порта содержится в регистровой паре BC.
Инструкция IN r,(C) при коде r, равном 110, производит соответствующую прочитанному значению установку или сброс флажков, но само прочитанное значение не сохраняет. Действия инструкции OUT (C),r в такой же ситуации не определены.
В инструкциях INI, IND, OUTI и OUTD флажок Z устанавливается, если содержимое регистра B было обнулено, или сбрасывается, если в B получено ненулевое значение. По этой же причине в инструкциях INIR, INDR, OTIR и OTDR этот флажок всегда устанавливается.
Большая длительность инструкций INIR, INDR, OTIR и OTDR соответствует ситуации, когда содержимое регистра B отлично от нуля, т.е. когда выполнение инструкции продолжается; меньшая длительность – когда регистр B обнуляется, и выполнение инструкции прекращается.