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