Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LRP1

.pdf
Скачиваний:
16
Добавлен:
02.02.2015
Размер:
453 Кб
Скачать
☆

2.2. Формирование ASCII кодов.

3. Описание работы

Записанная в ПЗУ BIOS подпрограмма обработки прерывания 09H, вызванного процессором клавиатуры при нажатии (отжатии) клавиши, читает скан-код из порта 60H и, если это скан-код клавиши-переклю-

чателя (правый Shift, левый Shift, Ctrl, Alt, ScrollLock, NumLock, CapsLock и Insert), то изменяется содержимое ячеек памяти 0040:0017H и 0040:0018H, хранящих состояния клавиш-переключате- лей. В буфер клавиатуры при этом ничего не пишется (исключение составляет клавиша Insert). В таблице 1 приведен формат байта по адресу 0040:0017H, а в таблице 2 - по адресу 0040:0018H.

Таблица 1 Формат байта по адресу 0040:0017H

──────────────────────────────────────

Бит Значение, когда бит=1

──────────────────────────────────────

0нажата клавиша правый Shift

1нажата клавиша левый Shift

2нажата клавиша Ctrl

3нажата клавиша Alt

4режим ScrollLock включен

5режим NumLock включен

6режим CapsLock включен

7режим вставки включен

────────────────────────────────────────

Таблица 2

Формат байта по адресу 0040:0018H.

──────────────────────────────────────────────────

Бит Значение, когда бит=1

──────────────────────────────────────────────────

0нажаты клавиши левый Shift вместе с Ctrl

1нажаты клавиши левый Shift вмести с Alt

2нажата клавиша SysReq

3нажаты клавиши Ctrl вместе с NumLock

──────────────────────────────────────────────────

41

Продолжение таблицы 2

──────────────────────────────────────────────────

Бит Значение, когда бит=1

──────────────────────────────────────────────────

4режим ScrollLock включен

5режим NumLock включен

6режим CapsLock включен

7режим вставки включен

───────────────────────────────────────────────────

Состояния клавиш-переключателей могут быть изменены программно. Если же это скан-код клавиши, не являющейся переключателем, то в соответствии с ее скан-кодом и состоянием клавиш-переключателей

формируется или однобайтный ASCII код данной клавиши, который вместе со скан-кодом записывается в буфер клавиатуры, или двубайтный расширенный код, первым байтом которого является 0, а второй байт в большинстве случаев совпадает со скан-кодом. Эти два байта также записываются в буфер клавиатуры. При отжатии клавиши в буфер ничего не записывается и изменяется только состояние клавиш-переключате- лей.

Программа обработки прерывания 09H отслеживает также некоторые комбинации клавиш. В табл.3 приведены эти комбинации и действия, выполняемые обработчиком прерывания при их обнаружении:

Таблица 3

Функции клавиш

──────────────────────────────────────────────────────────────

Комбинация клавиш Выполняемые действия

──────────────────────────────────────────────────────────────

Ctrl-Alt-Del Сброс и перегрузка системы Ctrl-NumLock Перевод машины в состояние ожидания

Shift-PrtSc Распечатка на принтере содержимого экрана (обработка прерывания 05H)

Ctrl-Break Завершение выполнения программы

───────────────────────────────────────────────────────────────

Структура буфера клавиатуры изображена на рис.1. Буфер клавиатуры расположен по адресам 0040:001aH - 0040:003cH оперативной памяти и позволяет накапливать данные (ASCII и скан-коды) о 15 нажатиях клавиш (на месте, предшедствующем началу строки символов в буфере хранятся ASCII код возврата каретки (ASCII 13) и скан -код клавиши "Enter").

В ячейке 0040:001aH (указатель начала) хранится адрес первого введенного символа, а в ячейке 0040:001cH (указатель хвоста) - адрес первой свободной ячейки после последнего введенного символа.

42

Адреса хранятся

 

в виде байта

смещения (второй байт ячейки не ис-

пользуется). Если буфер пуст,

то содержимое указателя начала сов-

падает с содержимым указателя хвоста.

 

 

 

 

 

15

0

 

 

 

 

 

┌──────────────┐

 

 

 

 

0040:003с

│

 

│

 

 

 

 

 

├──────────────┤

 

 

 

 

3a

│

 

│

Содержимое ячейки буфера

 

 

├──────────────┤

 

 

 

 

38

│

 

│

15

8

7

0

 

├──────────────┤

┌────────────┬────────────┐

36

│

 

│

│ скан-код

│

ASCII

│

 

