;Лабораторная работа №4
;макроопределение
vivod macro row,col,symb ;параметры - номера строк и столбцов, выводимый символ
  push DX       ;копируем в стек используемые в программе регистры
  push AX       ;чтобы не испортить их программное содержимое
  push CX        ;
  mov DH,row  ;назначаем номер столбца
  mov DL,col   ;и номер строки соотв. папаметрам
  mov BH,0
  mov AH,2     ; помещаем курсор 
  INT 10h         ;в заданную позицию
  mov CX,8
 m:
  SHL symb,1 ;значение символа сдвгаем на 1 влево
  JC m1            ;если сдвинутый бит 1, то переход на метку
  mov DL,'0'    ;если нет, то в DL заносим о для вывода
  jmp m2          ;переход на метку
 m1:
  mov DL,'1' ;заносим в DL 1 для вывода
 m2:
  mov AH,2    ;вывод символа
  int 21h          ;из DL 
  loop m          ;переход к следующей итерации цикла
  pop DX        ;возвращаем первоначальное 
  pop AX       ;содержимое регистров
  pop CX       ;
 ENDM          ;конец макроопредления
;
;сегмент стека
SSEG SEGMENT STACK
 DB 128 DUP(?)
SSEG ENDS  ;конец сегмента стека
;сегмент данных
MYDAT SEGMENT
 simvol DB (?)
 x DB (0)       ;по умолчанию устанавливаем 
 y DB (0)       ;координаты (0,0)
 mes1 DB '“Введите коодинаты вывода :$'
 mes2 DB '‚Введите x:$'
 mes3 DB 'Введите y:$'
 mes4 DB 'Введите символ:$'
MYDAT ENDS
;
CSEG SEGMENT
  ASSUME CS:CSEG, DS:MYDAT, SS:SSEG
 MAIN PROC 
  mov BX,MYDAT
  mov DS,BX
  call CLRSCR            ;вызов процедуры очиски экрана
  mov AH,9                 ;
  lea DX,mes1             ;вывод строки 
  int 21H                      ;
  call nachalo              ;вызов процедуры перехода на новую строку
  mov AH,9                 ;вывод
  lea DX,mes2             ;строки
  int 21H
;ввод координаты строки
  xor CX,CX              ;обнуляем регистр СХ
 l1:
  mov AH,1              ;вводим символ
  int 21h
  cmp AL,13             ;проверяем не нажата ли клавиша "Ввод"
  je  endvvod           ;если да, то ввод завершен
  and AL,1111b        ;если нет, то избавляемся от ASCII кода цифры
  mov BL,AL             ;цифру в чистом виде заносим в BL
  mov CL,x                 ;номер строки помещаем в СL
  mov AL,10          
  mul CL                     ;умножаем CL на 10
  add AL,BL              ;складывем сод-е AL и BL
  mov x,AL                 ;полученную сумму заносим в х
 jmp l1                        ;переходим на метку
 endvvod:
;
  call nachalo            ;переход на новую строку
  mov AH,9               ;
  lea DX,mes3           ;вывод сообщения
  int 21H                    ;
;ввод координаты столбца
  xor CX,CX
 l2:
  mov AH,1             ;вводим первый символ
  int 21h
  cmp AL,13             ;если это "Ввод"
  je  endvvod2         ;ввод позиции закончен
  and AL,1111b        ;устраняем ASCII код
  mov BL,AL            ; цифру в BL
  mov CL,y                ;у в CL
  mov AL,10              ;делаем число
  mul CL                     ;двузначным
  add AL,BL
  mov y,AL
 jmp l2
 endvvod2:
;
  call nachalo         ;переход на новую строку
  mov AH,9
  lea DX,mes4        ;вывод строки сообщения
  int 21H
  mov AH,1            ;ввод символа,который
  int 21h                  ;должен быть представлен в двоичном формате
  mov simvol,AL   ;в переменную simvol заносим введенный символ
 vivod y,x,simvol  ;макрокоманда(вызов макроопределения с соотвю парам-ми)
;
 MOV AX,4C00H   ;коррекное завершение
 INT 21H                  ;программы
 MAIN ENDP          ;конец роцедуры MAIN
;
nachalo PROC   ;процедура осуществляющая перевод на новую строку
  mov AH,2
  mov DL,10
  int 21h                  
  mov AH,2
  mov DL,13
  int 21h
nachalo ENDP  ;конец процедуры
;процедура очистки экрана
CLRSCR PROC 
  push AX
  push BX
  push CX
  push DX
  mov AX,0600h
  mov BH,7
  xor CX,CX
  mov DX,1950h
  int 10h
  pop DX
  pop CX
  pop BX
  pop AX
  RET
CLRSCR ENDP   ;конец процедуры
CSEG ENDS
END MAIN         ;указываем имя первой вызываемой процедуры

