; DMA_INIT.ASM .MODEL SMALL include msystem.mac include diskete.m .CODE ;--- Инициализация микросхемы DMA --- func dma_init,,,,public ; устанавливаем скоpость пеpедачи данных если PC AT pc_model , if$ mov DX, 3F7h ; адрес регистра mov AL, 0 ; 500 Кбайт/с (высокая плотность HD) out DX, AL ; посылаем команду endif$ ; начинаем инициализацию микросхемы DMA cli mov AH, is_RDWR switch AH,<00h,0FFh> case 1 mov AL, 46h ; код чтения данных контролера НГМД case 2 mov AL, 4Ah ; код записи данных контролера НГМД endcase out 12, AL ; посылаем код по двум адресам (в порт 0Ch) out 11, AL ; --//-- (в порт 0Bh) ; вычисляем адрес буфера mov AX, buffer ; берем смещение буфера в DS mov BX, DS ; помещаем DS в BX mov CL, 4 ; готовим вращение старшего нибла rol BX, CL ; вращаем младшие 4 бита mov DL, BL ; копируем DL в BL and DL, 0Fh ; чистим старший нибл в DL and BL, 0F0h ; чистим младший нибл в BL add AX, BX ; складываем if$ inc DL ; увеличиваем DL если был перенос endif$ out 4, AL ; посылаем младший байт адреса mov AL, AH ; сдвигаем старший байт out 4, AL ; посылаем младший байт адреса mov AL, DL ; засылаем номер страницы out 81h, AL ; посылаем номер страницы ; получаем указатель на базу диска get_dpt , ; конец инициализации mov AL, ES:[BX]+3 ; COD_SIZE switch AL,<0,1,2,3> case 1 mov AX, 128-1 ; значение счетчика case 2 mov AX, 256-1 ; значение счетчика case 3 mov AX, 512-1 ; значение счетчика case 4 mov AX, 1024-1 ; значение счетчика endcase out 5, AL ; посылаем младший байт mov AL, AH ; готовим старший байт out 5, AL ; посылаем старший байт mov AL, 2 ; готовим разрешение канала 2 out 10, AL ; DMA ожидает данные sti endf END