Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %TITLE "lab3.asm Lab 3"
- ;На экране инициализировать 2 локальных окна. Каждое окно
- ;со своим атрибутом и текстом с несколькими строками.
- ;Организовать циклическое переключение атрибутов первого
- ;окна на второе и обратно. Цикл переключения задаётся
- ;временной задержкой в 2...3 сек. Предусмотреть выход из программы.
- IDEAL
- P386N
- MODEL small
- STACK 256
- ;Макросы
- ;Макрос инициализации окна с цветом (N=0) или его скроллинг вверх на N-строк
- MACRO window N,attrib,y1,x1,y2,x2
- mov ah,06h ;Функция инициализация окна или его скроллинг вверх
- mov al,N
- mov bh,attrib ;Атрибут цвета
- mov ch,y1 ;Координаты левого верхнего угла (у1,х1)
- mov cl,x1
- mov dh,y2 ;Координаты правого нижнего угла (у2,х2)
- mov dl,x2
- int 10h
- ENDM window
- ;Макрос позиционирования курсора в точку k-го локального окна "у-строка(row),
- ;х-столбец(col)" с запоминанием координат в памяти переменных: row_k,col_k
- MACRO locate x,y,k
- mov ah,02h ;Функция позиционирования курсора
- mov bh,0 ;Номер страницы
- mov dh,y
- mov dl,x
- mov [row_&k],dh
- mov [col_&k],dl
- int 10h
- ENDM locate
- ;Макрос вывода сообщения mes, длиной leng, атрибутом цвета attrib и с
- ;позиции (row_k,col_k), здесь k -номер окна. После вывода сообщения
- ;курсор перемещается в его конец. Если сообщение не укладывается в одну
- ;строку можно применить управляющие коды 10h (перевод строки) и 13h (возврат
- ;каретки)
- MACRO out_str mes,leng,attrib,k
- mov ah,13h
- mov al,1 ;Признак смещения курсора в конец строки
- mov bh,0 ;Номер видеостраницы
- mov bl,attrib
- mov cx,leng
- mov dh,[row_&k]
- mov dl,[col_&k]
- mov bp,offset mes ;Адрес строки ES:BP
- int 10h
- ENDM out_str
- crlf EQU 13,10,13 DUP(20h)
- crlf2 EQU 13,10,50 DUP(20h)
- DATASEG
- exCode DB 0
- mes1 DB 'Press <F1> for exit.'
- DB crlf,'Timeout 3sec'
- leng_mes1 = $-mes1
- mes2 DB 'abcdefghijklmn'
- DB crlf2, 'opqrstuvwxyz'
- leng_mes2 = $-mes2
- row_1 DB ?
- col_1 DB ?
- row_2 DB ?
- col_2 DB ?
- ;Аттрибуты окон
- attr_1 DB 0C1h
- attr_2 DB 0E4h
- CODESEG
- Start: mov ax,@data ;Установка в ds адреса
- mov ds,ax ;сегмента данных
- mov es,ax ;es=ds
- ;Включение повышенной яркости экрана
- mov ax,1003h ;Вызов функции
- mov bl,0 ;Повышенная яркость
- int 10h
- ;Цикл вывода окон с переключением аттрибутов по таймеру
- looper:
- ;Инициализация локального окна_2 с атрибутом 0E4h (красный по жёлтому)
- ;с координатами: (0,0)- левый верхний угол, (25,80)- правый нижний
- window 0,[attr_2],0,37,25,80
- locate 50,13,2
- out_str mes2,leng_mes2,[attr_2],2 ;Вывод сообщения mes2
- ;Инициализация локального окна_1 с атрибутом 0C1h (синий по розовому)
- ;с координатами: (0,0)- левый верхний угол, (23,38)- правый нижний
- window 0,[attr_1],0,0,25,38
- locate 13,13,1
- out_str mes1,leng_mes1,[attr_1],1 ;Вывод сообщения mes1
- keys: mov ah, 11h ;Асинхронный ввод символа
- int 16h
- cmp ah, 3Bh
- je exit
- CALL Timeout ;Вызов таймера
- CALL SwitchAttr ;Переключение аттрибутов
- jmp looper
- Exit:
- window 0, 007h, 0, 0, 100,100
- mov ah, 06h
- int 10h
- mov ah,04Ch ;Функция DOS 4Сh:выход из программы
- mov al,[exCode] ;Возврат кода ошибки
- int 21h ;Вызов DOS. Останов
- ;Процедура переключения аттрибутов окон
- PROC SwitchAttr
- push dx
- ;Поменять местами аттрибуты
- mov dh, [attr_1]
- mov dl, [attr_2]
- mov [attr_1], dl
- mov [attr_2], dh
- pop dx
- ret
- ENDP SwitchAttr
- ;Процедура вызова таймера на 3сек
- PROC Timeout
- push ax
- push dx
- push bx
- mov ah, 0 ;Функция чтения циклов таймера
- int 1Ah ;Получаем значение счетчика в cx, dx
- add dx, 54 ;Запоминаем требуемое значение
- mov bx, dx
- repeat:
- int 1Ah ;Получаем значение счетчика
- cmp dx, bx ;Сравниваем с искомым
- jne repeat ;Повторяем, если не равно
- pop bx
- pop dx
- pop ax
- ret
- ENDP timeout
- END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement