http://zxpress.ru/article.php?id=728

Код:
3. "Самоуничтожение команды LDIR"

Теория     : Грубая эмуляция команд LDIR,LDDR
Эмулятор   : Z80, UKV (наверное... точно не помню)

Комментарии:   В  Z80  неверно  обрабатываются  команды  блочных
операций.  Там  считается,  что,  например, LDIR выполняется "за
один  проход",  то  есть  процессор  извлекает код операции (два
байта),  затем выполняет команду, а потом переходит к следующей.
В  реальности  же  (даже  в  книгах  Родионова/Ларченко  про это
написано!)  выполнение  LDIR/LDDR  работает  циклически  - перед
каждой  пересылкой процессор читает код операции. Если настроить
параметры в HL, DE и BC так, чтобы LDIR заполнял область памяти,
в которой он сам находится, например, нулями, то на реальном Z80
выполнение  LDIR  произойдёт  досрочно  -  уничтожится  команда,
вернее  её "половинка" префикс #ED, и дальше "заработает" другая
половинка  (#B0 = OR B). Естественно, после этого никакого LDIRа
не будет.
Код:
MEMTST  EQU  #4000
        LD   HL,CNTLDR
        LD   DE,MEMTST
        LD   BC,3+ELDR-CNTLDR
        PUSH DE
        LDIR;Переносим тестирующий фрагмент в "ненужное"
            ;место  ( для  многократного  тестирования )
        RET ;Переходим на тест
CNTLDR  LD   HL,MEMTST
        LD   DE,MEMTST+1
        LD   BC,ELDR-CNTLDR-1; Длина  взята  с таким расчётом,
        ;чтобы в глюкавом эмуляторе "убилась" команда перехода
        ;JP NO_LDR - выход, если реальный Z80
        LD   (HL),0
        LDIR
        JP   NO_LDR; в  итоге  на эмуляторе после LDIR
        ;выполятся 3 NOP и мы узнаем, что у нас эмуль.
ELDR    JP   EMUL
NO_LDR  ....
*Z80 - здесь - эмулятор "Z80" by G.Lunter