Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

DMA for floppy

555
07 октября 2002 года
AcidJAM
25 / / 20.05.2000
У кого-нить есть дока где есть как писать на флоп сектор с помошью ДМА. Проблема такая : знаю код ожидания данных от флопа, а когда инициализируешь ДМА на запись то что там куда (в какие порты) кидать надо ?
2.2K
26 октября 2002 года
kar
7 / / 26.10.2002
Цитата:
Originally posted by AcidJAM
У кого-нить есть дока где есть как писать на флоп сектор с помошью ДМА. Проблема такая : знаю код ожидания данных от флопа, а когда инициализируешь ДМА на запись то что там куда (в какие порты) кидать надо ?



вобщем так
;--------------------------------------
;;инициализация 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 пихается в контроллер флоппи (с некоторыми нюансами)
..вообще советую купить Кулакова 'программиррование дисковых подсистем'
;--------------------------------------

4.4K
01 июня 2003 года
film
3 / / 01.06.2003
Очень хотелось бы узнать как аналогичную операцию можно произвести в WIN2k. Если кто-то знает, попгите, пожалуйста
424
03 июня 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by film
Очень хотелось бы узнать как аналогичную операцию можно произвести в WIN2k. Если кто-то знает, попгите, пожалуйста




CreateFile("\\.\A:", ...);

4.4K
05 июня 2003 года
film
3 / / 01.06.2003
Цитата:
Originally posted by (C)dragon



CreateFile("\\.\A:", ...);



Мне это не совсем подходит. Скорее нужен kernel mode driver. Но тут у меня проблемма с инициализацией DMA
Для IoGetDmaAdapter() нужна структурка DEVICE_DESCRIPTION Какие в ней должны быть параметры для дисковода?

424
05 июня 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by film


Мне это не совсем подходит. Скорее нужен kernel mode driver. Но тут у меня проблемма с инициализацией DMA
Для IoGetDmaAdapter() нужна структурка DEVICE_DESCRIPTION Какие в ней должны быть параметры для дисковода?



Тогда зачем нужна эта функция? Нужно просто выделить память в пределах первого мегабайта(именно первого, а не 16 первых, т.к. второй контроллер DMA пересылает слова, а не байты, и это подходит для винтов и CD/DVD устройств). Только вот какая функция выделяет эту память - не знаю, придётся в DDK копаться. Если найдёшь функцию, скажи хоть как называется.

4.4K
05 июня 2003 года
film
3 / / 01.06.2003
Цитата:
Originally posted by (C)dragon


Тогда зачем нужна эта функция? Нужно просто выделить память в пределах первого мегабайта(именно первого, а не 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 тип драйвера. Как думаешь?

424
06 июня 2003 года
(C)dragon
307 / / 04.12.2002
Я никогда WDM не писал, ничего не могу сказать. И ещё, в каком это смысле дрова kernel mode туда не попадают? Код может в любом месте находится, главное, чтобы память была выделена в пределах первого мегабайта. Всё остальное - через порты, а если заранее задан буфер, то просто надо переместить в него данные. На wasm.ru написали, что есть функция - AllocateCommonBuffer, попробуй её использовать. Только после неё не забудь адрес в физический перевести, чтобы его через порты передавать.
4.6K
06 июня 2003 года
zay
2 / / 06.06.2003
Помогите прочитать один любой сектор с дискеты с помощью портов вода/вывода в турбо паскале
4.6K
06 июня 2003 года
zay
2 / / 06.06.2003
забыл е-мэйл указать [email]ztf@nm.ru[/email]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог