;; процессора 80286 (реальный режим) и инструкций арифметического
;; сопроцессора 80287.
;; Сегмент стэка -----------------------------------------------------------
Stack_segment segment para stack
Dw 16 dup(?)
Stack_segment ends
;; Сегмента данных ---------------------------------------------------------
Data_segment segment para
;; переход на новую строку и возврат каретки
Cr equ 0Dh
Lf equ 0Ah
;; количество символов
Symblos_num equ 16
;; массив, хранящий введённую последовательность
Arr_symbols db symblos_num dup(?)
;; выводимые сообщения
txt_empty_str db 'BBegeHHa9I nocJIegoBaTeJIbHocTb nycTa9I!
XoTuTe noBTopuTb BBog? (y/n)...',cr,lf,'$'
txt_separator db ' >> $'
txt_enter_symb db 'BBeguTe cuMBoJIbI, no}I{aJIyucTa:',cr,lf,'$'
Txt_out_symb db 'BBbIBog cuMBoJIoB B o6paTHoM nop9IgKe c 3aMeHou
u,uqpP:',cr,lf,'$'
txt_print_start db 'BBbIBog Ha ne4aTb.',cr,lf,'$'
txt_print_busy db 'IIpuHTep 3aH9IT!',cr,lf,'$'
txt_print_no_paper db 'HeT 6yMaru!',cr,lf,'$'
txt_print_error db 'Owu6ka Bo BpeM9I ne4aTu!',cr,lf,'$'
Data_segment ends
;; Сегмент кода ------------------------------------------------------------
Code_segment segment para
;; ********************************* MAIN **********************************
;; Главная функция
Main proc far
Assume cs:code_segment,ds:data_segment,ss:stack_segment
Push ds
Mov ax,0
Push ax
Mov ax,data_segment
|
|
Mov ds,ax
;; очистка экрана и установка режима
;; режим - 3 (80x25 цветной алфавитноцифровой)
Xor ax,ax
Mov al,3
Int 10h
;; в случае пустой введённой последовательности производится повтор
;; сообщения с просьбой ввести символы, либо выход из программы
main_Repeat_input:
;; вывод времени с разделителем
Call out_curr_time
;; вывод сообщения с просьбой ввести символы
Mov ah,09h
Mov dx,offset txt_enter_symb
Int 21h
;; ввод символьной последовательности
Call input_symbols
Cmp bx,0;; последовательность пустая?
Jne main_Symbols_were_enter;; если нет, продолжаем обработку
;; иначе вывод соответствующего сообще-
;; ния
Call out_curr_time
Mov dx,offset txt_empty_str
Int 21h;; вывод вопроса о повторе ввода
;; если ответом на вопрос были не "y" или "n", то повтор чтения
;; клавиши производится до получения правильного ответа
main_Repeat_answer:
Mov ah,10h;; функция чтения клавиши со 101-
;; клавишной клавиатуры
Int 16h;; вызов
cmp ah,15h;; "Y"?
Je main_Repeat_input;; если да, то повторяем ввод
cmp ah,31h;; "N"?
Jne main_Repeat_answer;; если нет, то спросить ещё раз
Jmp main_End_program;; если да, то выход из программы
;; если символы были введены, то их обработка продолжается
main_Symbols_were_enter:
Call out_curr_time
;; вывод сообщения о том, что сейчас будут выведены символы
;; в обратном порядке и с заменой цифр на их дополнения
Mov dx,offset txt_out_symb
Int 21h
Call out_curr_time
Push bx
Call out_revers_replace_symb;; вывод символов на экран
Call out_curr_time
Mov dx,offset txt_print_start
Int 21h
Pop bx
Call out_symbols_on_printer
;; задержка