;; если дополнение равно десяти
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;; следующий символ