EGA 640X350X16-color graphics with TURBO 3.0
Alan Curtis
curtis at uwmacc.UUCP
Thu Nov 21 09:09:47 AEST 1985
This is a little demo program that takes advantage of the
640X350 by 16 color graphics capabilities of the IBM Enhanced Graphics
Adapter when used with the Enhanced Color Monitor. As yet, TURBO
doesn't support this particular mode, so I've used interrupt 10H for
all the plotting. The graphics primitives that are used are
plot_point, and plot_line (draw a line).
-Alan Curtis
{----------------cut here---------------}
program interrupt(input,output);
{this program uses the high resolution mode, 640X350 by 16 color graphics
that are available with the enhanced graphics adapter and enhanced color
monitor. This was written by Alan Curtis, 1985. }
var
j,k,page : integer;
{////////////////////////////}
procedure super_hires;
{set resolution to 640X350 by 16 color mode}
type
result = record
al,ah,bl,bh : byte;
cx,dx,bp,si,di,ds,es,flags : integer;
end;
var
int_result : result;
col : byte;
begin
with int_result do begin
al := $10; {graphics mode}
ah := $0;
end;
intr($10,int_result); {high res mode}
end;
{////////////////////////////}
procedure set_page(page : integer);
{sets active display page - must have 128K of graphics memory}
type
result = record
al,ah,bl,bh : byte;
cx,dx,bp,si,di,ds,es,flags : integer;
end;
var
int_result : result;
b_page : byte;
begin
b_page := page;
int_result.ah := $5;
int_result.al := b_page; {active page}
intr($10,int_result);
end;
{////////////////////////////}
procedure plot_point(row,col,color,page : integer);
{plots a point at row,col in the specified color (0-15), at the
specific page}
type
result = record
al,ah,bl,bh : byte;
cx,dx,bp,si,di,ds,es,flags : integer;
end;
var
int_result : result;
b_page,b_color : byte;
begin
b_page := page;
b_color := color;
int_result.ah := $C;
int_result.bh := b_page; {active page}
int_result.al := b_color;
int_result.dx := row;
int_result.cx := col;
intr($10,int_result);
end;
{////////////////////////////}
procedure plot_line(x1,y1,x2,y2 : real; color,page : integer);
{draws a line from x1,y1 to x2,y2 in the specified color}
type
result = record
al,ah,bl,bh : byte;
cx,dx,bp,si,di,ds,es,flags : integer;
end;
var
counter : real;
int_result : result;
dx,dy,ddx,ddy,newx,newy : real;
b_page,b_color : byte;
xmult,ymult : integer;
begin
b_page := page;
b_color := color;
int_result.ah := $C;
int_result.bh := b_page; {active page}
int_result.al := b_color;
int_result.dx := round(y1);
int_result.cx := round(x1);
intr($10,int_result);
dx := x2 - x1;
if dx < 0.0 then xmult := -1 else xmult := 1; {increment can be negative}
dy := y2 - y1;
if dy < 0.0 then ymult := -1 else ymult := 1;
{before getting ratios, check for zeros in dx and dy}
if dy = 0.0 then begin
{x will be incremented by 1 through every loop, y by 0}
ddx := 1.0 * xmult;
ymult := 0;
dy := abs(dx); {fool loop counter below}
end
else if dx = 0.0 then begin
ddx := 2;
ddy := 1 * ymult;
xmult := 0;
dx := abs(dy); {fool loop counter}
end
else begin
ddx := abs(dx/dy); {get ratio}
ddy := abs(dy/dx);
ddx := ddx*xmult;
ddy := ddy*ymult;
end;
{the following initializations are used in the proceeding loops}
newy := y1;
newx := x1;
counter := 0.0;
dy := abs(dy);
dx := abs(dx);
if abs(ddx) <= 1.0 then
while counter < dy do begin
counter := counter + 1.0;
newx := newx + ddx;
newy := newy + ymult;
int_result.ah := $C;
int_result.bh := b_page; {active page}
int_result.al := b_color;
int_result.dx := round(newy);
int_result.cx := round(newx);
intr($10,int_result);
end
else while counter < dx do begin {x will be incremented by 1}
counter := counter + 1.0;
newx := newx + xmult;
newy := newy + ddy;
int_result.ah := $C;
int_result.bh := b_page; {active page}
int_result.al := b_color;
int_result.dx := round(newy);
int_result.cx := round(newx);
intr($10,int_result);
end;
end;
{****************************}
{begin main}
begin
super_hires;
page := 0;
set_page(page);
plot_line(0.0,0.0,639.0,0.0,9,0);
plot_line(639.0,0.0,639.0,349.0,9,0);
plot_line(639.0,349.0,0.0,349.0,9,0);
plot_line(0.0,349.0,0.0,0.0,9,0);
for j := 1 to 15 do
for k := 1 to 10 do
plot_line(j*10.0+k,1.0,349.0+j*10.0+k,350.0,j,0);
end.
More information about the Comp.sources.unix
mailing list