| Организация ЭВМ и систем
Лабораторная работа № 7 (b)
Программирование периферийного устройства
Выполнил: Моисеев Игорь Владимирович, специальность 2204, 2 курс, группа 2 (заочники), 22.05.2004
Вариант 6
Цель: создать программу чтение сектора с НГМД
Большинство дисковых операций можно выполнить на уровне BIOS. Это самый
простой и надежный способ работы с диском на физическом уровне. Однако в
отдельных случаях вам может потребоваться непосредственный доступ к
контроллеру (например, если вы разрабатываете систему защиты данных от
несанкционированного копирования).
Таблица 1 - Формат дорожки диска
| FF |
|
| 00 |
Прединдексный синхронизирующий промежуток |
| IAM |
Индексная адресная метка |
| |
Промежуток |
| |
Сектор 1 |
| |
Промежуток |
| |
Сектор 2 |
| |
Промежуток |
| ... |
|
| |
Промежуток |
| |
Сектор N |
| |
Промежуток |
| |
Конечный промежуток |
Каждый сектор на дорожке состоит из областей индекса и
данных. Секторы разделены промежутками. В конце дорожки располагается конечный
промежуток, его размер зависит от скорости вращения диска, длин секторов и
других промежутков. Область индекса содержит информацию о номере дорожки,
головки, сектора, код длины сектора. Область данных, очевидно, содержит
данные, которые хранятся на диске.
Таблица 2 - Формат сектора
| IDAM |
Адресная метка индекса |
| |
Номер дорожки |
| |
Номер головки |
| |
Номер сектора |
| |
Код длины сектора |
| |
2 байта циклического контроля |
| FF |
|
| 00 |
Промежуток |
| |
Адресная метка данных |
| |
Адресна |
| |
2 байта циклического контроля |
Функции BIOS для работы с дисками.
Наилучший и самый безопасный способ работы с дисками на
физическом уровне - использование функций базовой системы ввода/вывода BIOS.
Эти функции учитывают все особенности аппаратуры и предоставляют достаточно
широкий набор средств доступа к дискам на физическом уровне.
Вся дисковая подсистема обслуживается прерыванием INT 13h.
Это прерывание выполняет множество функций. Для вызова определенной функции
программа должна занести ее код в регистр AH. При этом в другие регистры
следует записать параметры - номер НМД или номер НГМД, номер цилиндра,
головки, адрес таблицы параметров НМД или НГМД и т.д.
Таблица 3 - Краткая таблица функций прерывания INT 13h
| Номер функции |
Описание |
| 00h |
Сброс дисковой системы |
| 01h |
Определение состояния дисковой системы |
| 02h |
Чтение сектора |
| 03h |
Запись сектора |
| 04h |
Проверка сектора |
| 05h |
Форматирование дорожки |
| 06h |
Форматирование дорожки НМД |
| 07h |
Форматирование НМД |
| 08h |
Получить текущие параметры НГМД или НМД |
| 09h |
Инициализация таблиц параметров НМД |
| 0Ah |
Чтение длинное (только для НМД) |
| 0Bh |
Запись длинная (только для НМД) |
| 0Ch |
Поиск цилиндра (только для НМД) |
| 0Dh |
Альтернативный сброс НМД |
| 0Eh |
Чтение буфера сектора (только для НМД) |
| 0Fh |
Запись буфера сектора (только для НМД) |
| 10h |
Проверка готовности НМД |
| 11h |
Рекалибровка НМД |
| 12h |
Проверка памяти контроллера НМД |
| 13h |
Проверка НМД |
| 14h |
Проверка контроллера НМД |
| 15h |
Получить тип НМД или НГМД |
| 16h |
Проверка замены дискеты |
| 17h |
Установка типа дискеты |
| 18h |
Установка среды носителя данных для форматирования |
| 19h |
Парковка головок (только для НМД) |
| 1Ah |
Форматирование НМД с интерфейсом ESDI |
С помощью функций BIOS можно выполнить низкоуровневое
форматирование диска, как стандартное, так и использующее нестандартный формат
дорожки. В любом случае при записи информации в секторы следует внимательно
анализировать работу программы - ошибки могут привести к разрушению логической
структуры. В результате этого могут появиться потерянные каталоги и файлы. Все
опасные эксперименты лучше проводить на дискетах, и только когда вы уверены
безошибочной работе программы, можно "допустить" ее к жесткому диску.
Ниже приведена программа, осуществляющая чтение сектора с
НГМД
{programm made by Moiseev Igor,2204,2 kurs, ZAO}
uses crt;
var
num_sect,track,sector,head,sector_read,drive:byte;
begin
clrscr;
writeln ('number to sectors of read');{ввести количество секторов для чтения}
readln (num_sect);
writeln ('sector of floppy disk');{ввести номер сектора для чтения}
readln (sector);
writeln ('head of floppy disk'); {номер головки для чтения}
readln (head);
asm
mov ah,02 {загружаем в верхнюю часть регистра AX номер функции прерывания}
mov al,num_sect {загружаем в нижнюю часть регистра AX количество
секторов для считывания}
mov cl,sector {загружаем в регистр cl номер сектора от 1 до 63}
mov dh,head {загружаем в регистр dh номер головки}
mov dl,00 {загружаем в регистр dl номер устройства от 00-7FH}
int 13h {вызываем прерывание BIOS 13h}
mov sector_read,al {загружаем в переменную sector_read количество
прочитанных секторов из регистра al}
end;
write ('read ',sector_read,' sector');
readln;
end.
Вывод: в результате выполнения лабораторной работы обрели
навыки программирования периферийного устройства – накопителя на гибких
магнитных дисках. Была создана программа, осуществляющая чтение сектора с
НГМД. Поставленная задача была решена с помощью функции 02h прерывания
BIOS 13h. В начале работы приведены основные сведения о функциях
прерывания 13h по работе с диском, кроме того введены общие понятия
о секторе.
|