Ликбез - Ассемблер взгляд издалека: Работа с внешними устройствами. Чтение данных из порта. Команды записи в порт.
Ассемблер - взгляд издалека
Продолжение.
Начало в || 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 ║
╚═══════════╧═══════════════╝
Как видите, и здесь всё довольно просто.
Ну, теперь действительно всё.
Итак, до следующего раза!
Продолжение следует...
──══════════──
Другие статьи номера:
|
|
|
|
|
|
Ликбез - Ассемблер взгляд издалека: Работа с внешними устройствами. Чтение данных из порта. Команды записи в порт.
|
|
|
|
|