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

         mov ax,vseg

         mov ds,ax

         mov al,4ah

         mov ah,25h

         int 21h

; завершаем работу программы

         mov ax,4c00h

         int 21h              ; завершаем работу программы

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

alarm    proc far             ; процедура обработчика прерывания по таймеру

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

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

         push dx          

         mov ah,2             ; выдаем звуковой сигнал

         mov dl,7 

         int 21h  

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

         pop ax

         iret                 ; возврат из прерывания

         endp alarm

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

prtime   proc                 ; процедура вывода времени

                              ; регистры д.б.в том виде, в каком возвращает

                              ; функция 2 прерывания 1ah

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

         mov bh,20h

         mov bl,ch

         call bcd             ; выводим часы, перед ними пробел

         mov bh,':'

         mov bl,cl

         call bcd             ; выводим минуты, перед ними двоеточие

         mov bh,':'

         mov bl,dh

         call bcd             ; выводим секунды, передними двоеточие

         mov dl,0ah

         mov ah,02

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

         ret

         endp prtime

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

bcd      proc                 ; процедура вывода числа в формате bcd

                              ; bh - префикс, bl - число в формате bcd

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

         mov dl,bh

         mov ah,02

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

         mov dl,bl

         shr dl,4             ; выделяем левую тетраду

         add dl,30h           ; корректируем до символа

         mov ah,02

         int 21h              ; и выводим

         mov dl,bl

         and dl,0Fh           ; выделяем правую тетраду

         add dl,30h           ; корректируем до символа

         mov ah,02

         int 21h              ; и выводим

         ret

         endp bcd

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

bcd2int  proc                 ; процедура перевода числа в формате bcd

                              ; в двоичный формат

                              ; bl - число в формате bcd

                              ; результат в al

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

         mov al,bl

         shr al,4             ; выделяем левую тетраду

         mov bh,10

         mul bh               ; умножаем значение на 10

         and bl,0Fh           ; выделяем правую тетраду

         add al,bl            ; добавляем к значению

         ret

         endp bcd2int

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

int2bcd  proc                 ; процедура перевода двоичного числа в

                              ; форимат bcd

                              ; bl - двоичное число

                              ; результат в al

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

         xor ah,ah            ; очищаем ah

         mov al,bl            ; грузим преобразуемое число

         mov bl,10           

         div bl               ; делим его на 10

         shl al,4             ; сдвигаем частное влево на 4 разряда

         or al,ah             ; накладываем на него остаток

         ret

         endp int2bcd

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

InInt proc                    ; процедура интерпретации знаковых целых чисел

                              ; параметры: si - смещение буфера

                              ; результат возвращается в регистре ax

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

        push cx

        push dx

        push bx

        push si

        push di

; обрабатываем содержимое буфера

        cmp byte ptr [si],"-" ; если первый символ минус

        jnz ii1

        mov di,1              ; устанавливаем флаг

        inc si                ; и пропускаем его

ii1:

        xor ax,ax

        mov bx,10             ; основание сc

ii2:

        mov cl,[si]           ; берем символ из буфера

        cmp cl,0dh            ; проверяем не последний ли он

        jz endin

; если символ не последний, то проверяем его на правильность

        cmp cl,'0'            ; если введен неверный символ <0

        jl endin                 

        cmp cl,'9'            ; если введен неверный символ >9

        ja endin              ; на этом разбор введенного числа заканчивается

        sub cl,'0'            ; делаем из символа число

        mul bx                ; умножаем на 10

        add ax,cx             ; прибавляем к остальным

        inc si                ; указатель на следующий символ

        jmp ii2               ; повторяем

; все символы из буфера обработаны число находится в ax

endin:

        cmp di,1              ; если установлен флаг, то

        jnz ii3

        neg ax                ; делаем число отрицательным

ii3:

        pop di

        pop si

        pop bx

        pop dx

        pop cx

        ret

InInt   endp

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

end main