Ада-95. Компилятор GNAT

       

Организация доступа к индивидуальным битам


Организацию доступа к индивидуальным битам можно рассмотреть на примере операционной системы MS-DOS, в которой фиксированный адрес памяти 16#0417# содержит состояние установок клавиатуры.

Вид физического представления этого байта следующий:



7 6 5 4 3 2 1 0
Insert Caps
Lock
Num
Lock
Scroll
Lock
       

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

with Ada.Text_IO; use Ada.Text_IO; with System.Storage_Elements; use System.Storage_Elements;

procedure Keyboard_Status_Demo is

Keyboard_Address : constant Address := To_Address (16#0417#);

type Status is (Not_Active, Active); for Status use (Not_Active => 0, Active => 1); for Status'Size use 1;

type Keyboard_Status is

record

Scroll_Lock : Status; -- состояние Scroll Lock Num_Lock : Status; -- состояние Num Lock Caps_Lock : Status; -- состояние Caps Lock Insert : Status; -- состояние Insert end record; for Keyboard_Status use

record

Scroll_Lock at 0 range 4..4; -- бит 4 Num_Lock at 0 range 5..5; -- бит 5 Caps_Lock at 0 range 6..6; -- бит 6 Insert at 0 range 7..7; -- бит 7 end record;

Keyboard_Status_Byte : Keyboard_Status; for Keyboard_Status_Byte'Address use Keyboard_Address;

begin

if Keyboard_Status_Byte.Insert = Active then

Put_Line("Insert mode ON"); else

Put_Line("Insert mode OFF"); end if;

if Keyboard_Status_Byte.Caps_Lock = Active then

Put_Line("Caps Lock mode ON"); else

Put_Line("Caps Lock mode OFF"); end if;

if Keyboard_Status_Byte.Num_Lock = Active then

Put_Line("Num Lock mode ON"); else

Put_Line("Num Lock mode OFF"); end if;

if Keyboard_Status_Byte.Scroll_Lock = Active then

Put_Line("Scroll Lock mode ON"); else

Put_Line("Scroll Lock mode OFF"); end if;

end Keyboard_Status_Demo;

В данном примере, тип Status описан так, чтобы значения этого типа занимали ровно один бит.

Далее, с используя тип Status, описывается тип записи Keyboard_Status, внутреннее представление которой соответствует физической структуре байта состояния клавиатуры.

Следует заметить, что спецификатор "Scroll_Lock at 0 range 4 .. 4" указывает, что объект Scroll_Lock должен быть размещен по нулевому смещению в четвертой битовой позиции записи Keyboard_Status

(отсчет ведется в битах от начала записи).

Copyright (C) А.Гавва V-0.4w май 2004



Содержание раздела