%constant %integer metal = blue, poly = red, diff = green

%routine pline (%string(255) s)
   printstring (s);newline
%end

!------------------------------------------------------------------------
%external %integer xlat=13,ybat=0
%external %integer overflow = 0
%external %integer scxl=65,scxr=141,scyb=70,scyt=137
!
%externalintegerfn to screen x(%integer i)
  %result = (i-scxl+xlat)*8
%end
!------------------------------------------------------------------------
%externalintegerfn to screen y(%integer i)
  %result = (i-scyb+ybat)*8
%end
!------------------------------------------------------------------------
%externalintegerfn from screen x(%integer i)
  %integer j
  j =  (i//8)+scxl-xlat
  %if j < 0 %then overflow = 1 %and %result = 0
  %if j > xr lim %then overflow = 1 %and %result = xrlim
  %result = j
%end
!------------------------------------------------------------------------
%externalintegerfn from screen y(%integer i)
  %integer j
  j = (i//8)+scyb-ybat
  %if j < 0 %then overflow = 1 %and %result = 0
  %if j > yt lim %then overflow = 1 %and %result = yt lim
  %result = j
%end
!---------------------------------------------------------------------------
%externalintegerfn to x lambda (%integer pixel)
  %result = pixel //8
%end
!------------------------------------------------------------------------
%externalintegerfn to y lambda (%integer pixel)
   %result = pixel //8
%end
!------------------------------------------------------------------------
%externalintegerfn to x pixel(%integer x lambda)
   %result = 0 %if x lambda  < 0
   %result =  x lambda *8 
%end
!------------------------------------------------------------------------
%externalintegerfn to y pixel(%integer y lambda)
   %result = 0 %if y lambda < 0
   %result =  y lambda *8 
%end
!------------------------------------------------------------------------
%externalroutine flash screen
  %integer i
  offset(0,512)
  %for i = 1,1,3*6500 %cycle
  %repeat
  offset(0,0)
%end
!------------------------------------------------------------------------
%external %routine draw contact (%integer type,x,y)
  %routine box(%integer i,j,k,l)
    line(i,j,i,l)
    line(i,l,k,l)
    line(k,l,k,j)
    line(k,j,i,j)
  %end
 
  %integer i,j,k,l,ii,jj,kk,ll
  %switch contype(0:12)

!  printstring ("in draw contact");newline
  %return %if x >scxr %or y >scyt
  %return %if x <scxl %or y <scyb
  x = x -scxl+xlat;y = y - scyb + ybat
  -> contype(type)
  contype(0):         {PM}
    i = x - 2; j = y - 2; k = x + 2; l = y + 2
    enable  (15)
    colour(poly ! metal)
    fill(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-1)
    colour(white)
    box(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-1)
    colour(black)
    i = i + 1; j = j + 1; k = k - 1; l = l - 1
    fill(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-1)
    %return
  contype(1):         { DM }
    i = x - 2; j = y - 2; k = x + 2; l = y + 2
    enable  (15)
    colour(diff ! metal )
    fill(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-1)
    colour(white)
    box(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-1)
    colour(black)
    i = i + 1; j = j + 1; k = k - 1; l = l - 1
    fill(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-1)
    %return
  contype(2):         { PDBN }
    i = x - 2; j = y - 2; k = x + 2; l = y + 3
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    enable  (15)
    colour(white)
    box(ii,jj,kk,ll)
    enable  (poly)
    colour(poly)
    j = j + 1; l = y + 1
    fill(ii+1,toypixel(j),kk-1,toypixel(l)-1)
    enable  (diff)
    colour(diff)
    i = i + 1; j = y - 2; k = x + 1; l = y + 3
    fill(toxpixel(i),toypixel(j)+1,toxpixel(k)-1,toypixel(l)-2)
    enable  (15)
    %return
  contype(3):       { PDBE }
    enable  (15)
    colour(white)
    i = x - 2; j = y - 2; k = x + 3; l = y + 2
    ii = toxpixel(i);jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (diff)
    colour(diff)
    j = j + 1; l = l - 1
    fill(ii,toypixel(j),kk,toypixel(l)-1)
    i = i + 1; j = y - 2; k = x + 1; l = y + 2
    enable  (poly)
    colour(poly)
    fill(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-1)
    %return
  contype(4):        { PDBS }
    i = x - 2; j = y - 3; k = x + 2; l = y + 2
    enable  (15)
    colour(white)
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (poly)
    colour(poly)
    j = j + 2; l = y + 1
    fill(ii+1,toypixel(j),kk-1,toypixel(l)-1)
    enable  (diff)
    colour(diff)
    i = i + 1; j = y - 3; k = x + 1; l = y + 2
    fill(toxpixel(i),toypixel(j)+1,toxpixel(k)-1,toypixel(l)-2)
    %return
  contype(5):        { PDBW }
    enable  (15)
    colour(white)
    i = x - 3; j = y - 2; k = x + 2; l = y + 2
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (diff)
    colour(diff)
    j = j + 1; l = l - 1
    fill(ii,toypixel(j),kk-1,toypixel(l)-1)
    i = i + 2; j = y - 2; k = x + 1; l = y + 2
    enable  (poly)
    colour(poly)
    fill(toxpixel(i),toypixel(j)+1,toxpixel(k)-1,toypixel(l)-2)
    %return
  contype(6):        { PDBNS }
    i = x - 2; j = y - 3; k = x + 2; l = y + 3
    enable  (15)
    colour(white)
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (poly)
    colour(poly)
    j = y - 1; l = y + 1
    fill(ii+1,toypixel(j),kk-1,toypixel(l)-1)
    enable  (diff)
    colour(diff)
    i = i + 1; j = y - 3; k = x + 1; l = y + 3
    fill(toxpixel(i),toypixel(j)+1,toxpixel(k)-1,toypixel(l)-2)
    %return
  contype(7):       { PDBEW }
    enable  (15)
    colour(white)
    i = x - 3; j = y - 2; k = x + 3; l = y + 2
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (diff)
    colour(diff)
    j = j + 1; l = l - 1
    fill(ii+1,toypixel(j),kk-1,toypixel(l)-1)
    i = i + 2; j = y - 2; k = x + 1; l = y + 2
    enable  (poly)
    colour(poly)
    fill(toxpixel(i),toypixel(j)+1,toxpixel(k)-1,toypixel(l)-2)
    %return
  contype(8):     { PDCN }
    enable  (15)
    colour (white)
    i = x - 2; j = y - 2; k = x + 2; l = y + 3
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (poly)
    colour(poly)
    fill(ii+1,jj+1,kk-1,toypixel(l-2))
    enable  (diff)
    colour( diff )
    i = x - 1; j = y - 1; k = x + 1
    fill(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-2)
    %return
  contype(9):     { PDCE }
    enable  (15)
    colour (white)
    i = x - 2; j = y - 2; k = x + 3; l = y + 2
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (poly)
    colour(poly)
    fill(ii+1,jj+1,toxpixel(k-2)-1,ll)
    enable  (diff)
    colour(diff)
    i = x - 1; j = y - 1; k = x + 3; l = y + 1
    fill(toxpixel(i),toypixel(j),toxpixel(k)-2,toypixel(l)-1)
    %return
  contype(10):    { PDCS }
    enable  (15)
    colour (white)
    i = x - 2; j = y - 3; k = x + 2; l = y + 2
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (poly)
    colour(poly)
    fill(ii+1,toypixel(y - 1),kk-1,ll-1)
    enable  (diff)
    colour( diff )
    i = x - 1; j = y - 3; k = x + 1; l = y +1
    fill(toxpixel(i),toypixel(j)+1,toxpixel(k)-1,toypixel(l)-1)
    %return
  contype(11):    { PDCW }
    enable  (15)
    colour (white)
    i = x - 3; j = y - 2; k = x + 2; l = y + 2
    ii = toxpixel(i); jj = toypixel(j);kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
    enable  (poly)
    colour(poly)
    fill(toxpixel(i+2),jj+1,kk-1,ll-1)
    enable  (diff)
    colour(diff)
    i = x - 3;j = y - 1; k = x + 1;l = y + 1
    fill(toxpixel(i),toypixel(j),toxpixel(k)-1,toypixel(l)-1)
    %return
  contype(12):   { B C }
    i = x - 2; j = y - 2; k = x + 2; l = y + 2
    enable  (15)
    colour(white)
    ii = toxpixel(i); jj = toypixel(j); kk = toxpixel(k)-1; ll = toypixel(l)-1
    box(ii,jj,kk,ll)
!    %return
%end
!------------------------------------------------------------------------
%endoffile
