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