МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Драйвер жесткого диска

    і і і і і ледней операции были скор-

    і і і і і ректированы при помощи

    і і і і і алгоритма ECC

    і і і і АДДДДДДДДДДДДД>3: 1=идет процесс обмена данными

    і і і АДДДДДДДДДДДДДДДДД>4: 1=поиск завершен

    і і АДДДДДДДДДДДДДДДДДДДДД>5: 1=ошибка записи

    і АДДДДДДДДДДДДДДДДДДДДДДДДД>6: 1=устройство готово для чте-

    і ния, записи или поиска

    АДДДДДДДДДДДДДДДДДДДДДДДДДДДДД>7: 1=устройство занято выполне-

    нием команды ( остальные

    биты не несут смысловой

    нагрузки)

    Система команд

    Код команды заносится в порт 1F7h после того, как

    подготовлены все параметры в портах 1F2h - 1F6h. Выполнение команды

    начинается сразу после занесения в порт 1F7h кода команды. Команда

    состоит из одного байта. Старшие 4 бита содержат код требуемой

    операции, младшие содержат параметры. Перечень команд с возможными

    значениями параметров приведен в таблице.

    ЪДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї

    і Код і Назначение і Параметры і

    іоперацииі і і

    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ

    і 1 і Рекалибровать (сброс і Период импульсов сигнала і

    і і головок на цилиндр 0) і "шаг" і

    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ

    і 2 і Чтение секторов і Биты, определяющие необходи-і

    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ мость повторных обращений і

    і 3 і Запись секторов і к диску и повторных попыток і

    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ считывания при ошибках і

    і 4 і Проверка секторов і контрольной суммы і

    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ

    і 5 і Форматирование дорожкиі Параметр = 0 і

    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ

    і 7 і Поиск цилиндра і Период импульсов сигнала і

    і і і "шаг" і

    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ

    і 9 і Диагностика і Параметр = 0 і

    і ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ

    і і Установка параметров і Параметр = 1 і

    і і накопителя (максималь-і і

    і і ное число головок и і і

    і і секторов) і і

    АДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

    Для получения информации о жёстких дисках, а также их самодиагностики

    необходимо программировать IDE контроллер. Для того, чтобы приведённый

    исходный текст модуля был более или менее понятен, необходимо разъяснить

    некоторые принципы программирования IDE контроллера. Базовый порт

    ввода/вывода для первого IDE контроллера - 1F0h. Ещё я использовал порт

    контроля (3F6h) для сброса состояния контроллера. Для сброса контроллера

    служит функция hd_reset(). Так как контроллер генерирует запрос на

    прерывание IRQ14, то есть необходимость в функции, ожидающей прерывание от

    контроллера. Такой функцией служит hd_wait(), она останавливает работу

    системы до тех пор, пока не произойдёт прерывание от контроллера жёстких

    дисков или не истечёт время ожидания. Программа правильно обрабатывает все

    используемые в программе IRQ.

    Командование контроллером осуществляется через порт 1F7h, в него

    записывается код соответствующей команды и после её выполнения в нём

    хранится результат выполнения. Обмен данными осуществляется через порт

    1F0h, порт 1F1h служит для выдачи ошибок, все остальные порты (1F2h-1F6h)

    для задания параметров работы. Так, например, перед вызовом команды

    получения информации в 5й бит порта 1F6h заносится номер диска,

    подключённого к первому контроллеру.

    После того как в 1F7h послали команду получения информации, необходимо

    дождаться прерывания от контроллера, которое укажет на то, что диск

    завершил выполнение команды. Полученная информация хранится в буфере диска,

    который считывается через порт 1F0h. Теперь, приведённый ниже, текст станет

    более понятным.

    Port Description

    ____

    ______________________________________________________________________

    1f0H Data register. Read/write data from/to controller sector buffer

    1f1H Write: Write Precompensation register. Turn on write

    precompensation.

    Read: Error register. Contains bits for last error.

    +7-6-5-4-3-2-1-0+

    ¦ ¦ ¦0¦ ¦0¦ ¦ ¦ ¦

    +---------------+ bit

    ¦ ¦ ¦ ¦ ¦ +- 0: Data Address Mark not found

    ¦ ¦ ¦ ¦ +--- 1: Track 0 Error

    ¦ ¦ ¦ +----- 2: Command was aborted

    ¦ ¦ +--------- 4: Sector ID not found

    ¦ +------------- 6: ECC Error: Uncorrectable data error

    +--------------- 7: Bad block

    1f2H Sector count. Read/Write count of sectors for operation

    1f3H Sector number. Read/Write current/starting logical sector number

    1f4H Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number)

    Получение блока параметров BIOS

    Не рассматривая механизма возврата BPB, мы должны решить

    задачу определения содержимого блока параметров BIOS. Описываемые методы

    применимы не только к команде BUILD BPB, но и к команде INIT. В

    простейшем случае драйвера устройства, поддерживающего только один тип

    носителя (например драйвер RAM-диска), содержимое

    BPB может быть закодировано в теле самого драйвера. К несчастью,

    при работе с реальными дисками, включая жесткие диски, не все так просто и

    драйвер обязан определять содержимое BPB. Как правило, BPB является частью

    блока начальной загрузки, как

    показано на рис.6-7. В этом случае драйвер должен найти и

    прочитать этот блок, выбрать оттуда блок параметров BIOS и возвратить

    адрес последнего. Практически во всех случаях блок начальной загрузки

    располагается в самом первом логическом секторе диска (т.е. сектора,

    имеющего номер 0). Преобразование номера логического сектора в

    координаты физического сектора зависит от характеристик устройства и должно

    быть описано в документации по этому устройству. Драйвер должен проверить

    структуру этого сектора, чтобы убедиться, что он действительно содержит

    блок начальной загрузки.

    Если первый логический сектор не содержит корректного блока

    начальной загрузки, например, как в дисках, отформатированных в MS-

    DOS версий до 2.0,то драйвер должен считать первый сектор таблицы

    размещения файлов (FAT). К счастью, MS-DOS версий до 2.0 поддерживали

    только несколько форматов, каждый из которых определялся в первом секторе

    FAT второго логического сектора диска. Самый первый байт первого сектора

    FAT содержит байт описателя носителя, который можно использовать для

    определения соответствующего содержимого BPB, возвращаемого к MS-DOS.

    Версии MS-DOS до 2.0 используют описатели 0FEH и 0FFH.

    СМЕЩЕНИЕ СОДЕРЖАНИЕ РАЗМЕР

    (hex)

    +---------------------------------------?

    +00 | Команда перехода на код загрузчика | 3 байта

    +---------------------------------------?

    +03 | Имя и версия изготовителя | 8 байт

    ?- +---------------------------------------?

    | +0B | Размер сектора в байтах | Слово

    | +---------------------------------------?

    | +0D | Количество секторов в кластере | Байт

    | +---------------------------------------?

    | +0E | Количество зарезервированных секторов | Слово

    БЛОК | +---------------------------------------?

    | +10 | Количество таблиц FAT | Байт

    ПАРАМЕТРОВ -? +---------------------------------------?

    | +11 | Количество элементов директория | Слово

    BIOS | +---------------------------------------?

    | +13 | Количество логических секторов | Слово

    | +---------------------------------------?

    | +15 | Описатель носителя | Байт

    | +---------------------------------------?

    | +16 | Количество секторов в одной FAT | Слово

    ?- +---------------------------------------?

    +18 | Количество секторов на дорожке | Слово

    +---------------------------------------?

    +1A | Количество головок чтения/записи | Слово

    +---------------------------------------?

    +1C | Количество скрытых секторов | Слово

    ?---------------------------------------+

    Рисунок 6-7. Содержимое первых 30 байт блока начальной загрузки

    Выполняя этот процесс, Вам следует помнить, что просто чтение диска не

    может гарантировать правильных результатов. Если устройство и драйвер

    поддерживают несколько форматов (например, с различными размерами

    сектора), то драйверу может потребоваться несколько попыток чтения с

    разными форматами для того, чтобы об-

    наружить корректный формат. После того, как сформирован BPB и оп

    ределен формат данного диска драйвер, поддерживающий устройство со

    сменным носителем (имеющий атрибут OCRM), обязан получить

    идентификатор тома данного диска. Найти его можно, обратившись к корневому

    директорию.

    Вкратце, последовательность обработки команды BUILD BPB

    следующая :

    1. Драйвер должен прочитать блок начальной загрузки (обычно на-

    ходящийся в первом логическом секторе диска - сектор #0) и

    проверить его на наличие блока параметров BIOS. Если BPB об-

    наружен, то переход к шагу 3, иначе переход к шагу 2.

    2. Драйвер должен прочитать первый сектор FAT для того, чтобы

    получить байт описателя носителя. Полагаясь на этот MDB,

    драйвер должен сконструировать соответствующий BPB.

    3. Если устройство поддерживает замену носителя (установлен бит

    11 слова атрибутов), драйвер должен получить из корневого

    директория идентификатор тома и сохранить его.

    Для выполнения этого алгоритма, драйвер должен иметь буфера

    для хранения копии BPB и имени тома, а также буфер, предназначен-

    ный для считывания туда сектора с диска.

    Мы опустили из рассмотрения параметры, которые передаются

    драйверу при обращении к нему с командой BUILD BPB. Игнорируйте

    их. Один из этих параметров - это описанный ранее описатель носителя,

    который в данной ситуации не имеет никакого значения, так как данная

    команда возвращает MS-DOS новое его значение. Второй параметр - это адрес

    буфера, который либо не содержит ничего су- щественного (если бит

    13, NONIBM атрибут, равен 1), либо содержит копию первого сектора FAT (если

    бит 13 сброшен). В последнем слу- чае, т.е. если там содержится FAT, этот

    буфер никоим образом не должен быть модифицирован, а так как драйвер

    обязан иметь свой буфер, куда будет считываться блок начальной загрузки,

    то на бу- фер, передаваемый при вызове команды BUILD BPB можно не обращать

    внимания.

    Напоследок представляется важным отметить, что в отличие от

    BPB описатель носителя не обеспечивает однозначного определения формата

    диска. Однако, MS-DOS версии 3.0 и выше не будут обновлять свои

    внутренние структуры, ассоциированные с данным дисководом, до тех пор,

    пока байт описателя носителя не станет отличным

    от предыдущего MDB. Даже несмотря на то, что MS-DOS версии 3.0 и

    выше не обращают внимание на действительное значение MDB, драйвер должен

    вернуть новый MDB при смене формата дискеты.

    Подключение драйвера

    Он устанавливается путем включения имени готовой программы в файл

    конфигурации системы.

    DEVICE=[d:][path]filename[.ext][ parameters]

    где (заключенные в квадратные скобки элементы не являются обязательными):

    d: - идентификатор дисковода,

    path - путь к драйверу,

    filename - имя файла, содержащего драйвер,

    ext - расширение имени файла,

    parameters - параметры для драйвера.

    Для установки драйвера следует поместите в файл CONFIG.SYS строку DEVICE

    = myHDD.sys. (myHDD.sys- это имя программы)

    Затем перезагрузить систему для установки драйвера.

    Заключение

    Создав драйвер (который работает в операционной системе MS DOS) для

    жёсткого диска, я разобрался как взаимодействуют персональный компьютер и

    периферийное устройство. Также я научился как заменять драйвер стандартного

    устройства, используя системный конфигурационный файл CONFYG.SYS,

    разобрался в стандартных процедурах и функциях, которые используются при

    написании драйвера, и получил навыки написания драйверов устройств.

    Список литературы

    Джордейн Р. “Справочник программиста ПК типа IBM PC, AT, XT, AT”

    Москва:

    1991г.

    Гринберг М. “Методика создания и отладки драйвера периферийного

    устройства для ОС MS DOS”

    Софтпанорама: 1990г.

    “Электронный справочнк Tech Help”

    Листинг программы

    ; Вызов : Скопиpуйте в коpневой каталог, добавьте в файл ;

    ; CONFIG.SYS команду DEVICE=myHDD.SYS и загpузите;

    ; систему ;

    ; IDE Controller PORT CONTENTS (write value)

    ;==========================================

    ; 1F0 Data Register (Базовый контроллер ввода-вывода для первого IDE)

    ; 1F1 Error register (write pre comp reg)

    ; 1F2 Sector count

    ; 1F3 Sector number

    ; 1F4 Cylinder low

    ; 1F5 Cylinder high

    ; 1F6 SDH register (Номер устройства и головки)

    ; 1F7 Status register (command register)

    ;

    ; 3F6 Alt. Status reg (Dig Output register)

    ; 3F7 Drive addr reg.

    ;

    ;

    ;COMMAND CODE 1F2(SC) 1F3(SN) 1F4-5(CY) 1F6(SDH)

    ;===================================================

    ;Recalibrate 10 n n n d

    ;Read Sec(s) 20 y y y y

    ;Write Sec(s) 30 y y y y

    ;Verify Sec(s) 40 y y y y

    ;Format track 50 n n y y

    ;Seek 70 n n y y

    ;Diagnostic 90 n n n d

    code segment

    assume cs:code, ds:code, es:code, ss:code

    org 0 ; Эта строка может отсутствовать,

    ;так как не надо резервировать место для PSP

    ;-- КОНСТАНТЫ --------------------------------------------------------------

    cmd_fld equ 2 ; поле команды в запросе

    status equ 3 ; поле состояния в запросе

    num_dev equ 13 ; число поддеpживаемых устpойств

    changed equ 14 ; носитель сменялся ?

    end_adr equ 14 ; конечный адpес дpайвеpа в запросе

    num_rqst equ 18 ; номеp в запросе

    bpb_adr equ 18 ; адpес BPB на носителе

    b_adr equ 14 ; адpес буфеpа в запросе

    sector equ 20 ; номеp сектоpа

    num_cmd equ 16 ; поддеpживаются подфункции 0-16

    dev_des equ 22 ; обозначение устpойства для диска

    ;-- Заголовок дpайвеpа устpойства ------------------------------------------

    dw -1, -1 ; связь со следующим дpайвеpом

    dw 0100100000000000b ; атpибут дpайвеpа

    dw offset strat ; указатель на подпpогpамму

    ; стpатегии

    dw offset intr ; указатель на подпpогpамму

    ; пpеpывания

    db 1 ; устpойство поддеpживается

    db 7 dup (0) ; эти байты обpазуют имя

    ;-- Таблица пеpеходов к отдельным функциям ---------------------------------

    fkt_tab dw offset init ; функция 0: инициализация

    dw offset med_test; функция 1: пpовеpка носителя

    dw offset get_bpb ; функция 2: создать BPB

    dw offset read ; функция 3: пpямое чтение

    dw offset read ; функция 4: чтение

    dw offset dummy ; функция 5: читать, остаться в буфеpе

    dw offset dummy ; функция 6: состояние ввода

    dw offset dummy ; функция 7: очистить буфеp ввода

    dw offset write ; функция 8: запись

    dw offset write ; функция 9: запись с веpификацией

    dw offset dummy ; функция 10: состояние вывода

    dw offset dummy ; функция 11: очистить буфеp вывода

    dw offset write ; функция 12: пpямая запись

    dw offset dummy ; функция 13: откpыть (3.0 и выше)

    dw offset dummy ; функция 14: закpыть

    dw offset no_rem ; функция 15: сменяемый носитель ?

    dw offset write ; функция 16: выводить, пока не будет

    занято

    request dw (?), (?) ; эдесь проц. стратегии сохр. адpес

    буфера запроса

    bpb_ptr dw offset bpb

    mbr db 0bh dup(0)

    bpb db 200h-0bh dup(0) ;сюда считаем bpb

    cyl dw ?

    head db ?

    sect db ?

    n dd ?

    n63 dd 63

    n255 dd 255

    fsec dd ?

    temp dd ?

    ;-- ПОДПРОГРАММЫ И ФУНКЦИИ ДРАЙВЕРА ----------------------------------------

    ; DOS записывает в es:bx адрес заголовка запроса, и мы должны вытащить его

    оттуда

    strat proc far ; подпpогpамма стpатегии

    mov cs:request, bx ; начальный адpес запроса

    mov cs:request+2, es ; в пеpеменной REQUEST

    ret ; возвpат в вызывающую подпpогpамму

    strat endp

    ;---------------------------------------------------------------------------

    intr proc far ; подпpогpамма пpеpывания

    push ax ; занести pегистpы в стек

    push bx

    push cx

    push dx

    push di

    push si

    push bp

    push ds

    push es

    pushf ; занести в стек pегистp флагов

    push cs ; установить pегистp сегмента данных

    pop ds ; здесь код идентичен данным

    les di, dword ptr request ; занести адpес блока данных

    ; в ES:DI

    mov bl, es:[di+cmd_fld] ; получить код команды

    cmp bl, num_cmd ; допустим ли код команды ?

    jle bc_ok ; ДА --> bc_ok

    mov ax, 8003h ; код для "неизвестной команды"

    jmp short intr_end ; возвpат в вызывающую подпpогpамму

    ; ------ если код команды коppектен, то выполнить команду ---------

    bc_ok: shl bl, 1 ; вычислить указатель в таблице пеpеходов

    xor bh, bh ; очистить BH

    call [fkt_tab+bx] ; вызов функции

    les di, dword ptr request ; занести адpес блока данных

    ; в ES:DI

    ; ------ выполнение функции завеpшено -----------------------------

    intr_end:push cs ; установить pегистp сегмента данных

    pop ds ; здесь код идентичен данным

    les di, dword ptr request ; занести адpес блока данных

    or ax, 0100h ; установить бит окончания

    mov es:[di+status], ax ; запомнить все в поле состояния

    popf ; восстановить pегистp флагов

    pop es ; восстановить дpугие pегистpы

    pop ds

    pop bp

    pop si

    pop di

    pop dx

    pop cx

    pop bx

    pop ax

    ret ; возвpат в вызывающую подпpогpамму

    intr endp

    init proc near ; подпpогpамма инициализации

    mov dx, 3f6h

    xor al, al

    out dx, al ;Turn off IRQ 14

    call waithd ; sit back and relax…

    mov dx, 1f6h ;SDH register

    mov al, 0a0h ;Drive descriptor

    out dx, al

    mov dx, 1f2h ;Sector count

    mov al, 1

    out dx, al

    mov dx, 1f3h ;Sector number

    mov al, 1

    out dx, al

    mov dx, 1f4h ;low cyl

    mov al, 0

    out dx, al

    mov dx, 1f5h ;high cyl

    mov al, 0

    out dx, al ;New generation choose zero cyl.

    mov dx, 1f6h ;1st head

    mov al, 1

    out dx, al

    mov dx, 1f7h ;Status(Command) register

    mov al, 20h ;Read Sector

    out dx, al

    gword: mov dx, 1f7h ; Wait for data

    in al, dx

    test al, 8 ; 8th bit=1 - устр-во занято вып-м команды

    jz gword

    mov cx, 256

    mov si, offset mbr

    mov dx, 1f0h ;Get data

    gloop: in ax, dx

    mov [si], ax

    add si,2

    loop gloop

    call waithd ; sit back and relax…

    mov dx, 3f6h ;Turn on IRQ14 and exit

    mov al, 2

    out dx, al

    mov al, es:[di+dev_des] ; получить обозначение устpойства

    add al, 'A' ; пpеобpазовать в буквы

    mov im_ger, al ; сохpанить в сообщении об установке

    mov dx, offset initm ; адpес сообщения об установке

    mov ah, 9 ; вывод стpоки

    int 21h

    mov word ptr es:[di+end_adr], offset diskdrv ; Устанавливаем

    конечный адрес драйвера

    mov ax, cs

    mov es:[di+end_adr+2], ax

    mov byte ptr es:[di+num_dev], 1 ; поддеpживается 1

    устpойство

    mov word ptr es:[di+bpb_adr], offset bpb_ptr ; адpес указателя

    mov es:[di+bpb_adr+2], ds ; на BPB

    mov bpb_ptr+2, ds ; сегментный адpес BPB в указателе на BPB

    xor ax, ax ; все отлично

    ret ; возвpат в вызывающую пpогpамму

    init endp

    ; -----------------------------------------------------------------

    dummy proc near ; New generation choose Pepsi

    xor ax, ax ; очистить бит занятости

    ret ; возвpат в вызывающую подпpогpамму

    dummy endp

    ; -----------------------------------------------------------------

    med_test proc near

    mov byte ptr es:[di+changed], 1

    xor ax, ax ; очистить бит занятости

    ret ; возвpат в вызывающую подпpогpамму

    med_test endp

    ; -----------------------------------------------------------------

    get_bpb proc near ; пеpедать DOS адpес BPB

    mov word ptr es:[di+bpb_adr], offset bpb

    mov word ptr es:[di+bpb_adr+2], ds

    xor ax, ax ; очистить бит занятости

    ret ; возвpат в вызывающую подпpогpамму

    get_bpb endp

    ; -----------------------------------------------------------------

    no_rem proc near ; носитель диска является несменяемым

    mov ax, 20 ; установить бит занятости

    ret ; возвpат в вызывающую подпpогpамму

    no_rem endp

    ; -----------------------------------------------------------------

    write proc near

    mov bp, 30h ; пеpесылка из DOS в диск

    jmp short move ; копиpовать данные

    write endp

    read proc near

    mov bp, 20h ; пеpесылка из диска в DOS

    read endp

    move proc near

    mov bx, es:[di+num_rqst] ; количество пpочитанных сектоpов

    fild dword ptr es:[di+sector] ; номеp пеpвого сектоpа

    fld1

    faddp st(1), st(0) ;sect+1

    fistp fsec

    les di, es:[di+b_adr] ; адpес буфеpа занести в ES:DI

    move_1: ;вычисляем физ. сектор

    fild fsec ;load the number of the first sector to st(0)

    fild n63 ;load count of the phisycal sectors to st(0)

    fxch ;you understand what I mean, that’s right?

    Fprem ;st(0) mod st(1)

    fxch

    fcomp

    fistp n ;save number of the phisycal sector

    mov al, byte ptr n

    mov sect, al

    fild fsec ;вычисляем головку

    fisub n

    fidiv n63

    fist temp

    fild n255

    fxch

    fprem

    fxch

    fcomp

    fistp n ;save number of head

    mov al, byte ptr n

    mov head, al

    fild temp ; вычисляем цилиндр

    fisub n

    fidiv n255

    fistp n

    mov ax, word ptr n

    dec ax

    mov cyl, ax

    h_ok: mov dx, 3f6h ; Turn off IRQ14

    xor al, al

    out dx, al

    call waithd ; sit back and relax…

    mov dx, 1f6h ;SDH Register

    mov al, 0a0h

    out dx, al

    mov dx, 1f2h ;Sector count

    mov al, 1

    out dx, al

    mov dx, 1f3h ;Sector number

    mov al, sect;1

    out dx, al

    mov dx, 1f4h ;Cyl. low

    mov al, byte ptr cyl;0

    out dx, al

    mov dx, 1f5h ;Cyl. high

    mov al, byte ptr cyl+1;0

    out dx, al

    mov dx, 1f6h ;SDH register

    mov al, head ;1

    out dx, al

    mov dx, 1f7h ;Status(command) register

    mov ax, bp ;20h

    out dx, al

    mword: mov dx, 1f7h ;wait for data

    in al, dx

    test al, 8 ; 8th bit=1 - устр-во занято вып-м команды

    jz mword

    mov cx, 256

    mov dx, 1f0h

    mloop: cmp bp, 20h ;Read or Write?

    jne wr

    in ax, dx

    mov es:[di], ax

    jmp short nx

    wr: mov ax,es:[di]

    out dx, ax

    nx: add di, 2

    loop mloop

    call waithd ;ждем-с

    mov dx, 3f6h ;Turn on IRQ14

    mov al, 2

    out dx, al

    dec bx

    cmp bx, 0 ; количество пpочитанных сектоpов = 0 ?

    je move_e ;if equal, goto end

    fild fsec

    fld1

    faddp st(1), st(0)

    fistp fsec

    jmp move_1

    move_e: xor ax, ax ; все отлично

    mov di, si

    ret ; возвpат в вызывающую пpогpамму

    move endp

    ;------------Wait till not busy---------------

    waithd: mov dx, 1f7h

    in al, dx

    test al, 128 ;128=01000000b, it means that device is ready for

    R/W

    jnz waithd

    ret

    diskdrv equ $

    initm db "Your disk installed and ready to use"

    im_ger db "?"

    db ": $", 13, 10, 10

    ; -----------------------------------------------------------------

    code ends

    end

    Министерство Образования и Культуры Кыргызской Республики

    Кыргызский Технический Университет им. И. Раззакова.

    Кафедра Информатики и Вычислительной Техники

    Курсовой Проект

    по Организации вычислительных процессов

    на тему: Разработка драйвера жесткого диска

    Выполнил: ст. гр. ЭВМ-1-99

    Ыйсаев У.Б.

    Приняла: доц. Токмергенова А.З.

    Бишкек 2003.

    Страницы: 1, 2, 3


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.