воскресенье, 11 декабря 2016 г.

Структура програми

Враховуючи те, що для імен можна застосовувати тільки латинські літери, всі назви параметрів подані англійською.
Умовні позначення:
<>— обов'язковий параметр;
[]— не обов'язковий параметр.
Опис директив (макросів):
{$<directive><switch>, <directive><switch>,..}
Місце опису директив (макросів) є довільним. Деякі директиви мають більш, ніж одне значення. Наприклад:
$I <filename.pas> та $I<switch>;
$L<switch> $L<filename.obj>.
Більшість директив має однакову форму запису, але є й вийнятки, на кшталт:
$M <value>, <value>, <value>;
$IFDEF <name>; $ELSE; $INC.
Приклад:
{$A-,B-,D+,E-,F-,G-,I-,L+,N+,O-,P-,Q+,R-,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}
{$I i8042.pas}
var f: File;
begin
 Assign(f, 'file');
 {$I-}
 Reset(f, $200);
 {$I+}
 if IOResult<> 0 then 
  Rewrite(f, $200);
end.
Назва програми (ім'я головного модулю):
program <name>[(input, output)];
Приклад:
{$X+}
program t80c187;

function New: ByteBool;
begin
end;

begin
 t80c187.New;
 New;
end.
Підключення відкомпільованих модулів:
uses <unitNam0>, <unitNam1>,.. ;
Порядок підключення оверлейних модулів інший, та здійснюється за допомогою директиви $O.
Приклад:
uses crt, dos, vbe30;
var
   screen: Text;

begin
 Crt.AssignCrt(screen);
 AssignCrt(screen);
end.
Опис міток:
Мітка— ціле число від 0 до 9999.
label <number0>, <number1>,..;
Приклад:
label 0, 9999;

begin
 0: goto 9999;
 9999: goto 0;
end.
Опис констант:
const <name0>=<value>; <name1>=<value>,.. ;
Опис статичних змінних:
const <name3>:<type>=<value>; <name4>:<type>=<value>,.. ;
Якщо статична змінна описана в процедурі або функції, то після виклику останньої стек для змінної не резервується (місце вже є в самому коді), що дозволяє заощадити час.
Опис нових типів (в тому числі процедурних і функціональних), структур та об'єктів:
 type
   <name_0>= record
   end;
   <name_1>= <type or range>;
   <name_2>= object[(father's name)]
   [private]
   <variables or methods>
   [public]
   <variables or methods>
   end;
Опис змінних:
var <name0>, <name1>,.. : <type or range>;
var <name3>, <name4>,.. : Byte absolute <segment: offset>;
Приклади:
type
    Pointer= record
    case Byte of
     $00: (ofs, seg: Word);
     $01: (fulladdr: LongInt);
    end;

    _RGBA= record
     red, green, blue: Single;
     alpha: Single;
    end;

    _VideoBuffer= array [16*12] of _RGBA;

    _Beer= (BEST, BESTER, MORE);

    _Element= ^_List;

    _List= record
     prev: _Element;
     data: _Beer;
     next: _Element;
    end;

    _SimpleProc= Procedure;
    _ByteFunc= Function: Byte;

    _New= object
    private
     right, bottom: Integer;
     procedure Destroy;(*or destructor..*)
    public
     left, top: Integer;
     width, height: Word;
     procedure Create;(*or constructor..*)
     procedure Free;
    end;

    _Newest= object(_New)
     procedure Create;
     procedure Free;
    end;

const
     CNT= $40;
     svar_0: _Beer= MORE;
     svar_1: Byte= 0;
     svar_0_addr: Pointer= (ofs: Ofs(svar_0); seg: Seg(svar_1));
     svar_1_addr: Pointer= (fulladdr: LongInt(@svar_1));

var
   counter: _Beer;
   temp0, temp1, temp2: 0..Byte('2');
   a: array [0..0] of array [Byte] of Byte;
   b: array (.0..0, Byte.) of Word;(*(.= [    .)= ]*)
   intVar: Word;
   proc: Procedure (const BITS: Byte);
   float10: Extended;
   float4: Single;
   divZeroErrorAddr: LongInt absolute $0000: $0000;
   mode: LongInt absolute $0040: $0049;
   crtMode: LongInt absolute mode;

procedure _New.Create; assembler;
asm
end;

procedure _New.Destroy; assembler;
asm
end;

procedure _New.Free;
begin
end;

procedure _Newest.Create;
begin
 inherited Create;
end;

procedure _Newest.Free;
begin
 inherited Free;
end;

begin
end.
Опис процедур та функцій (конструкторів та деструкторів):
procedure <identifier> [parameters]; [directives]
function <identifier> [parameters]: <type>; [directives]
Приклад:
const
     test: Word= $0001;

var
   procCall: Procedure (var DATA);
   temp: Byte;

procedure SwitchLowBytes(var DATA); far;
begin
 temp:= Byte(Ptr(Seg(DATA), Ofs(DATA)+ 1)^);
 Byte(Ptr(Seg(DATA), Ofs(DATA)+ 1)^):= Byte(Ptr(Seg(DATA), Ofs(DATA))^);
 Byte(Ptr(Seg(DATA), Ofs(DATA))^):= temp;
end;

procedure switch_low_bytes(var data);
type
    _bytes: array [0..1] of Byte;

begin
 temp:= _bytes(data)[0];
 _bytes(data)[0]:= _bytes(data)[1];
 _bytes(data)[1]:= temp;
end;


begin
 procCall:= SwitchLowBytes;
 WriteLn(test);
 procCall(test);
 WriteLn(test);
 switch_low_bytes(test);
 WriteLn(test);
end.
У програмі повинно бути як мінімум два оператори — це begin та end. Після кожного рядка необхідно ставити «;» (це правило не стосується операторів після яких розміщено зарезервоване слово «end», «begin», «else», вбудованого асемблеру тощо).
Кількість зарезервованих слів «begin» та «end» у програмі не обов'язково повинно збігатися.
Наприклад:
begin
 asm
 end;
end.
unit new;
 interface
 implementation
end.
type
    _HBrush= record
    end;
begin
end.
Присвоєння значення відбувається так:
<typed address>:= <typed address>;
<typed address>:= <value>;
Після останнього «end» необхідно поставити крапку «.»


Комментариев нет:

Отправить комментарий