abrash-black-book/index.html
2013-12-30 12:21:49 +11:00

1216 lines
53 KiB
HTML

<HTML>
<HEAD>
<META name=vsisbn content="1576101746">
<META name=vstitle content="Michael Abrash's Graphics Programming Black Book, Special Edition">
<META name=vsauthor content="Michael Abrash">
<META name=vspublisher content="The Coriolis Group">
<META name=vspubdate content="07/01/97">
<META name=vscategory content="Web and Software Development: Game Development,Web and Software Development: Graphics and Multimedia Development">
<TITLE>Michael Abrash's Graphics Programming Black Book Special Edition: Table of Contents</TITLE>
<!-- HEADER -->
<!-- Empty Reference Subhead -->
<!--ISBN=1576101746//-->
<!--TITLE=Michael Abrash's Graphics Programming Black Book Special Edition//-->
<!--AUTHOR=Michael Abrash//-->
<!--PUBLISHER=The Coriolis Group, Inc.//-->
<!--CHAPTER=0//-->
<!--PAGES=0//-->
<!--UNASSIGNED1//-->
<!--UNASSIGNED2//--></HEAD><BODY LINK=#0000FF ALINK=#000099 VLINK=#0000FF BGCOLOR=#FFFFFF>
<CENTER><H2><FONT COLOR="#000077">Michael Abrash's Graphics Programming Black Book Special Edition</FONT></H2></CENTER>
<HR>
<DL>
<FONT SIZE="4"><B>
<DD><A HREF="intro.html">Introduction</A>
<DD><A HREF="about.html">Foreword</A>
<DD><A HREF="about_author.html">About the Author</A>
</B></FONT>
<BR>
<BR><DD><A HREF="01-01.html"><FONT SIZE="4"><B>Part I</B></FONT></A>
<DL>
<DD><A HREF="01-01.html#Heading1"><FONT SIZE="4"><B>Chapter 1&#151;The Best Optimizer Is between Your Ears</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="01-01.html#Heading2">The Human Element of Code Optimization</A>
<DD><A HREF="01-01.html#Heading3">Understanding High Performance</A>
<DL>
<DD><A HREF="01-01.html#Heading4">When Fast Isn&#146;t Fast</A>
</DL>
<DD><A HREF="01-02.html#Heading5">Rules for Building High-Performance Code</A>
<DL>
<DD><A HREF="01-02.html#Heading6">Know Where You&#146;re Going</A>
<DD><A HREF="01-02.html#Heading7">Make a Big Map</A>
<DD><A HREF="01-02.html#Heading8">Make Lots of Little Maps</A>
<DD><A HREF="01-03.html#Heading9">Know the Territory</A>
<DD><A HREF="01-04.html#Heading10">Know When It Matters</A>
<DD><A HREF="01-04.html#Heading11">Always Consider the Alternatives</A>
<DD><A HREF="01-05.html#Heading12">Know How to Turn On the Juice</A>
</DL>
<DD><A HREF="01-06.html#Heading13">Where We&#146;ve Been, What We&#146;ve Seen</A>
<DL>
<DD><A HREF="01-06.html#Heading14">Where We&#146;re Going</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="02-01.html#Heading1"><FONT SIZE="4"><B>Chapter 2&#151;A World Apart</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="02-01.html#Heading2">The Unique Nature of Assembly Language Optimization</A>
<DD><A HREF="02-01.html#Heading3">Instructions: The Individual versus the Collective</A>
<DD><A HREF="02-01.html#Heading4">Assembly Is Fundamentally Different</A>
<DL>
<DD><A HREF="02-02.html#Heading5">Transformation Inefficiencies</A>
<DD><A HREF="02-02.html#Heading6">Self-Reliance</A>
<DD><A HREF="02-02.html#Heading7">Knowledge</A>
</DL>
<DD><A HREF="02-03.html#Heading8">The Flexible Mind</A>
<DL>
<DD><A HREF="02-03.html#Heading9">Where to Begin?</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="03-01.html#Heading1"><FONT SIZE="4"><B>Chapter 3&#151;Assume Nothing</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="03-01.html#Heading2">Understanding and Using the Zen Timer</A>
<DD><A HREF="03-01.html#Heading3">The Costs of Ignorance</A>
<DD><A HREF="03-01.html#Heading4">The Zen Timer</A>
<DL>
<DD><A HREF="03-03.html#Heading5">The Zen Timer Is a Means, Not an End</A>
<DD><A HREF="03-03.html#Heading6">Starting the Zen Timer</A>
</DL>
<DD><A HREF="03-03.html#Heading7">Time and the PC</A>
<DD><A HREF="03-04.html#Heading8">Stopping the Zen Timer</A>
<DD><A HREF="03-04.html#Heading9">Reporting Timing Results</A>
<DD><A HREF="03-05.html#Heading10">Notes on the Zen Timer</A>
<DD><A HREF="03-05.html#Heading11">A Sample Use of the Zen Timer</A>
<DD><A HREF="03-06.html#Heading12">The Long-Period Zen Timer</A>
<DL>
<DD><A HREF="03-07.html#Heading13">Stopping the Clock</A>
</DL>
<DD><A HREF="03-08.html#Heading14">Example Use of the Long-Period Zen Timer</A>
<DD><A HREF="03-09.html#Heading15">Using the Zen Timer from C</A>
<DL>
<DD><A HREF="03-10.html#Heading16">Watch Out for Optimizing Assemblers!</A>
<DD><A HREF="03-10.html#Heading17">Further Reading</A>
<DD><A HREF="03-10.html#Heading18">Armed with the Zen Timer, Onward and Upward</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="04-01.html#Heading1"><FONT SIZE="4"><B>Chapter 4&#151;In the Lair of the Cycle-Eaters</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="04-01.html#Heading2">How the PC Hardware Devours Code Performance</A>
<DD><A HREF="04-01.html#Heading3">Cycle-Eaters</A>
<DD><A HREF="04-01.html#Heading4">The Nature of Cycle-Eaters</A>
<DL>
<DD><A HREF="04-01.html#Heading5">The 8088&#146;s Ancestral Cycle-Eaters</A>
</DL>
<DD><A HREF="04-01.html#Heading6">The 8-Bit Bus Cycle-Eater</A>
<DL>
<DD><A HREF="04-02.html#Heading7">The Impact of the 8-Bit Bus Cycle-Eater</A>
<DD><A HREF="04-02.html#Heading8">What to Do about the 8-Bit Bus Cycle-Eater?</A>
</DL>
<DD><A HREF="04-03.html#Heading9">The Prefetch Queue Cycle-Eater</A>
<DL>
<DD><A HREF="04-04.html#Heading10">Official Execution Times Are Only Part of the Story</A>
<DD><A HREF="04-04.html#Heading11">There Is No Such Beast as a True Instruction Execution Time</A>
<DD><A HREF="04-05.html#Heading12">Approximating Overall Execution Times</A>
<DD><A HREF="04-05.html#Heading13">What to Do about the Prefetch Queue Cycle-Eater?</A>
<DD><A HREF="04-06.html#Heading14">Holding Up the 8088</A>
</DL>
<DD><A HREF="04-06.html#Heading15">Dynamic RAM Refresh: The Invisible Hand</A>
<DL>
<DD><A HREF="04-06.html#Heading16">How DRAM Refresh Works in the PC</A>
<DD><A HREF="04-07.html#Heading17">The Impact of DRAM Refresh</A>
<DD><A HREF="04-07.html#Heading18">What to Do About the DRAM Refresh Cycle-Eater?</A>
</DL>
<DD><A HREF="04-07.html#Heading19">Wait States</A>
<DD><A HREF="04-08.html#Heading20">The Display Adapter Cycle-Eater</A>
<DL>
<DD><A HREF="04-09.html#Heading21">The Impact of the Display Adapter Cycle-Eater</A>
<DD><A HREF="04-10.html#Heading22">What to Do about the Display Adapter Cycle-Eater?</A>
<DD><A HREF="04-10.html#Heading23">Cycle-Eaters: A Summary</A>
<DD><A HREF="04-10.html#Heading24">What Does It All Mean?</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="05-01.html#Heading1"><FONT SIZE="4"><B>Chapter 5&#151;Crossing the Border</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="05-01.html#Heading2">Searching Files with Restartable Blocks</A>
<DL>
<DD><A HREF="05-01.html#Heading3">Searching for Text</A>
</DL>
<DD><A HREF="05-01.html#Heading4">Avoiding the String Trap</A>
<DD><A HREF="05-02.html#Heading5">Brute-Force Techniques</A>
<DD><A HREF="05-02.html#Heading6">Using memchr()</A>
<DL>
<DD><A HREF="05-02.html#Heading7">Making a Search Restartable</A>
</DL>
<DD><A HREF="05-04.html#Heading8">Interpreting Where the Cycles Go</A>
<DL>
<DD><A HREF="05-04.html#Heading9">Knowing When Assembly Is Pointless</A>
</DL>
<DD><A HREF="05-05.html#Heading10">Always Look Where Execution Is Going</A>
</DL>
</B></FONT>
<DD><A HREF="06-01.html#Heading1"><FONT SIZE="4"><B>Chapter 6&#151;Looking Past Face Value</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="06-01.html#Heading2">How Machine Instructions May Do More Than You Think</A>
<DL>
<DD><A HREF="06-01.html#Heading3">Memory Addressing and Arithmetic</A>
</DL>
<DD><A HREF="06-02.html#Heading4">Math via Memory Addressing</A>
<DL>
<DD><A HREF="06-02.html#Heading5">The Wonders of LEA on the 386</A>
</DL>
<DD><A HREF="06-02.html#Heading6">Multiplication with LEA Using Non-Powers of Two</A>
</DL>
</B></FONT>
<DD><A HREF="07-01.html#Heading1"><FONT SIZE="4"><B>Chapter 7&#151;Local Optimization</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="07-01.html#Heading2">Optimizing Halfway between Algorithms and Cycle Counting</A>
<DL>
<DD><A HREF="07-01.html#Heading3">When LOOP Is a Bad Idea</A>
</DL>
<DD><A HREF="07-02.html#Heading4">The Lessons of LOOP and JCXZ</A>
<DL>
<DD><A HREF="07-02.html#Heading5">Avoiding LOOPS of Any Stripe</A>
</DL>
<DD><A HREF="07-02.html#Heading6">Local Optimization</A>
<DD><A HREF="07-03.html#Heading7">Unrolling Loops</A>
<DL>
<DD><A HREF="07-05.html#Heading8">Rotating and Shifting with Tables</A>
<DD><A HREF="07-05.html#Heading9">NOT Flips Bits&#151;Not Flags</A>
<DD><A HREF="07-05.html#Heading10">Incrementing with and without Carry</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="08-01.html#Heading1"><FONT SIZE="4"><B>Chapter 8&#151;Speeding Up C with Assembly Language</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="08-01.html#Heading2">Jumping Languages When You Know It&#146;ll Help</A>
<DL>
<DD><A HREF="08-01.html#Heading3">Billy, Don&#146;t Be a Compiler</A>
</DL>
<DD><A HREF="08-01.html#Heading4">Don&#146;t Call Your Functions on Me, Baby</A>
<DD><A HREF="08-02.html#Heading5">Stack Frames Slow So Much</A>
<DD><A HREF="08-02.html#Heading6">Torn Between Two Segments</A>
<DL>
<DD><A HREF="08-02.html#Heading7">Why Speeding Up Is Hard to Do</A>
</DL>
<DD><A HREF="08-02.html#Heading8">Taking It to the Limit</A>
<DL>
<DD><A HREF="08-02.html#Heading9">A C-to-Assembly Case Study</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="09-01.html#Heading1"><FONT SIZE="4"><B>Chapter 9&#151;Hints My Readers Gave Me</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="09-01.html#Heading2">Optimization Odds and Ends from the Field</A>
<DL>
<DD><A HREF="09-01.html#Heading3">Another Look at LEA</A>
<DD><A HREF="09-01.html#Heading4">The Kennedy Portfolio</A>
<DD><A HREF="09-02.html#Heading5">Speeding Up Multiplication</A>
<DD><A HREF="09-02.html#Heading6">Optimizing Optimized Searching</A>
<DD><A HREF="09-05.html#Heading7">Short Sorts</A>
<DD><A HREF="09-05.html#Heading8">Full 32-Bit Division</A>
<DD><A HREF="09-06.html#Heading9">Sweet Spot Revisited</A>
<DD><A HREF="09-07.html#Heading10">Hard-Core Cycle Counting</A>
<DD><A HREF="09-07.html#Heading11">Hardwired Far Jumps</A>
<DD><A HREF="09-07.html#Heading12">Setting 32-Bit Registers: Time versus Space</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="10-01.html#Heading1"><FONT SIZE="4"><B>Chapter 10&#151;Patient Coding, Faster Code</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="10-01.html#Heading2">How Working Quickly Can Bring Execution to a Crawl</A>
<DL>
<DD><A HREF="10-01.html#Heading3">The Case for Delayed Gratification</A>
</DL>
<DD><A HREF="10-01.html#Heading4">The Brute-Force Syndrome</A>
<DL>
<DD><A HREF="10-02.html#Heading5">Wasted Breakthroughs</A>
</DL>
<DD><A HREF="10-03.html#Heading6">Recursion</A>
<DL>
<DD><A HREF="10-03.html#Heading7">Patient Optimization</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="11-01.html#Heading1"><FONT SIZE="4"><B>Chapter 11&#151;Pushing the 286 and 386</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="11-01.html#Heading2">New Registers, New Instructions, New Timings, New Complications</A>
<DL>
<DD><A HREF="11-01.html#Heading3">Family Matters</A>
<DD><A HREF="11-01.html#Heading4">Crossing the Gulf to the 286 and the 386</A>
<DD><A HREF="11-01.html#Heading5">In the Lair of the Cycle-Eaters, Part II</A>
<DL>
<DD><A HREF="11-02.html#Heading6">System Wait States</A>
<DD><A HREF="11-03.html#Heading7">Data Alignment</A>
</DL>
<DD><A HREF="11-03.html#Heading8">Code Alignment</A>
<DL>
<DD><A HREF="11-04.html#Heading9">Alignment and the 386</A>
<DD><A HREF="11-04.html#Heading10">Alignment and the Stack</A>
<DD><A HREF="11-04.html#Heading11">The DRAM Refresh Cycle-Eater: Still an Act of God</A>
<DD><A HREF="11-04.html#Heading12">The Display Adapter Cycle-Eater</A>
</DL>
<DD><A HREF="11-05.html#Heading13">New Instructions and Features: The 286</A>
<DD><A HREF="11-05.html#Heading14">New Instructions and Features: The 386</A>
<DL>
<DD><A HREF="11-06.html#Heading15">Optimization Rules: The More Things Change...</A>
<DD><A HREF="11-06.html#Heading16">Detailed Optimization</A>
</DL>
<DD><A HREF="11-07.html#Heading17">POPF and the 286</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="12-01.html#Heading1"><FONT SIZE="4"><B>Chapter 12&#151;Pushing the 486</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="12-01.html#Heading2">It&#146;s Not Just a Bigger 386</A>
<DL>
<DD><A HREF="12-01.html#Heading3">Enter the 486</A>
</DL>
<DD><A HREF="12-01.html#Heading4">Rules to Optimize By</A>
<DL>
<DD><A HREF="12-01.html#Heading5">The Hazards of Indexed Addressing</A>
<DD><A HREF="12-02.html#Heading6">Calculate Memory Pointers Ahead of Time</A>
</DL>
<DD><A HREF="12-02.html#Heading7">Caveat Programmor</A>
<DL>
<DD><A HREF="12-03.html#Heading8">Stack Addressing and Address Pipelining</A>
<DD><A HREF="12-03.html#Heading9">Problems with Byte Registers</A>
<DD><A HREF="12-04.html#Heading10">More Fun with Byte Registers</A>
<DD><A HREF="12-04.html#Heading11">Timing Your Own 486 Code</A>
</DL>
<DD><A HREF="12-04.html#Heading12">The Story Continues</A>
</DL>
</B></FONT>
<DD><A HREF="13-01.html#Heading1"><FONT SIZE="4"><B>Chapter 13&#151;Aiming the 486</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="13-01.html#Heading2">Pipelines and Other Hazards of the High End</A>
<DL>
<DD><A HREF="13-01.html#Heading3">486 Pipeline Optimization</A>
</DL>
<DD><A HREF="13-02.html#Heading4">BSWAP: More Useful Than You Might Think</A>
<DD><A HREF="13-03.html#Heading5">Pushing and Popping Memory</A>
<DD><A HREF="13-03.html#Heading6">Optimal 1-Bit Shifts and Rotates</A>
<DD><A HREF="13-04.html#Heading7">32-Bit Addressing Modes</A>
</DL>
</B></FONT>
<DD><A HREF="14-01.html#Heading1"><FONT SIZE="4"><B>Chapter 14&#151;Boyer-Moore String Searching</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="14-01.html#Heading2">Optimizing a Pretty Optimum Search Algorithm</A>
<DD><A HREF="14-01.html#Heading3">String Searching Refresher</A>
<DD><A HREF="14-02.html#Heading4">The Boyer-Moore Algorithm</A>
<DD><A HREF="14-02.html#Heading5">Boyer-Moore: The Good and the Bad</A>
<DD><A HREF="14-06.html#Heading6">Further Optimization of Boyer-Moore</A>
<DD><A HREF="14-06.html#Heading7">Know What You Know</A>
</DL>
</B></FONT>
<DD><A HREF="15-01.html#Heading1"><FONT SIZE="4"><B>Chapter 15&#151;Linked Lists and plain Unintended Challenges</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="15-01.html#Heading2">Unfamiliar Problems with Familiar Data Structures</A>
<DD><A HREF="15-01.html#Heading3">Linked Lists</A>
<DD><A HREF="15-02.html#Heading4">Dummies and Sentinels</A>
<DD><A HREF="15-03.html#Heading5">Circular Lists</A>
<DD><A HREF="15-04.html#Heading6">Hi/Lo in 24 Bytes</A>
</DL>
</B></FONT>
<DD><A HREF="16-01.html#Heading1"><FONT SIZE="4"><B>Chapter 16&#151;There Ain&#146;t No Such Thing as the Fastest Code</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="16-01.html#Heading2">Lessons Learned in the Pursuit of the Ultimate Word Counter</A>
<DD><A HREF="16-01.html#Heading3">Counting Words in a Hurry</A>
<DL>
<DD><A HREF="16-02.html#Heading4">Which Way to Go from Here?</A>
</DL>
<DD><A HREF="16-03.html#Heading5">Challenges and Hazards</A>
<DL>
<DD><A HREF="16-04.html#Heading6">Blinding Yourself to a Better Approach</A>
<DD><A HREF="16-04.html#Heading7">Watch Out for Luggable Assumptions!</A>
</DL>
<DD><A HREF="16-04.html#Heading8">The Astonishment of Right-Brain Optimization</A>
<DD><A HREF="16-06.html#Heading9">Levels of Optimization</A>
<DL>
<DD><A HREF="16-06.html#Heading10">Optimization Level 1: Good Code</A>
</DL>
<DD><A HREF="16-07.html#Heading11">Level 2: A New Perspective</A>
<DL>
<DD><A HREF="16-08.html#Heading12">Level 3: Breakthrough</A>
<DD><A HREF="16-08.html#Heading13">Enough Word Counting Already!</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="17-01.html#Heading1"><FONT SIZE="4"><B>Chapter 17&#151;The Game of Life</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="17-01.html#Heading2">The Triumph of Algorithmic Optimization in a Cellular Automata Game</A>
<DD><A HREF="17-01.html#Heading3">Conway&#146;s Game</A>
<DL>
<DD><A HREF="17-01.html#Heading4">The Rules of the Game</A>
</DL>
<DD><A HREF="17-03.html#Heading5">Where Does the Time Go?</A>
<DD><A HREF="17-03.html#Heading6">The Hazards and Advantages of Abstraction</A>
<DD><A HREF="17-05.html#Heading7">Heavy-Duty C&#43;&#43; Optimization</A>
<DD><A HREF="17-06.html#Heading8">Bringing In the Right Brain</A>
<DL>
<DD><A HREF="17-06.html#Heading9">Re-Examining the Task</A>
<DD><A HREF="17-06.html#Heading10">Acting on What We Know</A>
<DD><A HREF="17-08.html#Heading11">The Challenge That Ate My Life</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="18-01.html#Heading1"><FONT SIZE="4"><B>Chapter 18&#151;It&#146;s a plain Wonderful Life</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="18-01.html#Heading2">Optimization beyond the Pale</A>
<DD><A HREF="18-01.html#Heading3">Breaking the Rules</A>
<DD><A HREF="18-02.html#Heading4">Table-Driven Magic</A>
<DD><A HREF="18-04.html#Heading5">Keeping Track of Change with a Change List</A>
<DL>
<DD><A HREF="18-05.html#Heading6">A Layperson&#146;s Overview of QLIFE</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="19-01.html#Heading1"><FONT SIZE="4"><B>Chapter 19&#151;Pentium: Not the Same Old Song</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="19-01.html#Heading2">Learning a Whole Different Set of Optimization Rules</A>
<DD><A HREF="19-01.html#Heading3">The Return of Optimization as Art</A>
<DD><A HREF="19-01.html#Heading4">The Pentium: An Overview</A>
<DL>
<DD><A HREF="19-02.html#Heading5">Crossing Cache Lines</A>
<DD><A HREF="19-02.html#Heading6">Cache Organization</A>
</DL>
<DD><A HREF="19-03.html#Heading7">Faster Addressing and More</A>
<DD><A HREF="19-04.html#Heading8">Branch Prediction</A>
<DD><A HREF="19-04.html#Heading9">Miscellaneous Pentium Topics</A>
<DL>
<DD><A HREF="19-04.html#Heading10">486 versus Pentium Optimization</A>
<DD><A HREF="19-04.html#Heading11">Going Superscalar</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="20-01.html#Heading1"><FONT SIZE="4"><B>Chapter 20&#151;Pentium Rules</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="20-01.html#Heading2">How Your Carbon-Based Optimizer Can Put the &#147;Super&#148; in Superscalar</A>
<DD><A HREF="20-01.html#Heading3">An Instruction in Every Pipe</A>
<DD><A HREF="20-02.html#Heading4">V-Pipe-Capable Instructions</A>
<DD><A HREF="20-03.html#Heading5">Lockstep Execution</A>
<DD><A HREF="20-04.html#Heading6">Superscalar Notes</A>
<DL>
<DD><A HREF="20-04.html#Heading7">Register Starvation</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="21-01.html#Heading1"><FONT SIZE="4"><B>Chapter 21&#151;Unleashing the Pentium&#146;s V-Pipe</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="21-01.html#Heading2">Focusing on Keeping Both Pentium Pipes Full</A>
<DD><A HREF="21-01.html#Heading3">Address Generation Interlocks</A>
<DD><A HREF="21-02.html#Heading4">Register Contention</A>
<DL>
<DD><A HREF="21-02.html#Heading5">Exceptions to Register Contention</A>
</DL>
<DD><A HREF="21-02.html#Heading6">Who&#146;s in First?</A>
<DD><A HREF="21-03.html#Heading7">Pentium Optimization in Action</A>
<DL>
<DD><A HREF="21-05.html#Heading8">A Quick Note on the 386 and 486</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="22-01.html#Heading1"><FONT SIZE="4"><B>Chapter 22&#151;Zenning and the Flexible Mind</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="22-01.html#Heading2">Taking a Spin through What You&#146;ve Learned</A>
<DD><A HREF="22-01.html#Heading3">Zenning</A>
</DL>
</DL>
</B></FONT>
<BR>
<DD><A HREF="23-01.html"><FONT SIZE="4"><B>Part II</B></FONT></A>
<DL>
<DD><A HREF="23-01.html#Heading1"><FONT SIZE="4"><B>Chapter 23&#151;Bones and Sinew</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="23-01.html#Heading2">At the Very Heart of Standard PC Graphics</A>
<DD><A HREF="23-01.html#Heading3">The VGA</A>
<DD><A HREF="23-01.html#Heading4">An Introduction to VGA Programming</A>
<DD><A HREF="23-02.html#Heading5">At the Core</A>
<DL>
<DD><A HREF="23-03.html#Heading6">Linear Planes and True VGA Modes</A>
<DD><A HREF="23-04.html#Heading7">Smooth Panning</A>
<DD><A HREF="23-05.html#Heading8">Color Plane Manipulation</A>
<DD><A HREF="23-05.html#Heading9">Page Flipping</A>
</DL>
<DD><A HREF="23-06.html#Heading10">The Hazards of VGA Clones</A>
<DD><A HREF="23-06.html#Heading11">Just the Beginning</A>
<DD><A HREF="23-06.html#Heading12">The Macro Assembler</A>
</DL>
</B></FONT>
<DD><A HREF="24-01.html#Heading1"><FONT SIZE="4"><B>Chapter 24&#151;Parallel Processing with the VGA</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="24-01.html#Heading2">Taking on Graphics Memory Four Bytes at a Time</A>
<DD><A HREF="24-01.html#Heading3">VGA Programming: ALUs and Latches</A>
<DD><A HREF="24-03.html#Heading4">Notes on the ALU/Latch Demo Program</A>
</DL>
</B></FONT>
<DD><A HREF="25-01.html#Heading1"><FONT SIZE="4"><B>Chapter 25&#151;VGA Data Machinery</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="25-01.html#Heading2">The Barrel Shifter, Bit Mask, and Set/Reset Mechanisms</A>
<DD><A HREF="25-01.html#Heading3">VGA Data Rotation</A>
<DD><A HREF="25-01.html#Heading4">The Bit Mask</A>
<DD><A HREF="25-03.html#Heading5">The VGA&#146;s Set/Reset Circuitry</A>
<DL>
<DD><A HREF="25-04.html#Heading6">Setting All Planes to a Single Color</A>
<DD><A HREF="25-05.html#Heading7">Manipulating Planes Individually</A>
</DL>
<DD><A HREF="25-06.html#Heading8">Notes on Set/Reset</A>
<DD><A HREF="25-06.html#Heading9">A Brief Note on Word OUTs</A>
</DL>
</B></FONT>
<DD><A HREF="26-01.html#Heading1"><FONT SIZE="4"><B>Chapter 26&#151;VGA Write Mode 3</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="26-01.html#Heading2">The Write Mode That Grows on You</A>
<DD><A HREF="26-01.html#Heading3">A Mode Born in Strangeness</A>
<DD><A HREF="26-03.html#Heading4">A Note on Preserving Register Bits</A>
</DL>
</B></FONT>
<DD><A HREF="27-01.html#Heading1"><FONT SIZE="4"><B>Chapter 27&#151;Yet Another VGA Write Mode</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="27-01.html#Heading2">Write Mode 2, Chunky Bitmaps,and Text-Graphics Coexistence</A>
<DD><A HREF="27-01.html#Heading3">Write Mode 2 and Set/Reset</A>
<DL>
<DD><A HREF="27-01.html#Heading4">A Byte&#146;s Progress in Write Mode 2</A>
<DD><A HREF="27-02.html#Heading5">Copying Chunky Bitmaps to VGA Memory Using Write Mode 2</A>
<DD><A HREF="27-03.html#Heading6">Drawing Color-Patterned Lines Using Write Mode 2</A>
</DL>
<DD><A HREF="27-04.html#Heading7">When to Use Write Mode 2 and When to Use Set/Reset</A>
<DD><A HREF="27-04.html#Heading8">Mode 13H&#151;320&#215;200 with 256 Colors</A>
<DD><A HREF="27-04.html#Heading9">Flipping Pages from Text to Graphics and Back</A>
</DL>
</B></FONT>
<DD><A HREF="28-01.html#Heading1"><FONT SIZE="4"><B>Chapter 28&#151;Reading VGA Memory</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="28-01.html#Heading2">Read Modes 0 and 1, and the Color Don&#146;t Care Register</A>
<DD><A HREF="28-01.html#Heading3">Read Mode 0</A>
<DD><A HREF="28-03.html#Heading4">Read Mode 1</A>
<DD><A HREF="28-04.html#Heading5">When all Planes &#147;Don&#146;t Care&#148;</A>
</DL>
</B></FONT>
<DD><A HREF="29-01.html#Heading1"><FONT SIZE="4"><B>Chapter 29&#151;Saving Screens and Other VGA Mysteries</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="29-01.html#Heading2">Useful Nuggets from the VGA Zen File</A>
<DD><A HREF="29-01.html#Heading3">Saving and Restoring EGA and VGA Screens</A>
<DD><A HREF="29-03.html#Heading4">16 Colors out of 64</A>
<DD><A HREF="29-05.html#Heading5">Overscan</A>
<DD><A HREF="29-05.html#Heading6">A Bonus Blanker</A>
<DD><A HREF="29-06.html#Heading7">Modifying VGA Registers</A>
</DL>
</B></FONT>
<DD><A HREF="30-01.html#Heading1"><FONT SIZE="4"><B>Chapter 30&#151;Video Est Omnis Divisa</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="30-01.html#Heading2">The Joys and Galling Problems of Using Split Screens on the EGA and VGA</A>
<DD><A HREF="30-01.html#Heading3">How the Split Screen Works</A>
<DL>
<DD><A HREF="30-01.html#Heading4">The Split Screen in Action</A>
<DD><A HREF="30-03.html#Heading5">VGA and EGA Split-Screen Operation Don&#146;t Mix</A>
</DL>
<DD><A HREF="30-03.html#Heading6">Setting the Split-Screen-Related Registers</A>
<DD><A HREF="30-03.html#Heading7">The Problem with the EGA Split Screen</A>
<DD><A HREF="30-04.html#Heading8">Split Screen and Panning</A>
<DL>
<DD><A HREF="30-04.html#Heading9">The Split Screen and Horizontal Panning: An Example</A>
</DL>
<DD><A HREF="30-06.html#Heading10">Notes on Setting and Reading Registers</A>
<DD><A HREF="30-07.html#Heading11">Split Screens in Other Modes</A>
<DD><A HREF="30-07.html#Heading12">How Safe?</A>
</DL>
</B></FONT>
<DD><A HREF="31-01.html#Heading1"><FONT SIZE="4"><B>Chapter 31&#151;Higher 256-Color Resolution on the VGA</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="31-01.html#Heading2">When Is 320&#215;200 Really 320&#215;400?</A>
<DD><A HREF="31-01.html#Heading3">Why 320x200? Only IBM Knows for Sure</A>
<DD><A HREF="31-01.html#Heading4">320x400 256-Color Mode</A>
<DL>
<DD><A HREF="31-01.html#Heading5">Display Memory Organization in 320x400 Mode</A>
<DD><A HREF="31-02.html#Heading6">Reading and Writing Pixels</A>
</DL>
<DD><A HREF="31-04.html#Heading7">Two 256-Color Pages</A>
<DD><A HREF="31-05.html#Heading8">Something to Think About</A>
</DL>
</B></FONT>
<DD><A HREF="32-01.html#Heading1"><FONT SIZE="4"><B>Chapter 32&#151;Be It Resolved: 360&#215;480</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="32-01.html#Heading2">Taking 256-Color Modes About as Far as the Standard VGA Can Take Them</A>
<DD><A HREF="32-01.html#Heading3">Extended 256-Color Modes: What&#146;s Not to Like?</A>
<DD><A HREF="32-01.html#Heading4">360x480 256-Color Mode</A>
<DD><A HREF="32-04.html#Heading5">How 360&#215;480 256-Color Mode Works</A>
<DL>
<DD><A HREF="32-04.html#Heading6">480 Scan Lines per Screen: A Little Slower, But No Big Deal</A>
<DD><A HREF="32-04.html#Heading7">360 Pixels per Scan Line: No Mean Feat</A>
<DD><A HREF="32-05.html#Heading8">Accessing Display Memory in 360&#215;480 256-Color Mode</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="33-01.html#Heading1"><FONT SIZE="4"><B>Chapter 33&#151;Yogi Bear and Eurythmics Confront VGA Colors</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="33-01.html#Heading2">The Basics of VGA Color Generation</A>
<DD><A HREF="33-01.html#Heading3">VGA Color Basics</A>
<DL>
<DD><A HREF="33-01.html#Heading4">The Palette RAM</A>
<DD><A HREF="33-01.html#Heading5">The DAC</A>
<DD><A HREF="33-02.html#Heading6">Color Paging with the Color Select Register</A>
<DD><A HREF="33-02.html#Heading7">256-Color Mode</A>
<DD><A HREF="33-02.html#Heading8">Setting the Palette RAM</A>
<DD><A HREF="33-03.html#Heading9">Setting the DAC</A>
</DL>
<DD><A HREF="33-03.html#Heading10">If You Can&#146;t Call the BIOS, Who Ya Gonna Call?</A>
<DD><A HREF="33-03.html#Heading11">An Example of Setting the DAC</A>
</DL>
</B></FONT>
<DD><A HREF="34-01.html#Heading1"><FONT SIZE="4"><B>Chapter 34&#151;Changing Colors without Writing Pixels</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="34-01.html#Heading2">Special Effects through Realtime Manipulation of DAC Colors</A>
<DD><A HREF="34-01.html#Heading3">Color Cycling</A>
<DD><A HREF="34-01.html#Heading4">The Heart of the Problem</A>
<DL>
<DD><A HREF="34-02.html#Heading5">Loading the DAC via the BIOS</A>
<DD><A HREF="34-02.html#Heading6">Loading the DAC Directly</A>
</DL>
<DD><A HREF="34-03.html#Heading7">A Test Program for Color Cycling</A>
<DD><A HREF="34-04.html#Heading8">Color Cycling Approaches that Work</A>
<DD><A HREF="34-05.html#Heading9">Odds and Ends</A>
<DL>
<DD><A HREF="34-05.html#Heading10">The DAC Mask</A>
<DD><A HREF="34-05.html#Heading11">Reading the DAC</A>
<DD><A HREF="34-05.html#Heading12">Cycling Down</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="35-01.html#Heading1"><FONT SIZE="4"><B>Chapter 35&#151;Bresenham Is Fast, and Fast Is Good</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="35-01.html#Heading2">Implementing and Optimizing Bresenham&#146;s Line-Drawing Algorithm</A>
<DD><A HREF="35-01.html#Heading3">The Task at Hand</A>
<DD><A HREF="35-01.html#Heading4">Bresenham&#146;s Line-Drawing Algorithm</A>
<DL>
<DD><A HREF="35-02.html#Heading5">Strengths and Weaknesses</A>
</DL>
<DD><A HREF="35-03.html#Heading6">An Implementation in C</A>
<DL>
<DD><A HREF="35-04.html#Heading7">Looking at EVGALine</A>
<DD><A HREF="35-05.html#Heading8">Drawing Each Line</A>
<DD><A HREF="35-05.html#Heading9">Drawing Each Pixel</A>
</DL>
<DD><A HREF="35-06.html#Heading10">Comments on the C Implementation</A>
<DD><A HREF="35-06.html#Heading11">Bresenham&#146;s Algorithm in Assembly</A>
</DL>
</B></FONT>
<DD><A HREF="36-01.html#Heading1"><FONT SIZE="4"><B>Chapter 36&#151;The Good, the Bad, and the Run-Sliced</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="36-01.html#Heading2">Faster Bresenham Lines with Run-Length Slice Line Drawing</A>
<DD><A HREF="36-01.html#Heading3">Run-Length Slice Fundamentals</A>
<DD><A HREF="36-02.html#Heading4">Run-Length Slice Implementation</A>
<DD><A HREF="36-03.html#Heading5">Run-Length Slice Details</A>
</DL>
</B></FONT>
<DD><A HREF="37-01.html#Heading1"><FONT SIZE="4"><B>Chapter 37&#151;Dead Cats and Lightning Lines</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="37-01.html#Heading2">Optimizing Run-Length Slice Line Drawing in a Major Way</A>
<DD><A HREF="37-01.html#Heading3">Fast Run-Length Slice Line Drawing</A>
<DL>
<DD><A HREF="37-02.html#Heading4">How Fast Is Fast?</A>
<DD><A HREF="37-02.html#Heading5">Further Optimizations</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="38-01.html#Heading1"><FONT SIZE="4"><B>Chapter 38&#151;The Polygon Primeval</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="38-01.html#Heading2">Drawing Polygons Efficiently and Quickly</A>
<DD><A HREF="38-01.html#Heading3">Filled Polygons</A>
<DL>
<DD><A HREF="38-01.html#Heading4">Which Side Is Inside?</A>
<DD><A HREF="38-02.html#Heading5">How Do You Fit Polygons Together?</A>
</DL>
<DD><A HREF="38-02.html#Heading6">Filling Non-Overlapping Convex Polygons</A>
<DD><A HREF="38-04.html#Heading7">Oddball Cases</A>
</DL>
</B></FONT>
<DD><A HREF="39-01.html#Heading1"><FONT SIZE="4"><B>Chapter 39&#151;Fast Convex Polygons</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="39-01.html#Heading2">Filling Polygons in a Hurry</A>
<DD><A HREF="39-01.html#Heading3">Fast Convex Polygon Filling</A>
<DL>
<DD><A HREF="39-01.html#Heading4">Fast Drawing</A>
<DD><A HREF="39-02.html#Heading5">Fast Edge Tracing</A>
</DL>
<DD><A HREF="39-03.html#Heading6">The Finishing Touch: Assembly Language</A>
<DL>
<DD><A HREF="39-04.html#Heading7">Maximizing REP STOS</A>
</DL>
<DD><A HREF="39-04.html#Heading8">Faster Edge Tracing</A>
</DL>
</B></FONT>
<DD><A HREF="40-01.html#Heading1"><FONT SIZE="4"><B>Chapter 40&#151;Of Songs, Taxes, and the Simplicity of Complex Polygons</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="40-01.html#Heading2">Dealing with Irregular Polygonal Areas</A>
<DD><A HREF="40-01.html#Heading3">Filling Arbitrary Polygons</A>
<DL>
<DD><A HREF="40-01.html#Heading4">Active Edges</A>
</DL>
<DD><A HREF="40-03.html#Heading5">Complex Polygon Filling: An Implementation</A>
<DL>
<DD><A HREF="40-04.html#Heading6">More on Active Edges</A>
<DD><A HREF="40-04.html#Heading7">Performance Considerations</A>
</DL>
<DD><A HREF="40-05.html#Heading8">Nonconvex Polygons</A>
<DL>
<DD><A HREF="40-05.html#Heading9">Details, Details</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="41-01.html#Heading1"><FONT SIZE="4"><B>Chapter 41&#151;Those Way-Down Polygon Nomenclature Blues</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="41-01.html#Heading2">Names Do Matter when You Conceptualize a Data Structure</A>
<DD><A HREF="41-01.html#Heading3">Nomenclature in Action</A>
</DL>
</B></FONT>
<DD><A HREF="42-01.html#Heading1"><FONT SIZE="4"><B>Chapter 42&#151;Wu&#146;ed in Haste; Fried, Stewed at Leisure</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="42-01.html#Heading2">Fast Antialiased Lines Using Wu&#146;s Algorithm</A>
<DD><A HREF="42-01.html#Heading3">Wu Antialiasing</A>
<DD><A HREF="42-02.html#Heading4">Tracing and Intensity in One</A>
<DD><A HREF="42-03.html#Heading5">Sample Wu Antialiasing</A>
<DL>
<DD><A HREF="42-05.html#Heading6">Notes on Wu Antialiasing</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="43-01.html#Heading1"><FONT SIZE="4"><B>Chapter 43&#151;Bit-Plane Animation</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="43-01.html#Heading2">A Simple and Extremely Fast Animation Method for Limited Color</A>
<DD><A HREF="43-01.html#Heading3">Bit-Planes: The Basics</A>
<DL>
<DD><A HREF="43-02.html#Heading4">Stacking the Palette Registers</A>
</DL>
<DD><A HREF="43-02.html#Heading5">Bit-Plane Animation in Action</A>
<DD><A HREF="43-04.html#Heading6">Limitations of Bit-Plane Animation</A>
<DD><A HREF="43-05.html#Heading7">Shearing and Page Flipping</A>
<DD><A HREF="43-06.html#Heading8">Beating the Odds in the Jaw-Dropping Contest</A>
</DL>
</B></FONT>
<DD><A HREF="44-01.html#Heading1"><FONT SIZE="4"><B>Chapter 44&#151;Split Screens Save the Page Flipped Day</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="44-01.html#Heading2">640x480 Page Flipped Animation in 64K...Almost</A>
<DL>
<DD><A HREF="44-01.html#Heading3">A Plethora of Challenges</A>
<DD><A HREF="44-01.html#Heading4">A Page Flipping Animation Demonstration</A>
<DL>
<DD><A HREF="44-04.html#Heading5">Write Mode 3</A>
<DD><A HREF="44-04.html#Heading6">Drawing Text</A>
<DD><A HREF="44-05.html#Heading7">Page Flipping</A>
<DD><A HREF="44-06.html#Heading8">Knowing When to Flip</A>
</DL>
<DD><A HREF="44-06.html#Heading9">Enter the Split Screen</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="45-01.html#Heading1"><FONT SIZE="4"><B>Chapter 45&#151;Dog Hair and Dirty Rectangles</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="45-01.html#Heading2">Different Angles on Animation</A>
<DD><A HREF="45-01.html#Heading3">Plus &#231;a Change</A>
<DD><A HREF="45-01.html#Heading4">VGA Access Times</A>
<DD><A HREF="45-02.html#Heading5">Dirty-Rectangle Animation</A>
<DL>
<DD><A HREF="45-02.html#Heading6">So Why Not Use Page Flipping?</A>
</DL>
<DD><A HREF="45-03.html#Heading7">Dirty Rectangles in Action</A>
<DD><A HREF="45-04.html#Heading8">Hi-Res VGA Page Flipping</A>
<DD><A HREF="45-06.html#Heading9">Another Interesting Twist on Page Flipping</A>
</DL>
</B></FONT>
<DD><A HREF="46-01.html#Heading1"><FONT SIZE="4"><B>Chapter 46&#151;Who Was that Masked Image?</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="46-01.html#Heading2">Optimizing Dirty-Rectangle Animation</A>
<DL>
<DD><A HREF="46-01.html#Heading3">Dirty-Rectangle Animation, Continued</A>
<DD><A HREF="46-03.html#Heading4">Masked Images</A>
<DD><A HREF="46-03.html#Heading5">Internal Animation</A>
<DL>
<DD><A HREF="46-03.html#Heading6">Dirty-Rectangle Management</A>
</DL>
<DD><A HREF="46-03.html#Heading7">Drawing Order and Visual Quality</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="47-01.html#Heading1"><FONT SIZE="4"><B>Chapter 47&#151;Mode X: 256-Color VGA Magic</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="47-01.html#Heading2">Introducing the VGA&#146;s Undocumented &#147;Animation-Optimal&#148; Mode</A>
<DD><A HREF="47-01.html#Heading3">What Makes Mode X Special?</A>
<DD><A HREF="47-02.html#Heading4">Selecting 320x240 256-Color Mode</A>
<DD><A HREF="47-04.html#Heading5">Designing from a Mode X Perspective</A>
<DD><A HREF="47-06.html#Heading6">Hardware Assist from an Unexpected Quarter</A>
</DL>
</B></FONT>
<DD><A HREF="48-01.html#Heading1"><FONT SIZE="4"><B>Chapter 48&#151;Mode X Marks the Latch</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="48-01.html#Heading2">The Internals of Animation&#146;s Best Video Display Mode</A>
<DD><A HREF="48-03.html#Heading3">Allocating Memory in Mode X</A>
<DD><A HREF="48-03.html#Heading4">Copying Pixel Blocks within Display Memory</A>
<DL>
<DD><A HREF="48-05.html#Heading5">Copying to Display Memory</A>
</DL>
<DD><A HREF="48-05.html#Heading6">Who Was that Masked Image Copier?</A>
</DL>
</B></FONT>
<DD><A HREF="49-01.html#Heading1"><FONT SIZE="4"><B>Chapter 49&#151;Mode X 256-Color Animation</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="49-01.html#Heading2">How to Make the VGA Really Get up and Dance</A>
<DD><A HREF="49-01.html#Heading3">Masked Copying</A>
<DL>
<DD><A HREF="49-02.html#Heading4">Faster Masked Copying</A>
<DD><A HREF="49-03.html#Heading5">Notes on Masked Copying</A>
</DL>
<DD><A HREF="49-04.html#Heading6">Animation</A>
<DD><A HREF="49-04.html#Heading7">Mode X Animation in Action</A>
<DD><A HREF="49-05.html#Heading8">Works Fast, Looks Great</A>
</DL>
</B></FONT>
<DD><A HREF="50-01.html#Heading1"><FONT SIZE="4"><B>Chapter 50&#151;Adding a Dimension</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="50-01.html#Heading2">3-D Animation Using Mode X</A>
<DD><A HREF="50-01.html#Heading3">References on 3-D Drawing</A>
<DD><A HREF="50-01.html#Heading4">The 3-D Drawing Pipeline</A>
<DL>
<DD><A HREF="50-02.html#Heading5">Projection</A>
<DD><A HREF="50-02.html#Heading6">Translation</A>
<DD><A HREF="50-02.html#Heading7">Rotation</A>
</DL>
<DD><A HREF="50-02.html#Heading8">A Simple 3-D Example</A>
<DL>
<DD><A HREF="50-07.html#Heading9">Notes on the 3-D Animation Example</A>
</DL>
<DD><A HREF="50-07.html#Heading10">An Ongoing Journey</A>
</DL>
</B></FONT>
<DD><A HREF="51-01.html#Heading1"><FONT SIZE="4"><B>Chapter 51&#151;Sneakers in Space</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="51-01.html#Heading2">Using Backface Removal to Eliminate Hidden Surfaces</A>
<DD><A HREF="51-01.html#Heading3">One-sided Polygons: Backface Removal</A>
<DL>
<DD><A HREF="51-02.html#Heading4">Backface Removal in Action</A>
</DL>
<DD><A HREF="51-05.html#Heading5">Incremental Transformation</A>
<DD><A HREF="51-06.html#Heading6">A Note on Rounding Negative Numbers</A>
<DD><A HREF="51-06.html#Heading7">Object Representation</A>
</DL>
</B></FONT>
<DD><A HREF="52-01.html#Heading1"><FONT SIZE="4"><B>Chapter 52&#151;Fast 3-D Animation: Meet X-Sharp</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="52-01.html#Heading2">The First Iteration of a Generalized 3-D Animation Package</A>
<DD><A HREF="52-01.html#Heading3">This Chapter&#146;s Demo Program</A>
<DD><A HREF="52-07.html#Heading4">A New Animation Framework: X-Sharp</A>
<DD><A HREF="52-07.html#Heading5">Three Keys to Realtime Animation Performance</A>
<DL>
<DD><A HREF="52-08.html#Heading6">Drawbacks</A>
<DD><A HREF="52-08.html#Heading7">Where the Time Goes</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="53-01.html#Heading1"><FONT SIZE="4"><B>Chapter 53&#151;Raw Speed and More</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="53-01.html#Heading2">The Naked Truth About Speed in 3-D Animation</A>
<DD><A HREF="53-01.html#Heading3">Raw Speed, Part 1: Assembly Language</A>
<DD><A HREF="53-03.html#Heading4">Raw Speed, Part II: Look it Up</A>
<DL>
<DD><A HREF="53-03.html#Heading5">Hidden Surfaces</A>
<DD><A HREF="53-04.html#Heading6">Rounding</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="54-01.html#Heading1"><FONT SIZE="4"><B>Chapter 54&#151;3-D Shading</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="54-01.html#Heading2">Putting Realistic Surfaces on Animated 3-D Objects</A>
<DD><A HREF="54-01.html#Heading3">Support for Older Processors</A>
<DL>
<DD><A HREF="54-03.html#Heading4">Shading</A>
<DL>
<DD><A HREF="54-03.html#Heading5">Ambient Shading</A>
<DD><A HREF="54-03.html#Heading6">Diffuse Shading</A>
</DL>
<DD><A HREF="54-05.html#Heading7">Shading: Implementation Details</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="55-01.html#Heading1"><FONT SIZE="4"><B>Chapter 55&#151;Color Modeling in 256-Color Mode</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="55-01.html#Heading2">Pondering X-Sharp&#146;s Color Model in an RGB State of Mind</A>
<DL>
<DD><A HREF="55-01.html#Heading3">A Color Model</A>
<DD><A HREF="55-03.html#Heading4">A Bonus from the BitMan</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="56-01.html#Heading1"><FONT SIZE="4"><B>Chapter 56&#151;Pooh and the Space Station</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="56-01.html#Heading2">Using Fast Texture Mapping to Place Pooh on a Polygon</A>
<DD><A HREF="56-01.html#Heading3">Principles of Quick-and-Dirty Texture Mapping</A>
<DL>
<DD><A HREF="56-01.html#Heading4">Mapping Textures Made Easy</A>
</DL>
<DD><A HREF="56-03.html#Heading5">Fast Texture Mapping: An Implementation</A>
</DL>
</B></FONT>
<DD><A HREF="57-01.html#Heading1"><FONT SIZE="4"><B>Chapter 57&#151;10,000 Freshly Sheared Sheep on the Screen</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="57-01.html#Heading2">The Critical Role of Experience in Implementing Fast, Smooth Texture Mapping</A>
<DL>
<DD><A HREF="57-01.html#Heading3">Visual Quality: A Black Hole ... Er, Art</A>
<DD><A HREF="57-01.html#Heading4">Fixed-Point Arithmetic, Redux</A>
<DD><A HREF="57-02.html#Heading5">Texture Mapping: Orientation Independence</A>
<DD><A HREF="57-02.html#Heading6">Mapping Textures across Multiple Polygons</A>
<DL>
<DD><A HREF="57-02.html#Heading7">Fast Texture Mapping</A>
</DL>
</DL>
</DL>
</B></FONT>
<DD><A HREF="58-01.html#Heading1"><FONT SIZE="4"><B>Chapter 58&#151;Heinlein&#146;s Crystal Ball, Spock&#146;s Brain, and the 9-Cycle Dare</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="58-01.html#Heading2">Using the Whole-Brain Approach to Accelerate Texture Mapping</A>
<DD><A HREF="58-01.html#Heading3">Texture Mapping Redux</A>
<DL>
<DD><A HREF="58-01.html#Heading4">Left-Brain Optimization</A>
<DD><A HREF="58-02.html#Heading5">A 90-Degree Shift in Perspective</A>
</DL>
<DD><A HREF="58-03.html#Heading6">That&#146;s Nice&#151;But it Sure as Heck Ain&#146;t 9 Cycles</A>
<DL>
<DD><A HREF="58-04.html#Heading7">Don&#146;t Stop Thinking about Those Cycles</A>
</DL>
<DD><A HREF="58-05.html#Heading8">Texture Mapping Notes</A>
</DL>
</B></FONT>
<DD><A HREF="59-01.html#Heading1"><FONT SIZE="4"><B>Chapter 59&#151;The Idea of BSP Trees</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="59-01.html#Heading2">What BSP Trees Are and How to Walk Them</A>
<DD><A HREF="59-01.html#Heading3">BSP Trees</A>
<DL>
<DD><A HREF="59-01.html#Heading4">Visibility Determination</A>
<DD><A HREF="59-02.html#Heading5">Limitations of BSP Trees</A>
</DL>
<DD><A HREF="59-02.html#Heading6">Building a BSP Tree</A>
<DL>
<DD><A HREF="59-03.html#Heading7">Visibility Ordering</A>
</DL>
<DD><A HREF="59-04.html#Heading8">Inorder Walks of BSP Trees</A>
<DL>
<DD><A HREF="59-04.html#Heading9">Know It <I>Cold</I></A>
<DD><A HREF="59-05.html#Heading10">Measure and Learn</A>
</DL>
<DD><A HREF="59-06.html#Heading11">Surfing Amidst the Trees</A>
<DL>
<DD><A HREF="59-06.html#Heading12">Related Reading</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="60-01.html#Heading1"><FONT SIZE="4"><B>Chapter 60&#151;Compiling BSP Trees</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="60-01.html#Heading2">Taking BSP Trees from Concept to Reality</A>
<DD><A HREF="60-01.html#Heading3">Compiling BSP Trees</A>
<DL>
<DD><A HREF="60-02.html#Heading4">Parametric Lines</A>
<DD><A HREF="60-02.html#Heading5">Parametric Line Clipping</A>
<DD><A HREF="60-02.html#Heading6">The BSP Compiler</A>
</DL>
<DD><A HREF="60-04.html#Heading7">Optimizing the BSP Tree</A>
<DD><A HREF="60-04.html#Heading8">BSP Optimization: an Undiscovered Country</A>
</DL>
</B></FONT>
<DD><A HREF="61-01.html#Heading1"><FONT SIZE="4"><B>Chapter 61&#151;Frames of Reference</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="61-01.html#Heading2">The Fundamentals of the Math behind 3-D Graphics</A>
<DL>
<DD><A HREF="61-01.html#Heading3">3-D Math</A>
<DD><A HREF="61-01.html#Heading4">Foundation Definitions</A>
</DL>
<DD><A HREF="61-02.html#Heading5">The Dot Product</A>
<DL>
<DD><A HREF="61-02.html#Heading6">Dot Products of Unit Vectors</A>
</DL>
<DD><A HREF="61-02.html#Heading7">Cross Products and the Generation of Polygon Normals</A>
<DD><A HREF="61-03.html#Heading8">Using the Sign of the Dot Product</A>
<DD><A HREF="61-04.html#Heading9">Using the Dot Product for Projection</A>
<DD><A HREF="61-04.html#Heading10">Rotation by Projection</A>
</DL>
</B></FONT>
<DD><A HREF="62-01.html#Heading1"><FONT SIZE="4"><B>Chapter 62&#151;One Story, Two Rules, and a BSP Renderer</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="62-01.html#Heading2">Taking a Compiled BSP Tree from Logical to Visual Reality</A>
<DL>
<DD><A HREF="62-01.html#Heading3">BSP-based Rendering</A>
<DD><A HREF="62-03.html#Heading4">The Rendering Pipeline</A>
</DL>
<DD><A HREF="62-03.html#Heading5">Moving the Viewer</A>
<DD><A HREF="62-03.html#Heading6">Transformation into Viewspace</A>
<DD><A HREF="62-03.html#Heading7">Clipping</A>
<DD><A HREF="62-03.html#Heading8">Projection to Screenspace</A>
<DD><A HREF="62-04.html#Heading9">Walking the Tree, Backface Culling and Drawing</A>
<DL>
<DD><A HREF="62-04.html#Heading10">Notes on the BSP Renderer</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="63-01.html#Heading1"><FONT SIZE="4"><B>Chapter 63&#151;Floating-Point for Real-Time 3-D</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="63-01.html#Heading2">Knowing When to Hurl Conventional Math Wisdom Out the Window</A>
<DD><A HREF="63-01.html#Heading3">Not Your Father&#146;s Floating-Point</A>
<DD><A HREF="63-01.html#Heading4">Pentium Floating-Point Optimization</A>
<DL>
<DD><A HREF="63-02.html#Heading5">Pipelining, Latency, and Throughput</A>
<DD><A HREF="63-02.html#Heading6">FXCH</A>
</DL>
<DD><A HREF="63-02.html#Heading7">The Dot Product</A>
<DD><A HREF="63-03.html#Heading8">The Cross Product</A>
<DD><A HREF="63-03.html#Heading9">Transformation</A>
<DD><A HREF="63-04.html#Heading10">Projection</A>
<DD><A HREF="63-04.html#Heading11">Rounding Control</A>
<DD><A HREF="63-04.html#Heading12">A Farewell to 3-D Fixed-Point</A>
</DL>
</B></FONT>
<DD><A HREF="64-01.html#Heading1"><FONT SIZE="4"><B>Chapter 64&#151;Quake&#146;s Visible-Surface Determination</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="64-01.html#Heading2">The Challenge of Separating All Things Seen from All Things Unseen</A>
<DD><A HREF="64-01.html#Heading3">VSD: The Toughest 3-D Challenge of All</A>
<DD><A HREF="64-02.html#Heading4">The Structure of Quake Levels</A>
<DD><A HREF="64-02.html#Heading5">Culling and Visible Surface Determination</A>
<DL>
<DD><A HREF="64-02.html#Heading6">Nodes Inside and Outside the View Frustum</A>
</DL>
<DD><A HREF="64-02.html#Heading7">Overdraw</A>
<DD><A HREF="64-03.html#Heading8">The Beam Tree</A>
<DD><A HREF="64-03.html#Heading9">3-D Engine du Jour</A>
<DL>
<DD><A HREF="64-03.html#Heading10">Subdividing Raycast</A>
<DD><A HREF="64-03.html#Heading11">Vertex-Free Surfaces</A>
<DD><A HREF="64-03.html#Heading12">The Draw-Buffer</A>
<DD><A HREF="64-03.html#Heading13">Span-Based Drawing</A>
<DD><A HREF="64-03.html#Heading14">Portals</A>
</DL>
<DD><A HREF="64-03.html#Heading15">Breakthrough!</A>
<DD><A HREF="64-04.html#Heading16">Simplify, and Keep on Trying New Things</A>
<DD><A HREF="64-04.html#Heading17">Learn Now, Pay Forward</A>
<DD><A HREF="64-04.html#Heading18">References</A>
</DL>
</B></FONT>
<DD><A HREF="65-01.html#Heading1"><FONT SIZE="4"><B>Chapter 65&#151;3-D Clipping and Other Thoughts</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="65-01.html#Heading2">Determining What&#146;s Inside Your Field of View</A>
<DD><A HREF="65-01.html#Heading3">3-D Clipping Basics</A>
<DL>
<DD><A HREF="65-02.html#Heading4">Intersecting a Line Segment with a Plane</A>
</DL>
<DD><A HREF="65-02.html#Heading5">Polygon Clipping</A>
<DL>
<DD><A HREF="65-03.html#Heading6">Clipping to the Frustum</A>
<DD><A HREF="65-04.html#Heading7">The Lessons of Listing 65.3</A>
</DL>
<DD><A HREF="65-04.html#Heading8">Advantages of Viewspace Clipping</A>
<DD><A HREF="65-04.html#Heading9">Further Reading</A>
</DL>
</B></FONT>
<DD><A HREF="66-01.html#Heading1"><FONT SIZE="4"><B>Chapter 66&#151;Quake&#146;s Hidden-Surface Removal</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="66-01.html#Heading2">Struggling with Z-Order Solutions to the Hidden Surface Problem</A>
<DD><A HREF="66-01.html#Heading3">Creative Flux and Hidden Surfaces</A>
<DL>
<DD><A HREF="66-01.html#Heading4">Drawing Moving Objects</A>
<DD><A HREF="66-01.html#Heading5">Performance Impact</A>
<DD><A HREF="66-01.html#Heading6">Leveling and Improving Performance</A>
</DL>
<DD><A HREF="66-02.html#Heading7">Sorted Spans</A>
<DD><A HREF="66-02.html#Heading8">Edges versus Spans</A>
<DD><A HREF="66-03.html#Heading9">Edge-Sorting Keys</A>
<DL>
<DD><A HREF="66-04.html#Heading10">Where That 1/Z Equation Comes From</A>
<DD><A HREF="66-04.html#Heading11">Quake and Z-Sorting</A>
</DL>
<DD><A HREF="66-04.html#Heading12">Decisions Deferred</A>
</DL>
</B></FONT>
<DD><A HREF="67-01.html#Heading1"><FONT SIZE="4"><B>Chapter 67&#151;Sorted Spans in Action</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="67-01.html#Heading2">Implementing Independent Span Sorting for Rendering without Overdraw</A>
<DD><A HREF="67-01.html#Heading3">Quake and Sorted Spans</A>
<DD><A HREF="67-02.html#Heading4">Types of 1/z Span Sorting</A>
<DL>
<DD><A HREF="67-02.html#Heading5">Intersecting Span Sorting</A>
<DD><A HREF="67-02.html#Heading6">Abutting Span Sorting</A>
<DD><A HREF="67-03.html#Heading7">Independent Span Sorting</A>
</DL>
<DD><A HREF="67-03.html#Heading8">1/z Span Sorting in Action</A>
<DL>
<DD><A HREF="67-05.html#Heading9">Implementation Notes</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="68-01.html#Heading1"><FONT SIZE="4"><B>Chapter 68&#151;Quake&#146;s Lighting Model</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="68-01.html#Heading2">A Radically Different Approach to Lighting Polygons</A>
<DD><A HREF="68-01.html#Heading3">The Lighting Conundrum</A>
<DD><A HREF="68-01.html#Heading4">Gouraud Shading</A>
<DL>
<DD><A HREF="68-01.html#Heading5">Problems with Gouraud Shading</A>
<DD><A HREF="68-02.html#Heading6">Perspective Correctness</A>
</DL>
<DD><A HREF="68-02.html#Heading7">The Quest for Alternative Lighting</A>
<DL>
<DD><A HREF="68-02.html#Heading8">Decoupling Lighting from Rasterization</A>
<DD><A HREF="68-03.html#Heading9">Size and Speed</A>
</DL>
<DD><A HREF="68-03.html#Heading10">Surface Caching</A>
<DL>
<DD><A HREF="68-04.html#Heading11">Mipmapping To The Rescue</A>
<DD><A HREF="68-04.html#Heading12">Two Final Notes on Surface Caching</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="69-01.html#Heading1"><FONT SIZE="4"><B>Chapter 69&#151;Surface Caching and Quake&#146;s Triangle Models</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="69-01.html#Heading2">Probing Hardware-Assisted Surfaces and Fast Model Animation Without Sprites</A>
<DD><A HREF="69-01.html#Heading3">Surface Caching with Hardware Assistance</A>
<DL>
<DD><A HREF="69-02.html#Heading4">Letting the Graphics Card Build the Textures</A>
<DD><A HREF="69-02.html#Heading5">The Light Map as Alpha Texture</A>
</DL>
<DD><A HREF="69-02.html#Heading6">Drawing Triangle Models</A>
<DL>
<DD><A HREF="69-02.html#Heading7">Drawing Triangle Models Fast</A>
<DD><A HREF="69-03.html#Heading8">Trading Subpixel Precision for Speed</A>
<DD><A HREF="69-03.html#Heading9">An Idea that Didn&#146;t Work</A>
<DD><A HREF="69-03.html#Heading10">An Idea that Did Work</A>
<DD><A HREF="69-04.html#Heading11">More Ideas that Might Work</A>
</DL>
</DL>
</B></FONT>
<DD><A HREF="70-01.html#Heading1"><FONT SIZE="4"><B>Chapter 70&#151;Quake: A Post-Mortem and a Glimpse into the Future</B></FONT></A>
<FONT SIZE="3"><B>
<DL>
<DD><A HREF="70-01.html#Heading2">Preprocessing the World</A>
<DD><A HREF="70-02.html#Heading3">The Potentially Visible Set (PVS)</A>
<DD><A HREF="70-03.html#Heading4">Passages: The Last-Minute Change that Didn&#146;t Happen</A>
<DD><A HREF="70-03.html#Heading5">Drawing the World</A>
<DD><A HREF="70-04.html#Heading6">Rasterization</A>
<DL>
<DD><A HREF="70-04.html#Heading7">Lighting</A>
<DD><A HREF="70-04.html#Heading8">Dynamic Lighting</A>
</DL>
<DD><A HREF="70-05.html#Heading9">Entities</A>
<DL>
<DD><A HREF="70-05.html#Heading10">BSP Models</A>
<DD><A HREF="70-05.html#Heading11">Polygon Models and Z-Buffering</A>
<DD><A HREF="70-06.html#Heading12">The Subdivision Rasterizer</A>
<DD><A HREF="70-06.html#Heading13">Sprites</A>
<DD><A HREF="70-06.html#Heading14">Particles</A>
</DL>
<DD><A HREF="70-06.html#Heading15">How We Spent Our Summer Vacation: After Shipping Quake</A>
<DL>
<DD><A HREF="70-06.html#Heading16">Verite Quake</A>
<DD><A HREF="70-07.html#Heading17">GLQuake</A>
<DD><A HREF="70-07.html#Heading18">WinQuake</A>
<DD><A HREF="70-07.html#Heading19">QuakeWorld</A>
<DD><A HREF="70-08.html#Heading20">Quake 2</A>
</DL>
<DD><A HREF="70-09.html#Heading21">Looking Forward</A>
</DL>
</DL>
</DL>
<B></FONT>
<FONT SIZE="4"><B>
<DD><A HREF="appendix-a.html">Appendix A</A>
<DD><A HREF="book-index.html">Index</A>
</B></FONT>
</DL>
<hr width="90%" size="1" noshade>
<div align="center">
<font face="Verdana,sans-serif" size="1">Graphics Programming Black Book &copy; 2001 Michael Abrash</font>
</div>
<!-- all of the reference materials (books) have the footer and subfoot reveresed -->
<!-- reference_subfoot = footer -->
<!-- reference_footer = subfoot -->
<!-- BEGIN SUB FOOTER -->
</BODY>
</HTML>
<!-- END FOOTER -->