Работа с портами

Любое системное устройство и любое устройство ввода/вывода имеет один или несколько регистров. Доступ к этим регистрам происходит через адресное пространство ввода/вывода. Регистры имеют разрядность 8,16 или 32 бита, а адресное пространство ввода/вывода включает 65536 адресов. То есть понятие порта можно определить как 8-,16- или 32-разрядный аппаратный регистр, который имеет определенный адрес в адресном пространстве ввода вывода. Вся работа с устройствами на низком уровне происходит с использованием этих портов. Не смотря на то, что Паскаль язык высокого уровня, он позволяет работать с портами ввода/вывода. Для этого в языках Turbo Pascal и в первой версии Delphi существуют предопределенные массивы PortW и Port. Это одномерные массивы индексы которого соответствуют адресу порта ввода/вывода. Разница между PortW и Port заключается в то, что в PortW – элементы имеют тип word (целочисленный тип. Возможные значения от 0 до 65535), а в массиве Port – значение byte (целое число от 0 до 255). Запись и чтение в порт осуществляется также как и с обычным массивом.
Port[номер_порта] := данные – запись данных типа byte в порт;
Переменная := Port[номер_порта] – чтение данных типа byte из порта.
PortW[номер_порта] := данные – запись данных в порт. Записываемые данные должны иметь тип word
Переменная := PortW[номер_порта] – чтение данных из порта. В переменную будут записаны данные типа word

Однако с появление Object Pascal массивы Port и PortW были исключены. Частично эту проблему можно было решить, используя стандартные функции APIWindows. Однако такой подход решал проблему только для стандартных портов (Com, LPT и т.д.). Когда же требовалось работать с нестандартным оборудованием, проблема возникала снова. Единственным решением, было программирование собственных драйверов. Но благодаря написанной Фредом Булбаком динамической библиотеке и эта проблема была решена. Скачать, а также прочитать описание бибилиотеки (на английском языке) можно на сайте автора http://www.geekhideout.com/iodll.shtml. Всего четыре процедуры из этой библиотеки способны, полностью заменить массивы Port и PortW. Вот эти процедуры:

  • PortOut – запись байта в порт
  • PortWordOut – запись данных типа word в порт
  • Параметрами для данных процедур являются: 1 – адрес порта, 2 – данные которые нужно записать
  • PortIn – чтение байта из порта
  • PortWordIn – чтения данных тапа word из порта
  • У этих процедур всего один параметр – адрес порта.
Дата публикации: 13.11.2009