Программирование в машинных кодах и на языке ассемблера 1993 г.

Ввод-вывод - Команды для работы с внешними устройствами.


5.17. Команды для работы с внешними устройствами

 

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

Обратите внимание на то, что по отношению к процессору Z-80 такие части компьютерной системы как клавиатура, магнитофон, звуковой динамик тоже являются внешними.

Команды этой группы начитаются с мнемоник IN (ввод) и OUT (вывод). В какой-то степени они аналогичны командам БЕЙСИКа IN и OUT.

Данные, которые передаются по командам IN и OUT являются 8-ми битными. Во время приема активизируются физические линии RD и IORQ, а во время выдачи - также IORQ и WR. Кроме этих линий активизируется также адресная шина. Адрес, помещенный на ней, задает адрес внешнего порта. Всего возможны 65536 адреса портов. Различные периферийные устройства активизируются состоянием различных адресных линий адресной шины.

Так, например, порт 254 (FE) служит для связи процессора с клавиатурой, магнитофоном, звуковым динамиком и телеэкраном.

Для примера рассмотрим содержимое байта данных, поступающих или выдаваемых по этому порту.

 

 

 

Для тех, кто не имеет книги Виккерса, напомним, как задаются адреса портов при опросе клавиатуры.

1.                            Мы указали, что 16-разрядная адресная шина (от А0 до А15) указывает на адрес внешнего порта.

2.                            Порт FE задается состоянием адресных линий А0…А7. При этом А0 - включена, А1…А7 - выключены: 1111 1110. Об остальных адресных линиях А8…А15 мы пока не говорим.

3.                            В то же время, мы указали, что клавиши полуряда опрашиваются по пяти битам данных, поступающим с этого порта (D0…D5).

4.                            При этом адресные линии А8…А15 могут указывать о каком именно полуряде идет речь.

Клавиатура «Спектрума» имеет 40 основных клавиш. Они разбиты на 8 полурядов по 5 клавиш в каждом.

1 – 5

6 – 0

Q – T

Y – P

A – G

H – Enter

C Shift - V

B - Space

Этим полурядам соответствует следующее состояние адресных линий А8…А15.

1111 0111 = 247

1110 1111 = 239

1111 1011 = 251

1101 1111 = 223

1111 1101 = 253

1011 1111 = 191

1111 1110 = 254

0111 1111 = 127

 

 

 

Таким образом, для опроса произвольного полуряда адрес его порта равен:

Здесь n - номер полуряда.

Например, опросить клавиши от 1 до 5 можно следующей командой из Бейсика:

      PRINT IN (256*(255-2^3)+254) или проще:

      PRINT IN 63486

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

·         самый младший бит соответствует внешней клавише полуряда;

·         при нажатой клавише соответствующий ей бит выключается, т.е. если ни одна клавиша не была нажата, то все пять младших битов включены, и Вы получите 255.

 

Среди команд ввода/вывода есть команды простого (однобайтного) ввода/вывода и есть команды блочного ввода/вывода, которые бывают как автоматическими, так и неавтоматическими. Далее мы рассмотрим все эти команды по подгруппам.

 

5.17.1. Команды простого ввода.

 

Мнемоника

Код

Комментарий

IN A,(n)

DB n

Поместить в регистр А число, из порта n.

IN A,(C)

ED 78

Поместить в регистр А число, из порта, номер которого находится в регистре С.

IN H,(C)

ED 60

То же, но в регистр H.

IN L,(C)

ED 68

То же, но в регистр L.

IN B,(C)

ED 40

То же, но в регистр B.

IN C,(C)

ED 48

То же, но в регистр C.

IN D,(C)

ED 50

То же, но в регистр D.

IN E,(C)

ED 58

То же, но в регистр E.

IN F,(C)

ED 70

Служит для выставления флагов в регистре F без изменения содержимого числовых регистров.

 

