program Memory_Top;                             (*Program umoznuje pouzit az X*64kB pre seba*)

{$M $4000,$0000,$9FFFF}

{$N-,E-,G-,A+,R-,S-,D+}

{$IFDEF WINDOWS}
Uses WinDos,WinCrt,NPU_387,Utility;
{$ELSE}
Uses Dos,Crt,NPU_387,Utility;
{$ENDIF}

type  Screen     = array [0..25,0..80] of word;

var   Old_Screen : Screen absolute $B800:$0000;
      New_Screen : Screen;
      Ext_Screen : ^Screen;

const MaxMemory  : word = $FFFF;             (*Maximalne mnozstvo pamati k alokacii*)

procedure Pouzi_Memory;
var i    : word;
    Data : byte;
begin
     for i:=0 to MaxMemory do
         begin
              Write_Ram(i,Random(255)); (*Zapisuj do memory*)
              Data:=Read_Ram(i);        (*Citaj z memory*)
         end;
end;

procedure Init;
begin
     if MemAvail<(SizeOf(Screen)) then begin WriteLn('Not enough memory ...'); Halt(0); end;
     GetMem(Ext_Screen,SizeOf(Screen));
     FreeMem(Ext_Screen,SizeOf(Screen));
end;

begin
     ClrScr;
     HighVideo;
     ClrScr;
     WriteLn('Free memory : ',MemAvail/1024:3:1,' kBytes');
     if MemAvail<(100*1024) then begin WriteLn('Not enough memory ...'); Halt(0); end;
     GetMem(ExtRam,MaxMemory);          (*Alokuj pamat pre seba*)
     Pouzi_Memory;                      (*Teraz tu pamat mozeme pouzivat pre seba*)
     FreeMem(ExtRam,MaxMemory);         (*Uvolni pamat pre inych uzivatelov*)
     Init;
end.