Доступ к памяти
В Турбо Паскале можно напрямую обращаться к ячейкам памяти, организованным в три типа предопределенных одномерных массивов и представляющих элементы различного формата:
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.