Nicron #14
03 января 1997

Программирование - курс изучения ассемблера от Wlodek Black, продолжение.

╔──────────────────────────────────────────────────────────────╗
│ ▒▒▒▒░  ▒▒▒▒░  ▒▒▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░  ▒▒▒▒░▒▒▒▒▒▒░▒▒▒▒▒░│
│▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░    ▒▒▒▒▒▒░▒▒░     ▒▒░▒▒░▒▒░    ▒▒░ ▒▒│
│▒▒░ ▒▒░▒▒░    ▒▒░    ▒▒▒▒▒░ ▒▒░ ▒▒░▒▒▒▒▒▒░ ▒▒░▒▒░▒▒▒▒▒░ ▒▒░ ▒▒│
│▒▒▒▒▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░    ▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░    ▒▒▒▒▒░│
│▒▒░ ▒▒░ ▒▒▒▒░  ▒▒▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░▒▒░z80│
╚──────────────────────────────────────────────────────────────╝
[ Продолжение ].

(C) WLODEK BLACK.


		00Bh. ГРУППА КОМАНД ВВОДА-ВЫВОДА.

УВВ - устройство ввода-вывода (Input/Output Unit).

Любое устройство для обмена данными с внешней средой  характери-
зуется принципиальной особенностью: оно имеет два узла передачи
данных.С одной стороны оно подключено к шинам микропроцессорной
системы, а с другой - к тому устройству, которому предназначают-
ся или от которого принимаются данные. Собственно, это свойство
и породило название "порт" для устройств ввода-вывода.
При обращении к порту процессор выставляет на шину адреса адрес
порта, на шину данных - выводимый байт  (если это операция выво-
да), на линию IORQ (запрос устройства ввода-вывода) -  активный
низкий уровень; для записи в порт активизируется линия WR (запи-
сь), для чтения из порта активизируется линия RD (чтение).  Все
эти сигналы устанавливаются одновременно. Если выполнялась  опе-
рация чтения, то в конце такта фиксируется байт  с  шины данных,
являющийся принятым данным и установленный за время такта  внеш-
ним устройством. При операции записи в порт в конце такта  прос-
то снимаются управляющие сигналы. В компьютерах MSX и "Спектрум"
не реализована проверка факта, действительно ли внешнее устройс-
тво приняло данные. Операции обращения к портам очень  напомина-
ют операции с памятью.  Разница лишь в том,  какая  линия  шины
управления активизируется - MREQ (запрос памяти) или  IORQ  (за-
прос ввода-вывода). Упомянутая схожесть может накладывать  отпе-
чаток на архитектуру  машины - иногда  устройства  ввода-вывода
включают в схему компьютера как ячейки памяти (но никогда наобо-
рот!).
В MSX таким способом включен один из системных портов, управляю-
щих оперативной конфигурацией машины (регистр вторичного слота -
ячейка памяти 0FFFFh).
Обычно устройства ввода и устройства вывода имеют разные адреса.
Но даже когда встречается использование одного и того же адреса,
может оказаться, что физически обращение на ввод и обращение на
вывод производится к разным устройствам. Так что,записав в порт
какое-либо значение, а потом считав его с того же адреса, мы да-
леко не всегда получим то же значение.
Внешнее устройство не всегда использует все 8 бит. Если  в конк-
ретном случае известно, что в считываемом данном имеются  незна-
чащие биты, то они скорее всего будут равны 1. На вывод незнача-
щие биты обычно можно устанавливать в любое состояние.

Процессор Z80 способен адресовать 64К (65536) портов ввода-выво-
да. Однако для первых 256-ти адресов, то есть при использовании
лишь младшего байта шины адреса,существует большее разнообразие
способов адресации портов, что породило  своеобразное  "правило
хорошего тона" - использовать 8-ми, а не 16-разрядную адресацию
портов. В MSX-компьютерах это правило соблюдено.
   Адресация УВВ бывает прямой - 8-разрядный адрес порта входит
в состав команды; косвенной - 16-разрядный адрес УВВ помещается
в пару BC.

	Вывод данных с применением прямой адресации порта.

