Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

512 Байтов или кратное 512) в один или несколько определенных секторов.

Управляющая информация загружается в регистры аналогично операции чтения

диска (код 02). Операция записи возвращает в регистре AL число секторов,

которые действительно были записаны. Регистры DX, BX, CX и DX сохраняют

свои значения.

AH = 04: Верификация сектора

------------------------------

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

выполняет своего рода контроль на четность. Операцию можно использовать

после записи (код 03) для гарантии более надежного вывода, на что

потребуется дополнительное время ввода/вывода. Значения регистров

устанавливаются аналогично операции записи (код 03), за исключением

регистровой пары ES:BX - их инициализация не требуется. Операция

возвращает в регистре AL число обработанных секторов. Регистры DX, BX, CX

и DX сохраняют свои значения.

AH = 05: Форматирование дорожек

---------------------------------

Данная операция используется для форматирования определенного числа

дорожек в соответствии с одним из четырех размеров (стандарт для системы

PC - 512). Операции чтения и записи для локализации требуемого сектора

требуют информацию о формате. Для форматирования регистровая пара ES:BX

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

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

элемент в виде T/H/S|B, где

T номер дорожки,

H номер головки,

S номер сектора,

B число байт на секторе, (00-128, 01-256, 02-512, 03-1024).

Например, для форматирования 03 дорожки, на стороне 00 и 512 байтов

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

должны быть описаны элементы для остальных секторов на дорожке.

Техническое руководство по AT содержит ряд дополнительных операций BIOS.

БАЙТ СОСТОЯНИЯ

________________________________________________________________

Для всех рассмотренных выше операций (02, 03, 04 и 05) в случае

нормального завершения флаг CF и регистр AH содержит 0. В случае ошибки

флаг CF устанавливается в 1, а регистр AH содержит код состояния,

идентифицирующий причину ошибки. Код состояния аналогичен значению в

регистре AL после выполнения операции 01.

AH Причина

0000 0001 Ошибка команды для дискеты

0000 0010 Не найден адресный маркер на диске

0000 0011 Попытка записи на защищенный диск

0000 0100 Не найден сектор

0000 1000 Выход за границы DMA (памяти прямого доступа)

0000 1001 Попытка доступа через границу 64K

0001 0000 Чтение сбойный участок на диске

0010 0000 Ошибка контролера дисковода

0100 0000 Ошибка установки (поиска)

1000 0000 Ошибка оборудования

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

(AH=00) и троекратное повторение операции. Если таким образом ошибка не

устраняется, то на экран выводится соответствующее сообщение и

пользователь может сменить дискету.

ПРОГРАММА: ИСПОЛЬЗОВАНИЕ BIOS ДЛЯ ЧТЕНИЯ СЕКТОРОВ

________________________________________________________________

__________________________________________________________________________

TITLE BIOREAD (COM) Чтение дискового сектора через BIOS

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H

BEGIN JMP MAIN

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

RECDIN DB 512 DUP(' ') ;Область ввода

ENDCDE DB 00

CURADR DW 0304H ;Начало (дорожка/сектор)

ENDADR DW 0501H ;Конец (дорожка/сектор)

READMSG DB '*** Read error ***$'

SIDE DB 00

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

MAIN PROC NEAR

MOV AX,0600H ;Функция прокрутки экрана

A20LOOP:

CALL Q10SCR ;Очистить экран

CALL Q20CURS ;Установить курсор

CALL C10ADDR ;Определить адрес на диске

MOV CX,CURADR

MOV DX,ENDADR

CMP CX,DX ;Последний сектор?

JE A90 ; да - выйти

CALL F10READ ;Получить дисковую запись

CMP ENDCDE,00 ;Ошибка чтения?

JNZ A90 ; да - выйти

CALL G10DISP ;Вывести сектор на экран

JMP A20LOOP ;Повторить

A90 RET ;Завершить программу

MAIN ENDP

; Вычислить следующий адрес на диске:

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

C10ADDR PROC NEAR

MOV CX,CURADR ;Последняя дорожка/сектор

CMP CL,10 ;Последний сектор?

JNE C90 ; нет - выйти

CMP SIDE,00 ;Обойти, если сторона = 0

JE C20