14.2. Доступ к памяти ПЭВМ. Массивы Mem, MemW, MemL
Для простого доступа к любой физической ячейке памяти Турбо Паскаль вводит три предопределенных массива: Mem, MemW, MemL. Они как бы наложены на всю память ПЭВМ. Можно условно считать, что эти массивы известны по системному определению:
VAR
Mem : Array of Byte absolute 0:0;
MemW : Array of Word absolute 0:0;
MemL : Array of Longlnt absolute 0:0;
- 298 -
Но отличие их от обычных массивов — в задании индексов. Они должны задаваться не номером, а адресом интересующей нас ячейки памяти в формате СЕГМЕНТ:СМЕЩЕНИЕ. Так,
Mem [$B000:$0000] — значение байта (Byte) по данному адресу;
MemW[$B000:$0000] — значение слова (Word) по данному адресу;
MemL[$B000:$0000] — значение двойного слова (LongInt).
Во всем остальном массивы Mem очень похожи на обычные массивы. Если Mem [] стоит справа в операторе присваивания, то это — значение байта (слова, двойного слова), начинающегося с данного индекса-адреса. Но Mem[] может стоять и слева. Это будет означать модификацию байта (слова или двойного слова) по данному адресу, например:
Mem[ $50 : 0 ] := Mem [ $50: 0 ] xor 1;
{ вкл/выкл реакции на Shift+PrtScr }
Элементы массивов Mem могут подставляться как фактические параметры при вызовах процедур и функций. Наиболее часто массивы Mem, MemW и MemL используются для доступа к системным областям памяти, как в примере на рис. 14.3.
| PROGRAM Devices; { Анализ байта конфигурации }
| VAR
| CFG : Word; { сюда запишется значение ячейки памяти }
| BEGIN
| CFG := MemW[ $0000:$0410 ];
| WriteLn( #10, 'Текущая конфигурация:', #10 );
| WriteLn('Макс. число принтеров -->', CFG shr 14 );
| WriteLn('Число серийных портов -->', (CFG shr 9) and 7);
| WriteLn('Число НГМД --> ',
| ( CFG and 1 )*( 1 + ( CFG shr 6 ) and 3 ) );
| WriteLn('Наличие игрового порта-—>',(CFG and 4096)=1);
| WriteLn;
| ReadLn
| END.
Рис. 14.3