├──────────────┤

└────────────┴────────────┘

34

│

"R"

│

 

 

 

 

 

├──────────────┤

если ASCII код равен 0, то

32

│

"E"

│

вместо скан-кода указывается

 

├──────────────┤

номер расширенного кода

 

30

│

"F"

│

(в большинстве случаев сов-

 

├──────────────┤

падающего со скан-кодом)

2e

│

"F"

│

 

 

 

 

 

├──────────────┤

 

 

 

 

2c

│

"U"

│

 

 

 

 

 

├──────────────┤

 

 

 

 

2a

│

"B"

│

 

 

 

 

 

├──────────────┤

 

 

 

 

28

│

 

│

 

 

 

 

 

├──────────────┤

 

 

 

 

26

│

 

│

 

 

 

 

 

├──────────────┤

 

 

 

 

24

│

 

│

 

 

 

 

 

├──────────────┤

 

 

 

 

22

│

 

│

 

 

 

 

 

├──────────────┤

 

 

 

 

20

│

 

│

 

 

 

 

 

├──────────────┤

 

 

 

 

1e

│

 

│

 

 

 

 

 

├──────────────┤

 

 

 

 

1c

│

36

│

Указатель хвоста

 

 

 

├──────────────┤

 

 

 

 

0040:001a

│

2a

│

Указатель начала

 

 

 

└──────────────┘

 

 

 

 

 

 

 

Рис.1

 

 

 

 

 

 

 

43

 

 

 

Запись в буфер осуществляется по адресу указателя хвоста, при этом содержимое указателя увеличивается на 2. Чтение из буфера производится по адресу указателя начала, при этом содержимое указателя также увеличивается на 2 (если указатель содержит адрес последней ячейки буфера - 3cH, то вместо увеличения на 2 в него необходимо записать адрес начала буфера - 1eH).

4.Порядок выполнения

4.1.Написать программу, реализующую изображенный на рис.2 алгоритм чтения из буфера клавиатуры ASCII и скан-кодов.

4.2.В соответствии с индивидуальным заданием определить ASCII и скан-код требуемых клавиш.

──1 ────────────

 

Начало

 

────────┬────────

 

│

┌────────────────>

│

│

│да 2

<──────

Буфер пуст?

 

│

 

 

│

│ нет

 

│

┌── 3 ────┴─────────┐

┌

│

│Чтение байта по ад-│

│ Чтение кода ASCII

│

│ресу начала буфера │

│ нажатой клавиши

│

└─────────┬─────────┘

└

│

│

┌

│

┌── 4 ────┴─────────┐

│Чтение скан-кода, если

│

│ Чтение байта по │

│ASCII код <> 0, иначе -

││ следующему адресу │ │номера расширенного кода

│

└─────────┬─────────┘

└

│

│

 

│┌── 5 ────┴─────────┐

││ ASCII и скан-код │

│

│

│

│└─────────┬─────────┘

│┌── 6 ────┴─────────┐

││Коррекция указателя│

│

│ начала буфера

│

│└─────────┬─────────┘

44

│

 

│

┌

│ нет

7

 

│Окончание по Ctrl-Break

- └──────

 

Ctrl-Break?

│для чтения кодов любой

 

 

 

│ клавиши

 

 

│ да

└

 

─ 8

────┴────────

 

 

 

Конец

 

─────────────────

Рис.2

5.Особенности программирования

5.1.На языке Турбо-Паскаль.

5.1.1. Для чтения данных из буфера клавиатуры используйте предопределенный массив Mem. Например, для чтения содержимого указателя хвоста применяется выражение Mem[$0040:$001c], а для чтения

ASCII кода из начала буфера - Mem[$0040:Mem[$0040:$001a]].

5.2. На языке Турбо-Си.

5.2.1. Для чтения данных из буфера клавиатуры используются дальние указатели,которые обьявляются в программе следующим образом:

char far * uk;

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

uk=( char far * ) 0x0040001c; b=* uk;

а для чтения ASCII кода из начала буфера

uk=( char far * ) 0x0040001a; b=* uk;

где: b- переменная типа char.

45

6.Индивидуальные задания

6.1.Определить ASCII код русской буквы, номер которой в алфавите совпадает с номером студента в журнале.

6.2.Определить скан-код этой клавиши. 7. Содержание отчета

7.1.Тема лабораторной работы.

7.2.Цель работы.

7.3.Порядок выполнения.

7.4.Индивидуальное задание.

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

7.6.Результаты работы программы.

7.7.Выводы.

