PUSH H
PUSH D
PUSH B
IN CSbd ; A ← xxxx xA2A1A0 –чтение номера I/O запросившего обслуживание
ANI 7 ; A ← 0000 0A2A1A0 – выделение кода A2A1A0 = m
CPI 1 ; Сравнение кода A2A1A0 с числом 1
JZ IO_1 ; Переход на обслуживание I/O -1
JC IO_0 ; Переход на обслуживание I/O -0
CPI 3 ; Сравнение кода A2A1A0 с числом 3
JZ IO_3 ; Переход на обслуживание I/O-3
JC IO_2 ; Переход на обслуживание I/О-2
СРI 5 ; Сравнение кода A2A1A0 с числом 5
JZ IО_5 ; Переход на обслуживание I/O-5
JC IО_4 ; Переход на обслуживание I/O-4
CPI 6 ; Сравнение кода A2A1A0 с числом 6
JZ IO_6 ; Переход на обслуживание I/O-6
; Начало подпрограммы обслуживания I/O-7
OUT Reset _IR7 ; Сброс запроса прерывания от I/O-7 (сигнал I/OW&CSI7 = 0)
JMP ENDRST ; Конец подпрограммы обслуживания I/O-7
IO_0: ; Начало подпрограммы обслуживания //О-О
OUT Reset_IR0 ; Сброс запроса прерывания от I/О-0
JMP ENDRST ; Конец подпрограммы обслуживания I/О-0
IO_1: ; и т. д.
IO_6
ENDRST: POP В ; Восстановление состояния прерванной программы
POP D
POP Н
POP PSW
EI ; Разрешение прерываний (INTE ← 1)
RET ; Возврат в прерванную программу
Прервать эту подпрограмму до ее завершения другие внешние устройства не в состоянии, так как команда разрешения прерываний EI находится в самом конце подпрограммы.
Для определения адресов переходов на программы обслуживания I/О — m удобно использовать косвенно-регистровый метод адресации переходов (см. § 1.7). Пример 2:
; Начало подпрограммы обработки прерывания RST 7 с адресом вызова 7 х 8 = 56d = 38h
PUSH PSW ; Сохранение в стеке состояния прерванной программы
PUSH Н
PUSH D
PUSH В
IN CSbd ; А ← хххх xA2A1A0 — чтение номера I/О -m, пославшего запрос
AN1 7 ; А ← 0000 0A2A1A0 — выделение кода A2A1A0 = m
LXI H, Addr_t ; HL ← Addr_t (начальный адрес таблицы адресов
MVI D, 0 ; передачи управления)
ADD А ; А ← m х 2
MOV Е, А ; DE = m х 2
DAD D ; HL ← Addr_t + (m x 2)
MOV A, M
INX H
MOV H, M
MOV L, A ; HL = Addr_m
PCHL ; PC ← Addr_m (переход на обслуживание I/О - m, где m = A2A1A0)
Addr_t Addr_t ; Таблица адресов переходов: Addr_m — двухбайтовый адрес
Addr_t+ 2 Addr_1 ; передачи управления подпрограмме обслуживания
Addr_t + 4 Addr_2 ; внешнего устройства I/О - m (m = 0 ... 7)
Addr_t + 6 Addr_3
Addr_t + 8 Addr_4 ;Передача управления подпрограмме обслуживания
Addr_t + А Addr_5 ;внешнего устройства I/O – m осуществляется с помощью
Addr_t + С Addr_6 ; косвенно-регистрового метода адресации переходов
Addr_t + Е Addr_7
В этой подпрограмме используется таблица для восьми адресов переходов Addr_m и вычисление конкретного адреса таблицы для загрузки из нее адреса перехода в программный счетчик PC. Если при отладке программы адреса переходов изменятся или потребуется перенести подпрограммы обслуживания прерываний в другое место памяти, то достаточно будет изменить только таблицу адресов.
Рис. 2.14. Восьмивекторная система прерываний
Восьмивекторные системы прерываний. На рис 2.14 показана структурная схема МП - системы с восьмивекторным обслуживанием по прерыванию внешних устройств I/О - m (m = 0...7). Отличие этой системы прерываний от предыдущей заключается в том, что здесь производится чтение команд RST n из элементарного контроллера прерываний, выполненного на ИС 555ИВ1 и 1533АП12. Машинный код llxxxlll команд RST n формируется шинным драйвером 1533АП12. В ответ на групповой запрос прерывания GS = 1 (при INTE = 1) МП выдает в системный контроллер 8238 слово состояния SW8,10 = 0010x011 (см. табл. 1.15), по которому вырабатывается сигнал = ך_, производящий чтение шинного драйвера BD (безадресное чтение команд из внешнего устройства — контроллера прерываний).
Таким образом, ввод-вывод по прерыванию определяется схемой:
=> INTE (аппаратное квитирование ввода-вывода)
Im => GS ∫
=> SW8,10 => = ך_ => RST n => ППОП по адресу addr = 8 x n
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.