Здравствуйте, Дмитрий!
Вот Вам программа
[code h=207]code segment 'code' ;начало сегмента кода
assume cs:code,ds:data,ss:stk
main proc
;установим обработчик int24h, старый можно не сохранять
push cs
pop ds ;ds=cs
lea dx, int_24 ;ds:dx - адрес обработчика
mov ax, 2524h
int 21h
mov ax, data ;адрес сегмента данных
mov ds, ax ;в ds
mov es, ax ;в es
lea dx, dta ;установим свою область DTA
mov ah, 1ah
int 21h
lea dx, sMask ;a:\*.*
mov cx, 26h ;все:и readonly, и system, и hidden
mov ah, 4eh ;ищем файлы
int 21h
jc NotFound
lea si, dta.fname ;имя файла в DTA
jmp PrintMessage
NotFound:
lea si, sNotFound
cmp ax, 18 ;ошибка "не найдено в поиске"
je PrintMessage
lea si, not_ready ;все остальное считаем, что устройство не готово
PrintMessage: ;вывод сообщения из ds:[si]
mov ah, 0eh ;сначала сделаем перевод строки
mov al, 0dh
int 10h ;функцией БИОС
mov al, 0ah
PrintLoop:
int 10h
lodsb
cmp al, 0
jne PrintLoop
PrintAny:
lea dx, sAny ;press any key
mov ah, 9
int 21h
mov ah, 0
int 16h ;ждем any key
mov ax, 4c00h
int 21h ;выход в ДОС
main endp
int_24: ;обработка ошибок
push ds
push di
push si
mov si, data
mov ds, si ;сообщения в сегменте данных
and di, 0fh ;младшие 4 бита - номер ошибки
shl di, 1 ;по 2 байта на адрес
mov si, table_errors[di] ;si - адрес сообщения
mov ah, 0eh ;выводим с помощью БИОС
mov al, 0dh ;сначала перевод строки
int 10h
mov al, 0ah
int 10h
print_loop: ;выводим строку ds:si, заканчивающуюся нулем
lodsb
cmp al, 0
je print_rc
int 10h
jmp print_loop
print_rc: ;добавим общую часть
lea si, Retry_Cancel
print_rc_loop:
lodsb
cmp al, 0
je wait_rc
int 10h
jmp print_rc_loop
wait_rc: ;ждем R или C
mov ah,0
int 16h
cmp ah,13h ;скан-код клавиши R
jne cmp_cancel
mov al,1 ;возвращаем код "повторить операцию"
jmp short jmp_iret
cmp_cancel:
cmp ah,2eh ;скан-код клавиши C
jne wait_rc ;все остальное игнорируем
mov al,3 ;возвращаем код "прервать операцию"
jmp_iret:
pop si
pop di
pop ds
iret
code ends
_DTA struc
res db 21 dup (?)
attr db ?
time dw ?
date dw ?
len dd ?
fname db 13 dup (?)
_DTA ends
data segment
sNotFound db 'Files not found',0
sAny db 0dh,0ah,'Press any key$',0
sMask db 'a:\*.*',0
;сообщения int24h
;таблица адресов
table_errors dw protect_disk
dw unknown_id
dw not_ready
dw unknown_com
dw crc_error
dw request_error
dw search_error
dw media_type
dw sector_not_fou
dw printer_error
dw write_fault
dw read_fault
dw general_fault
dw unknown_error
dw unknown_error
dw change_error
;сами сообщения
protect_disk db 'Disk protected',0
unknown_id db 'Unknown ID subunit',0
not_ready db 'Disk not ready',0
unknown_com db 'Unknown command',0
crc_error db 'CRC error',0
request_error db 'Request error',0
search_error db 'Search error',0
media_type db 'Unknown disk media',0
sector_not_fou db 'Sector not found',0
printer_error db 'Printer error',0
write_fault db 'Write fault error',0
read_fault db 'Read fault error',0
general_fault db 'General failure',0
unknown_error db 'Unknown error',0
change_error db 'Disk change error',0
Retry_Cancel db ' (Retry or Cancel) ',0
dta _DTA <>
data ends
stk segment stack
dw 100h dup (?)
stk ends
end main[/code]