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