Мнемоника команды - OUT (n),A, где n - 8-разрядный номер (адрес)
порта. Данное для вывода содержится в аккумуляторе. Номер порта
выставляется на младшую половину шины адреса, а на старшую поло-
вину выставляется содержимое аккумулятора, то есть выводимый ба-
йт. Выводимый байт, разумеется, выставляется и  на  шину данных.
Появление байта данных на части шины адреса - нетривиальная осо-
бенность команды OUT с прямой адресацией. Если  дешифрация адре-
са порта производится по 8-ми младшим битам  адреса,  выведение
байта данных на старшую половину шины адреса проходит незамечен-
ным. (А в противном случае - яркий пример на этот счет  до  сих
пор будоражит спектрумистов, когда вывод в порт #FD приводит  к
одновременному обращению к AY-3-8910  и  к  порту  конфигурации
#7FFD).

	Ввод данных с применением прямой адресации.

Мнемоника команды - IN A,(nn).
Номер порта выводится в младшие 8 бит шины адреса, а на старшую
половину выводится содержимое аккумулятора, существовавшее к мо-
менту начала исполнения команды. Таким образом  можно  получить
16-разрядную прямо-косвенную адресацию порта. В программах  ком-
пьютера "Спектрум" можно встретить, например, такую конструкцию:
LD A,#7F
IN A,(#FE).
Таким путем  в "Спектруме"  производится опрос одного  из рядов
клавиш. В приведенной конструкции фактически  производится  чте-
ние из порта #7FFE.

	Ввод-вывод с применением косвенной адресации.

Полный 16-разрядный адрес порта помещается в пару BC, и выполня-
ется команда OUT (C),r или IN r,(C). Пересылка данных между УВВ
и процессором может вестись с использованием не только аккумуля-
тора, но и регистров D,E,H,L и даже регистра флагов F. Существу-
ет команда IN F,(C), устанавливающая флаги по результату чтения
из порта; сам принятый байт при этом никуда не помещается.
   Команды IN C,(C) и IN B,(C) существуют,  однако практическое
их применение специфично, так как они модифицируют  адрес порта.
   Команды OUT (C),C и OUT (C),B скорее бесполезны, нежели  спе-
цифичны.
   Важные комментарии. В мнемонике используется (C), а не  (BC),
по вышеупомянутым соображениям "хорошего тона",однако адресация
по (C) выполняется с использованием всех 16-ти разрядов пары BC,
это бесспорно.
   Написание команды IN (HL),(C) проходит. Но на самом деле это
команда IN F,(C). Настоящей команды IN (HL),(C)  не  существует,
как нет и команды OUT (C),F.
   Кроме команды IN F,(C), другие команды ввода-вывода  не влия-
ют на флаги.

		Команды группового ввода-вывода.

Нечто похожее на LDIR имеется и в арсенале IN и OUT.Это команды
INIR, INI, INDR, IND; OTIR, OUTI, OTDR, OUTD.

INIR выполняет N вводов из порта,адресуемого регистром C (одним
байтом!), по адресу (HL), инкрементируемому на каждый  совершен-
ный ввод. На регистре B организован счетчик, работающий на умен-
ьшение в сторону нуля. Расклад команды:
(HL) <--- port (C);
B    <--- B-1;
HL   <--- HL+1;
если B=0, то завершение; иначе повторить.
На выходе из команды установлен флаг нуля.
Использовать INIR в "Спектруме" невозможно,  так как содержимое
пары BC по-прежнему выставляется на шину адреса, несмотря на то,
что регистр B выполняет функции счетчика.

INI выполняет побайтный ввод без организации цикла.  Контролиро-
вать состояние счетчика - регистра B - можно по флагу нуля. При
достижении B=0 флаг Z устанавливается.

INDR и IND выполняют групповой ввод в сторону декремента адреса
по (HL).

Групповой вывод осуществляется командами OTIR, OUTI; OTDR, OUTD.
OTIR:
Port (C) <--- (HL);
HL <--- HL+1;
B  <--- B-1;
Если B=0, то выход; иначе повторение цикла.

Команды группового вывода так же влияют на флаг нуля.

[ Продолжение следует ].




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

Похожие статьи:
Реклама - Компьютеp SPECTRUM +2 (фиpменный) с пpинтеpом.
Happy end - Ну вот и перевернута последняя страница этого номера.
Письмо №270

В этот день...   17 ноября