Лабораторная работа 6

СТРУКТУРА МАГНИТНЫХ ДИСКОВ

1. Цель работы.

Изучение физической и логической структуры магнитных дисков и приобретение практических навыков определения местонахождения основных элементов логической структуры дисков - корневой записи, корневого каталога и таблицы размещения файлов.

2.Темы для предварительной проработки.

2.1.Физическая и логическая структура магнитных дисков.

3.Описание работы.

3.1. Физическая структура диска.

Все диски как гибкие, так и жесткие организованы одинаковым образом. Данные всегда записываются на магнитной поверхности диска в виде концентрических окружностей, называемых дорожками (цилиндрами), а дорожки в свою очередь делятся радиально на сектора. Гибкие диски (дискеты) имеют две стороны. Жесткие (фиксированные) диски могут иметь более двух сторон.

Количество информации на одной стороне диска зависит от числа

46

дорожек (называемого плотностью) и числа секторов на одной дорожке. Плотность может существенно меняться от диска к диску. Например, диски двойной плотности имеют 40 дорожек, а диски учетверенной (высокой) плотности - 80 дорожек. Если число дорожек и число сторон являются конструктивными особенностями дисков, то расположение, число и размер секторов задаются программно при первоначальной разметке (форматировании каждой дорожки диска). Для всех типов дисков в MS-DOS размер сектора равен 512 байтам.

Например, стандартная дискета с диаметром 5.25 дюйма имеет 40 дорожек и в системе MS-DOS каждая такая дорожка может быть разбита на 9 секторов, что дает общую емкость дискеты 360K (512 байт х 9 секторов х 40 дорожек х 2 стороны = 360K), на 15 секторов с емкостью дискеты 1.2М или на другое число секторов.

Файл располагают на таком количестве секторов, которое необходимо, чтобы вместить его полностью. Только несколько секторов на внешнем ободе дискеты зарезервированы для специальных нужд. Остальные доступны на основе правила "первый подошел - первого обслужат". Это означает, что по мере заполнения диска данными сектора постепенно заполняются по направлению к центру диска. При уничтожении файла сектора освобождаются и со временем свободные области становятся разбросанными по диску, разбивая новые файлы и замедляя доступ к ним для чтения и записи.

3.2. Логическая структура гибкого диска.

Процесс форматирования диска делит общее количество секторов на четыре части, образующие непрерывные сегменты. Эти сегменты (в порядке расположения на диске) называются загрузочная запись (Boot

Record), таблица размещения файлов (FAT - File Allocation Table),

каталог (Directory) и пространство данных.

3.2.1. Загрузочная запись.

На дискетах первый сектор (дорожка 0, сторона 0, сектор 1) содержит запись начальной загрузки, которая является небольшой программой, позволяющей компьютеру считывать с дискового накопителя остальные части MS-DOS, а также данные о структуре диска. Формат сектора представлен в таблице 1.

47

. Таблица 1

────────────────────────────────────────────────────────────────

Смещ. Длина Содержимое

────────────────────────────────────────────────────────────────

+0

3

JMP

xx xx

NEAR-переход на код загрузки

 

+3

8

 

имя компании и версия системы

 

+0bH

2

SectSiz

число байтов на сектор

══ начало BPB ══╗

+0dH

1

ClustSiz

число секторов на единицу распределения

║

 

 

 

(кластер)

 

 

║

+0eH

2

ResSecs

число резервных секторов

 

║

 

 

 

(секторов перед первой FAT)

║

+10H

1

FatCnt

число таблиц FAT

 

║

+11H

2

RootSiz

макс. число 32-байтовых элементов

║

 

 

 

корневого оглавления

 

║

+13H

2

TotSecs

общее число секторов на носителе

║

 

 

 

(раздел DOS)

 

 

║

+15H

1

Media

дескриптор носителя

 

║

 

 

 

(то же, что 1-й байт FAT)

 

║

+16H

2

FatSize

число секторов

 

║

 

 

 

в одной FAT

 

══ конец BPB ═══╜

+18H

2

TrkSecs

число секторов на дорожке (цилиндре)

 

+1aH

2

HeadCnt

число головок чтения/записи (сторон)

 

+1bH

2

HidnSec

спрятанных секторов

 

 

+1eH

 

 

начало программы загрузки и данных

 

──────────────────────────────────────────────────────────────────

Замечания:

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

-последние три поля структуры требуются, начиная с DOS 3.0 .

3.2.1.1. Адрес области FAT.

Адрес области FAT вычисляется следующим образом:

