{$G+}
unit motor;

interface

type
    page = array[0..63999] of byte;
    ppage = ^page;

procedure init;
procedure done;
procedure putpixel(x, y, c : integer);
procedure clearscreen;
procedure copy;
function getmaxx : integer;
function getmaxy : integer;
procedure setpal(i, r, g, b: byte);
function getbuf: ppage;


implementation

uses dos;

var
   vmem : page absolute $a000:0000;
   buf : ppage;

procedure init;
var regs: registers;
begin
     getmem(buf, 64000);
     regs.ax := $13;
     Intr($10, regs);
end;

procedure done;
var regs: registers;
begin
     freemem(buf, 64000);
     regs.ax := $10;
     Intr($10, regs);
end;

procedure setpal(i, r, g, b: byte);
begin
     Port[$03c8]:=i;
     Port[$03c9]:=r shr 2;
     Port[$03c9]:=g shr 2;
     Port[$03c9]:=b shr 2;
end;

procedure putpixel(x, y, c : integer);
begin
     if (x < 0) or (x > 319) then exit;
     if (y < 0) or (y > 199) then exit;
     buf^[(320 * y) + x] := c;
end;

procedure clearscreen;
begin
     fillchar(buf^, 64000, #0);
end;

procedure copy;
begin
     move(buf^, vmem, 64000);
end;

function getmaxx : integer;
begin
     getmaxx:=319;
end;

function getmaxy : integer;
begin
     getmaxy:=199;
end;

function getbuf: ppage;
begin
     getbuf:=buf;
end;

end.
