________________________________________________________________ Message: 1048664, 198 lines Posted: 6:06pm EST, Wed Dec 11/85, imported: 12:24am EST, Thu Dec 12/85 To: Julian Humphries, umich!um.cc!julian_humphries@ihnp4 From: ihnp4!gargoyle!sphinx!jmhj@eecs.umich From gargoyle!ihnp4!houxm!whuxl!whuxlm!akgua!gatech!seismo!uwvax!uwmacc!curtis Sun Feb 6 00:28:16 2106 Relay-Version: version B 2.10.1 6/24/83; site sphinx.UChicago.UUCP Posting-Version: version B 2.10.2 9/5/84; site uwmacc.UUCP Path: sphinx!gargoyle!ihnp4!houxm!whuxl!whuxlm!akgua!gatech!seismo!uwvax!uwmacc!curtis From: curtis@uwmacc.UUCP (Alan Curtis) Newsgroups: net.sources Subject: EGA 640X350X16-color graphics with TURBO 3.0 Message-ID: <1721@uwmacc.UUCP> Date: Wed, 20-Nov-85 17:09:47 CST Date-Received: Thu, 21-Nov-85 16:28:23 CST Distribution: net Organization: UWisconsin-Madison Academic Comp Center Lines: 181 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.