MS-DOS для программиста


Программа FDDIO - часть 3


// Ожидаем прерывание после завершения операции 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:

asm in al,dx asm test al,80h // Проверяем готовность asm jz loop_fdc_out // контроллера

asm inc dx // Выводим байт в порт данных asm mov al, parm // контроллера asm out dx, al }

// Ввод байта из порта данных контроллера дисковода int fdc_inp(void) { asm mov dx,3F4h // Порт основного состояния loop_fdc_inp: asm in al,dx asm test al,80h // Проверяем готовность asm jz loop_fdc_inp // контроллера

asm inc dx // Введенный байт записываем asm in al, dx // в регистр AX }

// Ожидание прерывания от контроллера void int_wait(void) { // Разрешаем прерывания _enable(); asm mov ax,40h // После прихода прерывания asm mov es,ax // программа обработки прерывания asm mov bx,3Eh // устанавливает в 1 старший бит wait_loop: // байта в области данных BIOS asm mov dl,es:[bx] // по адресу 0040:003E. asm test dl,80h // Мы ждем, когда этот бит будет asm jz wait_loop // установлен в 1, а затем // сбрасываем его. asm and dl,01111111b asm mov es:[bx],dl }

// Инициализация канала прямого доступа к памяти void dma_init(void far *buf) { unsigned long f_adr; unsigned sg, of;

// Вычисляем 24-разрядный адрес буфера для данных f_adr = ((unsigned long)FP_SEG(buf) << 4) + (unsigned long)FP_OFF(buf);

// Расщепляем адрес на номер страницы // и смещение sg = (f_adr >> 16) & 0xff; of = f_adr & 0xffff;

// На время программирования контроллера прямого // доступа запрещаем прерывания _disable(); asm mov al,46h // Команда чтения данных от // контроллера НГМД




- Начало -  - Назад -  - Вперед -