{ [GRAPHN88.PAS of JUGPDS Vol.11] }

{ Graphic Routines for NEC PC-8801
    by K. Nakazato   Nov. 23, 1984   }

procedure gon;
begin
  port[$31]:=$3B
end;

procedure goff;
begin
  port[$31]:=$37
end;

procedure gcls;
var wsp:integer;
begin
  inline( $F3/ $ED/ $73/ wsp/ $3E/ $5C/ $21/ $00/ $00/
          $31/ $80/ $FE/ $06/ $FA/ $4F/ $ED/ $79/ $E5/
          $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/
          $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/
          $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/ $E5/
          $E5/ $E5/ $E5/ $E5/ $10/ $DE/ $3C/ $FE/ $5F/
          $20/ $D1/ $D3/ $5F/ $ED/ $7B/ wsp/ $FB)
end;


procedure dotset(x,y,c:integer);
begin
  inline( $2A/   y/ $01/ $C8/ $00/ $54/ $5D/ $B7/ $ED/
          $42/ $30/ $F9/ $EB/ $29/ $29/ $29/ $29/ $54/
          $5D/ $29/ $29/ $19/ $11/ $00/ $C0/ $19/ $E5/
          $2A/   x/ $01/ $80/ $02/ $54/ $5D/ $B7/ $ED/
          $42/ $30/ $F9/ $EB/ $7D/ $E6/ $07/ $06/ $80/
          $B7/ $28/ $05/ $CB/ $08/ $3D/ $20/ $FB/ $CB/
          $3C/ $CB/ $1D/ $CB/ $3C/ $CB/ $1D/ $CB/ $3C/
          $CB/ $1D/ $D1/ $19/ $3A/   c/ $57/ $0E/ $5C/
          $F3/ $78/ $ED/ $79/ $CB/ $3A/ $38/ $04/ $2F/
          $A6/ $18/ $01/ $B6/ $77/ $0C/ $79/ $FE/ $5F/
          $20/ $ED/ $ED/ $79/ $FB)
end;

procedure drawline(x1,y1,x2,y2,c:integer);
var dx,dy,accx,accy,x,y:integer; sdx,sdy:boolean;
begin
  dx:=abs(x2-x1); dy:=abs(y2-y1);
  if (dx>0) or (dy>0) then
    while ((dx and $4000)=0) and ((dy and $4000)=0) do
      begin dx:=dx shl 1; dy:=dy shl 1 end;
  accx:=$4000; accy:=accx;
  sdx:=x2>x1; sdy:=y2>y1;
  x:=x1; y:=y1; dotset(x,y,c);
  while (x<>x2) or (y<>y2) do
    begin
      accx:=accx+dx;
      if accx<0 then
        begin
          if sdx then x:=x+1 else x:=x-1;
          accx:=accx and $7FFF
        end;
      accy:=accy+dy;
      if accy<0 then
        begin
          if sdy then y:=y+1 else y:=y-1;
          accy:=accy and $7FFF
        end;
      dotset(x,y,c)
    end
end;

{ turtle }

var x,y,angle,color:integer;

procedure moveto(x1,y1:integer);
begin
  if color>=0 then drawline(x+320,100-y,x1+320,100-y1,color);
  x:=x1; y:=y1
end;

procedure move(dest:integer);
var angle1:real;
begin
  angle1:=angle*pi/180.0;
  moveto(x+round(dest*cos(angle1)),y+round(dest*sin(angle1)))
end;

procedure turnto(i:integer);
begin
  angle:=i mod 360
end;

procedure turn(i:integer);
begin
  turnto(angle+i)
end;

procedure pascolor(i:integer);
begin
  color:=i
end;

procedure cls(g:boolean);
var addr:integer; i,attr:byte;
begin
  if g then begin goff; gcls; gon end else clrscr
end;

procedure initturtle;
begin
  cls(false); cls(true);
  x:=0; y:=0; angle:=0; color:=-1
end;

