; вводим длительность смещения
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 ; грузим сохраненные сегмент и смещение
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.