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

oh0:    rol al,4              ; циклически сдвигаем значение,

        mov dl,al             ; чтобы очередная тетрада стала младшей

        and dl,0Fh            ; гасим старшую тетраду

        cmp dl,9              ; сравниваем значение с 9

        jbe short oh1         ; это цифра - обходим доп.корректировку

        add dl,7              ; дополнительно корректируем до буквы

oh1:    add dl,30h            ; корректируем до цифры

        push ax

        mov ah,02h            ; выводим полученную цифру

        int 21h

        pop ax

        loop oh0              ; продолжаем вывод

        pop dx                ; восстанавливаем регистры

        pop cx

        ret

OutHex  endp

;-------------------------------------------------------------------------

InHex   proc near             ; процедура ввода шестнадцатеричного числа

                              ; считанное число возвращает в ax

;-------------------------------------------------------------------------

        push cx               ; сохраняем регистры

        push dx

        xor cx,cx             ; обнуляем регистр для накопления числа

ih0:    mov ah,1              ; вводим символ

        int 21h

        sub al,30h            ; вычитаем из него '0'

        jb short ih3          ; результат < 0 - это не hex цифра

        cmp al,9              ; результат < 9 - это десятичная цифра

        jbe short ih2

        sub al,11h            ; вычитаем из результата 17

        jb short ih3          ; теперь он < 0 - это не большая hex буква

        cmp al,5      

        jbe short ih1         ; результат > 5 - это не большая hex буква

        sub al,20h            ; вычитаем из результата 32

        jb short ih3          ; теперь он < 0 - это не маленькая hex буква

        cmp al,5

        ja short ih3          ; результат > 5 - это не маленькая hex буква

ih1:    add al,10             ; корректируем до числа

ih2:    shl cx,4              ; сдвигаем накапливаемое число на тетраду

                              ; влево, на освободившееся место пишем

        or cl,al              ; распознанную цифру

        jmp short ih0         ; продолжаем ввод

ih3:    mov ah,02h            ; выводим перевод строки

        mov dl,0dh

        int 21h

        mov dl,0ah            ; и возврат каретки

        int 21h

        mov ax,cx             ; переносим результат в ax

        pop dx                ; восстанавливаем регистры

        pop cx

        ret

InHex   endp

;-------------------------------------------------------------------------

end main

ГУАП

КАФЕДРА № 44

ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

ассистент

А.Б. Бубликов

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №5

Работа с системными часами

по курсу: ИНТЕРФЕЙСЫ ПЕРИФЕРИЙНЫХ УСТРОЙСТВ

РАБОТУ ВЫПОЛНИЛ(А)

СТУДЕНТ(КА) ГР.

В8441

Тарасов Р.С.

подпись, дата

инициалы, фамилия

Санкт-Петербург 2011

Опросить текущее состояние часов и вывести на экран. Считать с клавиатуры количество секунд и установить системное время на это количество секунд в прошлое. Установить будильник на 15 секунд в будущее и обработать его прерывние выдав звуковой сигнал.

Ниже перечислены использованные функции INT 1AH доступа к часам реального времени:

AH  сервис

--- ----------------------------------------------------------------------------

02H ¦AT¦ читать время из CMOS часов реального времени

    выход: CH = часы в коде BCD   (пример: CX = 1243H = 12:43)

           CL = минуты в коде BCD

           DH = секунды в коде BCD

    выход: CF = 1, если часы не работают

--- ----------------------------------------------------------------------------

03H ¦AT¦ установить время на CMOS часах реального времени

     вход: CH,CL = часы,минуты в коде BCD

           DH    = секунды в коде BCD

           DL = 1 для опции "единиц светового дня"

--- ----------------------------------------------------------------------------

06H ¦AT¦ установить сигнал часов реального времени. В указанное время вызывается

     пользовательская программа по вектору прерывания INT 4aH. Лишь один сигнал

     может быть активен в каждый момент времени.

     вход: CH,CL = часы,минуты в коде BCD

           DH    = секунды в коде BCD

    выход: CF = 1, если часы не работают или сигнал уже активен

--- ----------------------------------------------------------------------------

07H ¦AT¦ сбросить сигнал часов реального времени. Эта функция позволяет отменить

     один сигнал перед установкой другого.

--- ----------------------------------------------------------------------------

Текст программы:

        .MODEL SMALL

        .STACK 100h

        .DATA

Message1 DB 'Программа демонстрирует работу с часами',13,10,'$'

Message2 DB 'Текущее время:','$'

Message3 DB 'Время, сдвинутое назад:','$'

Message4 DB 'Введите смещение в секундах: ','$'

Message5 DB 'Через 15 секунд должен сработать будильник',13,10,'$'

buff     DB 6,7 dup (?)

vseg     DW ?

voff     DW ?

        .CODE

main:

; подготовительные действия

         mov ax,@Data         ; устанавливаем регистры DS и ES,

         mov ds,ax            ; чтобы они указывали на сегмент данных

         mov es,ax           

         mov ah,09h

         lea dx,Message1

         int 21h              ; выводим заголовок программы