5.16. Команды обработки блоков памяти
Это очень мощные команды. Они предназначены для работы с целыми частями памяти. В этой группе 8 команд. Четыре команды предназначены для перемещения блоков памяти из одного места в другое и четыре команды для поиска заданного байта в заданной области.
5.16.1. Команды перемещения блоков.
В этой подгруппе 4 команды: LDIR, LDI, LDDR, LDD.
Команда LDIR
Ее код ED B0, т.е. это двухбайтная команда. Служит для перемещения блоков памяти. Для ее работы необходимо, чтобы:
· в регистровой паре HL находился адрес начала перемещаемого блока;
· в регистровой паре DE находился адрес того места, куда должен перемещаться блок;
· в паре BC находилась длина перемещаемого блока.
Команда может перемещать блоки в памяти как сверху вниз, так и снизу вверх, но если перемещение памяти происходит с частичным наложением нового блока на старый, то тогда возможно перемещение только сверху вниз, иначе пересылаемые байты запортят те, которые еще не были пересланы.

Команда LDDR
Ее код ED B8, а назначение - то же, что и у команды LDIR. Регистры HL, DE, BC - выполняют те же функции и должны быть выставлены так же, как и для команды LDIR.
Разница состоит в том, что если по команде LDIR сначала пересылается первый байт, затем второй и т.д., то по команде LDDR - сначала последний, затем предпоследний и т.д. Таким образом, если перемещение идет с наложением нового блока на старый, то этой командой можно пересылать блоки снизу вверх.
Команда LDI
Ее код ED A0. Действие этой команды такое же, как и у команды LDIR, но если команда LDIR выполняет перемещение блока целиком байт за байтом до тех пор, пока в регистре BC не будет достигнут ноль, то команда LDI перемещает только один байт. Если при этом в BC не достигнут ноль, то флаг P/V равен 1, если достигнут, то флаг P/V равен нулю. По результатам проверки этого флага программист может принять решение о продолжении действия команды LDI или прекращении. Одним словом, если команда LDIR выполняет перенос каждого последующего байта автоматически, то LDI – не автоматически.
Команда LDD
Ее код ED A8. Это такой же неавтоматический аналог LDDR, как LDI - аналог LDIR.
Время выполнения команд LDD и LDI - фиксированное и занимает 16 тактов микропроцессора. Время же действия автоматических команд LDIR и LDDR - неопределенно, так как оно зависит от размера блока, подлежащего перемещению. Чем он больше, тем больше и время, но его можно оценить - это 21 такт на перемещение каждого байта, кроме последнего, на который необходимы 16 тактов. Можно оценить, например, время на переброску экрана, т.е. 6912 байтов: 6911*21+16=145147 тактов, что при частоте 3.5 МГц составляет, примерно, 0.04 сек.
5.16.2. Команды поиска.
В этой подгруппе 4 команды: CPIR, CPDR, CPI и CPD.
Команда CPIR
Ее код - ED B1.
Команда просматривает заданную область памяти в поисках первого встреченного места нахождения заданной величины. Заданный байт должен быть установлен заранее в регистре А. В регистровой паре HL, устанавливается начальный адрес, с которого начинается поиск, а в регистре BC - длина блока, подлежащего проверке.
Команда исполняется до тех пор, пока либо в какой-либо ячейке не будет найден байт, равный содержимому регистра А, либо пока не будет исчерпана вся заданная область и в регистре BC не останется ноль. Многократное повторение команды выполняется автоматически. Поиск ведется снизу вверх. Если в результате поиска нужный байт найден, то действие команды прекращается. В регистре HL будет искомый адрес, при этом включается флаг нуля (Z) и выключается флаг знака (S).
Команда CPDR
Ее код - ED B9.
Действие аналогично команде CPIR, но здесь блок просматривается сверху вниз. Эта команда также автоматическая.
Команда CPI
Ее код - ED A1.
Команда аналогична CPIR, но в отличие от нее не является автоматической. Здесь после каждого сравнения очередного байта программист может принять решение о прекращении или продолжении поиска в зависимости от состояния флагов регистра F.
Если содержимое проверяемой ячейки и аккумулятора совпадут, включается флаг нуля, в противном случае он выключен. Если в процессе поиска нужный байт еще не найден, а содержимое BC уменьшилось до нуля, то включается флаг переполнения/четности (P/V), в противном случае он включен.
Поиск по команде CPI выполняется снизу вверх, как и по команде CPIR.
Команда CPD
Ее код ED 9.
Действие команды аналогично командам CPDR и CPI, но в отличие от CPDR она неавтоматическая, а в отличие от CPI поиск по блоку памяти производится не снизу вверх, а сверху вниз.