Специальные адреса памяти

В ОС MS-DOS имеются специальные адреса памяти, которые используются системой и с помощью которых можно выполнять, например, операции по обслуживанию периферийных устройств. Эти адреса расположены в сегменте, для доступа к которому используется константа Seg0040.

Таблица 1. Некоторые специальные адреса MS-DOS

смещение размер Назначение
$0010 word список оборудования
$0017 word статус клавиатуры
$0019 word альтернативный ввод с клавиатуры
$001A word вершина буфера клавиатуры
$001C word нижняя часть буфера клавиатуры
$001Е 16*word буфер клавиатуры - кольцевой список

В таблице 2 приведено описание байта состояния клавиатуры (адрес $0040:$0017). Установка каждого бита в этом байте соответствует наступлению определенного события.

Таблица 2. Байт состояния клавиатуры

Бит событие
нажата правая клавиша Shift
нажата левая клавиша Shift
нажата клавиша Ctrl
нажата клавиша Alt
нажата клавиша ScrollLock
нажата клавиша NumLock
нажата клавиша CapsLock
нажата клавиша Insert

 

Шестнадцатеричная константа $DF, в двоичной записи имеющая вид 1101 1111, играет роль маски. Побитовое выполнение логической операции and над этой константой и байтом состояния клавиатуры устанавливает значение 5-го бита (‘режим NumLock включен’) в 0, т.е. отключает его.

Переменная Absolute

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

 

Var <идентификатор> : <тип> Absolute BA:BS;

где BA – базовый адрес сегмента, BS смещение внутри этого сегмента. Например,
Var root : integer Absolute $0000:$01F0;

BA:BS может заменяться на идентификатор другой переменной, тогда вместо BA:BS будет подставлен ее адрес. Таким способом можно выполнять ‘наложение’ переменных.

Пример. Программа образует строку букв алфавита путем ее увеличения в цикле на одну букву, начиная с латинской буквы ‘a’.