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

;границы страницы

WorkNotCross:

mov                               WorkOff, ax ; запомним смещение

 


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

 


sub                                ax,ax ; адресация векторов прерываний

mov                               es, ax

; запомним адреса обработчиков

mov                               ax,word ptr еs:[08h*4];       ; смещение для таймера

mov                               bx,word ptr es:[08h*4+2]   ; сегмент для таймара

mov                               cx,word ptr es:[0eh*4]        ; смещение для гибкого диска

mov                               dx,word ptr es:[0eh*4+2]    ; сегмент для гибкого диска.

mov                               Save08Off,ax           ;запомним смещение для таймера

mov                               Save08Seg,bx          ;запомним сегмент для таймерa

mov                               Save0Eoff,cx           ;запомним смещениедля гибкого диска

mov                               Save0Eseg,dx          ;запомним сегмент для гибкого дискa

cli                                  ;установим новые вeкторы

mov                               word ptr es:[08h*4],offset New08

mov                               word ptr es:[08h*4][2],сs

mov                               word ptr es:[0eh*4],offset New0E

mov                               word ptr es:[0eh*4][2],cs

sti

push                              cs      ; адресация пo ES

pop                                es

 


;установим скорость передачи данных для дискеты

 


mov                               al,1   ; скорость передачи дaнных 300

mov                               dx,03f7h       ; регистр скорости

out                                 dx.al ; установим скорость

jmp                               ehort $+2

 


;выполним начальный программный сброс контроллера

 


mov                               FDCOpCode,0         ; выполняем сброс

cli                                  ; закрываем маски сначала сброс

mov                               1,00011000b            ;разрешение DMA-прерываний сброс

;контроллера

;включить мотор устройства 0

;выбрать устройство 0

mov                               dx,03f2h       ;регистр управления

out                                 dx,al ;передадим данные в контроллер

jmp                               short $+2

mov                               bx,29 ;время ожидания в циклах

;таймера не менее 23 мкс

call                                WaitTimer2 ;ждем не менее 23 мкс

mov                               al,00011100b           ;разрешение DMA-прерываний

;работа контроллера

;включить мотор устройства 0

;выбрать устройство 0

out                                 dx,al ;передадим данные в контроллер

jmp                               short $+2

and                                IntFlags,255-IntPres-IntMCA         ;сбросим состояние

;прерывания

sti                                  ;откроем маски

call WaitInt                  ;ждем прерывание

jc                                   FatalErr        ;не дождались

;снимем прерывание и проверим завершение для 4-х устройств

 


mov                               сх,4                      ;от четырех устройств

mov                               dl,11000000b      ;маска статуса прерывания

ResetSens:                    call Sensl             ;снимем состояние прерывания

jc                                   FatalErr               ;неуспешно

mov                               ah,ST0               ;статус регистр

cmp                               ah,dl                  ;сброс завершен?

jne                                 FatalErr             ;нет , что-то другое

inc                                 dl                       ;следующее устройство

loop                               ResetSens         ;повторим снятие состояния

 


;ждем раскрутки мотора

 


mov                               cx,1000/55   ;время раскрутки мотора

call                                WaitTime     ;ждем

 


;выполним команду Specify