program Example1_CrtWin;

uses
  Crt,
  Kernel,
  CrtWin;

const
  {pocet procesu pro vypis na obrazovku}
  MaxProc1 = 3;
  {rozmery procesu pro vypis na obrazovku}
  Rect1 : array[1..MaxProc1] of TRect =
    ((X:  2; Y:  3; W: 38; H:  9),
     (X: 42; Y:  3; W: 38; H:  9),
     (X:  2; Y: 14; W: 38; H:  9));
  {rozmery procesu pro cteni klavesnice}
  Rect2 : TRect = (X: 42; Y: 14; W: 38; H:  9);

const
  FlEnd : Boolean=false;

{$F+} { proces výpisu na obrazovku }
procedure P1(Rect: TRect; const S: String);
{$F-}
var
  Win : PCrtWin;
  i   : Word;
begin
  Start('Proc1',8000,90,254);Exit;
  { vytvoření okna }
  Win:=New(PCrtWin,Init(Rect,S,FrameD,LightGray,LightGray,LightGray,$20,0));
  repeat
    Win^.LockWin;   { získání práva přístupu na obrazovku }
    WriteLn(i);     { výpis na obrazovku }
    Win^.UnLockWin; { ukončení práva přístupu na obrazovku }

    {$R-}
    Inc(i);
    {$R+}
    Wait(2);
  until FlEnd;
end;

{$F+} { proces vstupu z klávesnice }
procedure P2(Rect: TRect; const S: String);
{$F-}
var
  Win : PCrtWin;
  Key : char;
begin
  Start('Proc2',8000,90,254);Exit;
  { vytvoření okna }
  Win:=New(PCrtWin,Init(Rect,S,FrameS,LightGray,LightGray,LightGray,{ $20,0}1,8));
  Win^.LockWin;     { získání práva přístupu na obrazovku }
  Write('Press any keys: '); { výpis na obrazovku }
  Win^.UnLockWin;   { ukončení práva přístupu na obrazovku }
  repeat
    Win^.LockWin;     { získání práva přístupu na obrazovku }
    if keypressed then      { vstup z klávesnice }
    begin
      Key:=Readkey;
      if Key in [' '..#255] then write(Key);
      FlEnd:=Key=#$1B{ukonceni na klavesu Esc};
    end;
    Wait(1);
    Win^.UnLockWin;   { ukončení práva přístupu na obrazovku }
  until FlEnd;
end;

var
  i : Byte;
begin
 {nastaveni videorezimu}
  TextMode(CO80);

 {inicializace o.s.Retos}
  StartMain(250,254);
  InitInterruptStack(1,8000);
  StartTimeSlicing($8);

 {inicializace vypisovych oken}
  CrtInit;
  MainWin^.HiddenCursor; {skryti kurzoru}
  MainWin^.LockWin;
  write('Example of CrtWin by SofCon');
  gotoxy(1,Hi(WindMax)+1); {jdi na posledni radek}
  write('Help: Press <Esc> for Exit');
  MainWin^.UnLockWin;

  for i:=1 to MaxProc1 do
    P1(Rect1[i],' Process 1 '); { spuštění procesu P1 }

  P2(Rect2,' Process 2 '); { spuštění procesu P2 }

  SetPriority(10,254); {nastaveni priority hlavniho procesu}

  repeat
    {telo hlavniho procesu}
  until FlEnd;

 {ukonceni o.s.Retos}
  Abort('*');
  TerminateMain;
end.
