{Graficky unit}
{R. Novotny}

unit grafika;

interface

uses crt, dos;
{dos: Registers etc.}

type TPoint = record
  x:integer;
  y:integer;
end;

type TPointH = record
  x:integer;
  y:integer;
  h:integer;
end;

var mem:array [0..$7FFF] of byte absolute $A000:0000;

procedure init(mode:byte);
procedure usecka_b(x1, y1, x2, y2: integer; farba: byte);
procedure bod_pc(x,y:integer; farba:byte);
function farbabodu_pc(x,y:integer):byte;
procedure PointToPointH(pt:TPoint; var pth:TPointH);
procedure PointHToPoint(pth:TPointH; var pt:TPoint);

implementation

procedure init(mode:byte);
begin
     asm
     mov ah,0;
     mov al,mode;
     int $10;
     end;
end;

{
procedure bod_pc(x,y:integer; farba: byte);
 //only 13h mode!
begin
  mem[320*y+x]:=farba;
end;
}

function farbabodu_pc(x,y:integer):byte;
begin
  farbabodu_pc:=mem[320*y+x];
end;

procedure usecka_b(x1, y1, x2, y2: integer; farba: byte);
var i,dx,dy,pixelov,d,dp1,dp2,x,posunx1,posunx2,y,posuny1,posuny2: integer;
begin
  dx:=abs(x2-x1);
  dy:=abs(y2-y1);
  {uhol <= 45}
  if dx>=dy then begin
    pixelov:=dx+1;
    d:=(2*dy)-dx;
    dp1:=dy*2;
    dp2:=(dy-dx)*2;
    posunx1:=1;
    posunx2:=1;
    posuny1:=0;
    posuny2:=1;
  end
  {uhol > 45}
  else begin
    pixelov:=dy+1;
    d:=(2*dx)-dy;
    dp1:=dx*2;
    dp2:=(dx-dy)*2;
    posunx1:=0;
    posunx2:=1;
    posuny1:=1;
    posuny2:=1;
  end;
  {druhy bod je viac vpravo ako prvy bod, otacame suradnice}
  if x1 > x2 then begin
    posunx1:= -posunx1;
    posunx2:= -posunx2;
  end;
  {prvy bod je vyssie ako druhy bod, otacame suradnice}
  if y1 > y2 then begin
    posuny1:= -posuny1;
    posuny2:= -posuny2;
  end;
  {kreslime}
  x:=x1;
  y:=y1;
  for i:=1 to pixelov do begin
    bod_pc(x, y, farba);
    if d < 0 then begin
      d:=d+dp1;
      x:=x+posunx1;
      y:=y+posuny1;
    end
    else begin
      d:=d+dp2;
      x:=x+posunx2;
      y:=y+posuny2;
    end;
  end;
end;

procedure bod_pc(x,y:integer; farba:byte);
Var Reg: Registers;
begin
  Reg.AH := $0C; {service no}
  Reg.AL := farba; {pt color}
  Reg.BH := $0; {display page no (ignored in 12h}
  Reg.CX := x; {x-coord}
  Reg.DX := y; {y-coord}
  Intr($10, Reg); {call interrupt}
end;

{-----------------------------------------------------------}

procedure PointToPointH(pt:TPoint; var pth:TPointH);
begin
  pth.x:=pt.x;
  pth.y:=pt.y;
  pth.h:=1;
end;

procedure PointHToPoint(pth:TPointH; var pt:TPoint);
  var xx,yy,hh:real;
begin
  xx:=pth.x;
  yy:=pth.y;
  hh:=pth.h;

  pt.x:=Trunc(xx / hh);
  pt.y:=Trunc(yy / hh);
end;

end.