Нет ничего тайного, что не сделалось бы явным. Евангелие Никто, зажегши свечу, не покрывает ее сосудом или не ставит под кровать,а ставит на подсвеч- ник, чтобы входящие видели свет. Евангелие 2.11. Т а й н ы м и к р о п р о ц е с с о р а Z80 Т а й н а н о м е р 1. Сейчас мы расскажем Вам о нескольких таинственных командах микропроцес- сора Z80 , начинающихся с кодов &hDD, &hFD . Какие же дополнительные возможности они нам предоставляют?! Вам, конечно же, известно, что работа с индексными регистрами IX и IY аналогично работе с однобайтными регистрами A,B,C,D,E,H,L невозможна. Например, не существует команда с мнемоникой LD A,X , где символом X обозначен младший байт регистра IX ! Тем не менее Вы можете оперировать с "половинками" индексных регистров с помощью вышеуказанных кодов, используя их как префикс (префикс - приста- вка). Сейчас мы Вас этому научим... В о - п е р в ы х, заметим,что код &hDD используется при работе с реги- стром IX , а код &hFD - при работе с регистром IY. В о - в т о р ы х , указанные префиксы должны предшествовать командам Z80, операндами которых является содержимое однобайтных регистров H или L. Например, OR H или SUB L и т.д. Причем старший байт регистра IX (IY) в случае использования префикса &hDD (&hFD) будет именоваться H , а младший байт индексного регистра ─ L. Заметим, что содержимое "настоящих" регистров H и L останется прежним! В - т р е т ь и х , рассматриваемые нами команды формируются так: вначале Вы указываете с каким индексным регистром будет происходить рабо- та (если с регистром IX - устанавливаете код &hDD, если с IY - код &hFD), затем Вы пишите мнемонику команды, выполняющую действия с регистром H или L в зависимости от используемого байта индексного регистра. П р и м е р 1. ────────────── α) загрузить содержимое м л а д ш е г о байта регистра IX в регистр C 0100:DD 0101:4D LD C,L β) сложить содержимое регистра A со с т а р ш и м байтом регистра IY 0100:FD 0101:84 ADD A,H Отметим, что существует еще одна группа команд, начинающихся с кодов &hDD, &hCB или с кодов &hFD, &hCB в зависимости от содержимого индекс- ного регистра. Как известно, команды работы с битами RLC, RRC, RL, RR, SLA, SRA, SRL, BIT, RES, SET начинаются с кода &hCB, за которым указывается код команды. Например, CB 11 ( RL C ) ▲ ▲ Префикс ─────┘ └────── Код команды Что же произойдет, когда Вы в некотором месте программы укажете перед этим кодом код &hDD (или &hFD)? В результате этого образуется команда ра- боты с битами числа из ячейки с адресом, содержащимся в индексном регист- ре IX с учетом смещения (или IY, если указан код &hFD), с одновременной загрузкой преобразованного числа в регистр, соответствующий коду команды. Приведем схему расположения кодов в команде: ┌────────────────────────────┐ │ Предварительное помещение │ │ в индексный регистр адреса │ │ некоторой ячейки │ └────────────────────────────┘ ┌─────────┐ ┌──────┐ ┌──────┐ ┌──────────────┐ │ Код │ │ DD │ │ CB │ │ Код смещения │ │ команды │ └──────┘ └──────┘ └──────────────┘ └─────────┘ П р и м е р 2. Число из ячейки &h9000 сдвинуть влево на один бит и ────────────── поместить результат в регистр C. 0100:DD 21 00 90 LD IX,9000 ; ┌─────────────────────────────────────────────────────────────────┐ │ 0104:DD ; Будем работать с регистром IX │ │ 0105:CB ; Префикс битовых операций │ └─────────────────────────────────────────────────────────────────┘ 0106:00 ; Код смещения индексного регистра 0107:11 ; Второй байт кода команды RL C ; равен &h11 Мнемонику данной команды можно представить так: RL C,(IX+00) ▲ ▲ ▲ ▲ │ │ │ └──── Смещение относительно адреса &h9000 │ │ └─────── Код &hDD - если IX, &hFD - если IY │ └────────── Регистр, в который необходимо поместить результат └──────────────── Код битовой операции Очередной любопытной командой является командa SLI, мнемоника которой произошла от английской фразы "Shift Left and Increment" (сдвиг влево и одновременное увеличение результата на единицу). При выполнении команды SLI устанавливаются признаки аналогичные признакам, устанавливаемым ко- мандой RL. Несколько примеров команды SLI: CB 37 SLI A CB 36 SLI (HL) DD CB 00 36 SLI (IX+00) DD CB 01 57 SLI A,(IX+01) В последнем примере употреблены сразу две "секретные" команды. Таким образом мы видим, что возможности Z80 еще не до конца изучены! Т а й н а н о м е р 2. Опишем теперь содержимое битов с номерами 3 и 5 регистра флагов (F): Имена битов ──▶ S Z A P/O N C ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │F 5│ │F 3│ │ │ │ └─▲─┴───┴─▲─┴───┴─▲─┴───┴───┴─▲─┘ 7-й бит ──┘ └───┬───┘ └─ 0-й бит Изучаемые биты Данные биты установлены в соответствии с содержимым регистра А, т.е. если Вы в регистр A положите число &h28 (&b 0010 1000), в котором пятый и третий бит установлены в 1, а затем исполните команду OR A или любую дру- гую команду, устанавливающую биты регистра флагов, то оба бита установят- ся в единицу. Соответственно, если Вы положите в регистр A число 8 (&b 0000 1000), то установится только бит F3. Эти же биты могут быть установлены командами IN <регистр>,(C) или IN F,(C). Эти тайны для Вас приоткрыли Никитин А.Н., Седов А.М. и Поляков С.Л.