Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Программирование внешних устройств

Целью лабораторной работы является изучение способов организации взаимодействия процессора и внешних устройств (ВУ) в составе ЭВМ.

Теоретические положения:

Модели внешних устройств (ВУ), используемые в учебной ЭВМ, реализованы по единому принципу. С точки зрения процессора они представляют собой ряд программно-доступных регистров, лежащих в адресном пространстве ввода/вывода. Размер регистров ВУ совпадает с размером ячеек памяти и регистров данных процессора – шесть десятичных разрядов.

Доступ к регистрам ВУ осуществляется по командам IN аа, OUT аа, где аа – двухразрядный десятичный адрес регистра ВУ. Общий объем адресного пространства ввода/вывода составляет 100 адресов, при этом адресные пространства памяти и ввода/вывода в этой модели разделены.

Разные ВУ содержат различное число программно-доступных регистров, каждому из них присвоен свой адрес, нумерация которых начинается с 0. Подключаемому ВУ ставится в соответствие базовый адрес в пространстве ввода/вывода, а все адреса его регистров становятся смещениями относительно этого базового адреса.

Связь процессора и ВУ может осуществляться в синхронном или асинхронном режиме.

Синхронный режим используется для ВУ, всегда готовых к обмену (в нашей модели – дисплей и тоногенератор). Процессор может обращаться к этим ВУ, не анализируя их состояние (в учебной модели дисплей блокирует прием данных после ввода 128 символов, формируя флаг ошибки).

Асинхронный обмен предполагает анализ процессором состояния ВУ, которое определяет готовность ВУ выдать или принять данные или факт осуществления некоторого события, контролируемого системой (в нашей модели – клавиатура и блок таймеров.

Анализ состояния ВУ может осуществляться процессором двумя способами: в программно-управляемом режиме и в режиме прерывания.

В первом случае предполагается программное обращение процессора к регистру состояния ВУ с последующим анализом значения соответствующего разряда слова состояния. Такое обращение следует предусмотреть в программе с некоторой периодичностью, независимо от фактического наступления контролируемого события (например, нажатие клавиши).

Во втором случае при возникновении контролируемого события ВУ формирует процессору запрос на прерывание программы, по которому процессор и осуществляет связь с ВУ.

Если в системе создаются несколько ВУ, то их базовые адреса следует выбирать с учетом величины адресного пространства, занимаемого этими устройствами, исключая наложение адресов.

Вариант задания:

№ варианта Задание Используемые ВУ Пояснения
Селективный ввод символов с клавиатуры Клавиатура, дисплей Все русские буквы, встречающиеся в строке ввода – в верхнюю часть экрана дисплея (строки 1-4), все цифры – в нижнюю часть экрана (строки 5-8), остальные символы не выводить

Текст программы с программным анализом флагов и готовности ВУ:

RD #0 ;Начальный адрес, куда будем писать русские символы

wr R0 ;Сохраним

rd #64 ;Начальный адрес куда будем писать цифры

wr R1 ;Сохраним

RDI #101 ;Команда очистки буфера

out 1 ;для клавиатуры

out 11 ;и дисплея

RDI #102 ;Команда сброса ошибки

out 1 ;для клавиатуры

out 11 ;и для дисплея

RDI #10 ;Команда разрешения МВУ

OUT 1 ;для клавиатуры без прерываний (по опросу)

out 11 ;для монитора без автоувеличения адреса

RDI #103 ;Команда установки посимвольного ввода

out 1 ;для клавиатуры

LOOP:IN 2 ;Читаем регистр состояния клавиатуры

DIV #10 ;делим на 10, чтобы второй разряд готовности стал в первом разряде

WR R3 ;Сохраним

DIV #2 ;Разделим на 2

MUL #2 ;Умножим на 2

SUB R3 ;Отнимем сохранное

JZ LOOP ;Если четное, то нет кода в буфере, идем на цикл

IN 0 ;Считываем код с клавиатуры

wr R2 ;Сохраним

sbi #48 ;<'0'

js RESET ;Игнорируем, на сброс клавиатуры

rd R2 ;код

sbi #58 ;>'9'

jns CMPRUS ;Проверим на русские буквы

RD R1 ;Цифру выводим в нижней части экрана, в R1 адрес, куда писать

out 13 ;в регистр адреса

adi #1 ;инкремент адреса

wr R1 ;Сохраним

rd R2 ;код

out 10 ;На дисплей!

jmp RESET ;На сброс клавиатуры

CMPRUS:RD R2 ;код, проверим на > 128 - там русские буквы

SBI #128 ;Сравним со 128

JS RESET ;< 128 игнорируем

RD R0 ;Русские буковки выводим в верхней части экрана, в R0 адрес, куда писать

out 13 ;в регистр адреса

adi #1 ;инкремент адреса

wr R0 ;Сохраним

rd R2 ;код

out 10 ;На дисплей!

RESET:RDI #101 ;Команда сброса

out 1 ;В клавиатуру

RDI #103 ;Команда установки посимвольного ввода (сбрасывается при сбросе)

out 1 ;В клавиатуру

jmp LOOP ;На чтение состояния клавиатуры

Текст программы с обработчиком прерываний:

RD #27 ;Адрес обработчика прерывания клавиатуры

WR 100 ;запишем по адресу обработчика IRQ0

RD #0 ;Начальный адрес куда будем писать русские символы

wr R0 ;Сохраним

rd #64 ;Начальный адрес куда будем писать цифры

wr R1 ;Сохраним

RDI #101 ;Команда очистки буфера

out 1 ;для клавиатуры

out 11 ;и дисплея

RDI #102 ;Команда сброса ошибки

out 1 ;для клавиатуры

out 11 ;и для дисплея

RDI #11 ;Команда разрешения МВУ и работы по прерыванию

OUT 1 ;для клавиатуры

RDI #10 ;Команда разрешения МВУ

out 11 ;для монитора без автоувеличения адреса

RDI #103 ;Команда установки посимвольного ввода

out 1 ;для клавиатуры

EI ;Разрешаем прерывания от устройств (клавиатуры)

LOOP: ;Пустой цикл

NOP ;Вся работа в прерывании

NOP

JMP LOOP

INT0:IN 0 ;Считываем код с клавиатуры

wr R2 ;Сохраним

sbi #48 ;<'0'

js RESET ;Игнорируем, на сброс клавиатуры

rd R2 ;код

sbi #58 ;>'9'

jns CMPRUS ;Проверим на русские буквы

RD R1 ;Цифру выводим в нижней части экрана, в R1 адрес, куда писать

out 13 ;В регистр адреса

adi #1 ;инкремент адреса

wr R1 ;Сохраним

rd R2 ;код

out 10 ;На дисплей!

jmp RESET ;На сброс клавиатуры

CMPRUS:RD R2 ;Код, проверим на > 128 - там русские буквы

SBI #128 ;Сравним со 128

JS RESET ;< 128 игнорируем

RD R0 ;Русские буковки выводим в верхней части экрана, в R0 адрес, куда писать

out 13 ;в регистр адреса

adi #1 ;инкремент адреса

wr R0 ;Сохраним

rd R2 ;код

out 10 ;На дисплей!

RESET:RDI #101 ;Команда сброса

out 1 ;В клавиатуру

RDI #103 ;Команда установки посимвольного ввода (сбрасывается при сбросе)

out 1 ;В клавиатуру

IRET ;Возврат из прерывания

 

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.