abrash-black-book/23-01.md
2013-12-30 20:26:41 +11:00

119 lines
6.4 KiB
Markdown

*Part II* {align="center"}
---------
Chapter 23\
Bones and Sinew {#Heading1}
----------------
### At the Very Heart of Standard PC Graphics {#Heading2}
The VGA is unparalleled in the history of computer graphics, for it is
by far the most widely-used graphics standard ever, the closest we may
ever come to a *lingua franca* of computer graphics. No other graphics
standard has even come close to the 50,000,000 or so VGAs in use today,
and virtually every PC compatible sold today has full VGA compatibility
built in. There are, of course, a variety of graphics accelerators that
outperform the standard VGA, and indeed, it is becoming hard to find a
plain vanilla VGA anymore—but there is no standard for accelerators, and
every accelerator contains a true-blue VGA at its core.
What that means is that if you write your programs for the VGA, you'll
have the largest possible market for your software. In order for
graphics-based software to succeed, however, it must perform well.
Wringing the best performance from the VGA is no simple task, and it's
*impossible* unless you really understand how the VGA works—unless you
have the internals down cold. This book is about PC graphics at many
levels, but high performance is the foundation for all that is to come,
so it is with the inner workings of the VGA that we will begin our
exploration of PC graphics.
The first eight chapters of Part II is a guided tour of the heart of the
VGA; after you've absorbed what we'll cover in this and the next seven
chapters, you'll have the foundation for understanding just about
everything the VGA can do, including the fabled Mode X and more. As you
read through these first chapters, please keep in mind that the *really*
exciting stuff—animation, 3-D, blurry-fast lines and circles and
polygons—has to wait until we have the fundamentals out of the way. So
hold on and follow along, and before you know it the fireworks will be
well underway.
We'll start our exploration with a quick overview of the VGA, and then
we'll dive right in and get a taste of what the VGA can do.
### The VGA {#Heading3}
The VGA is the baseline adapter for modern IBM PC compatibles, present
in virtually every PC sold today or in the last several years. (Note
that the VGA is often nothing more than a chip on a motherboard, with
some memory, a DAC, and maybe a couple of glue chips; nonetheless, I'll
refer to it as an adapter from now on for simplicity.) It guarantees
that every PC is capable of documented resolutions up to 640x480 (with
16 possible colors per pixel) and 320x200 (with 256 colors per pixel),
as well as undocumented—but nonetheless thoroughly standard—resolutions
up to 360x480 in 256-color mode, as we'll see in Chapters 31-34 and
47-49. In order for a video adapter to claim VGA compatibility, it must
support all the features and code discussed in this book (with a very
few minor exceptions that I'll note)—and my experience is that just
about 100 percent of the video hardware currently shipping or shipped
since 1990 is in fact VGA compatible. Therefore, VGA code will run on
nearly all of the 50,000,000 or so PC compatibles out there, with the
exceptions being almost entirely obsolete machines from the 1980s. This
makes good VGA code and VGA programming expertise valuable commodities
indeed.
Right off the bat, I'd like to make one thing perfectly clear: The VGA
is hard—sometimes *very* hard—to program for good performance. Hard, but
not impossible—and that's why I like this odd board. It's a throwback to
an earlier generation of micros, when inventive coding and a solid
understanding of the hardware were the best tools for improving
performance. Increasingly, faster processors and powerful coprocessors
are seen as the solution to the sluggish software produced by high-level
languages and layers of interface and driver code, and that's surely a
valid approach. However, there are tens of millions of VGAs installed
right now, in machines ranging from 6-MHz 286s to 90-MHz Pentiums.
What's more, because the VGAs are generally 8- or at best 16-bit
devices, and because of display memory wait states, a faster processor
isn't as much of a help as you'd expect. The upshot is that only a
seasoned performance programmer who understands the VGA through and
through can drive the board to its fullest potential.
Throughout this book, I'll explore the VGA by selecting a specific
algorithm or feature and implementing code to support it on the VGA,
examining aspects of the VGA architecture as they become relevant.
You'll get to see VGA features in context, where they are more
comprehensible than in IBM's somewhat arcane documentation, and you'll
get working code to use or to modify to meet your needs.
The prime directive of VGA programming is that there's rarely just one
way to program the VGA for a given purpose. Once you understand the
tools the VGA provides, you'll be able to combine them to generate the
particular synergy your application needs. My VGA routines are not
intended to be taken as gospel, or to show "best" implementations, but
rather to start you down the road to understanding the VGA.
Let's begin.
### An Introduction to VGA Programming {#Heading4}
Most discussions of the VGA start out with a traditional "Here's a block
diagram of the VGA" approach, with lists of registers and statistics.
I'll get to that eventually, but you can find it in IBM's VGA
documentation and several other books. Besides, it's numbing to read
specifications and explanations, and the VGA is an exciting adapter, the
kind that makes you want to get your hands dirty probing under the hood,
to write some nifty code just to see what the board can do. What's more,
the best way to understand the VGA is to see it work, so let's jump
right into a sample of the VGA in action, getting a feel for the VGA's
architecture in the process.
Listing 23.1 is a sample VGA program that pans around an animated
16-color medium-resolution (640x350) playfield. There's a lot packed
into this code; I'm going to focus on the VGA-specific aspects so we
don't get sidetracked. I'm not going to explain how the ball is
animated, for example; we'll get to animation starting in Chapter 42.
What I will do is cover each of the VGA features used in this
program—the virtual screen, vertical and horizontal panning, color plane
manipulation, multi-plane block copying, and page flipping—at a
conceptual level, letting the code itself demonstrate the implementation
details. We'll return to many of these concepts in more depth later in
this book.