Адрес FAT = начало раздела + корневой сектор(1) + число резервных секторов - 1.

3.2.1.2. Адрес корневого каталога.

Адрес корневого каталого вычисляется следующим образом:

Адрес каталога = начало раздела + корневой сектор(1) + число резервных секторов + число FAT x число секторов в одной FAT - 1.

Необходимо заметить, что при вычислении адресов области FAT и

48

каталога с использованием трехмерных координат для задания адреса сектора (головка, цилиндр, сектор) сначала изменяется значение сектора, затем - головки, последним изменяется номер цилиндра.

3.2.2. Таблица размещения файлов (FAT).

FAT располагается

непосредственно

после загрузочной записи,

начиная с сектора 2

на дорожке 0

стороны

0 и содержит код формата

и полную карту принадлежности секторов файлам. MS DOS использует

FAT для хранения сведений о размещении файлов. Каждый элемент таб-

лицы соответствует

участку дискового пространства и содержит код

состояния этого участка:

занят,

свободен или содержит дефект по-

верхности и поэтому не используется. Сохранность таблицы размещения файлов имеет критическое значение для сохранности всего диска, поэтому на диске хранится две идентичные копии этой таблицы.

3.2.3. Каталог файлов.

Каталог представляет собой таблицу, в которой каждый элемент соответствует файлу или другому каталогу и содержит информацию об имени файла, его размере и др.

3.2.4. Пространство данных.

Пространство данных используется для хранения собственно данных и занимает большую часть диска (более 99% и с ростом емкости дисков этот процент увеличивается).

3.3. Логическая структура жесткого диска.

Логическая структура жеского диска включает в себя все элементы структуры гибкого диска, описанные в п. 2.2 и имеющие то же самое назначение. Однако, помимо этого, жесткий диск содержит в самом первом секторе (цилиндр (дорожка) 0, головка (сторона) 0, сектор 1) программу, называемую главной корневой записью. Последняя часть этого сектора содержит таблицу разделов ─ 4-элементную таблицу с 16-байтовыми элементами. Этой таблицей манипулирует программа FDISK. Каждый раздел на жестком диске имеет логическое имя, например, 1-й раздел - "C:", 2-й раздел - "D:" и т.д.

Во время загрузки ROM-BIOS загружает главную корневую запись

впамять и передает ей управление. Эта программа считывает таблицу разделов, чтобы определить раздел, помеченный как активный. Затем

впамять считывается корневой сектор активного раздела и выполняется. В таблице 2 приведена структура таблицы разделов.

49

 

Таблица 2

.

Таблица разделов

────────────────────────────────────────────────────────────────

Смещ. Длина Содержимое

────────────────────────────────────────────────────────────────

+0

1beH

программа загрузки и выполнения корневого

 

 

сектора активного раздела

+1beH

10H

элемент раздела

1

(см. табл. 3)

+1ceH

10H

элемент раздела

2

 

+1deH

10H

элемент раздела

3

 

+1eeH

10H

элемент раздела

4

 

+1feH

2

55 aa - подпись

(окончание)

таблицы разделов (0aa55H)

───────────────────────────────────────────────────────────────

Таблица 3

Структура элемента раздела

─────────────────────────────────────────────────────────────────

Смещ. Длина Содержимое

────────────────────────────────────────────────────────────────

+0

1

Boot

 

- флаг загрузки : 0=не активен,

 

 

 

 

80H = активен

+1

1

Hd

 

- начало раздела: номер головки (стороны)

+2

2

Sec Cyl

- начало раздела: сектор/цилиндр(дорожка)

 

 

 

 

корневого сектора

+4

1

Sys

 

- код системы : 0=неизвестна (незадана),

 

 

 

 

1=DOS с 12-бит. FAT,

 

 

 

 

4=DOS с 16-бит. FAT

 

 

 

 

5=дополнительный DOS

+5

1

Hd

 

- конец раздела : номер головки

+6

2

Sec Cyl

- конец раздела : сектор/цилиндр

 

 

 

 

последнего сектора

+8

4

мл.

ст. - относительный номер начального сектора

+0cH

4

мл.

ст. - размер (число секторов)

+10H

 

начало следующего элемента раздела

(или 0aa55H для последнего элемента)

──────────────────────────────────────────────────────────────────

Замечания:

Значения цилиндра и сектора занимают 10 и 6 бит соответственно. Формат слова, задающего значения цилиндра и сектора приведен на рис. 1 ( ц - разряды значения цилинда, Ц - старший разряд;

50

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]