Создание TSR программ в операционной системе MS DOS, страница 9

mov                               ax,4c00h

int                                 21 h

main endp

*****************************Процедуры*************************

 


;Ожидание целого числа циклов таймера

;Вход:   СХ - количество циклов таймера

 


WaitTime                     ргос

push                              ax

push                              bx

push                              cx

;установка таймера

in                                   al,61h                  ;остановим 2-й канал таймера

and                                al,0ffh-03h

out                                 61h,al

jmp                               short $+2

mov                               al,10110100b      ; маска таймера

out                                 43h,al                  ; установим

mov                               al,0ffh                  ;новый счетчик

out                                 42h,al                  ;запишем все 16 бит

jmp                               short $+2

out                                 42h,al

jmp                               short $+2

in                                   al,61h                  ;запустим 2-й канал таймера

or                                  al,01h

out                                 61h,al

jmp                               short $+2

; цикл ожидания

mov                               bx,0ffffh       ;начальное значение для

;сравнения

WaitTimeTest:

Mov                              al,84h           ;запомним счетчик канала 2

out                                 43h,al

in                                   al,42h           ;прочитаем все 16 бит

xchg                              ah,al

in                                   al,42h

xchg                              ah,al

cmp                               ax,bx                             ;переехали через 0?

mov                               bx,ax                             ;значение счетчика для

;сравнения

jb                                   WaitTimeTest              ;не переехали через 0- ждем

loop                               WaitTimeTest              ;повторим для всех циклов

pop                                сх

pop                                bх

pop                                ax

ret

WaitTime                     endp

 


; Обработчик прерывания от FDC

 


NewOE                         proc

push                              ax

or                                  cs:IntFlags,IntPres   ;укажем прерывание

test                                cs:IntFlags,PresMCA          ;есть микроканал?

jz                                   NewOENormalEOI ;нет, обычное завершение

or                                  cs:IntFlags,IntMCA             ;требуется завершение

;прерывания для микроканала

jmp                               NewOEIRet              ;на выход

;завершим прерывание для обычной шины

New0ENormalEOI:

mov                               al,20h           ;сообщим контроллеру

out                                 20h,al           ;прерываний EOI

jmp                               short $+2

NewOEIRet:

pop                                ax

iret

NewOE                         endp

 


; Обработчик прерывания от таймера

 


New08                          proc

push                              ax

cmp                               cs:RtCounter,0         ;требуется уменьшать счетчик

;времени?

je                                   New08Iret    ;нет, на выход

dec                                cs:RtCounter            ;уменьшаем счетчик времени

New08Iret :

;отобразим время в область данных BIOS

push                              ds

mov                               ax,40h          ;область данных BIOS

mov                               ds,ax

add                                word ptr ds:[6ch],1  ;увеличим счетчик времени

adс                                word ptr ds:[6eh],0

cmp                               word ptr ds:[6eh],0018h      ;есть переход через сутки?

jne                                 New08Time ;нет, переход