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

and                                IntFlags,255-IntPres-IntMCA         ;сбросим прерывание

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

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

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

; получим результат

call                                InFDC                      ;прочитаем данные из FDC

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

mov                               ah,ST0                      ;регистр состояния 0

and                                ah,11000000b          ;выделим состояние завершения

or                                  ah,ah                        ;успешно?

jz                                   GoodExit                 ;да, на выход

 


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

 


FatalErr :

sti                                  ; возможно маски были закрыты

cmp                               FDCErrCode,0

jne                                 GoodExit

mov                               FDCErrCode,FDCComErr

 


; восстановим состояние контроллера и вектора прерываний

 


GoodExit:

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

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

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

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

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

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

jmp                               short $ +2

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

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

mov                               es,ax

cli

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

mov                               bx,Save08Seg                             ;возьмем сегмент для таймера

mov                               cx,Save0EOff                             ;возьмем смещение для гибкого

;диска

mov                               dx,Save0ESeg                             ;возьмем сегмент для гибкого

;диска

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

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

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

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

sti

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

pop                                es

 


; выведем результат

 


mov                               si,offset  FDCResult              ;результат

mov                               di,offset FirstOut                   ;куда складывать

mov                               ex,FDCOutAreaLen               ;сколько выводить

cld

HexToCharLoop:

lodsb

call                                HexChar                          ;преобразовать в симв.форму

stosw

add                                di,SkipOverTitle             ;следующее поле результата

loop                               HexToCharLoop             ;заполним весь результат

mov                               dx,offset ResultOut        ;что выводим

mov                               ah,09h                             ;функция вывода строки

int                                 21h                                  ;выполним

mov                               dx,offset GoodMsg         ;сообщение об успехе

cmp                               FDCErrCode,0                ;есть ошибка?

je                                   ShowMsg                        ;нет, выводим сообщение

mov                               dx,offset BadMsg           ;сообщение о неуспехе

ShowMag:

mov                               ah,09h

int                                 21h