Работа с адаптером дисплея в текстовом режиме, страница 3

        mov bx,0Fh           ; белым по черному

        mov cx,1             ; один символ

        int 10h

        retf

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

end main

ГУАП

КАФЕДРА № 44

ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

ассистент

А.Б. Бубликов

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

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4

Работа с дисководом

по курсу: ИНТЕРФЕЙСЫ ПЕРИФЕРИЙНЫХ УСТРОЙСТВ

РАБОТУ ВЫПОЛНИЛ(А)

СТУДЕНТ(КА) ГР.

В8441

Тарасов Р.С.

подпись, дата

инициалы, фамилия

Санкт-Петербург 2011

С помощью прерываний BIOS получить состояния дисковода, вывести на экран результат. Получить с клавиатуры сектор и данные для записи. Записать данные в заданный сектор. Получить с клавиатуры сектор — прочитать его и вывести результат на экран.

Ниже перечислены использованные функции INT 13H стандартного дискового ввода-вывода:

AH  сервис

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

01H прочитать состояние диска

    вход: DL = диск.  DL < 80H = дискета;  DL > 7FH = твердый диск

   выход: AL содержит состояние диска

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

02H читать секторы

     вход: DL = номер диска (0=диск A...; 80H=тв.диск 0; 81H=тв.диск 1)

           DH = номер головки чтения/записи

           CH = номер дорожки (цилиндра)(0-n)

           CL = номер сектора (1-n)

На сектор и цилиндр отводится соответственно 6 и 10 бит: старшие два бита CL используются как старшие биты номера цилиндра.

           AL = число секторов (в сумме не больше чем один цилиндр)

           ES:BX => адрес буфера вызывающей программы

   выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.

          ES:BX буфер содержит данные, прочитанные с диска

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

03H писать секторы

     вход: (аналогично подфункции 02H)

           ES:BX => данные, записываемые на диск.

    выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.

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

08H ¦AT¦  ¦XT¦ дать параметры диска. возвращает информацию об устройстве.

     вход: DL = диск

    выход: DL = число тв. дисков на первом контроллере

           DH = максимальный номер головки

           CH = максимальный номер цилиндра (младшие 8 бит)

           CL = максим. номер сектора (и старшие биты макс. номера цилиндра)

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

Текст программы:

        .MODEL SMALL

        .STACK 100h

        .DATA

Message1 DB 'Программа демонстрирует работу с контроллером дисковода',13,10,'$'

Message2 DB 'Текущий статус дисковода: ','$'

Message3 DB 'Введите номер цилиндра [0-','$'

Message4 DB ']: ','$'

Message5 DB 'Введите номер головки  [0-','$'

Message6 DB 'Введите номер сектора  [1-','$'

Message7 DB 'Введите 512 шестнадцатеричных байт для записи в сектор,',13,10

         DB 'при вводе более двух цифр будут учтены две младшие:',13,10,'$'

Message8 DB 'Введите адрес сектора для записи:',13,10,'$'

Message9 DB 'Введите адрес сектора для чтения:',13,10,'$'

zero     DW 0

head     DB ?

cyl      DB 2 dup(?)

sec      DB ?

buf      DB 512 dup (?)

        .CODE

main:

; подготовительные действия

         mov ax,@Data         ; устанавливаем регистры DS и ES,

         mov ds,ax            ; чтобы они указывали на сегмент данных

         mov es,ax           

         mov ah,09h

         lea dx,Message1

         int 21h              ; выводим заголовок программы

; запрашиваем параметры дисковода для использования в качестве ограничений

         push es             

         mov ah,8             ; запрашиваем параметры устройства

         mov dl,0             ; дисковод A:

         mov di,offset zero   ; компенсируем известную ошибку BIOS

         int 13h

         mov head,dh          ; фиксируем количество головок

         push cx

         mov cyl+1,ch         ; вычисляем и фиксируем

         shr cl,6             ; количество цилиндров

         mov cyl,cl

         pop cx

         and cl,3Fh           ; фиксируем количество секторов

         mov sec,cl

         pop es

; запрашиваем и выводим состояние дисковода

         mov ah,09h

         lea dx,Message2

         int 21h              ; выводим сообщение о состоянии

         mov ah,1             ; запрашиваем состояние дисковода

         mov dl,0

         int 13h

         mov al,ah

         call OutHex          ; выводим состояние дисковода

         mov dl,0ah

         mov ah,02

         int 21h              ; выводим перевод строки

; вводим значения буфера для записи в сектор дискеты

         mov ah,09h

         lea dx,Message7

         int 21h              ; выводим приглашение на ввод буфера

         mov cx,512           ; предельное количество вводимых чисел

         lea di,buf           ; смещение буфера для цепочечной команды

         cld                  ; сбрасываем флаг, направление слева-направо

input:                        ; цикл ввода значений

         call InHex           ; вводим значение

         stosb                ; размещаем очередной элемент буфера