[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

                           MCGA Graphics Tutorial
                                 Lesson #1
                                by Jim Cook

I'm not sure how this online tutorial will be received, but with your
comments and feedback I plan on creating a full-blown animation package. This
graphics library will be available to the public domain and will contain the
following abilities:

                Setting/Reading Pixels
                Drawing lines
                Saving/Restoring areas of the screen
                Displaying PCX/LBM files to the screen
                Spriting (Display picture with transparent areas)
                Palette control (Smooth fades to black)
                Page flipping

Before we're done, you will have the tools to produce programs with rich,
even photo-realistic (for the resolution) images on your PC.  The necessary
hardware is a VGA card and monitor that's it.  I'll be using Turbo Pascal
version 6.0.  Please holler if that will be a problem.  I'm using it to
create inline assembly.  My alternatives are inline code (yuk) or linking in
external assembly.  For speed (and actually ease) the latter is better.  If I
receive three complaints against 6.0, I'll use external assembly.

                                What is MCGA?

Multi-Color Graphics Array is the video card that IBM built into it's Model
25 and 30 PS/2's.  It subsequently became a subset of the standard VGA
adapter card.  It has the distiction of being the first card (excluding
Targa and other expensive cards) to display 256 colors at once on the
computer screen.  To us that meant cool games and neat pictures.  The MCGA
addapter has added two new video modes to the PC world:

                Mode $11        640x480x2 colors
                Mode $13        320x200x256 colors

Obviously, we will deal with mode $13.  If we wanted to deal with two
colors, we'd be programming a CGA.  So much for the history lesson...let's
dive in.

I've created a unit, MCGALib, that will contain all of our MCGA routines.
The first two procedures we will concern ourselves with are setting the
graphics mode and setting a pixel.  The MCGALib is followed by a test
program that uses the two procedures:

Unit MCGALib;

interface

Procedure SetGraphMode (Num:Byte);
Procedure SetPixel     (X,Y:Integer;Color:Byte);

implementation

var
  ScreenWide  :  Integer;
  ScreenAddr  :  Word;

Procedure SetGraphMode (Num:Byte);
begin
  asm
    mov al,Num
    mov ah,0
    int 10h
    end;
  Case Num of
    $13 : ScreenWide := 320;
    end;
  ScreenAddr := $A000;
end;
{
Function PixelAddr (X,Y:Word) : Word;
begin
  PixelAddr := Y * ScreenWide + X;
end;

Procedure SetPixel (X,Y:Integer;Color:Byte);
var
  Ofs    :  Word;
begin
  Ofs := PixelAddr (X,Y);
  Mem [ScreenAddr:Ofs] := Color;
end;
}

Procedure SetPixel (X,Y:Integer;Color:Byte);
begin
  asm
    push ds
    mov  ax,ScreenAddr
    mov  ds,ax

    mov  ax,Y
    mov  bx,320
    mul  bx
    mov  bx,X
    add  bx,ax

    mov  al,Color
    mov  byte ptr ds:[bx],al
    pop  ds
    end;
end;

Begin
End.

This is the test program to make sure it's working...

Program MCGATest;

uses
  Crt,Dos,MCGALib;

var
  Stop,
  Start  :  LongInt;
  Regs   :  Registers;

Function Tick : LongInt;
begin
  Regs.ah := 0;
  Intr ($1A,regs);
= egs.cx hl 16  Rgs.dx;
end;

Procedure Control;
var
  I,J :  Integr;begin
  Start := ic;
  Fr I := 0 to 199 do
  For J  SetPixe (J,I,Random(256));
 Stop := Tick;
end;

Pocdure Closing;
var
  Ch    :  Chr;
begin
  Repet Until Keypressed;
  While Keypressed do Ch:= Reake;
  TextMode (3);
ook '(Stop-Start),' ticks or ,(Stop-Start)/182:4:3,'
 seconds!');
nd;

Procedure Init;
begin
  SetGaphMode ($13);
 Randoiz;
end;

Begin
 Init
  Control;
  Cosing;
e where these listings coul get unbearably long in time.  I'l
explore a few ays I can get this information to ya'll without takingup too
much pace. Iwould like you tomake sue this routine works, ust in case
you ou graphis card. You may notce two SetPxel
procedures in the MCGALib, one is commented out.  Remove he comments,
comment up the uncommented SetPixel and run the test program aain.  Notice
the speed degradation.  Linking in raw assembly will eve improve upon the
speed of the inline assembly.
Please take the time to study each procedure and ASK ANY QUESTIONS tht you
may have, even if it doesn't relate to the graphics routines.  I'm cetain I
do not want to get pulled off track by any discussions about STYLE,ur critique
 for others to learn rom.

                              Coming next time

I think a discussio of video memory is paramount.  Possibly vertical and
horizontal lines, if spce permits.

Happy grafx
jim

--- QuickBBS 2.75
 * Origin: Quantum Leap.. (512)333-5360  HST/DS (1:387/307)
                                                                                                                     

[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]