По командам этой подгруппы необходимо сделать ряд примечаний. Мы говорили о том, что адрес порта может задаваться 16-битным числом, находящимся на адресной шине. В то же время, во всех этих командах адрес порта задается однобайтным числом, т.е. определяется состоянием адресных линий А0…А7. В тех случаях, когда для функционирования внешних устройства этого достаточно, линии А8…А15 могут быть проигнорированы, но как быть, когда этого недостаточно, например при вводе с заданного полуряда клавиатуры, о чем мы только что писали?

Для команды IN A,(n) биты адреса порта А0…А7 задаются числом n, следующим за кодом операции, а биты адреса А8…А15 должны быть предварительно выставлены в самом же регистре А.

Для команд IN A,(C) и других подобных биты адреса А0…А7 задаются содержимым регистра С, а биты А8…А15 должны быть предварительно помещены в регистр В.


 

5.17.2. Команды простого вывода.

 

Мнемоника

Код

Комментарий

OUT (n),A

D3 n

Выдать содержимое аккумулятора по порту n. Если адрес порта - двухбайтная величина, то старший байт адреса должен быть предварительно помещен в регистр А.

OUT (C),A

ED 79

Передать содержимое аккумулятора на внешний порт, номер которого содержится в регистре C. Если адрес порта - двухбайтная величина, то старший байт должен быть предварительно помещен в регистр В.

OUT (C),H

ED 61

То же, но для регистра H.

OUT (C),L

ED 69

То же, но для регистра L.

OUT (C),B

ED 41

То же, но для регистра B.

OUT (C),C

ED 49

То же, но для регистра C.

OUT (C),D

ED 51

То же, но для регистра D.

OUT (C),E

ED 59

То же, но для регистра E.

 

5.17.3. Команды блочного ввода/вывода.

Эти команды служат для организации ввода/вывода сразу целых блоков информации. Здесь так же, как и для простых команд ввода/вывода, младший байт адреса порта предварительно помещается в регистр С. Если нужен и старший байт, то он располагается в регистре В. В регистре HL, размещается начальный адрес, в который начинается загрузка или из которого начинается выгрузка (аналогично командам перемещения блоков). В регистре В, находится количество байтов, подлежащих вводу/выводу.

Среди этих команд есть автоматические, выполняющие сразу прием и размещение целого блока (аналогично LDIR и LDDR) и неавтоматические, выполняющие прием по одному байту (далее по результатам проверки флага нуля, который включается, если в регистре В оказывается в результате операции 0, программист может принять решение продолжить ввод или прервать его). Неавтоматические команды аналогичны LDI и LDD.

Сразу отметим, что автоматические команды ввода/вывода имеют для «Спектрума» очень ограниченное применение, т.к. необходимо, чтобы внешнее периферийное устройство работало с той же скоростью, что и сам Z-80, а к большинству употребляемых устройств это не относится (принтер, магнитофон, клавиатура, интерфейс джойстика и т.д.).

 

Мнемоника

Код

Комментарий

INIR

ED B2

Автоматическая команда блочного ввода. Первый поступающий байт направляется туда, куда указывает адрес, находящийся в регистре HL. Следующий байт размещается за ним и так далее снизу вверх.

INDR

ED BA

То же, но размещение байтов в памяти идет сверху вниз.

OTIR

ED B3

То же, что и INIR, но не для ввода, а для вывода.

OTDR

ED BB

То же, что и INDR, но не для ввода, а для вывода.

INI

ED A2

То же, что и INIR, но неавтоматическая.

IND

ED AA

То же, что и INDR, но неавтоматическая.

OUTI

ED A3

То же, что и OTIR, но неавтоматическая.

OUTD

ED AB

То же, что и OTDR, но неавтоматическая.

 




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Интервью - интервью с Дионисом Георгисом, Генеральным директором "Движения 'F'.
Club IM2 - Терминология и теоритические аспекты прерываний и многозадачности.
Inferno - Вступление.
Programming of magic games - Классный русско/англоязычный сайт, посвящённый программированию игр.
scene more - настоящие сценеры: Нету больше у нас нормальной прессы! Нету!

В этот день...   19 марта