Инструменты пользователя

Инструменты сайта


msx:basic_dialogue_programming_language:211

Первая страницаПредыдущая страницаНазад к обзоруСледующая страницаПоследняя страница

2.11. Тайны микропроцессора Z80


Нет ничего тайного, что не сделалось бы явным.

Евангелие


Никто, зажегши свечу, не покрывает её сосудом
или не ставит под кровать,а ставит на подсвечник,
чтобы входящие видели свет.

Евангелие

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)

Эти тайны для Вас приоткрыли Никитин А.Н., Седов А.М. и Поляков С.Л.


Первая страницаПредыдущая страницаНазад к обзоруСледующая страницаПоследняя страница

msx/basic_dialogue_programming_language/211.txt · Последние изменения: 2023-01-21 17:49 — GreyWolf