1. Создавать событие нужно до подачи команды. KolibriOS - многозадачная система, и при таком коде прерывание от таймера может переключиться на другую задачу после подачи команды, но до создания события, и если железо закончит работать до переключения назад, событие будет пропущено.
2. Хорошо бы проверить, что kernel_alloc вернула что-то ненулевое - памяти может и не оказаться. То же самое для create_event.
3. Метка DMA как название процедуры какая-то слишком неспецифичная, может совпасть с чем-нибудь, лучше переименовать.
Есть ещё некоторые некритичные вещи:
* вместо mov eax, 0 / sbb eax, 0 можно сделать sbb eax, eax
* ide_read и ide_write сильно похожи, можно их вообще сделать переходниками к общей функции - mov al, 0 / jmp ide_read_write в ide_read и mov al, 1 / jmp ide_read_write в ide_write. На allow_dma_access вообще можно забить, исторический артефакт.
* имена локальных переменных типа [hd_data] недоступны вне функций, но сами переменные продолжают существовать на время вызова вложенных функций - если объявить ide_hd_data equ hd_data, то во вложенных функциях можно вместо копирования туда-сюда использовать [ide_hd_data].
KolibriOS - многозадачная система, и железо может закончить работу во время исполнения другой задачи, которая, конечно, постоянно из порта ничего не читает. Впрочем, при реализованном DMA можно сказать, что так и было, код настройки IDE просто не включает прерывания IDE, если хотя бы один из master/slave не поддерживает DMA.Pathoswithin wrote:Только с PIO так и не понял, если прерывание сбрасывается чтением из порта, то зачем что-то делать в обработчике?