Optron #32
22 октября 1999

Ликбез - Ассемблер взгляд издалека: Работа с внешними устройствами. Чтение данных из порта. Команды записи в порт.

<b>Ликбез</b> - Ассемблер взгляд издалека: Работа с внешними устройствами. Чтение данных из порта. Команды записи в порт.
       Ассемблер - взгляд издалека

               Продолжение.
    Начало в || 20, 21, 24, 25, 28-30

{}Инфарх, 1999


      Работа с внешними устройствами

  К таковым относятся клавиатура, магнито-
фон,  принтер,  много ещё чего (зависит от
конкретного  варианта). Так как же процес-
сор  обменивается с ними информацией? Оче-
видно, что они не включены непосредственно
в   шину   данных   (ШД).   Между  внешним
устройством  (ВУ) и процессором есть такая
вещь, как "порт".
  Только  не  подумайте, что я про морской
порт  вам рассказывать буду! На самом деле
"порт" - это устройство, которое по коман-
де  процессора подключит к ШД определённое
ВУ.  Какое - зависит от его адреса. Напри-
мер,  порт kempston joystick'а имеет адрес
#1F, бипер - #FE и т.д.
  Теоретически   количество  портов  может
быть  65536,  но на практике это число го-
раздо  меньше и зависит от аппаратной реа-
лизации  вашего Speccy. Здесь имеет значе-
ние метод дешифрации порта, т.е. определе-
ние  того, какое ВУ в данный момент должно
быть подключено к ШД. К примеру, хоть порт
джойстика  имеет номер #1F, его дешифрация
чаще всего происходит только по разряду A5
шины адреса (ША).
  Рассмотрим  сей  процесс подробнее. При-
знаком  работы  с  портом, является низкий
уровень сигнала IORQ. Какой процесс проис-
ходит (чтение из порта или запись в него),
подскажет  низкий  уровень сигналов RD или
WR  соответственно. И если при таковом со-
четании  сигналов (IORQ=0; RD=0) сигнал A5
ША  имеет  низкий уровень, то будет выбран
порт  джойстика. При этом значение, прочи-
танное  из  него,  появится  на ШД. Запись
происходит аналогично, только используется
сигнал WR и число с ШД попадает в порт.
  А вот как управлять всеми этими сигнала-
ми  без  помощи паяльника и большого коли-
чества  пива? Для этого процессор распола-
гает специальными командами, которые я вам
сейчас и продемонстрирую.

          Чтение данных из порта

  Наверняка в бейсике вам встречалась  ко-
манда IN. Так вот, в ассемблере есть точно
такая же. Она присутствует в таких вариан-
тах:

  IN A,(n)
  IN r,(C)

  Первый вариант команды производит чтение
