есть небольшая проблема пытаюсь разобраться c DMA, вот есть код, вроде все работает правильно и чтение завершается успешно, но винчестер после завершения чтения по-прежнему сигнализирует о своей активности (не гаснет диод), в чем может быть причина, может чего в коде не учел, кому не лень, посмотрите код, что в нем может быть ошибочного Код (Text): ... mov eax, 24 @@: ;mask all IRQ lines lea ecx, [eax * 2 + 0xE] mov dword [0xFEC00000], ecx or dword [0xFEC00010], 0x10000 dec eax jnz @B ; unmask IRQ14 (IDE channel 0) mov dword [0xFEC00000], 0x10 + 14 SHL 1 mov dword [0xFEC00010], 0x8020 sti IDE_DEVICE_ID = 0x24DB IDE_VENDOR_ID = 0x8086 mov eax, 0x80000100 ; find 82801EB start: mov ebx, eax mov edx, 0xCF8 out dx, eax mov edx, 0xCFC in eax, dx mov edx, eax and edx, 0x0000FFFF cmp edx, IDE_VENDOR_ID jnz continue shr eax, 16 cmp eax, IDE_DEVICE_ID jnz continue ; read bus mastering BAR mov eax, ebx or eax, 0x20 mov edx, 0xCF8 out dx, eax mov edx, 0xCFC in eax, dx and eax, 0x0000FFF0 ; get address of bus mastering registers mov ecx, eax ; enable interrupts from device xor eax, eax mov edx, 0x3F6 out dx, al ; wait BSY = 0 mov edx, 0x1F7 @@: in al, dx test al, 0x80 jnz @B ; set device, address mode mov al, 0xE0 mov edx, 0x1F6 out dx, al ; wait BSY = 0, DRDY = 1 mov edx, 0x1F7 @@: in al, dx test al, 0x80 jnz @B test al, 0x40 jz @B ; set LBA address mov edx, 0x1F3 xor al, al out dx, al inc edx out dx, al inc edx out dx, al ; set count of sectors mov edx, 0x1F2 xor eax, eax inc eax out dx, al ; set PRD address mov edx, ecx add edx, 4 mov eax, prd out dx, eax ; set R/W bit mov edx, ecx mov eax, 8 out dx, al ; send command mov edx, 0x1F7 mov eax, 0xC8 out dx, al ; read DMA ; enable bus mastering mov edx, ecx mov eax, 9 out dx, al jmp @F continue: mov eax, ebx add eax, 0x800 test eax, 0x7F000000 jz start @@: hlt mov dword [0xB8000], 0x0F31 ; true jmp @B ... ide0_interrupt: mov edx, ecx xor eax, eax out dx, al ; stop bus mastering and dword [0xFEE000B0], 0 ; send EOI iretd ... align 8 prd: dd 0x7C00 dw 512 dw 0x8000