[Назад] [Далее]

4.7.3. Параллельный порт

Параллельные порты используются в первую очередь для подключения принтеров, хотя встречаются и другие устройства, например переносные жесткие диски, которые могут подключаться к этим портам. Базовые средства DOS и BIOS для работы с параллельными портами аналогичны соответствующим средствам для работы с последовательными портами: DOS инициализирует стандартное устройство PRN, соответствующее первому порту LPT1, которое может быть переопределено командой MODE, и предоставляет прерывание для вывода в это устройство.


Функция DOS 05h — Вывод символа в стандартное устройство PRN

Ввод: АН = 05h
DL = символ

Кроме того, можно пользоваться функцией записи в файл или устройство, поместив в ВХ число 4, соответствующее устройству PRN. BIOS, в свою очередь, предоставляет базовый набор из трех функций для работы с принтером.


INT 17h, АН = 00 — Вывести символ в принтер

Ввод: АН = 00h
AL = символ
DX = номер параллельного порта (00 — LPT1, 01 — LPT2, 02 — LPT3)
Вывод: АН = состояние принтера:
    бит 7: принтер не занят
    бит 6: подтверждение
    бит 5: нет бумаги
    бит 4: принтер в состоянии on-line
    бит 3: ошибка ввода-вывода
    бит 0: тайм-аут

INT 17h, АН = 01 — Выполнить аппаратный сброс принтера

Ввод: АН = 01h
DX = номер порта (00h — 02h)
Вывод: АН = состояние принтера

INT 17h, AH = 02 — Получить состояние принтера

Ввод: АН = 02h
DX = номер порта (00h – 02h)
Вывод: АН = состояние принтера

Например, чтобы распечатать содержимое экрана на принтере, можно написать такую программу:

; prtscr.asm
; распечатать содержимое экрана на принтере
;
        .model     tiny
        .code
        .186                      ; для команды push 0B800h
        org        100h           ; начало СОМ-файла
start:
        mov        ah,1
        mov        dx,0           ; порт LPT1
        int        17h            ; инициализировать принтер,
        cmp        ah,90h         ; если принтер не готов,
        jne        printer_error  ; выдать сообщение об ошибке,
        push       0B800h         ; иначе:
        pop        ds             ; DS = сегмент видеопамяти в текстовом режиме
        xor        si,si          ; SI = 0
        mov        cx,80*40       ; CX = число символов на экране
        cld                       ; строковые операции вперед
main_loop:
        lodsw                     ; AL - символ, АН - атрибут, SI = SI + 2
        mov        ah,0           ; АН - номер функции
        int        17h            ; вывод символа из AL на принтер
        loop       main_loop
        ret                       ; закончить программу

printer_error:
        mov        dx,offset msg  ; адрес сообщения об ошибке в DS:DX
        mov        ah,9
        int        21h            ; вывод строки на экран
        ret

msg     db    "Принтер на LPT1 находится в состоянии offline или занят$"
        end        start

Чтобы распечатать экран в текстовом режиме на LPT1, достаточно всего лишь одной команды INT 05h, что в точности эквивалентно нажатию клавиши PrtScr.


п»ї
"target=_blank><\/a>") //-->