const
cxmax=100;
(* opcodes *)
lit=1; opr=2; lod=3; sto=4;
int=6; jmp=7;
(* opr arguments *)
neg=1; add=2; sub=3; mul=4;
divis=5; ret=0;
var
codefct: array [cxmax] of integer ;
codea: array [cxmax] of integer ;
procedure interpret;
const stacksize=200;
var
 p,b,t: integer ;
 ifct, ia: integer ;
 s: array [stacksize] of integer ;
begin
 writeln ("start pl/0");
 t:=0; b:=1; p:=0;
 s[0]:=0;
 s[1]:=0; s[2]:=0; s[3]:=0;
 repeat
  ifct:=codefct[p];
  ia:=codea[p];
  p:=p + 1;
  case ifct of
   lit:
    begin
     t:=t + 1;
     s[t]:=ia;
    end ;
   opr:
    case ia of (* operator *)
     ret:
      begin
       t:=b - 1;
       p:=s[t + 3];
       b:=s[t + 2];
      end ;
     neg:
      s[t]:=- s[t];
     add:
      begin
       t:=t - 1;
       s[t]:=s[t] + s[t + 1];
      end ;
     sub:
      begin
       t:=t - 1;
       s[t]:=s[t] - s[t + 1];
      end ;
     mul:
      begin
       t:=t - 1;
       s[t]:=s[t] * s[t + 1];
      end ;
     divis:
      begin
       t:=t - 1;
       s[t]:=s[t] div s[t + 1];
      end
    end ; (* end case ia of *)
   lod:
    begin
     t:=t + 1;
     s[t] := s[1 + ia];
    end ;
   sto:
    begin
     s[1 + ia] := s[t];
     writeln ("> ",s[t]);
     t:=t - 1;
    end ;
   int:
    t:=t + ia;
   jmp:
    p:=ia
  end ;
 until p=0;
 writeln ("end pl/0")
end ;
begin
codefct[0]:=jmp; codea[0]:=1;
codefct[1]:=int; codea[1]:=5;
codefct[2]:=lit; codea[2]:=3;
codefct[3]:=sto; codea[3]:=3;
codefct[4]:=lit; codea[4]:=3;
codefct[5]:=sto; codea[5]:=4;
codefct[6]:=lit; codea[6]:=5;
codefct[7]:=lit; codea[7]:=2;
codefct[8]:=lod; codea[8]:=3;
codefct[9]:=opr; codea[9]:=add;
codefct[10]:=lit; codea[10]:=4;
codefct[11]:=opr; codea[11]:=mul;
codefct[12]:=opr; codea[12]:=add;
codefct[13]:=sto; codea[13]:=3;
codefct[14]:=lit; codea[14]:=4;
codefct[15]:=lit; codea[15]:=2;
codefct[16]:=lod; codea[16]:=3;
codefct[17]:=opr; codea[17]:=add;
codefct[18]:=opr; codea[18]:=mul;
codefct[19]:=lit; codea[19]:=5;
codefct[20]:=opr; codea[20]:=add;
codefct[21]:=sto; codea[21]:=3;
codefct[22]:=lod; codea[22]:=3;
codefct[23]:=lod; codea[23]:=4;
codefct[24]:=opr; codea[24]:=sub;
codefct[25]:=sto; codea[25]:=4;
codefct[26]:=opr; codea[26]:=ret;
interpret;
end .