Editors Note: Although I have always considered myself an "Apple person" (I have a disk-based Apple II at home), it was exciting to attend a two-day seminar for prospective Atari programmers given by Chris Crawford, Lane Winner, and Mike Ekberg, all of Atari Inc. Once I learned about the internal structure of the Atari 400 and 800 computers, I realized the tremendous potential these machines have. We at BYTE are proud to present "The Atari Tutorial," a series of articles written by members of the Atari staff. The subjects include: the display list, graphics indirection and character sets, player-missile graphics, display-list interrupts, scrolling, and Atari BASIC. This series of articles is adapted from De Re Atari, a forthcoming book on the internal structure of Atari computers, to be published in December 1981 by Atari Inc. This first article, which is on display lists, is by Chris Crawford, who with Lane Winner coauthored the article "An Introduction to Atari Graphics," which we published in the January 1981 BYTE, page 18. "The Atari Tutorial" will cover in greater detail many of the interesting points only mentioned in the first article. We hope you enjoy the series....GW
The Atari personal-computer system is a second-generation personal computer. First and foremost, it is a consumer computer, The entire thrust of its design is to make the consumer comfortable with the computer, This consumer orientation reveals itself in many ways. First, the consumer is protected from mistakes by items such as keystone-shaped connectors that cannot be inserted the wrong way, a power interlock that turns the computer off when internal electronics are exposed, and a pair of plastic shields protecting the system reset key, Second, the machine has a great deal of graphics power; people generally respond to pictures much more readily than to text, Third, the machine has good sound capabilities; again, people normally respond to direct sensory input better than to indirect textual messages. Finally, the computer has joysticks and paddles for more direct tactile input than is possible with keyboards. The point is not that the Atari personal-computer system has a lot of features, but rather that the features are all part of a consistent design philosophy aimed at the consumer. The designer who does not appreciate this fundamental fact will be working against the grain of the system.
The internal layout of the Atari 400 and 800 computers (which are electrically equivalent to each other) is very different from that of other systems. They do have a microprocessor (a 6502), RAM (random-access read/write memory), ROM (read-only memory), and a PIA (peripheral interface adapter). However, they also have three special-purpose LSI (large-scale integration) devices known as ANTIC, POKEY, and CTIA. These devices were designed by Atari engineers primarily to take much of the burden of housekeeping from the 6502, freeing the 6502 to concentrate on computations. While they were at it, they designed a great deal of power into these devices. Each is almost as big (in terms of silicon area) as a 6502, so the three of them together provide a tremendous amount of power. Mastering the Atari 400/800 is primarily a matter of mastering these three chips, a task we hope will be aided by this series of tutorial articles.
In order to understand the graphics capabilities of the Atari personal computer system, you must first understand the rudiments of how a television set works. Television sets use a raster-scan display system. An electron beam is generated at the rear of the television tube and shot toward the screen. Along the way, it passes between sets of horizontal and vertical coils or plates that, if energized, can deflect the beam to make it strike any point on the screen. The electronics inside the television set cause the beam to sweep across the screen in a regular fashion, The beam’s intensity can be controlled: if you make the beam more intense, the spot being struck on the screen glows brightly; if you make it less intense, the spot glows dimly or not at all.
The beam starts at the top left corner of the screen and traces horizontally across the screen. As it sweeps across the screen, the changes in intensity paint an image on the screen. When the beam reaches the right edge of the screen, it is turned off, brought back to the left side of the screen, and moved down a notch. It then turns back on and sweeps across the screen again. This process is repeated for 262 sweeps across the screen. (There actually are 525 sweeps across the screen in an alternating system known as interlace. 1 will ignore interlace and act as if the television has only 262 lines.) These 262 lines fill the screen from top to bottom, At the bottom of the screen (after the 262nd line is drawn), the electron beam is turned off and returned to the upper left corner of the screen. Then it starts the cycle over again. This entire cycle happens sixty times a second.
Now for some jargon: a single trace of the beam across the screen is called a horizontal scan line. A horizontal scan line is the fundamental unit of measurement of vertical distance on the screen. You state the height of an image by specifying the number of horizontal scan lines it spans. The period during which the beam returns from the right edge to the left edge is alled the horizontal blank. The period during which the beam returns from the bottom to the top of the screen is called the vertical blank. The entire process of drawing a screen takes 16,684 µs, The vertical-blank period is about 1400 µs. The horizontal blank takes 14 µs, while a single horizontal scan line takes 64 µs.
Most television sets are designed with overscan; they spread the image out so the edges of the picture are off the edge of the television tube, This guarantees that you have no unsightly borders in your picture. It is very bad for computers, though, because screen information that is off the edge of the picture does you no good. For this reason, the picture the computer puts out must be somewhat smaller than what the television can theoretically display. For this reason, only 192 horizontal scan lines are normally used by the Atari display. Thus, the normal limit of resolution of a television set used with the Atari 400/800 is 192 pixels (or picture elements) vertically. (Of course, a color monitor can do much better than that.)
The standard unit of horizontal distance is the color clock. You specify the width of an image by stating how many color clocks wide it is. There are 228 color clocks in a single horizontal scan line, with a maximum of 176 actually visible. Thus, the ultimate limit for full color horizontal resolution with a standard color television is 176 pixels. With the computer, you can go even finer and control individual half-clocks. This gives a horizontal resolution of 352 pixels. However, use of this feature produces interesting color effects known as color artifacts. Color artifacts can be a nuisance if they are not desired; they can be a boon to the programmer who desires additional color and is not fazed by their restrictions.
The fundamental problem any microcomputer has in using a rasterscan television for display purposes is that the television display is a dynamic process. Because of this, the television does not remember the image. Consequently, the computer must remember the screen image and constantly send a signal to the television telling it what to display. This process of sending information to the television is a continuous process requiring full-time attention. For this reason, most microcomputers have special hardware circuits that handle the television. The basic arrangement is the same on virtually all systems:
microprocessor -> screen RAM -> video hardware -> TV screen
The microprocessor writes information to the screen RAM area that holds the screen data. The video hardware is constantly accessing this RAM area, getting screen data and converting them into television signals. These signals go to the television, which then displays the information, The screen memory is mapped onto the screen in the same order in which it is stored. That is, the first byte in the screen memory maps to the top left corner of the screen, the second byte maps one position to the right, then the third, the fourth, and so on to the last byte that is mapped to the lower right corner of the screen.
The quality of the image that gets to the screen depends on two factors: how sophisticated the video hardware is, and how much screen memory is used. The simplest arrangement is used by the Radio Shack TRS-80 and the Commodore PET. These machines allocate a specific 1 K bytes of RAM as screen memory. The video-hardware circuits simply pull data out of this area, interpret them as characters (using a character set in ROM), and put the resulting characters on the screen. Each byte represents one character, allowing a choice of 256 different characters in the character set. With 1 K bytes of screen RAM, 1024 characters can be displayed on the screen. There isn't much that can be done to modify this arrangement.
The Apple Il, from Apple Computer Inc, uses more advanced video hardware. Three graphics modes are provided: text, low-resolution (lo-res) graphics, and high-resolution (hi-res) graphics. The text graphics mode operates much as the PET and TRS-80 displays operate. In the low-resolution graphics mode, the video hardware reaches into screen memory and interprets it differently. Instead of interpreting each byte as a character, each byte is interpreted as two blocks of color. The value of each block (4 bits) specifies the color of a single pixel, In the high-resolution graphics mode, each bit in screen memory is mapped to a single pixel. If the bit is on, the pixel gets color in it; if the bit is off, the pixel stays dark, The situation is complicated by a variety of design nuances in the Apple, but that is the basic idea.
The important point is that the Apple has three display modes—three completely different ways of interpreting the data in screen memory. The Apple video hardware is intelligent enough to interpret a screen memory byte as either an 8-bit character (text mode), two 4-bit color nybbles (low-resolution mode), or 7 individual bits for a bit map (high-resolution mode).
The Atari 400/800 display-list system represents a generalization of these systems. Where the PET and TRS-80 have one mode and the Apple has three modes, the Atari 400/800 has fourteen modes. A second important difference is that Atari 400/800 display modes can be mixed on the screen. You are not restricted to a choice between a screen full of text or a screen full of graphics. Any collection of the fourteen Atari graphics modes can be displayed on the screen simultaneously. The third important difference is that the Atari 400/800 screen RAM can be located anywhere in the address space of the computer and moved around while the program is running, whereas the other machines use fixed-screen memory areas.
This generality is made possible by a video microprocessor called ANTIC. Where earlier systems used rather simple video circuitry, Atari designed a full-scale microprocessor just to handle the intricacies of the television display. ANTIC is a true microprocessor---it has an instruction set, a program, and data. The program for ANTIC is called the display list. The display list specifies three things: where the screen data can be found, what display modes to use to interpret the screen data, and what special display options (if any) should be implemented.
When using the display list, it is important to shed the old view af a screen as a homogeneous image in a single mode and see it instead as a stack of mode lines. A mode line is a collection of horizontal scan lines, It stretches horizontally all the way across the screen. An Atari graphics 2 mode line is 16 horizontal scan lines high, while a graphics 7 mode line is only 2 scan lines high. Many graphics modes available from BASIC are homogeneous; an entire screen of a single made is set up. But you must not limit your imagination to this pattern; with the display list, you can create any sequence of mode lines down the screen. The display list is a collection of code bytes that specify that sequence.
ANTIC's instruction set is rather simple. There are four classes of instructions: map-mode instructions, character-mode instructions, blankline instructions, and jump instructions. Map-mode instructions cause ANTIC to display a mode line with simple colored pixels (no characters). Character-mode instructions cause ANTIC to display a mode line with Characters in it. Blank-line instructions cause ANTIC to display a number of horizontal scan lines with a solid background color. Jump instructions are analogous to a 6502 JMP instruction; they reload ANTIC's program counter with a new value. There are also four special options that can sometimes be specified by setting a designated bit in the ANTIC instruction. These options are: display-list interrupt (DLI), load-memory scan (LMS), vertical scroll, and horizontal scroll.
Map-mode instructions cause ANTIC to display a made line containing pixels with solid color in them. The color that is displayed comes from a color register. The choice of color register is specified by the value of the screen data. In four-color map modes (BASIC modes 3, 5, and 7, and ANTIC modes hexadecimal 8, A, D, and E), a pair of bits is required to specity a color register; these values are given in table 1. [Unfortunately, the graphics mode numbers in BASIC do not correspond to the mode numbers used by ANTIC; this often causes confusion....GW]
Value of Bit Pair | Atari Color Register Used |
|||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Table 1: Atari color-register assignment in four-color map mode.
Since only 2 bits are needed to specify one pixel, four pixels are encoded in each screen-data byte. For example, a byte of screen data containing the hexadecimal value 1B would display four pixels; the first would be the background, the second would be color register 0, the third would be color register 1, and the fourth would be color register 2:
hexadecimal 1B = binary 00011011 = 00 01 10 11
In two-color map modes (BASIC modes 4, 6, and 8, and ANTIC modes hexadecimal 9, B, C, and F), each bit specifies one of two color registers, A bit value of 0 selects background color for the pixel; a bit value of 1 selects color register O for the pixel. Eight pixels can be stored in one screen-data byte.
There are eight different map-display modes, They differ in the number of colors they display (two colors versus four colors), the vertical size one mode line occupies (1, 2, 4 or 8 scan lines), and the number of pixels that fit horizontally into one mode line (40, 80, 160, or 320). Thus, some map modes give better resolution; these will require more screen memory. Table 2 presents this information for all modes.
ANTIC Mode |
BASIC Mode |
Number of Colors |
Scan Lines Per Mode Line |
Pixels Per Mode Line |
Bytes Per Line |
Bytes Per Screen |
---|---|---|---|---|---|---|
2 | 0 | 2 | 8 | 40 | 40 | 960 |
3 | none | 2 | 10 | 40 | 40 | 760 |
4 | none | 4 | 8 | 40 | 40 | 960 |
5 | none | 4 | 16 | 40 | 40 | 480 |
6 | 1 | 5 | 8 | 20 | 20 | 480 |
7 | 2 | 5 | 16 | 20 | 20 | 240 |
8 | 3 | 4 | 8 | 40 | 10 | 240 |
9 | 4 | 2 | 4 | 80 | 10 | 480 |
A | 5 | 4 | 4 | 80 | 20 | 960 |
B | 6 | 2 | 2 | 160 | 20 | 1920 |
C | none | 2 | 1 | 160 | 20 | 3840 |
D | 7 | 4 | 2 | 160 | 40 | 3840 |
E | none | 4 | 2 | 160 | 40 | 7680 |
F | 8 | 2 | 1 | 320 | 40 | 7680 |
Table 2: Atari graphics modes and their characteristics. Nate that the same graphics mode is given a different number by BASIC and by ANTIC. The ANTIC mode number refers to one mode line of a given kind of graphics, while the BASIC mode number refers to a certain arrangement of mode lines (most or all of which are the given kind of graphics) that defines an entire screen of video display.
Character-mode instructions cause ANTIC to display a mode line with characters in it. Each byte in screen RAM specifies one character. There are six character-display modes. Character displays will be discussed in a future BYTE article in this series.
Blank-line instructions produce "blank" lines consisting of only a solid background color. There are eight blank-line instructions; they specify skipping one through eight blank lines.
There are two jump instructions. The first (JMP) is a direct jump; it reloads ANTIC's program counter with a new address that follows the JMP instruction as an operand. Its only function is to provide a solution to a tricky problem. ANTIC's program counter is only 10 bits wide. Thus, it cannot cross a 1 K-byte boundary. If the display list must cross a 1 K-byte boundary, it must use a JMP instruction to hop over the boundary. This means that display lists are not fully relocatable.
The second jump instruction (JVB) is more commonly used. It reloads the program counter with the value in the operand and waits for the television to perform a vertical blank. This instruction is normally used to end a display list by jumping to the top of the display list. Jumping to the top turns it into an infinite loop; ANTIC waits for vertical blank to insure that the infinite loop is synchronized to the display cycle of the television. Both JMP and JVB are 3-byte instructions; the first byte is the operation code (JMP or JVB), the second and third bytes are the address to jump to (low byte, then high byte).
The four special options mentioned previously will be discussed in future articles in this series. However, the load-memory scan option must have a preliminary explanation. This option is selected by setting bit 6 of a map-mode or a character-mode instruction byte. When ANTIC encounters such an instruction, it will load its memory-scan counter with the two following bytes. This memory-scan counter tells ANTIC where the screen memory is, and ANTIC begins fetching display data from this area. The LMS instruction is a 3-byte instruction: a 1-byte operation code followed by 2 bytes of operand. In simple display lists, the LMS struction is used only once, at the beginning of the display list. It may sometimes be necessary to use a second LMS instruction. The need arises when the screen-memory area crosses a 4 K-byte boundary. (The memory-scan counter is only 12 bits wide, which is why it cannot cross a 4 K boundary.) In this case, an LMS instruction must be used to jump the memory-scan counter over the boundary, This means that display data are not fully relocatable. LMS instructions have wider uses that will be discussed later in this series.
Every display list should begin with three "blank-eight-lines" instructions. This defeats vertical overscan by bringing the beginning of the useful display 24 scan lines down. After this is done, the first display line should be specified. Simultaneously, the LMS should be used to tell ANTIC where it will find the screen memory. Then follows the actual display list, which lists the display bytes for the mode lines on the screen, The total number of horizontal scan lines produced by the display list should always be 192 or less; ANTIC does not maintain the screen-timing requirements of the television. If you give ANTIC too many scan lines to display, it will do so, but the television screen will probably roll. Displaying fewer than 192 scan lines causes no problems; indeed, it decreases 6502 execution time by reducing the number of cycles stolen by ANTIC. The programmer must calculate the sum of the horizontal scan lines produced by his or her display list and verify it. The display list must end with a JVB instruction.
A typical display list for a standard BASIC graphics mode 0 display (all values are in hexadecimal) is given in table 3. As you can see, this display list is short—only 32 bytes. Most display lists are less than 100 bytes long. Furthermore, they are quite simple in structure and easy to set up.
Hexadecimal Address |
Hexadecimal Value |
Meaning |
---|---|---|
7BE0 | 70 | blank 8 lines |
70 | blank 8 lines | |
70 | blank 8 lines | |
42 | display ANTIC mode 2 (BASIC mode 0) | |
20 | also, screen memory starts at 7C20 | |
7C | ||
02 | display one mode line of ANTIC mode 2 | |
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
02 | ||
41 | JVB instruction---wait for the vertical- | |
E0 | blank signal, then jump to the beginning | |
7B | of the display list, which starts at $7BE0 |
Table 3: The display list for a standard BASIC graphics mode 0 display.
To implement your own display list, you must first design the display format. This is best done on paper. Lay out the screen image and translate it into a sequence of mode lines. Keep track of the scan-line count of your display by looking up the scan-line requirements of the various modes in table 2. Translate the sequence of mode lines into a sequence of ANTIC made bytes. Put 3 "blank-eight-lines" bytes (hexadecimal 70) at the top of the list. Set bit 6 of the first display byte (that is, make the upper nybble a 4)---this makes it a load-memory scan command, Follow with 2 bytes that specify the address of the screen RAM (low byte, then high). Then follow this with the rest of the display bytes. At the end of your display list, put in the JVB instruction (hexadecimal 41) and the address of the top of the display list. Store all these bytes into memory. They can be anywhere you want; just make sure they don't overlie something else, and be sure your JVB instruction at the end of the display list points to the top of the display list.
The display list must not cross a 1 K-byte address boundary. If you absolutely must have it cross such a boundary, insert a JMP instruction just in front of the boundary, with the JMP instruction's operand being the address of the first byte on the other side of the boundary. Next, you must turn off ANTIC for a fraction of a second while you rewrite its display-list pointer. Do this by writing a 0 into hexadecimal location 22F (known as SDMCTL). Then store the address of the new display list into hexadecimal locations 230 and 231 (low byte, then high). Lastly, turn ANTIC back on by depositing a hexadecimal 22 into SDMCTL. During the vertical blank, while ANTIC is quiet, the operating system will reload ANTIC's program counter with these new values.
Screen memory can be placed anywhere in the address space of the computer. Normally, the display list specifies the beginning of the screen memory with the first display instruction---the initial LMS instruction. However, ANTIC can execute a new LMS instruction with each display line of the display list, if this is desired. In this way, information from all over the address space of the computer can be displayed on a single screen. This can be of value in setting up independent text windows.
There are several restrictions in your placement of the screen memory. First, screen memory should not cross a 4 K-byte address boundary. If you cannot avoid crossing a 4 K-byte boundary (as would be the case in BASIC mode 8, which uses B K bytes of RAM), you must reload the memory-scan counter with a new LMS instruction. Second, if you wish to use any of the Atari operating-system screen routines, you must abide by the conventions the operating system uses. This can be particularly difficult when using a modified display list in a BASIC program, If you alter a standard display list from a BASIC program and then attempt to PRINT or PLOT to the screen, the operating system will do so under the assumption that the display list is unchanged. This will probably result in a garbled display.
There are three ways the display can fail when you attempt this. First, BASIC may refuse to carry out a screen operation because it is impossible to do with the graphics mode that the operating system thinks it is in. The operating system stores the value of the graphics mode that it thinks is on the screen in hexadecimal address 57. You can fool the operating system into cooperating by POKEing a different BASIC mode value there. POKE the BASIC mode number, not the ANTIC mode number.
The second failure arises when you mix mode lines with different screen-memory byte requirements. Some mode lines require 40 bytes per line, some require 20 bytes per line, and some require only 10 bytes per line. Let's say that you insert one 20-byte mode line into a display list with 40-byte mode lines. Then you PRINT text to the display. Everything above the interloper line is fine, but below it the characters are shifted twenty spaces to the right. This is because the operating system assumed that each line would require 40 bytes and positioned the characters accordingly. But ANTIC, when it encountered the interloper line, took only 20 bytes of what the operating system thought should be a 40-byte line. ANTIC interpreted the other 20 bytes as belonging to the next line and displayed them there. This resulted in the next line and all later lines being shifted twenty spaces to the right.
The only absolute way around this problem is to refrain from using BASIC PRINT and PLOT statements to output to a mixed display-list screen, The quick and dirty solution is to organize the screen into line groups that contain integer multiples of the standard byte requirement, That is, do not insert a 20-byte mode line into a 40-byte display; instead, insert two 20-byte lines or one 20-byte line and two 10-byte lines. As long as you retain the proper integer multiples, the horizontal shift will be avoided.
This solution accentuates the third problem with mixed display lists and BASIC: vertical shifts. The operating system positions screen material vertically by calculating the number of bytes to skip down from the top of the screen. In a standard 40-byte line display, BASIC would position the characters onto the tenth line by skipping 360 bytes (40 bytes per line times 9 full lines) from the beginning. lf you have inserted four 10-byte lines, BASIC ends up 3 lines further down the screen than you would otherwise expect. Furthermore, different mode lines consume different numbers of scan lines, so the position on the screen will not be quite what you expected if you do not take scan-line costs into account.
As you can see, mixed-mode displays can be difficult to use in conjunction with the operating system. Often, you must fool the operating system to make such displays work. To PRINT or PLOT to a mode window, POKE the BASIC mode number of that window to hexadecimal location 57, then POKE the address of the top left pixel of the mode window into hexadecimal locations 58 and 59 (low byte, then high). In character modes, execute a POSITION 0,0 to home the cursor to the top left corner of the mode window. In map modes, all PLOTs and DRAWTOs will be made using the top left corner of the mode window as the origin of the coordinate system.
The display-list system can be used to produce appealing screen displays. Its most obvious use is for mixing text and graphics. For example, you could prepare a screen with a bold BASIC mode 2 title, a medium-size BASIC mode 1 subtitle, and small BASIC mode 0 fine print. You could then have a BASIC mode 8 picture in the middle, with more text at the bottom.
With assembly-language routines, modified display lists are best used by organizing the screen into a series of windows, each window having its own LMS instruction and its own independent RAM area.
One simple application of displaylist modifications is to vertically space lines on the screen by inserting blank-line bytes. This will add some vertical spacing, which will highlight critical messages and enhance the readability of some displays.
Another important use of displaylist modifications is in providing access to features not available from BASIC. There are three text modes supported by ANTIC that BASIC does not support. You can gain access to these modes only by modifying the display list. There are also displaylist-interrupt and fine-scrolling capabilities that are only available after the display list is modified. These features are the subjects of later articles in this series.
Manipulations with the LMS instruction and its operand offer many possibilities to the creative programmer. For example, by changing the LMS during vertical blank, the programmer can alternate screen images. This can be done at slow speed to change between predrawn displays without having to redraw each one. Each display would continue to reside in (and consume) memory even while it is not in use, but it would be available almost instantly. This technique can also be used for animation. By flipping through a sequence of displays, cyclic animation can be achieved, The program to do this would manipulate only 2 address bytes to display thousands of bytes of memory.
It is also possible to superimpose images by flipping screens at high speed. The human eye has a time resolution of about 1/16 of a second, so a program can cycle between four images, one every 1/60 of a second, so each repeats every 1/15, of a second, In this way, up to four images can appear to reside simultaneously on the screen. There are some drawbacks to this method. First, four separate displays may well cost a lot of memory. Second, each display image will be washed out because it only shows up one quarter of the time, This means that the background of all displays must be black, and each image must be bright. Furthermore, there will be some unpleasant screen flicker when this technique is used. A conservative programmer might consider cycling between only three or even two images. This technique can also be used to extend the color and luminance resolution of the computer. By cycling between four versions of the same image, each version stressing one color or luminance range, a wider range of colors and luminosities is available.
For example, suppose we wish to display a bar of many different luminances. We first set our four color registers to the following hexadecimal values:
background: 00 playfield 1: 02 playfield 2: 0A playfield 3: 0C
If we put the images described in table 4 into each of the screen-memory areas, we can achieve much finer luminance resolution.
|
|
Table 4: Advanced color and luminance control through the high-speed changing of the video display; see the text for details.
A final suggestion concerns a subject that is laden with opportunities, but that is as little understood as the dynamic display list. This is a display list that the 6502 changes during vertical-blank periods. It should be possible to produce interesting effects with dynamic display lists. For example, a text-editing program could dynamically insert blank lines above and below the screen line being edited to set it apart from the other lines of text. As the cursor is moved vertically, the display list is changed to isolate the screen line the cursor is on. The technique is odd but very effective,
The display list is a powerful system for creating and controlling displays. It is not a simple system. In essence, it is a scheme for mating two completely different technologies, the television and the microcomputer. When I consider the differences between these two technologies and the exacting demands of each, I am surprised that the display-list system achieves such a favorable combination of power and simplicity. Even more surprising is the way the display-list system supports an even more powerful set of graphics capabilities, such as graphics indirection, display-list interrupts, and fine scrolling. These will be the subjects of future articles in this series. ¤