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

84 lines
4.7 KiB
Markdown

The second thing you'll notice is that exquisite shading effects are
possible in 360x480 256-color mode; adjacent lines blend together
remarkably smoothly, even with the default palette. The VGA allows you
to select your 256 colors from a palette of 256K, so you could, if you
wished, set up the colors to produce still finer shading albeit with
fewer distinctly different colors available. For more on this and
related topics, see the coverage of palette reprogramming that begins in
the next chapter.
The one thing you may not notice right away is just how much detail is
visible on the screen, because the blending of colors tends to obscure
the superior resolution of this mode. Each of the four rectangles
displayed measures 180 pixels horizontally by 240 vertically. Put
another way, each *one* of those rectangles has two-thirds as many
pixels as the entire mode 13H screen; in all, 360x480 256-color mode has
2.7 times as many pixels as mode 13H! As mentioned above, the resolution
is unevenly distributed, with vertical resolution matching that of mode
12H but horizontal resolution barely exceeding that of mode 13H—but
resolution is hot stuff, no matter how it's laid out, and 360x480
256-color mode has the highest 256-color resolution you're ever likely
to see on a standard VGA. (SuperVGAs are quite another matter—but when
you *require* a SuperVGA you're automatically excluding what might be a
significant chunk of the market for your code.)
Now that we've seen the wonders of which our new mode is capable, let's
take the time to understand how it works.
### How 360x480 256-Color Mode Works {#Heading5}
In describing 360x480 256-color mode, I'm going to assume that you're
familiar with the discussion of 320x400 256-color mode in the last
chapter. If not, go back to that chapter and read it; the two modes have
a great deal in common, and I'm not going to bore you by repeating
myself when the goods are just a few page flips (the paper kind) away.
360x480 256-color mode is essentially 320x400 256-color mode, but
stretched in both dimensions. Let's look at the vertical stretching
first, since that's the simpler of the two.
#### 480 Scan Lines per Screen: A Little Slower, But No Big Deal {#Heading6}
There's nothing unusual about 480 scan lines; standard modes 11H and 12H
support that vertical resolution. The number of scan lines has nothing
to do with either the number of colors or the horizontal resolution, so
converting 320x400 256mode to 320x480 256-color mode is a simple matter
of reprogramming the VGA's vertical control registers—which control the
scan lines displayed, the vertical sync pulse, vertical blanking, and
the total number of scan lines—to the 480-scansettings, and setting the
polarities of the horizontal and vertical sync pulses to tell the
monitor to adjust to a 480-line screen.
Switching to 480 scan lines has the effect of slowing the screen refresh
rate. The VGA always displays at 70 Hz *except* in 480-scan-line modes;
there, due to the time required to scan the extra lines, the refresh
rate slows to 60 Hz. (VGA monitors always scan at the same rate
horizontally; that is, the distance across the screen covered by the
electron beam in a given period of time is the same in all modes.
Consequently, adding extra lines per frame requires extra time.) 60 Hz
isn't *bad*—that's the only refresh rate the EGA ever supported, and the
EGA was the industry standard in its time—but it does tend to flicker a
little more and so is a little harder on the eyes than 70 Hz.
#### 360 Pixels per Scan Line: No Mean Feat {#Heading7}
Converting from 320 to 360 pixels per scan line is more difficult than
converting from 400 to 480 scan lines per screen. None of the VGA's
graphics modes supports 360 pixels across the screen, or anything like
it; the standard choices are 320 and 640 pixels across. However, the VGA
*does* support the horizontal resolution we seek—360 pixels—in 40-column
*text* mode.
Unfortunately, the register settings that select those horizontal
resolutions aren't directly transferable to graphics mode. Text modes
display 9 dots (the width of one character) for each time information is
fetched from display memory, while graphics modes display just 4 or 8
dots per display memory fetch. (Although it's a bit confusing, it's
standard terminology to refer to the interval required for one display
memory fetch as a "character," and I'll follow that terminology from now
on.) Consequently, both modes display either 40 or 80 characters per
scan line; the only difference is that text modes display more pixels
per character. Given that graphics modes *can't* display 9 dots per
character (there's only enough information for eight 16pixels or four
256-color pixels in each memory fetch, and that's that), we'd seem to be
at an impasse.