Кстати параллельно стоит вопрос написания универсального набора процедур для работы с винтом (а точнее с контроллером винта). Если это дело застандартизировать. И запихать например в свободныем места ТРДОС или в свободные странички ПЗУ, то это было бы какоето развитие и серьезное подспорие программисту (ибо не надо изучать весь десяток разных контроллеров). Ну и хардварщикам проще - написал свои процедуры и весь софт будущий будет совместим.
Мы с Алко и отчасти Vega задумались о таком шаге - если есть соображения тоже пишем их
видел предложения сделать чтение/запись сектора. но есть же ещё
несколько десятков ATA-команд. не будет же драйвер таким объемным. сами команды стандартизированы и выносить в драйвер их коды и протокол работы с каждой нет никакого смысла, на разных контроллерах они одинаковы. пускай уже программа разбирается. предлагаю команды разбить на более мелкие операции. всего я насчитал 5 необходимых:
1. ожидание нужного состояния (BUSY/DRQ) регистра статуса, например
Код:
wait:
in a,(рег-р статуса)
ld c,a
and h
cp l
jr nz,wait
in a,(рег-р ошибок)
ld b,a
ret
регистр ошибок тоже читаем заодно, чтобы второй раз не обращаться к драйверу. эту же процедуру можно использовать просто для чтения статуса при HL=0
2. запись блока регистров. HL - указатель на 7 байт значений регистров 1-7.
можно и такой формат:
<рег.1><знач.1><рег.2><знач.2>...<00 >, но по времени экономия небольшая и больше потратим тактов на заполнение номеров регистров в передаваемом блоке. плюс бонус - при записи в последний (7-й) регистр валидного кода команды начинается выполнение команды.
3. чтение блока регистров. аналогично. читаем блок из 7 регистров в (HL)
4. передача сектора (512 байт) из контроллера в память (HL). считается, что DRQ=1,BUSY=0 (хотя, можно сюда же поставить вызов 1-й процедуры, но лучше вызвать её из программы, так как такие команды, как read multiple не требуют ожидания DRQ) для ATM и доработанного Nemo (защелка на A8) очень короткая программа
Код:
ld b,#00
ld c,<порт данных>
inir
inir
ret
5. аналогично передача сектора из памяти в контроллер
запись управляющего регистра и чтение регистра альт. статуса, ожидание INTRQ не реализовывать в драйвере, так как в NEMO нет второго, в ATM - первого. программы вполне можно писать без них, а без поддержки в драйвере придётся так и делать, программы будут совместимы со всеми контроллерами
разместить точки входа лучше последовательно как 5 jr xxxx, 128 байт должно хватить на весь драйвер (или если моместить jr в середину, то адресуем и 256 байт). обязательно нужно стандартизировать, какие регистры драйвер может использовать для своих нужд, а какие не меняет