logo search
TurboProlog / Документация / TOM_1

Примеры:

1) Предложение set_mode использует membyte для получения информации

из 449 байта памяти (он содержит информацию о текущем состоянии дисплея).

Кроме того, set_mode использует memword для получения информации из байта

463, содержащего адрес текущего адаптера дисплея.

Затем, предикат выводит полученные величины, запрашивает пользовате-

ля о новом состоянии дисплея (от 0 до 7) и использует предикат port_byte

для установки нового состояния дисплея (в предположении, что введенная

величина имеет смысл для используемого адаптера).

set_mode:-

membyte(S0000,S0449,X),

memword(S0000,S0463,PortAddress),

write("Current mode setting is:",X), nl,

write("Enter new mode (0-7):"),

readint(NewMode),

NewMode <=7,

port_byte(PortAddress, NewMode).

2) Программа CH16EX04.PRO использует стандартные предикаты bios и

ptr_word для определения 4 предикатов:

dosver - возвращает номер версии ДОС,

diskspase - возвращает общий объем памяти и объем сворбодной

памяти на диске. Диск определяется номером:

0 - диск по умолчанию;

1 - диск А;

2 - диск В; и т.д.

makedir - создает подкаталог,

removedir - удаляет подкаталог.

Эта программа приведена ниже:

/*Program CH16TX04.PRO*/

predicates

dosver(real)

diskspace(real,real,real)

makedir(string)

removedir(string)

clauses

dosver(Version):-AX= 48*256

bios(33,reg(AX,0,0,0,0,0,0,0), reg(VV,-,-,-,-,-,-,-)),

/* Вы должны использовать 16-ричное представляение,

bios(S21...) вместо bios(33...)*/

L=VV/256, H=VV-256*L, Version=H+L/100

diskspace(Disk,TotalSpace,FreeSpace):-

AAX=54*256,

bios(33, reg(FFX,0,0,DISK,0,0,0,0),

reg(AX,BX,CX,DX,-,-,-,-)),

FreeSpace = 1.0*BX*CX*AX, TotalSpase = 1.0*DX*CX*AX.

makedir(Name): -

ptr_dword(Name,DS,DX),

AX=256*57,

bios(33, reg(AX,0,0,DX,0,0,DS,0),-).

removedir(Name): -

ptr_dword(Name,DS,DX), AX=256*58,

bios(33,reg(AX,0,0,DX,0,0,DS,0),-).

Задайте программе CH16EX04.PRO следующие цели:

dosver(DosVersionNumber). /*goal 1 */

diskspace(DriveNumber, TotalSpace, RemainingSpace)

/*goal 2 */

makedir("testdir"), /*goal 3 */

readchar(-), system("dir"), removedir("testdir"),

readchar(-),

system("dir").

Обзор

Ниже приведены основные темы, затронутые в этой главе.

1) Турбо Пролог включает несколько предикатов, которые:

а)осуществляют доступ к ДОС;.

б)выполняют битовые логические операции и операции сдвига;

в)обеспечивают поддержку низкого уровня для манипулирования

BIOS, памятью, другими элементами аппаратуры.

2) Следующие предикаты дают доступ к ДОС:

а)system (возможность обращения к любой команде ДОС);

б)time (установка или чтение показаний встроенных часов);

в)date (доступ к встроенному календарю);

г)envsimbol (доступ к таблице идентификаторов ДОС);

д)comline (чтение аргументов командной строки ДОС);

3) Предикаты, выполняющие побитовые операции:

а)bitor (логическое OR);

б)bitand (логическое И);

в)bitnot (логическое НЕ);

г)bitxor (логическое исключающее ИЛИ);

д)bitleft (сдвиг влево);

е)bitright (сдвиг вправо).

4) Предикаты, обеспечивающие поддержку связи с элементами аппара-

туры:

а)bios (доступ к процедурам BIOS);

б)ptr_dword (возврат адреса аргумента или помещение аргумента

в заданное место памяти);

в)memword (выбирает или помещает двухбайтную величину);

г)membyte (выбирает или помещает однобайтную величину);

д)port_byte (ввод/вывод байта в буфер ввода/вывода).