Доступ к аппаратуре

Доступ к памяти

В Турбо Паскале можно напрямую обращаться к ячейкам памяти, организованным в три типа предопределенных одномерных массивов и представляющих элементы различного формата:

Mem – Byte,

MemW – Word,

MemL – Longint.

Для доступа к элементам массивов используется специальный синтаксис, состоящий из номера сегмента и номера ячейки памяти, оба типа Word:

Mem[$0040:$0049]:=7;

Data:= MemW[Seg(V):Ofs(V)];

Обращение к оперативной памяти по физическим адресам обычно используется для доступа к системной информации DOS и BIOS и разрешено только в однопользовательских операционных системах, например MS-DOS.

Доступ к портам ввода-вывода

В процессорах фирмы Intel используется изолированный ввод-вывод. То есть область адресов памяти отделена от области внешних устройств. Все подключаемые внешние устройства с точки зрения процессора выглядят одинаково и являются портами ввода-вывода.

Для доступа к этим портам используются два предопределенных массива

Port, PortW

соответственно с типами byte и word.

Когда элементу массива Port или PortW присваивается значение, это действие интерпретируется как вывод значения в порт.

Когда элемент массива выступает как операнд в выражении, то доступ к порту понимается как ввод с порта. Например:

{ Разрешение дальнейшей работы контроллера прерываний }

Port[$20]:=$20;

{ Установка в 1 заданных линий порта }

PortW[Base]:=PortW[Base] or Maska;

{ Ожидание установки в 0 старшей линии порта }

While (Port[$82] and $80)=0 do;

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

Program Kyrsor;

{ Демонстрационный пример доступа к порту клавиатуры

для управления движением курсора }

Uses Crt; { используется для создания задержки }

Var Mode, { записываемый в порт байт }

Ch:byte; { число, читаемое с клавиатуры }

Begin

Writeln(' Выберите режим ввода символов:');

Writeln(' Задержка перед первым повторением:');

Writeln(' 1 - 250 мс');

Writeln(' 2 - 500 мс');

Writeln(' 3 - 750 мс');

Writeln(' 4 - 1 с');

Repeat

Read(Ch);

Until Ch in [1..4];

Case Ch of

1: Mode:=0;

2: Mode:=$20;

3: Mode:=$40;

4: Mode:=$60;

end;

Writeln(' Частота перемещения, раз/сек:');

Writeln(' 1 - 30');

Writeln(' 2 - 20');

Writeln(' 3 - 10');

Writeln(' 4 - 5');

Writeln(' 5 - 2');

Repeat

Read(Ch);

Until Ch in [1..5];

Case Ch of

2: Mode:=Mode or 4;

3: Mode:=Mode or $0a;

4: Mode:=Mode or $14;

5: Mode:=Mode or $1f;

end;

{ Команда на установку режима }

Port[$60]:=$f3;

{ Задержка на восприятие }

Delay(10);

{ Код режима }

Port[$60]:=Mode;

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: