Лаба вариант №9 (Рабочий лист)

Посмотреть архив целиком

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

Задание: Программа ввода символов с клавиатуры с выводом на дисплей.

Используемые ВУ: Клавиатура, дисплей.

Пояснения: Очистка буфера клавиатуры после ввода 35 символов.

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

; Сброс и инициализация дисплея и клавиатуры

CALL ResetDisplay

CALL ResetKeyboard


; Основной цикл программы

Loop:


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

IN 2


; Если флаг стоит, то вывод символа или сброс.

JNZ FlagExist


; Проверка размера буфера (меньше 35)

RD R0

SBI 35

JS Loop


; Сброс клавиатуры

CALL ResetKeyboard


JMP Loop


FlagExist:


; Если есть флаг готовности, то вывод символа

DIVI 10

JNZ TestDisplay


; Сброс клавиатуры и повтор цикла

CALL ResetKeyboard

JMP Loop


TestDisplay:


; Проверка ошибки на дисплее и сброс, если она есть

IN 12

JZ PrintSymbol

CALL ResetDisplay

PrintSymbol:


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

IN 0

; Запись символа на экран

OUT 10


; Проверка ошибки на клавиатуре и сброс, если она есть

IN 2

JZ Increment

CALL ResetKeyboard

JMP Loop


Increment:

; Увеличение счётчика буфера на 1

RD R0

ADI 1

WR R0


; Завершение обработки прерывания

JMP Loop


ResetDisplay: ; Сброс и инициализация дисплея


; Очистка дисплея

RDI 101

OUT 11


; Разрешение работы дисплея и автосмещения

RDI 11

OUT 11


RET


ResetKeyboard: ; Сброс и инициализация клавиатуры


; Очистка клавиатуры

RDI 101

OUT 1


; Включение буфера клавиатуры

RDI 10

OUT 1


; Включение посимвольного ввода

RDI 103

OUT 1


; Установка счётчика для буфера в нуль

RDI 0

WR R0


RET

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

; Запись вектора прерываний

CALL GetIntAddr

WR 100


; Сброс и инициализация дисплея и клавиатуры

CALL ResetDisplay

CALL ResetKeyboard


; Разрешение прерываний в процессоре

EI


; Зацикливание

Loop:

JMP Loop


; Получение адреса обработчика прерывания

ReturnIntAddr:

POP R0

RD R0

RET

GetIntAddr:

CALL ReturnIntAddr


; Обработчик прерывания

Int:


; Проверка ошибки в дисплее

IN 12

JZ PrintSymbol

CALL ResetDisplay


PrintSymbol:


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

IN 0


; Запись символа на экран

OUT 10


; Проверка ошибки клавиатуры

IN 2

JZ Increment


; Сброс клавиатуры

CALL ResetKeyboard


; Завершение обработки прерывания

IRET

Increment:

; Увеличение счётчика буфера на 1

RD R0

ADI 1

WR R0


; Проверка размера буфера (меньше 35)

SBI 35

JNS Clear


; Завершение обработки прерывания

IRET


Clear:


; Сброс клавиатуры

CALL ResetKeyboard


; Завершение обработки прерывания

IRET


ResetDisplay: ; Сброс и инициализация дисплея


; Очистка дисплея

RDI 101

OUT 11


; Разрешение работы дисплея и автосмещения

RDI 11

OUT 11


RET


ResetKeyboard: ; Сброс и инициализация клавиатуры


; Очистка клавиатуры

RDI 101

OUT 1



; Включение буфера и прерываний клавиатуры

RDI 11

OUT 1


; Включение посимвольного ввода

RDI 103

OUT 1


; Установка счётчика для буфера в нуль

RDI 0

WR R0


RET

Текст программы с проверкой значения регистра результата.

; Сброс и инициализация дисплея и клавиатуры

CALL ResetDisplay

CALL ResetKeyboard


; Основной цикл программы

Loop:


; Проверка ошибки на дисплее и сброс, если она есть

IN 12

JZ PrintSymbol

CALL ResetDisplay


PrintSymbol:


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

IN 0


; Вывод символа, если он считался

JNZ WriteSymbol


; Проверка размера буфера (меньше 35)

RD R0

SBI 35

JS Loop


; Сброс клавиатуры

CALL ResetKeyboard


JMP Loop


WriteSymbol:


; Запись символа на экран

OUT 10


; Проверка ошибки на клавиатуре и сброс, если она есть

IN 2

JZ Increment

CALL ResetKeyboard

JMP Loop


Increment:


; Увеличение счётчика буфера на 1

RD R0

ADI 1

WR R0


; Завершение обработки прерывания

JMP Loop


ResetDisplay: ; Сброс и инициализация дисплея


; Очистка дисплея

RDI 101

OUT 11


; Разрешение работы дисплея и автосмещения

RDI 11

OUT 11


RET


ResetKeyboard: ; Сброс и инициализация клавиатуры


; Очистка клавиатуры

RDI 101

OUT 1


; Включение буфера клавиатуры

RDI 10

OUT 1


; Установка счётчика для буфера в нуль

RDI 0

WR R0


RET







Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.