Задача - как можно быстрее затереть содержимое памяти (чтобы хакер не успел нажать NMI).
Вот так решил ее ASC:
SELF_DESTRUCT:
LD DE,0D5D5H
LD HL,DESTRU
LD SP,HL
LD BC,-4
DESTRU:
PUSH DE
PUSH DE
ADD HL,BC
JP (HL)
Команды PUSH DE заполняют память кодами D5 (PUSH DE). С каждым проходом цикла команд PUSH DE становится все больше. Таким образом, память затирается практически непрерывной серией команд PUSH, которые на Z80 являются наиболее быстрым способом записи в память.
Можно заметить, что команд PUSH DE этим фрагментом генерируется больше, чем используется. Андрей Гетало (FOCAL Soft) придумал, как это оптимизировать:
SELF_DESTRUCT:
LD SP,DESTRU
LD DE,0D5D5H
DESTRU:
PUSH DE
LD HL,0
ADD HL,SP
JP (HL)
Теперь все коды D5 (PUSH DE), которыми заполняется память, выполняются при каждом последующем проходе цикла. Их количество растет экспоненциально (как 3^n). 64кб адресного пространства Z80 перетираются (если пренебречь последними командами цикла) за 32768*11 = ~360448 тактов. При частоте 3.5МГц это ~0,1 секунды.