КАТЕГОРИИ: Архитектура-(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.
Примечания. 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; Просмотров: 242; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |