program Stack(input, output);

var global1, global2 :integer;
    p1, p2, p3 : ^integer;

procedure peek(var a, b :integer); external;

procedure stacking;
   var outer :integer;

   function fact(n :integer) :integer;
      var local :integer;
   begin
      local := 99900+n;
      if n<=1 then
      begin peek(outer, local); fact:=1 end
      else fact:=n*fact(n-1)
   end;

begin outer := 1111;
      writeln('fact(3)=', fact(3):1)
end;

begin
   writeln('STACK:'); stacking;
   
   writeln('GLOBALS:'); global1:=1234; global2:=4321; peek(global1, global2);
   
   writeln('HEAP:'); new(p1); new(p2); p1^:= 12345; p2^:=54321;
   new(p3); p3^:=56789; dispose(p2);
   peek(p1^,p3^)
end.
