Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Печатающее устройство




Печать копии экрана (1NT 05h)

Возможны два случая:

INT 05h – SW, печать копии экрана;

INT 05h – CPU, нарушение адресной границы.

INT 05h вызывается путем выполнения команды INT 05h (для печати копии экрана). Это достигается нажатием клавиши PrintScreen. Данное прерывание используется также CPU для генерирования неисправности, когда превышены пределы, указанные в команде BOUND.

BIOS: указывается обработчик BIOS «Печать копии экрана».

ДЕЙСТВИЕ: при нажатии клавиши PrintScreen обработчик клавиатуры ПЗУ обращается к программе прерываний. INT 05h использует команду INT 10h, чтобы считывать информацию из видеобуфера, и INT 17h для передачи символов на принтер. Символы из каждой позиции экрана посылаются на принтер без подавления следов перемещения курсора. Состояние печати копии экрана отражается флажком в ячейке памяти 40:0100h.

При обращении к INT 05h сохраняется текущая позиция курсора. Эта позиция восстанавливается по завершении печати. Состояние печати копии экрана хранится по адресу 0040:0100п, где 00h – печати копии экрана нет (или успешное завершение вызова печати копии экрана), 01h – идет печать копии экрана. Значение FFh возвращается при обнаружении тайм-аута.

Если во время печати копии экрана производится попытка еще одного обращения по команде INT 05h, оно игнорируется. Все регистры сохраняются. INT 05h выполняется при разрешенных прерываниях.

ВХОДНЫЕ ПАРАМЕТРЫ: отсутствуют.

ВЫХОДНЫЕ ПАРАМЕТРЫ: 0040:0100h – состояние печати копии экрана.

НАЗНАЧЕНИЕ: прикладная программа может использовать данное прерывание для запроса документальной копии экрана. Этот вектор обычно изменяется при расширении функций экрана, которые оперируют с графическим экраном, специальными принтерами или переадресовывают выходные данные в файлы.

Прерывание от принтера (INT OFh)

INT OFh не используется в системе. INT OFh не обрабатывается BIOS, управление передается вызывающей программе.

BIOS: указывает на возврат из прерывания.

ДЕЙСТВИЕ: отсутствует.

НАЗНАЧЕНИЕ: вектор для этого прерывания может быть изменен таким образом, что он будет указывать на прерывания от принтера в соответствии с особыми требованиями операционных систем реального времени (например, для вывода на печать с подкачкой).

Устройство печати IBM PC – подобных компьютеров обычно подключается к параллельному интерфейсу. Для подключения используется стандартный разъем Centronix, имеющий 36 контактных выходов (отечественный аналог ИРПР-М). Допускается три варианта подключения принтеров к ПЭВМ:

адаптер принтера может находится на одной плате с адаптером монохромного дисплея, при этом используются порты 3BCh - 3BEh;

к ПЭВМ могут подключены два отдельных адаптера для управления принтерами, использующие порты 378h – 37Ah (первый адаптер) и 278h – 27Ah (второй адаптер).

При программировании принтера важно знать адрес базового порта ввода-вывода (первого порта из трех); адреса базовых портов хранятся в области данных BIOS, начиная с адреса 0:408h (LPT1) и далее по слову на принтер до LPT4. Дальнейшее описание предполагает, что базовый адрес принтера равен 378h.

 

Порт Операция Описание
378h Запись Регистр данных - сюда засылается байт, посылаемый на печать
Чтение Регистр данных - позволяет считать последний байт, переданный принтеру
379h Чтение Регистр состояния принтера

Примечания.

1. Для запуска печати символа нужно на короткое время установить бит О регистра управления, а затем сбросить его.

2. Прерывание происходит по окончании вывода символа на печать: для первого принтера на седьмом уровне контроллера прерываний (IRQ7, вектор прерывания OFh), для второго принтера – на пятом уровне (IRQ5, вектор ODh). Следует отметить также, что IRQ5 используется XT – контроллером жестких дисков для генерации своих прерываний. Обычно этот бит не используется (сбрасывается), а проверка готовности принтера производится на основании опроса регистра состояния.

Типичная последовательность действий для вывода на печать одного символа такова:

– вывести передаваемый байт в регистр данных;

– в цикле проверять состояние принтера до установки бита 7 регистра состояния (здесь возможно использование таймаута);

– проверить биты 3-5 регистра состояния на наличие ошибки;

– установить и сразу же сбросить нулевой бит регистра управления, для этого подходит следующая последовательность команд:

