Работа с адаптером дисплея в текстовом режиме, страница 6

; вводим длительность смещения

gtime1:  mov ah,09h

         lea dx,Message4

         int 21h              ; приглашение на ввод смещения

         mov ah,0ah

         mov dx,offset buff   ; адрес буфера

         int 21h              ; принимаем строку

         mov dl,0ah

         mov ah,02

         int 21h              ; выводим перевод строки

         mov si,offset buff+2 ; готовим параметр для процедуры интерпретации

         call InInt           ; переводим введенную строку в число

         cmp ax,0             ; смещение д.б.не меньше нуля

         jle gtime1

         push ax

; считываем и выводим текущее время

         mov ah,09h

         lea dx,Message2

         int 21h              ; выводим заголовок текущего времени

         mov ah,2             ; запрашиваем текущее время

         int 1ah

         call prtime          ; выводим текущее время

; готовимся к выполнению сдвига времени на указанное смещение

         mov bl,dh

         call bcd2int         ; переводим секунды в число

         push ax

         mov bl,cl

         call bcd2int         ; переводим минуты в число

         push ax

         mov bl,ch

         call bcd2int         ; переводим часы в число

                              ; теперь в ax часы

         pop bx               ; в bx минуты

         pop cx               ; в cx секунды

         pop dx               ; в dx смещение

; сдвигаем время

next1:

         dec cx               ; уменьшаем секунды

         cmp cx,0           

         jge plain1           ; не меньше нуля - продолжаем сдвиг

         mov cx,59            ; секунд теперь 59

         dec bx               ; уменьшаем минуты

         cmp bx,0            

         jge plain1           ; не меньше нуля - продолжаем сдвиг

         mov bx,59            ; минут теперь 59

         dec ax               ; уменьшаем часы

         cmp ax,0

         jge plain1           ; не меньше нуля - продолжаем сдвиг

         mov ax,23            ; часов теперь 23

plain1:

         dec dx               ; уменьшаем счетчик смещения

         cmp dx,0

         jnz next1            ; продолжаем сдвиг

         push ax              ; сохраняем часы и секунды

         push cx

         call int2bcd         ; переводим минуты в формат bcd

         mov cl,al           

         pop bx

         call int2bcd         ; переводим секунды в формат bcd

         mov dh,al

         pop bx

         call int2bcd         ; переводим часы в формат bcd

         mov ch,al

         mov ah,3             ; устанавливаем новое значение времени

         int 1ah

; считываем и выводим установленное время

         mov ah,09h

         lea dx,Message3

         int 21h              ; выводим заголовок сдвинутого времени

         mov ah,2             ; запрашиваем время

         int 1ah

         call prtime          ; выводим время

; сбрасываем будильники, если они были установлены

         mov ah,7

         int 1ah

; устанавливаем вектор прерывания по будильнику

         push es

         mov ah,35h           ; сохраняем адрес и смещение

         mov al,4ah           ; установленного обработчика

         int 21h              ; прерывания по будильнику

         mov vseg,es

         mov voff,bx

         pop es

         push ds              

         mov ax,seg alarm     ; сегмент обработчика

         mov ds,ax           

         mov dx,offset alarm  ; смещение обработчика

         mov al,4ah           ; номер вектора

         mov ah,25h          

         int 21h              ; меняем вектор

         pop ds              

; устанавливаем время срабатывания будильника        

         mov ah,2             ; запрашиваем текущее время

         int 1ah

         mov bl,dh

         call bcd2int         ; переводим секунды в число

         push ax

         mov bl,cl           

         call bcd2int         ; переводим минуты в число

         push ax

         mov bl,ch

         call bcd2int         ; переводим часы в число

                              ; теперь в ax часы

         pop bx               ; в bx минуты

         pop cx               ; в cx секунды

         mov dx,15            ; на 15 секунд вперед

next2:

         inc cx               ; сдвигаем секунды вперед

         cmp cx,59

         jle plain2           ; накопилась полная минута

         mov cx,0             ; обнуляем секунды

         inc bx               ; наращиваем минуты

         cmp bx,59

         jle plain2           ; накопился полный час

         mov bx,0             ; обнуляем минуты

         inc ax               ; наращиваем часы

         cmp ax,23

         jle plain2           ; накопились полные сутки

         mov ax,0             ; обнуляем часы

plain2:

         dec dx               ; декрементируем счетчик смещения

         cmp dx,0

         jnz next2            ; продолжаем обработку

         push ax

         push cx

         call int2bcd         ; переводим минуты в формат bcd

         mov cl,al           

         pop bx

         call int2bcd         ; переводим секунды в формат bcd

         mov dh,al

         pop bx

         call int2bcd         ; переводим часы в формат bcd

         mov ch,al

         mov ah,6             ; устанавливаем время срабатывания

         int 1ah              ; будильника

; ожидание

         mov ah,09h

         lea dx,Message5

         int 21h              ; выводим сообщение ожидания будильника

         xor ah,ah            ; ожидаем нажатия какой-нибудь клавиши   

         int 16h

; восстанавливаем измененный вектор прерывания

         mov dx,voff          ; грузим сохраненные сегмент и смещение