home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 8
/
CDASC08.ISO
/
NEWS
/
554
/
MAI
/
MCGA_2.TXT
< prev
next >
Wrap
Text File
|
1993-10-07
|
6KB
|
103 lines
MCGA Graphics Tutorial
Lesson #2
by Jim Cook
I have to apologize a little bit. The first lesson contained code for
setting a pixel by directly altering video memory. This probably was a
strange sight for those of you that do not understand video memory, how
it's layed out and how to address it. I do hope you did get excited by
workable code in the first lesson.
Video memory in the MCGA Mode we are using is far simpler to understand
than even Text mode display memory. Those of you that know all about
text screen addressing, just scoffed. No, seriously, it is as simple.
I will try to make this easy to understand, because it really is.
There is an area in your computer's memory that holds the program that is
currently running, as well as, COMMAND.COM and other system drivers. s
Most of you realize that there is also a section of memory that holds
all of the information regarding your video screen. In the MCGA #1 you
will notice that we changed the value of a byte in memory to change the
color of a pixel on the screen. This may seem magical to some, but it
really isn't. The logic driving a video card is simply this:
1. Scan video memory and write the bytes you see there
to the screen.
2. Repeat Step 1.
Unlike COMMAND.COM and the program that's running, whose starting address
in memory could be different depending on a multitude of factors, video
memory is always at the same location. In MCGA mode, video memory begins
at the 655,360th byte of computer memory. You may say that my computer
only has 655,360 bytes of memory total (640K). Where does that memory
reside? Don't quote me on this, but I believe that the video memory
wholly resides on your graphics card.
So, the graphics card is responsible for scanning this piece of memory
many times per second, and displaying on the screen whatever color
values are stored starting at byte 655,360. By the way, in hex (base 16)
that number is $A0000, and we'll refer to it like that from now on.
These color values that I referred to are numbers from 0 to 255. If we
store the number 0 in every byte of screen memory and the computer
thinks that 0 means black, which it usually does, the screen will
instantly clear to black. That's how you do a screen clear in MCGA.
The resolution of our screen is 320 pixels horizontal by 200 pixels
vertical. That makes up a total of 64000 pixels per screen. A normal
text screen only has 4000 bytes of screen memory, so you can see why we
sometimes use assembly language. So, a very prehistoric screen clear
procedure could look something like:
Procedure ClearScreen (Color:Byte);
var
I : Word;
begin
For I := 0 to 64000 do
Mem [$A000:I] := Color;
end;
You'll notice I had to break the number $A0000 into two numbers. This
is called segment-offset addressing, and it is a throwback to the days
when the engineers felt we would never need more than 640K of memory.
Let me briefly explain. The memory address $A0000 and $A000:0000 are
synonymous. To compute a virtual address from a seg:ofs address you
perform the calcualtion: virtual := seg * 16 + ofs. This lets a
programmer access over 1 meg of memory using 2 word size values. Don't
ask...
OK. Since we are pretty much all hackers at heart and I don't have a
chalkboard, I'll illustrate video memory:
0 1 2 3 4 5 ---> up to pixel 319
+---+---+---+---+---+---+---+---+---+---+---+---+--
0 + 0 | 1 | 2 | 3 | 4 | 5 | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+--
1 +320|321|322|323|324| | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+--
2 +640|641|642|643| | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+--
3 + | | | | | | | | | | | |
Assume, (I know, bad word), that this is a extreme closeup of the upper
left corner of a MCGA screen. As a matter of fact the box 0 is the
first pixel (the uppermost leftest most pixel) on the screen. Say, we
want to make it white. In the default palette the color white is 255.
All we have to do is say: Mem [$A000:0000] := 255;
If we want to make the pixel below it white also, we type :
Mem [$A000:0320] := 255;
As you can see, segment:offset addressing actually comes in handy in
addressing pixels on the screen. Since there are 320 pixels across and
200 Pixels up and down, the following formula returns the address of any
pixel on the MCGA screen: (Y * 320) + X
This is assuming the upperleft pixel is (0,0) and the lower right pixel
is (319,199), and we will.
Understanding screen addresses is essential to comprehending any of the
code we will be developing, so if a point is not clear...POST a message.
Don't be bashful about asking questions. Just a quick point...I did not
go to school to learn this. This is something everyone can learn.
Graphics is a subject that a lot gets written about, but not the guts of
programming it. Many of you may opt for the easy way out (canned
libraries) but to really understand your computer you have to know
what's going on under the hood. Also, for laughs, try implementing a
good animation program or GUI with the BGI.