mov dx, 37Ah; адрес регистра управления

mov al, 00001101b; установить биты 0, 2 и 3

out dx, al; вывести команду

xor al, l; сбросить бит 0

out dx, al; повторно вывести команду

далее можно прочитать и запрограммировать регистр состояния и перейти к печати следующего символа.

2. Доступ и управление параллельным портом

Компьютер IBM может управлять тремя параллельными портами LPT1 – LPT3. Базовый адрес LPT1 находится в ячейке BIOS 0040:0008 (слово), LPT2 – 0040:ОООА и т. д. Какой адаптер назначен какому LPT не определено и зависит от конфигурации компьютера и ОС, поэтому программа должна определить используемые ими адреса. При инициализации базовому адресу присваивается 0, если адаптер не установлен.

Регистр выходных данных – тот адрес порта, через который проходит каждый байт данных, посылаемый в порт. Регистр статуса сообщает различную информацию о входных линиях; процессор может постоянно опрашивать его, чтобы распознать момент, когда все в порядке и можно посылать данные. Регистр статуса сообщает также, что произошла ошибка (линия ERROR). Регистр управления инициализирует адаптер и управляет выводом данных. Он может также подготавливать параллельный порт для операций прерывания с тем, чтобы устройство посылало прерывание к процессору, когда оно готово к приему очередной порции данных, оставляя процессор свободным для других дел. Ниже перечислены значения битов регистров статуса и управления.

 

Регистр управления

бит 0 – 0= нормальная установка 1 = вызывает вывод байта данных

бит 1 – 0 = нормальная установка 1 = автоматический перевод строки после возврата каретки

бит 2 – 0 = инициализировать порт принтера 1 = нормальная установка

бит 3 – 0 = отмена выбора принтера 1 = нормальная установка

бит 4 – 0 = прерывание принтера запрещено 1 = разрешено

бит 5 – 7 не используются

 

Регистр статуса

бит 0 – 2 не используются

бит 3 – 0 = ошибка принтера 1 = нет ошибки

бит 4 – 0 = принтер off-line 1 = принтер on-line

бит 5 – 0 = бумага вставлена 1 = нет бумаги

бит 6 – 0 = принтер подтверждает прием символа 1= нормальная установка

бит 7 – 0 = принтер занят 1= принтер свободен

 

Из этих таблиц видно, как соотносятся входные линии порта и биты регистров управления и статуса.

Мы можем управлять отдельно каждой выходной линией порта, посылая соответствующий байт в базовый регистр, и знать состояние каждой входной линии, читая из регистров статуса/управления. Для получения базового адреса порта прочитаем его из BIOS:


(ASM):

;записали сегмент BIOS в ES прочитали базовый адрес и запомнили

MOV AX, 0040h

MOV ES, AX

MOV DX, ES: [8]

MOV LPT_BASE, DX

INC DX

MOV LPTl_status, DX; добавили 1 и получили perистр статуса.

;добавили еще 1 и получили per.управления

INC DX

MOV LPT1 control, DX__ _

MOV AL,...; что-то занесли в AL

OUT DX, AL; и записали в порт управления


 

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

Например, требуется установить ВЫСОКИЙ уровень на линии SLCT IN (выбор принтера).Из таблиц видим, что этой линией управляет бит 3 регистра управления. Проделаем следующее:

– прочитаем из этого регистра

– с прочитанным значением делаем операцию OR с маской 00001000Ь, при этом все немаскированные биты (значение 0 в маске), сохранят свое прежнее значение, а бит 3 станет единицей.

– запишем полученное значение в регистр

Для сброса этой линии в НИЗКИЙ уровень делаем так:

– прочитаем из этого регистра

– с прочитанным значением делаем операцию AND с маской 11110111Ь, при этом все маскированные биты (значение 1 в маске), сохранят свое прежнее значение, а бит 3 станет нулем.

– запишем полученное значение в регистр

Рассмотрим фрагмент кода для таких операций:


(ASM):

; установим ВЫСОКИЙ уровень

MOV DX, LPT1_CONTROL; загрузили адрес регистра в DX

MOV АН, 0000100Ob; маску - в АН

IN AL, DX; прочитали регистр

OR AL, AH; отмаскировали

OUT DX, AL; записали обратно...

;установим НИЗКИЙ

MOV DX, LPT1_CONTROL; загрузили адрес регистра в DX

