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