© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
(ZX.SPECTRUM,
Insanity #7,
«Радиолюбитель. Ваш
компьютер» 5/2001, «Радиомир. Ваш компьютер» 8/2003
(под псевдонимом BV_Creator))
Дополненная версия. Дата последнего редактирования: 20.04.2003.
При написании одной программы мне понадобилось наиболее оптимально (по объёму) реализовать запись данных в первые 11 регистров музыкального сопроцессора из области памяти #8000#800A. Сначала я сделал это так:
LD HL,#800A
M1 LD BC,#FFFD
OUT (C),L
LD B,#BF
OUTD
BIT 7,L
JR Z,M1
При трассировке я заметил, что при последнем повторе цикла после команды OUTD флаг C оказался равным 1 (а при предыдущих повторах цикла он был сброшен). Естественно, этот факт был тут же использован для оптимизации:
LD HL,#800A
M1 LD BC,#FFFD
OUT (C),L
LD B,#BF
OUTD
JR NC,M1
Мне стало интересно, почему так получается, и я решил подробнее разобраться в этом вопросе.
В различных справочниках про влияние команды OUTD на флаги написано, что,
Я предположил, что флаг переноса устанавливается, когда при уменьшении HL изменяется регистр H (как в приведённом примере, когда HL уменьшается с #8000 до #7FFF). При проведении экспериментов это подтвердилось, но при одном условии: в ячейке памяти, адресуемой HL, должен быть не 0. Если там будет 0, то флаг C всегда будет сброшен.
Знание этой особенности Z80 позволяет в некоторых случаях сократить
программу и уменьшить время её выполнения. Приведённый выше пример это
наглядно демонстрирует. Может быть,
Кстати, заодно выяснилось, что флаг N устанавливается в 1 далеко не всегда. Вот, проверьте сами: при HL=#8000, (HL)=0, BC=#BFFD, после команды OUTD флаг N будет сброшен. А достаточно при тех же значениях регистров поместить в (HL), скажем, #FF и после OUTD этот флаг будет установлен.
Эксперименты проводились на оригинальном процессоре Z80 фирмы ZiLOG и на отечественном аналоге КР1858ВМ1.
Эти особенности Z80 вполне естественно использовать для проверки на выполнение программы под эмулятором. Ну а если вы применяете их для оптимизации своей программы, приготовьтесь к тому, что на эмуляторах она работать не будет
Я понимаю, что, возможно,
К сожалению, изложенный выше алгоритм установки флага переноса оказался не
вполне точным. Я узнал об этом, ознакомившись с
|
Другие мои статьи о недокументированных особенностях процессора Z80:
|
|
Другие мои статьи о различных приёмах оптимизации при программировании на ассемблере Z80:
|