Advertisement
Guest User

Untitled

a guest
Aug 6th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %TITLE "lab3.asm Lab 3"
  2. ;На экране инициализировать 2 локальных окна. Каждое окно
  3. ;со своим атрибутом и текстом с несколькими строками.
  4. ;Организовать циклическое переключение атрибутов первого
  5. ;окна на второе и обратно. Цикл переключения задаётся
  6. ;временной задержкой в 2...3 сек. Предусмотреть выход из программы.
  7. IDEAL
  8. P386N
  9. MODEL small
  10. STACK 256
  11. ;Макросы
  12. ;Макрос инициализации окна с цветом (N=0) или его скроллинг вверх на N-строк
  13. MACRO window N,attrib,y1,x1,y2,x2
  14.     mov ah,06h              ;Функция инициализация окна или его скроллинг вверх
  15.     mov al,N
  16.     mov bh,attrib           ;Атрибут цвета
  17.     mov ch,y1               ;Координаты левого верхнего угла (у1,х1)
  18.     mov cl,x1
  19.     mov dh,y2               ;Координаты правого нижнего угла (у2,х2)
  20.     mov dl,x2
  21.     int 10h
  22. ENDM window
  23.  
  24. ;Макрос позиционирования курсора в точку k-го локального окна "у-строка(row),
  25. ;х-столбец(col)" с запоминанием координат в памяти переменных: row_k,col_k
  26. MACRO locate x,y,k
  27.     mov ah,02h              ;Функция позиционирования курсора
  28.     mov bh,0                ;Номер страницы
  29.     mov dh,y
  30.     mov dl,x
  31.     mov [row_&k],dh
  32.     mov [col_&k],dl
  33.     int 10h
  34. ENDM locate
  35.  
  36. ;Макрос вывода сообщения mes, длиной leng, атрибутом цвета attrib и с
  37. ;позиции (row_k,col_k), здесь k -номер окна. После вывода сообщения
  38. ;курсор перемещается в его конец. Если сообщение не укладывается в одну
  39. ;строку можно применить управляющие коды 10h (перевод строки) и 13h (возврат
  40. ;каретки)
  41. MACRO out_str mes,leng,attrib,k
  42.     mov ah,13h
  43.     mov al,1                ;Признак смещения курсора в конец строки
  44.     mov bh,0                ;Номер видеостраницы
  45.     mov bl,attrib
  46.     mov cx,leng
  47.     mov dh,[row_&k]
  48.     mov dl,[col_&k]
  49.     mov bp,offset mes       ;Адрес строки ES:BP
  50.     int 10h
  51. ENDM out_str
  52. crlf EQU 13,10,13 DUP(20h)
  53. crlf2 EQU 13,10,50 DUP(20h)
  54.  
  55. DATASEG
  56.     exCode DB 0
  57.     mes1 DB 'Press <F1> for exit.'
  58.     DB crlf,'Timeout 3sec'
  59.     leng_mes1 = $-mes1  
  60.     mes2 DB 'abcdefghijklmn'
  61.     DB crlf2, 'opqrstuvwxyz'
  62.     leng_mes2 = $-mes2
  63.     row_1 DB ?
  64.     col_1 DB ?
  65.     row_2 DB ?
  66.     col_2 DB ?
  67.     ;Аттрибуты окон
  68.     attr_1 DB 0C1h
  69.     attr_2 DB 0E4h
  70. CODESEG
  71. Start:      mov ax,@data                        ;Установка в ds адреса
  72.             mov ds,ax                           ;сегмента данных
  73.             mov es,ax                           ;es=ds
  74.             ;Включение повышенной яркости экрана
  75.             mov ax,1003h                        ;Вызов функции
  76.             mov bl,0                            ;Повышенная яркость
  77.             int 10h
  78.     ;Цикл вывода окон с переключением аттрибутов по таймеру
  79.     looper:
  80.             ;Инициализация локального окна_2 с атрибутом 0E4h (красный по жёлтому)
  81.             ;с координатами: (0,0)- левый верхний угол, (25,80)- правый нижний
  82.             window 0,[attr_2],0,37,25,80
  83.             locate 50,13,2
  84.             out_str mes2,leng_mes2,[attr_2],2   ;Вывод сообщения mes2
  85.  
  86.             ;Инициализация локального окна_1 с атрибутом 0C1h (синий по розовому)
  87.             ;с координатами: (0,0)- левый верхний угол, (23,38)- правый нижний
  88.             window 0,[attr_1],0,0,25,38
  89.             locate 13,13,1
  90.             out_str mes1,leng_mes1,[attr_1],1   ;Вывод сообщения mes1
  91.  
  92.  
  93.     keys:   mov ah, 11h                         ;Асинхронный ввод символа
  94.             int 16h
  95.             cmp ah, 3Bh
  96.             je exit
  97.             CALL Timeout                        ;Вызов таймера
  98.             CALL SwitchAttr                     ;Переключение аттрибутов
  99.             jmp looper
  100.  
  101.     Exit:
  102.             window 0, 007h, 0, 0, 100,100
  103.             mov ah, 06h
  104.             int 10h
  105.             mov ah,04Ch ;Функция DOS 4Сh:выход из программы
  106.             mov al,[exCode] ;Возврат кода ошибки
  107.             int 21h ;Вызов DOS. Останов
  108.  
  109.         ;Процедура переключения аттрибутов окон
  110.         PROC SwitchAttr
  111.             push dx
  112.             ;Поменять местами аттрибуты
  113.             mov dh, [attr_1]
  114.             mov dl, [attr_2]
  115.             mov [attr_1], dl
  116.             mov [attr_2], dh
  117.             pop dx      
  118.             ret
  119.         ENDP SwitchAttr
  120.  
  121.         ;Процедура вызова таймера на 3сек
  122.         PROC Timeout
  123.             push ax
  124.             push dx
  125.             push bx
  126.             mov ah, 0                           ;Функция чтения циклов таймера
  127.             int 1Ah                             ;Получаем значение счетчика в cx, dx
  128.             add dx, 54                          ;Запоминаем требуемое значение
  129.             mov bx, dx
  130.          repeat:
  131.             int 1Ah                             ;Получаем значение счетчика
  132.             cmp dx, bx                          ;Сравниваем с искомым
  133.             jne repeat                          ;Повторяем, если не равно
  134.             pop bx
  135.             pop dx
  136.             pop ax
  137.             ret
  138.         ENDP timeout
  139. END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement