[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]