Insanity #07
17 августа 2000

Влияние команды OUTD на флаг переноса - Иван Рощин расскрывает недокуменированые возомжности процессора Z80.

<b>Влияние команды OUTD на флаг переноса</b> - Иван Рощин расскрывает недокуменированые возомжности процессора Z80.
-   -  - - -- --- ----─-────-───────-────-─--- --- -- - -  -   -
             Влияние команды OUTD на флаг переноса 
-   -  - - -- --- ----─-────-───────-────-─--- --- -- - -  -   -



  $% Иван Pощин



    При  написании  одной  программы  мне  понадобилось наиболее
оптимально  (по  объему)  реализовать  запись данных в первые 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 на флаги
написано,  что,  во-первых,  она  устанавливает  в  1  флаг N, и
во-вторых,  если  в  результате  выполнения  команды  регистр  B
обнуляется, то флаг Z = 1, иначе он равен 0. Про остальные флаги
сказано  лишь,  что  их  значения  после  выполнения  команды не
определены.

    Я  предположил, что флаг переноса устанавливается, когда при
уменьшении  HL  изменяется регистр H (как в приведенном примере,
когда   HL   уменьшается  с  #8000  до  #7FFF).  При  проведении
экспериментов  это подтвердилось, но при одном условии: в ячейке
памяти,  адресуемой  HL,  должен быть не 0. Если там будет 0, то
флаг C всегда будет сброшен.

    Знание  этой  особенности  Z80 позволяет в некоторых случаях
сократить программу и уменьшить время ее выполнения. Приведенный
выше  пример это наглядно демонстрирует. Может быть, кому-то это
пригодится: бывает ведь, что при создании intro не хватает всего
одного-двух свободных байтов памяти...

    Кстати,  заодно  выяснилось,  что флаг N устанавливается в 1
далеко  не  всегда.  Вот,  проверьте сами: при HL=#8000, (HL)=0,
BC=#BFFD,  после команды OUTD флаг N будет сброшен. А достаточно
при тех же значениях регистров поместить в (HL), скажем, #FF - и
после OUTD этот флаг будет установлен.

    Эксперименты  проводились  на  оригинальном  процессоре  Z80
фирмы ZiLOG и на отечественном аналоге КP1858ВМ1.

    Эти  особенности  Z80  вполне  естественно  использовать для
проверки  на  выполнение  программы под эмулятором. Hу а если вы
применяете  их  для оптимизации своей программы, приготовьтесь к
тому, что на эмуляторах она работать не будет...

    Я  понимаю,  что,  возможно,  кто-то  уже  проводил подобные
исследования, и для него написанное мной не является секретом (и
уж   точно  знали  об  этом  разработчики  Z80).  Hо  мне  такая
информация нигде не встречалась, и я решил сделать ее достоянием
общественности.

                               ...



Другие статьи номера:

Light Future News - Новость как примета времени: о престоящем CC'2000, прошедшем ASCII и т.д.

LFG Assembly'2000 - Тренировка перед СС'2000 (рассказ о Пермской пати).

Чайникам и простым смертным - CyberJack показывает на пальцах как написать простую игру.

Последний Weekend - история Ижевской печатной газеты для Спектрума: ZX Weekend.

Влияние команды OUTD на флаг переноса - Иван Рощин расскрывает недокуменированые возомжности процессора Z80.

Clive Sinclair - Страницы из жизни создателя Спектрума: Клайва Синклера.

Сталевары Спектрума - рассказ о сегодняшних буднях западных фирм, некогда выпускавших игры для Спектрума.

С битой по миру - размышления на тему "спектрум умрет только тогда, когда уйдет последний спектрумист".

Сказание в никуда - монолог Orc'a на тему "На сцене бардак... Опять же: кто сказал?"

Mania & Fobia - Диагноз Последней INSTанциY.

Da Real Life VS Computing - "...Сидим мы за своими компьютерами, а жизнь пешочком там мимо нас прыг-скок".

Insanity Jokez - Сборник околосценовых анекдотов.

Cybernetic Punk Culture - Голливуд в виртуальной реальности.

Kraftwerk - Techno культура: "история о том, как электронная музыка стала музыкой современности".


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Юмор - анекдоты.
Реклама - Рекламодатели.
Тема - Когда наступит XXI век (не 1 января 2000 года, а 366-ю днями позже).
Мозжечек - Нездоровые сны: юмористический рассказ с участием персонажей со Спектрума.
TOP TEN - Десяточка лучших игр.

В этот день...   25 апреля