|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 16, 2003 23:14:49 Необходим примерчик для работы с жёстким диском на низком уровне. Например форматирование нулевой дорожки. Или киньте ссылчку на документацию. Буду благодарен за любую информацию. |
|
|
Дата: Ноя 16, 2003 23:37:05 |
|
|
Дата: Ноя 17, 2003 03:51:30 Там не низкий уровень, там с помощью системных библиотек. Есть более обстоятельная книжка Кулакова "Программирование дисковых подсистем". 750 стр. и все "про это". |
|
|
Дата: Янв 27, 2004 17:46:08 Alexey Rybin сам жесткий диск тебе не позволит форматировать себя на низком уровне. Для этого есть специальные команды, выходящие за рамки документированности. Ими обычно оперирует производитель. Почитай М. Гука - "Дисковая подсистема ПК"/ Узнаешь много интересного. |
|
|
Дата: Мар 29, 2004 20:06:51 Alexey Rybin - Если на очень низком то смотри тут - http://www.nondot.org/sabre/os/files/Disk/IDEHDC.asm |
|
|
Дата: Мар 30, 2004 00:45:51 Недавно в магазине видел книгу "Программирование IDE устройств"...см. также t10.org, t13.org |
|
|
Дата: Июн 28, 2004 14:11:58 http://alex-justasu.narod.ru/541.html BUFFER DB 512 DUP(?) STATUS_BUFFER DB 7 DUP(?) SECTOR_READ PROC ;начало процедуры чтения одного сектора ;---включение мотора STI ;прерывания должны быть разрешены MOV DX,3F2H ;адрес регистра цифрового вывода MOV AL,28 ;устанавливаем биты 2, 3 и 4 OUT DX,AL ;посылаем команду ;---ожидаем пока мотор наберет скорость (около 1/2 сек.) MOV CX,3500 ;счетчик цикла задержки (для IBM PC и XT) MOTOR_DELAY: LOOP MOTOR_DELAY ;ожидаем 1/2 секунды ;---выполняем операцию поиска MOV AH,15 ;номер кода CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,0 ;номер накопителя CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,12 ;номер дорожки CALL OUT_FDC ;посылаем контроллеру HГМД CALL WAIT_INTERRUPT ;ожидаем прерывания от HГМД ;---ожидаем установки головки (25 мсек.) MOV CX,1750 ;счетчик цикла задержки (для IBM PC и XT) WAIT_SETTLE: LOOP WAIT_SETTLE ;ожидаем 25 мсек. ;---начинаем инициализацию микросхемы DMA MOV AL,46H ;код чтения данных контроллера HГМД OUT 12,AL ;посылаем код по двум адресам OUT 11,AL ; ;---вычисляем адрес буфера MOV AX,OFFSET 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 ;чистим младший нибл в BX ADD AX,BX ;складываем JNC NO_CARRY ;если не было переноса, то # страницы в DL INC DL ;увеличиваем DL, если был перенос NO_CARRY: OUT 4,AL ;посылаем младший байт адреса MOV AL,AH ;сдвигаем старший байт OUT 4,AL ;посылаем младший байт адреса MOV AL,DL ;засылаем номер страницы OUT 81H,AL ;посылаем номер страницы ;---конец инициализации MOV AX,511 ;значение счетчика OUT 5,AL ;посылаем младший байт MOV AL,AH ;готовим старший байт OUT 5,AL ;посылаем старший байт MOV AL,2 ;готовим разрешение канала 2 OUT 10,AL ;DMA ожидает данные ;---получаем указатель на базу диска MOV AL,1EH ;номер вектора, указывающего на таблицу MOV AH,35H ;номер функции INT 21H ;выполняем функцию ;---посылаем параметры чтения MOV AH,66H ;код чтения одного сектора CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,0 ;номера головки и накопителя CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,12 ;номер дорожки CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,0 ;номер головки CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,1 ;номер записи CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,ES:[BX]+3 ;код размера сектора CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,ES:[BX]+4 ;номер конца дорожки CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,ES:[BX]+5 ;длина сдвига CALL OUT_FDC ;посылаем контроллеру HГМД MOV AH,ES:[BX]+6 ;длина данных CALL OUT_FDC ;посылаем контроллеру HГМД CALL WAIT_INTERRUPT ;ожидаем прерывание от HГМД ;---читаем результирующие байты MOV CX,7 ;берем 7 байтов статуса LEA BX,STATUS_BUFFER ;помещаем в буфер статуса NEXT: CALL IN_FDC ;получаем байт MOV [BX],AL ;помещаем в буфер INC BX ;указываем на следующий байт буфера LOOP NEXT ;повторяем операцию ;---выключение мотора MOV DX,3F2H ;адрес регистра цифрового вывода MOV AL,12 ;оставляем биты 3 и 4 OUT DX,AL ;посылаем новую установку RET ;конец процедуры SECTOR_READ ENDP WAIT_INTERRUPT PROC ;ожидание прерывания от HГМД ;---управление статусом прерывания 6 в байте статуса BIOS MOV AX,40H ;сегмент области данных BIOS MOV ES,AX ;помещаем в ES MOV BX,3EH ;смещение для байта статуса AGAIN: MOV DL,ES:[BX] ;получаем байт TEST DL,80H ;проверяем бит 7 JZ AGAIN ;до тех пор пока не установлен AND DL,01111111B ;сбрасываем бит 7 MOV ES:[BX],DL ;заменяем байт статуса RET WAIT_INTERRUPT ENDP OUT_FDC PROC ;посылаем байт из AH FDC MOV DX,3F4H ;адрес порта регистра статуса KEEP_TRYING: IN AL,DX ;получаем значение TEST AL,128 ;бит 7 установлен? JZ KEEP_TRYING ;если нет, то снова проверяем INC DX ;указываем на регистр данных MOV AL,AH ;передаваемое значение в AH OUT DX,AL ;посылаем значение RET OUT_FDC ENDP IN_FDC PROC ;получаем байт от FDC в AL MOV DX,3F4H ;адрес порта регистра статуса ONCE_AGAIN: IN AL,DX ;получаем значение TEST AL,128 ;бит 7 установлен? JZ KEEP_TRYING ;если нет, то проверяем снова INC DX ;указываем на регистр данных IN AL,DX ;читаем байт из регистра данных RET IN_FDC ENDP |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.052 |