%begin
%option "-low"
*TEMP D0-D1/A0-A1
%owninteger failures=0
%routine pass
  printstring(" -- Pass"); newline
%end
%routine fail
  printstring(" -- FAIL"); newline
  failures = failures+1
%end

%routine REG0
%register(d2)%integer r1,r2
  printstring("Basic")
  r2 = 0
  %for r1 = 1,1,10 %cycle
    r2 = r2+r1
  %repeat
  %if r2 = 55 %then pass %else fail
%end

%own%byte%array a(1:10) = 1,2,3,4,5,6,7,8,9,10
%own%short%array aa(1:2) = 100,200

%routine REG1
%register(d2)%integer r1,r2
  printstring("Data registers")
  r1 = 0;  %if r1 = 0 %then pass %else fail
  r1 = r1+1;  %if r1 = 1 %then pass %else fail
  r1 = r1-3; %if r1 = -2 %then pass %else fail
  r1 = -r1; %if r1 = 2 %then pass %else fail
  r1 = \r1; %if r1 = -3 %then pass %else fail
  r1 = r1+r1; %if r1 = -6 %then pass %else fail
  r1 = r1*r1; %if r1 = 36 %then pass %else fail
  r1 = r1//2; %if r1 = 18 %then pass %else fail
  r1 = r1!3; %if r1 = 19 %then pass %else fail
  r1 = r1!!6; %if r1 = 21 %then pass %else fail
  r1 = r1&15; %if r1 = 5 %then pass %else fail
  r1 = 1-r1; %if r1 = -4 %then pass %else fail
  r2 = 2
  r1 = r1+r2; %if r1 = -2 %then pass %else fail
  r1 = r1-r2; %if r1 = -4 %then pass %else fail
  r1 = r2-r1; %if r1 = 6 %then pass %else fail
  r1 = r1*r2; %if r1 = 12 %then pass %else fail
  r1 = r2*r1; %if r1 = 24 %then pass %else fail
  r1 = r2*r2; %if r1 = 4 %then pass %else fail
  r1 = r1&(1-r1); %if r1 = 4 %then pass %else fail
  r1 = r1!32+'0'; %if r1 = 84 %then pass %else fail
  r1 = r1!32+r1; %if r1 = 200 %then pass %else fail
  r1 = r1>>6;  %if r1 = 3 %then pass %else fail
  r1 = a(r1); %if r1 = 3 %then pass %else fail
  r1 = aa(r1-1); %if r1 = 200 %then pass %else fail
%end   {reg1}

%routine REG2
%register(a2)%integer r1,r2
  printstring("Address registers for data")
  r1 = 0;  %if r1 = 0 %then pass %else fail
  r1 = r1+1;  %if r1 = 1 %then pass %else fail
  r1 = r1-3; %if r1 = -2 %then pass %else fail
  r1 = -r1; %if r1 = 2 %then pass %else fail
  r1 = \r1; %if r1 = -3 %then pass %else fail
  r1 = r1+r1; %if r1 = -6 %then pass %else fail
  r1 = r1*r1; %if r1 = 36 %then pass %else fail
  r1 = r1//2; %if r1 = 18 %then pass %else fail
  r1 = r1!3; %if r1 = 19 %then pass %else fail
  r1 = r1!!6; %if r1 = 21 %then pass %else fail
  r1 = r1&15; %if r1 = 5 %then pass %else fail
  r1 = 1-r1; %if r1 = -4 %then pass %else fail
  r2 = 2
  r1 = r1+r2; %if r1 = -2 %then pass %else fail
  r1 = r1-r2; %if r1 = -4 %then pass %else fail
  r1 = r2-r1; %if r1 = 6 %then pass %else fail
  r1 = r1*r2; %if r1 = 12 %then pass %else fail
  r1 = r2*r1; %if r1 = 24 %then pass %else fail
  r1 = r2*r2; %if r1 = 4 %then pass %else fail
  r1 = r1&(1-r1); %if r1 = 4 %then pass %else fail
  r1 = r1!32+'0'; %if r1 = 84 %then pass %else fail
  r1 = r1!32+r1; %if r1 = 200 %then pass %else fail
  r1 = r1>>6;  %if r1 = 3 %then pass %else fail
  r1 = a(r1); %if r1 = 3 %then pass %else fail
  r1 = aa(r1-1); %if r1 = 200 %then pass %else fail
%end   {reg2}

%routine REG3
%register(a2)%byte%name bn
%register(a3)%short%name sn
  printstring("Name assignment & modification")
  bn == a(4)
  %if bn = 4 %then pass %else fail
  bn == bn[1]
  %if bn = 5 %then pass %else fail
  bn == bn[bn]
  %if bn = 10 %then pass %else fail
  sn == aa(2)
  %if sn = 200 %then pass %else fail
  sn == sn[-1]
  %if sn = 100 %then pass %else fail
%end             {reg3}

  open output(1,"JOURNAL")
  reg0
  reg1
  reg2
  reg3
  select output(0)
  write(failures,1);  printstring(" failure(s)")
  newline
%end
