Программирование - курс изучения ассемблера от 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, то выход; иначе повторение цикла.
Команды группового вывода так же влияют на флаг нуля.
[ Продолжение следует ].
Другие статьи номера:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Программирование - курс изучения ассемблера от Wlodek Black, продолжение.
|
|
|