%begin
   %include "level1:graphinc.imp"
   %recordformat bf(%integer xl, xr, y)
   %recordformat pf(%integer x,y)
   %record(bf) t, b
   %integer i

%routine pcircle(%integer x, y, r, p)
   %integer d, e, s, da, db, dda, ddb, oda, odb, odda, oddb,
          ddax, ddbx, oddax, oddbx
   e = 1
   s = 0
   %while e<r %cycle
      e = e<<1
      s = s+1
   %repeat
   da = r<<s
   dda = r
   ddax = (r*p)>>2
   db = 0
   ddb = 0
   ddbx = 0
   %cycle
      odda = dda
      oddb = ddb
      oddax = ddax
      oddbx = ddbx
      %cycle
         odb = db
         db = db+(da>>s)
         da = da-(odb>>s)
         dda = da>>s
      %repeat %until odda#dda
      ddb = db>>s
      ddax = (da*p)>>(s+2)
      ddbx = (db*p)>>(s+2)
      hline(x-ddbx,x+ddbx,y+odda)
      fill(x-oddax,y+oddb,x+oddax,y+ddb)
      fill(x-oddax,y-oddb,x+oddax,y-ddb)
      hline(x-ddbx,x+ddbx,y-odda)
   %repeat %until da<odb
%end
%constant %integer back = black
%integer cx = 344
%routine road
   %own %integer lp=0, lp1=0, cy = 256, cy1 = 768
   %own %integer p = 0, q = 4, c1 = yellow, c2 = red, dir = -1
   %integer by, ty, i, ti
   %for cy = 256, 512, 768 %cycle
      colour(green)
      fill(0, cy-256, 688, cy)
      colour(blue)
      fill(0, cy, 688, cy+255)
      %for i = cy, 2, cy+32 %cycle
         colour(c1)
         fill(cx+36, i, cx+39, i+2)
         by = c1
         c1 = by
      %repeat
      colour(black)
      t_xl =  cx-36
      t_xr = cx+36
      t_y = cy
      b_xl = 36
      b_xr = 688-36
      b_y = cy-256
      trapeze(b_xl, b_xr, b_y, t_xl, t_xr, t_y)
   %repeat
   cy = 256
   %cycle
      offset(0, 256-cy)
      ti = cputime+20
      %while cputime<ti %cycle; %repeat
      colour(blue)
      fill(cx+38-lp1*14,cy1+32,cx+38+lp1*14,cy1+144)
      lp1 = lp
      lp = cy1
      cy1 = cy
      cy = lp
      lp = q
      colour(c1)
      cx = cx+38
      cy = cy+32
      %if q=0 %start
         fill(cx+1, cy, cx+3, cy+112)
         colour(c2)
         fill(cx-2, cy, cx, cy+112)
         %for ty = 0, 1, 1000 %cycle
         %repeat
      %finish %else %start
         pcircle(cx, cy+56, 56, q)
         colour(c2)
         pcircle(cx-10*q, cy+56, 12, q)
         fill(cx-9*q, cy+44, cx-7*q, cy+56)
         fill(cx-5*q, cy+28, cx-3*q, cy+56)
         pcircle(cx-2*q, cy+56, 12, q)
         fill(cx+3*q, cy+44, cx+5*q, cy+56)
         pcircle(cx+6*q, cy+56, 12, q)
         fill(cx+7*q, cy+44, cx+9*q, cy+56)
         pcircle(cx+10*q, cy+56, 12, q)
         fill(cx+11*q, cy+44, cx+13*q, cy+56)
         colour(c1)
         pcircle(cx-10*q, cy+56, 4, q)
         pcircle(cx-2*q, cy+56, 4, q)
         fill(cx+5*q, cy+44, cx+7*q, cy+56)
         pcircle(cx+6*q, cy+56, 4, q)
         fill(cx+9*q, cy+44, cx+11*q, cy+56)
         pcircle(cx+10*q, cy+56, 4, q)
      %finish
      cy = cy-32
      cx = cx-38
      q = q+dir
      %if q<0 %start
        q = c1
        c1 = c2
        c2 = q
        dir = 1
        q = 1
      %finish %else %if q>4 %start
        dir = -1
        q = 3
      %finish
      colour(black)
      fill(cx-36, cy-256, cx+36, cy-1)
      colour(white)
      ty = cy-256-p
      %cycle
          by = ty+(cy-ty)//10
          %if by=ty %start
             b_y = ty
             b_xl = cx-(cy-ty)>>3
             b_xr = cx+(cy-ty)>>3
             t_y = cy
             t_xl = cx
             t_xr = cx
             trapeze(b_xl, b_xr, b_y, t_xl, t_xr, t_y)
             %exit
          %finish
          ty = by+(cy-ty)//10+1
          %exit %if by>cy
          %if ty>cy %start
             t_y = cy
          %finish %else %if ty<=cy-256 %start
             p = 0
             %continue
          %else
             t_y = ty
          %finish
          %if by>=cy %start
             %exit
          %finish %else %if by<cy-256 %start
             b_y = cy-256
          %else
             b_y = by
          %finish
          b_xl = cx-(cy-b_y)>>3
          b_xr = cx+(cy-b_y)>>3
          t_xl = cx-(cy-t_y)>>3
          t_xr = cx+(cy-t_y)>>3
          trapeze(b_xl, b_xr, b_y, t_xl, t_xr, t_y)
      %repeat
      p = p+7
   %repeat
%end
%integer p

clear
colour map(black) = 3<<10+3<<5+3
colour map(green) = 11<<5+3
colour map(blue) = 31<<10+23<<5
%cycle
   road
%repeat
%end %of %program