из порта, младший байт адреса которого за-
писан в скобках, а старший - в аккумулято-
ре.  Байт, прочитанный из порта, будет по-
мещён в "A".  Для того,  чтобы  с  помощью
этой     команды    прочитать    состояние
kempston joystick'а, надо записать её сле-
дующим образом:

                IN A,(#1F)

  Как я уже говорил,  дешифрация порта #1F
происходит, как правило, только одним раз-
рядом  ША, поэтому содержимое регистра "A"
может быть любым. Хвастайтесь перед всеми,
что   ваш   компьютер   имеет  256  портов
джойстика!
  А теперь  обратимся ко второму варианту.
В  качестве приёмника для считанного байта
служит "r", который на практике может быть
одним из регистров:

           A, B, C, D, E, H, L

  Адрес порта помещается в регистровую па-
ру BC.  Этот вариант наиболее удобен, если
вам следует использовать полную  адресацию
порта.
  К примеру, рассмотрим чтение клавиатуры.
Адреса портов клавиатуры отличаются только
старшим байтом,  а младший всё время равен
#FE. Какой полуряд в данный момент читает-
ся, видно из таблички:

          ╔═══════════╤═══════╗
          ║  Полуряд  │ Адрес ║
          ║           │ порта ║
          ║───────────┼───────╢
          ║ Space...B │ 7FFE  ║
          ║ Enter...H │ BFFE  ║
          ║ P.......Y │ DFFE  ║
          ║ 0.......6 │ EFFE  ║
          ║ 1.......5 │ F7FE  ║
          ║ Q.......T │ FBFE  ║
          ║ A.......G │ FDFE  ║
          ║ CS......V │ FEFE  ║
          ╚═══════════╧═══════╝

  Одной  из  особенностей  чтения из порта
клавиатуры  является  то, что младшие биты
полученного  значения  относятся к крайним
клавишам полуряда. Наример, если мы выпол-
ним нечто вроде

  LD BC,#EFFE
  IN A,(C)

то полученный  байт  будет иметь следующее
значение:

 ╔══╤══╤══╤══╤══╤══╤══╤══╗
 ║x │x │x │6 │7 │8 │9 │0 ║ Клавиша
 ╟──┼──┼──┼──┼──┼──┼──┼──╢
 ║D7│D6│D5│D4│D3│D2│D1│D0║ Бит
 ╚══╧══╧══╧══╧══╧══╧══╧══╝

  Битам  D7,  D6,  D5  повезло - они имели
честь  остаться  неиспользованными. О том,
что определённая клавиша нажата, мы узнаем
по состоянию соответствующего ей бита - он
будет  сброшен.  Расширим приведённый выше
пример:

  LD   BC,#EFFE;полуряд 6...0
  IN   A,(C)   ;чтение состояния
  RRCA         ;проверка
  JR   NC,ZERO ;нажат "0"
;продолжаем работу
       .....
       .....
ZERO

  Вот так и просходит работа  с  клавиату-
рой. Не правда ли, все просто?
  А теперь давайте рассмотрим процесс  об-
ратный -

          Команды записи в порт

  Они весьма  похожи  на  команды  чтения.
Вот, взгляните:

  OUT (n),A
  OUT (C),r

  Запись  в  порт  аналогична  чтению,  по
крайней мере, в том, что относится к пере-
даче параметров. 
  К примеру, рассмотрим запись в порт #FE.
На  него возложена не одна задача, а сразу
несколько:  младшие  три  бита  определяют
цвет  бордюра,  бит D3 посылает импульс на
гнёзда  MIC  и  EAR, а бит D4 включает или
выключает бипер.
  Итак, допустим, что вам необходимо уста-
новить красный бордюр. Для этого выполните
следующее:

  LD  A,2
  OUT (#FE),A

  Пару слов о бите D4.  Всякий раз,  когда
вы переводите его в противоположное состо-
яние   (разумеется,  высылая  результат  в
порт),  внутренний динамик издаёт  краткий
щелчёк.  Таким  образом,  манипулируя этим
битом с определённой скоростью,  вы можете
создавать простые звуки.

  Так, на сегодня вроде бы всё...
  Что? Ах, да, я совсем забыл о влиянии на
флаги!  Ну,  давайте  посмотрим, что у нас
тут...


      ╔═══════════╤═══════════════╗
      ║ Мнемоника │    Флаги      ║
      ║ операции  ├───────────────╢
      ║           │ C Z P/V S N H ║
      ╟───────────┼───────────────╢
      ║ OUT (n),A │ . .  .  . . . ║
      ║ OUT (C),r │ . .  .  . . . ║
      ║           │               ║
      ║ IN  A,(n) │ . .  .  . . . ║
      ║ IN  r,(C) │ . x  P  x 0 x ║
      ╚═══════════╧═══════════════╝

  Как видите, и здесь всё довольно просто.
Ну, теперь действительно всё.
  Итак, до следующего раза!

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

              ──══════════──





Другие статьи номера:

Non Possumus - Сеть... Что же это такое на самом деле?

ZX-Обоз - Обзор электронной прессы: Nicron 112-113, Полесье 11, ZX-News 49, Born Dead 0D.

Вся жизнь игра - Операция Р.Р. (окончание Приключения последнего).

Ликбез - Ассемблер взгляд издалека: Работа с внешними устройствами. Чтение данных из порта. Команды записи в порт.

Реклама - Реклама и объявления...

Рубрика X - Торжественная поинтовка.


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

Похожие статьи:
Приколы - техника безопасности на досуге.
Вступление - Вот и вышел первый номер газеты "RED PRESS".
Coding - coding для чайников: доработка MINI BOOT V3.0.

В этот день...   7 мая