MOV АН, 111101lib; маску - в АН (для циклического

изменения

используем NOT)

IN AL, DX; прочитали регистр

AND AL, AH; отмаскировали

OUT DX, AL; записали обратно...

 

Текст программы:

Часть 1

STCK Segment Stack

dw 64 dup(?)

STCK EndS

 

DATA Segment

Sym db?

STRING db 20, 21 dup(?)

MSG_Error db 'Printer not ready', 13, 10, '$'

Len db?

DATA EndS

 

Code Segment

Assume CS:Code, DS:Data, SS:Stck

Ready PROC

BEG:

Mov DX, 379h;адрес порта состояния 379h

in AL, DX;чтения байта состояния

Cmp AL, 7Fh

Jne NEXT1

CALL Error

Mov AH, 4Ch

Int 21h

NEXT1:

Mov CX, 0FFFFh;

WAIT1:;задержка на ответ принтера о готовности

Loop WAIT1;

Mov DX, 379h;379h

Mov CX, 0FFFFh

BUSY:

in AL, DX;чтения байта состояния

AND AL, 10000000b;принтер занят, если 7-ой бит = 0

Cmp AL, 10000000b

Je NEXT4

Loop BUSY

NEXT4:

;печать символа

Mov DX, 37Ah;адрес порта управления 37Ah

in AL, DX

Mov AH, AL;сохранение старого слова управления

OR AL, 00000001b;установление 0-го бита для печати

out DX, AL;печать символа

Mov AL, Sym

Mov DX, 378h;адрес порта данных 378h

out DX, AL;посылка символа в порт данных

Mov AL, AH

Mov DX, 37Ah;адрес порта управления 37Ah

AND AL, 0FEh;сброс 0-го бита

out DX, AL

ret

Ready EndP

Error:

Mov AH, 09h

Mov DX, offset MSG_Error

Int 21h

ret

Main PROC Far

Push DS

Xor AX, AX

Push AX

Mov AX, Data

Mov DS, AX

 

Mov AH, 0Ah

Lea DX, String

Int 21h

Mov AL, String+1

Mov Len, AL

 

XOR CX, CX

Mov CL, Len

Add CX, 1

Mov SI, CX

nx:

Push CX

Mov AL, byte ptr [offset STRING+SI]

Mov Sym, AL

CALL Ready

Pop CX

Dec SI

Loop nx

Mov AH, 4Ch

Int 21h

Main EndP

Code EndS

End Main

 


 


.MODEL SMALL

.STACK 64h

.DATA

er db 0

sym db 5

string db 27, 75, 24, 0, 3, 12, 52, 65, 52, 12, 3, 0, 113, 73, 73, 79, 0, 3, 12, 48, 64, 48, 8, 48, 64, 48, 12, 3, '$'

error db 'Printer not ready', 13, 10, '$'

pe db 'No paper', 13, 10, '$'

notrd db 'Printer error', 13, 10, '$'

lpt_base dw 0

 

.CODE

START:

mov ax, @DATA

mov ds, ax

mov cx, 0

repeat:

mov ah, 00h

int 16h

cmp al, 1bh;esc

je f2

cmp al, 070h

je cont

cmp al, 050h

je cont

jmp repeat

cont:

inc cx

cmp cx, 6

je f2

mov ax, 40h

mov es, ax

mov dx, es:[8];пpочитать базовый адpесс паpал. поpта

mov lpt_base, dx;в ячейкy памяти

lea bx, string

f1:

mov al, ds:[bx]

cmp al, '$'

je cont

out dx, al

inc dx

 

in al, dx

test al, 80h

jz prn_n_r

 

inc dx

mov al, 0dh

out dx, AL

mov al, 0ch

out dx, al

dec dx

not_y2:

in al, dx;

test al, 10h

jz printer_error

test al, 8h;пpовеpка бита 2 в 3 на ошибкy

jz printer_error

test al, 80h;пpовеpка готовности пpинтеpа

jz not_y2

test al, 20h;пpовеpка наличия бyмаги

jnz papier

dec dx

inc bx

jmp f1

prn_n_r:

mov ah, 9

lea dx, error

int 21h;печать сообщения

jmp f1

papier:

mov ah, 9

lea dx, pe

int 21h;печать сообщения

jmp f2

printer_error:;ошибка пpинтеpа

mov ah, 9

lea dx, notrd

int 21h;печать сообщения

f2:

mov ah, 4ch

int 21h

end START


 

 




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 220; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.101 сек.