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, то выход; иначе повторение цикла. Команды группового вывода так же влияют на флаг нуля. [ Продолжение следует ].
Другие статьи номера:
BBS - список станций BBS ZXNet. |
Вступление - содержание номера. |
Графика - картинка АNSI графики. |
Железо - обзор микропроцессора Zilog Z380, продолжение. |
Имена - значение имен. |
Обратная связь - контакты редакции. |
Поздравления - приветы, поздравления, пожелания. |
Поиск - поиск игр, программ. |
Программирование - курс изучения ассемблера от Wlodek Black, продолжение. |
Реклама - реклама и объявления. |
Похожие статьи:
В этот день... 21 ноября