Эта програмка по утверждению знакомого работала нормально - но как видите он мне ее снизу "отрубал". .Теперь незнаю что там было. помогите кто чем может - может чем-то еще ее дополнить. Вот программа: Код (Text): #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <dos.h> #include "sysp.h" #define CYL 0 void main(void); void fdc_out(unsigned char byte); int fdc_inp(void); void int_wait(void); void dma_init(char *); void main(void) { unsigned i; long l; char buffer[512]; char status[7], main_status; DPT _far *fdpt; FILE *sect; printf("\n" "\nРабота с контроллером НГМД" "\n); // Эта программа предназначена только для IBM AT if(pc_model() != 0xfc) { printf("Эта программа предназначена только для IBM AT\n"); exit(-1); } // Открываем файл, в который будем записывать // содержимое самого первого сектора на дискете sect = fopen("!sector.dat","wb+"); // Устанавливаем указатель на таблицу // параметров дискеты fdpt = get_dpt(); // Включаем мотор дисковода А: // Перед этим разрешаем прерывания _enable(); outp(0x3F2, 0x1C); // Выполняем задержку для разгона двигателя for(l=0;l<200000;l++); // Показываем содержимое регистра основного // состояния контроллера printf("Мотор включен.\t\t"); printf("Основное состояние: %02.2X\n",inp(0x3F4)); // Перед чтением сектора необходимо установить // головку на нужную дорожку, в нашем случае это // дорожка с номером CYL. // Выдаем контроллеру команду "Поиск" fdc_out(0xf); // Для команды "Поиск" требуется два байта параметров: // номер головки/номер накопителя и номер дорожки. // Мы работаем с нулевой головкой накопителя А:, // поэтому первый параметр равен 0, второй - CYL fdc_out(0); fdc_out(CYL); // Показываем содержимое регистра основного // состояния контроллера printf("\n<<<Поиск>>> \t\t"); printf("Основное состояние: %02.2X\n",inp(0x3F4)); // Ожидаем прерывание по завершению операции int_wait(); // Задержка для позиционирования головки for(l=0;l<20000;l++); // Для проверки результата выполнения команды // "Поиск" выдаем контроллеру команду // "Чтение состояния прерывания" // Выводим содержимое регистра состояния // ST0 и номер дорожки после выполнения команды // "Поиск" PCN fdc_out(0x8); printf("Состояние прерывания:\t"); printf(" ST0: %02.2X, \t", fdc_inp()); printf("PCN: %02.2X\n", fdc_inp()); // Для более глубокой диагностики состояния // контроллера выдаем контроллеру команду // "Чтение состояния накопителя", выводим // содержимое регистра состояния ST3 fdc_out(4); fdc_out(0); printf("Состояние накопителя:\t ST3: %02.2X\n",fdc_inp()); // Устанавливаем скорость передачи данных 500 Кбайтов/с, // это значение может различаться для разных типов дискет outp(0x3F7, 0); // Инициализация канала прямого // доступа к памяти dma_init(buffer); // Выдаем команду "Чтение данных" fdc_out(0x66); fdc_out(0x0); // накопитель 0, головка 0 fdc_out(CYL); // цилиндр CYL fdc_out(0); // головка 0 fdc_out(1); // номер сектора - 1 // Передаем контроллеру технические параметры // дисковода, берем их из таблицы параметров дискеты. // Это такие параметры: // - размер сектора; // - номер последнего сектора на дорожке; // - размер промежутка; // - число считываемых/записываемых байтов fdc_out(fdpt->sec_size); fdc_out(fdpt->eot); fdc_out(fdpt->gap_rw); fdc_out(fdpt->dtl); // Ожидаем прерывание по завершению операции int_wait(); // Считываем и выводим на экран байты результата // операции "Чтение данных" printf("\n<<<Чтение сектора>>> \n"); printf(" Байты состояния (ST0,ST1,ST2,C,H,R,N):\n"); for(i=0; i<7; i++) printf("%02.2X\t", (char) fdc_inp()); printf("\n"); // Выводим содержимое считанного сектора в файл for(i=0; i<512; i++) fputc(buffer[i],sect); fclose(sect); // Выключаем мотор outp(0x3F2, 0xC); } // Вывод байта в контроллер дисковода void fdc_out(unsigned char parm) { _asm { mov dx,3F4h // Порт основного состояния loop_fdc_out: in al,dx test al,80h // Проверяем готовность jz loop_fdc_out // контроллера inc dx // Выводим байт в порт данных mov al, parm // контроллера out dx, al } } // Ввод байта из порта данных контроллера дисковода int fdc_inp(void) { _asm { mov dx,3F4h // Порт основного состояния loop_fdc_inp: in al,dx test al,80h // Проверяем готовность jz loop_fdc_inp // контроллера inc dx // Введенный байт записываем in al, dx // в регистр AX } } // Ожидание прерывания от контроллера void int_wait(void) { // Разрешаем прерывания _enable(); _asm { mov ax,40h // После прихода прерывания mov es,ax // программа обработки прерывания mov bx,3Eh // устанавливает в 1 старший бит wait_loop: // байта в области данных BIOS mov dl,es:[bx] // по адресу 0040:003E. test dl,80h // Мы ждем, когда используем тег [ code ]!
Кто нибудь делал программы связаные с DMA (ПДП)?Знаю точно что контроллер ПДП имеет 4(если не ошибаюсь) регистра - адрес источника; адрес получателя; адрес с которого начинается считывание и еще что-то. Я ассемблере пока неочень, но хотелось бы во всем разобраться...
frame В аттаче файл с небольшой теоретической частью про DMA и примером вывода звука через DMA в SoundBlaster писалось под DOS более 10 лет назад сейчас если и будет работать то только в "чистом DOS'е" Перезалил... Какие-то траблы с закачкой, переделал doc в txt форматирование потеряно, за то размер уменьшился
Mikl__ А ты неподскажеш откуда этот материальчик З.Ы. Архив обрезаный - может перезакачаеш если не сложно. Я так понял DMA используется только для передачи звука и данных со внешних хранителей. Если не так поправте.
frame Какие-то траблы с аттачами, вроде бы и размер маленький, а снова взяв архив с сайта я уже не могу его открыть. Напиши мне в почту я переправлю письмо с прикрепленными файлами
Еще вопрос:Откуда мне взять эти модули?(Смотреть в начале текста программы) <stdio.h> <stdlib.h> <conio.h> <dos.h> "sysp.h"
frame DMA использовался в DOS'е для фоновой печати, передача данных со сканера, передача данных с/из звуковой платы. Как используется сейчас не знаю. Как читаются архивы?
Я уже нашел кое-что, кстатти и в статтях WASM.RU. Вот ссылочка, посмотрите если заинтересовало http://www.wasm.ru/article.php?article=atazen02 http://techn.sstu.ru/TFI/site_tfi/TFI/PVS/material/Terin/mpbasics/hardware/mpbasics/2/2.html