Add al,30h ;; получаем ascii код дополнения

;; если дополнение равно десяти

Cmp al,3Ah

Jne out_revers_replace_symb_Out_symbol

Mov al,31h;; помещаем ascii код единицы в al

Int 10h;; выводим его

Mov al,30h;; помещаем ascii код нуля в al

out_revers_replace_symb_Out_symbol:

mov byte ptr [bx-1],al;; замена дополнением

Int 10h;; вывод символа

Dec bx;; следующий символ

Jnz out_revers_replace_symb_Start

Mov al,0Dh

Int 10h

Mov al,0Ah

Int 10h

Pop ax

Ret

Out_revers_replace_symb endp

;; ******************** OUT_SYMBOLS_ON_PRINTER *****************************

;; Функция вывода символьной последовательности в обратном порядке на принтер

;; Входные параметры:

;; bx - указатель на конец последовательности

;; Выходные параметры:

;; bx - ноль, в случае вывода всей последовательности

Out_symbols_on_printer proc near

Push ax

Push dx

xor ax,ax;; ax = 0

mov es,ax;; es = ax

mov dx,es:[408h];; dx = базовый адрес LPT1

Inc dx

Inc dx

;; инициализация принтера

Mov al,00001000b;значение для инициализации

Out dx,al;начинаем инициализацию

;; задержка

Mov cx,1800h

Mov ax,2000h

Out_symbols_on_printer_delay1:;начало пустого цикла

Sub ax,1

Sbb cx,0

Jnz out_symbols_on_printer_delay1

Mov al,00001100b;обычное значение для регистра

Out dx,al;конец инициализации

;; задержка

Mov ax,1800h

Mov cx,2000h

out_symbols_on_printer_delay2:

Sub ax,1

Sbb cx,0

Jnz out_symbols_on_printer_delay2

Dec dx;; адрес байта статуса

In al,dx

Test al,10000000b

Jnz out_symbols_on_printer_Check_paper

Call out_curr_time

Mov ah,09h

Mov dx,offset txt_print_busy

Int 21h;; вывод сообщения о занятости принтера

Jmp out_symbols_on_printer_End

out_symbols_on_printer_Check_paper:

Test al,00100000b

Jz out_symbols_on_printer_Begin_print

Call out_curr_time

Mov dx,offset txt_print_no_paper

Int 21h;; вывод сообщения об отсутствии бумаги

Jmp out_symbols_on_printer_End

out_symbols_on_printer_Begin_print:

Mov cx,-1

Dec dx

out_symbols_on_printer_Next_char:

mov al,[bx-1];; очредной символ в al

Cmp al,'0';; если ноль

Jne out_symbols_on_printer_Not_zero

;; тут выодим единицу, а затем ноль

Cmp cx,bx

Je out_symbols_on_printer_Not_zero

Mov cx,bx

Inc bx

mov al,'1'

out_symbols_on_printer_Not_zero:

Out dx,al;; отправляем символ на печать

Inc dx;; увеличиваем dx на 2, чтобы получить

Inc dx;; адрес регистра управления выводом

Mov al,00001101b;; посылаем стробирующий импульс

Out dx,al

Mov al,00001100b;; выключаем стробирующий импульс

Out dx,al

Dec dx;; адрес порта состояния принтера

out_symbols_on_printer_No_ready:

In al,dx;; считываем байт состояния

;; проверка на ошибки во время печати

Test al,00001000b

Jnz out_symbols_on_printer_No_errors

Call out_curr_time

Mov ah,09h

Mov dx,offset txt_print_error

Int 21h

Jmp out_symbols_on_printer_End

out_symbols_on_printer_No_errors:

Test al,80h

Jz out_symbols_on_printer_No_ready

Dec dx;; возврат на базовый адрес

Dec bx;; следующий символ


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: