DMA for floppy
У кого-нить есть дока где есть как писать на флоп сектор с помошью ДМА. Проблема такая : знаю код ожидания данных от флопа, а когда инициализируешь ДМА на запись то что там куда (в какие порты) кидать надо ?
вобщем так
;--------------------------------------
;;инициализация DMA под (R)ead/(W)rite
initFDCdma proc ;input dl=mod MR(0\R,1\W)!
push eax ebx ;input bx=offset 512bytes
;(смещение 512б-блока)
xor eax,eax
and ebx,0000FFFFh
mov ax,fs
shl eax,4
add ebx,eax
cli
mov al,6
out 0ah,al ;set mask for 2th
out 0ch,al ;reset register of bytes
cmp dl,0
je @read
mov al,4Ah
jmp @write
@read: mov al,46h
@write: out 0bh,al ;set MR
mov al,bl
out 4,al
mov al,bh
out 4,al ;BAR 2th
shr ebx,16
mov al,bl
out 81h,al ;Page Register 2th
mov ax,511
out 5,al
mov al,ah
out 5,al ;BWCR 2th
mov al,2
out 0ah,al ;reset mask 2th
sti
pop ebx eax
retn
initFDCdma endp
;(2th есть 2ой канал)
;--------------------------------------
;;запись/чтение
rwsector proc ;input dl=(0/R,1/W)!
push ax ;input bx=offset 512bytes
call initFDCdma
cmp dl,0
je @read1
mov al,45h
jmp @write1
@read1: mov al,66h
@write1:
call al2FIFO
mov al,fs:[FDD_head]
shl al,2
call al2FIFO
mov al,fs:[FDD_track]
call al2FIFO
mov al,fs:[FDD_head]
call al2FIFO
mov al,fs:[FDD_sector]
call al2FIFO
mov al,2
call al2FIFO
mov al,19 ;18+1
call al2FIFO
mov al,1bh
call al2FIFO
mov al,0ffh
call al2FIFO
call waitFDCint ;приводить не буду но в
;кратце - это есть небольшая здержка (delay)
cmp fs:[FDC_status],FDC_normal
jne end7
call Getstatusinfo ;на это и ниже можно забить
test fs:[FDC_ST0],11011000b
jnz err2
mov fs:[FDC_status],FDC_normal
jmp end7
err2:
mov fs:[FDC_status],FDC_sectornotfound
end7:
pop ax
retn
rwsector endp
;процедура al2FIFO - значение в аl пихается в контроллер флоппи (с некоторыми нюансами)
..вообще советую купить Кулакова 'программиррование дисковых подсистем'
;--------------------------------------
Очень хотелось бы узнать как аналогичную операцию можно произвести в WIN2k. Если кто-то знает, попгите, пожалуйста
CreateFile("\\.\A:", ...);
CreateFile("\\.\A:", ...);
Мне это не совсем подходит. Скорее нужен kernel mode driver. Но тут у меня проблемма с инициализацией DMA
Для IoGetDmaAdapter() нужна структурка DEVICE_DESCRIPTION Какие в ней должны быть параметры для дисковода?
Мне это не совсем подходит. Скорее нужен kernel mode driver. Но тут у меня проблемма с инициализацией DMA
Для IoGetDmaAdapter() нужна структурка DEVICE_DESCRIPTION Какие в ней должны быть параметры для дисковода?
Тогда зачем нужна эта функция? Нужно просто выделить память в пределах первого мегабайта(именно первого, а не 16 первых, т.к. второй контроллер DMA пересылает слова, а не байты, и это подходит для винтов и CD/DVD устройств). Только вот какая функция выделяет эту память - не знаю, придётся в DDK копаться. Если найдёшь функцию, скажи хоть как называется.
Тогда зачем нужна эта функция? Нужно просто выделить память в пределах первого мегабайта(именно первого, а не 16 первых, т.к. второй контроллер DMA пересылает слова, а не байты, и это подходит для винтов и CD/DVD устройств). Только вот какая функция выделяет эту память - не знаю, придётся в DDK копаться. Если найдёшь функцию, скажи хоть как называется.
Про первый мегабайт это хорошая идея, но я тоже не знаю как это сделать. Kernel-mode драйвера не попадают туда, в DDK описана последовательность действий при работе с DMA. Я попытался ее реализовать, но возникла проблема о которой я говорил выше. Если интересна данная тема можешь посмотреть обсуждения здесь: http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=1521
http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=1516
Возможно для данной задачи имеет смысл использовать WDM тип драйвера. Как думаешь?